從零搭建SpringCloud服務(wù)(超級詳細(xì))
閱讀本文大概需要 13?分鐘。
來自:blog.csdn.net/qq_29519041
1.什么是SpringCloud?
2.1 工程初始化配置













xml version="1.0"?encoding="UTF-8"?>
?
<project?xmlns="http://maven.apache.org/POM/4.0.0"?xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
?????????xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
??<modelVersion>4.0.0modelVersion>
?
??<groupId>com.yungroupId>
??<artifactId>springcloud-eureka-serverartifactId>
??<version>1.0-SNAPSHOTversion>
?
??<name>springcloud-eureka-servername>
??
??<url>http://www.example.comurl>
?
??<properties>
????<project.build.sourceEncoding>UTF-8project.build.sourceEncoding>
????<maven.compiler.source>1.7maven.compiler.source>
????<maven.compiler.target>1.7maven.compiler.target>
??properties>
?
??
??<parent>
????<groupId>org.springframework.bootgroupId>
????<artifactId>spring-boot-starter-parentartifactId>
????<version>1.5.7.RELEASEversion>
??parent>
?
??<dependencies>
????
????<dependency>
??????<groupId>org.springframework.cloudgroupId>
??????<artifactId>spring-cloud-starter-netflix-eureka-serverartifactId>
????dependency>
?
??dependencies>
?
?
??
??<dependencyManagement>
????<dependencies>
??????<dependency>
????????<groupId>org.springframework.cloudgroupId>
????????<artifactId>spring-cloud-dependenciesartifactId>
????????<version>Edgware.SR5version>
????????<type>pomtype>
????????<scope>importscope>
??????dependency>
????dependencies>
??dependencyManagement>
project>

![]()
2.2?Springboot的搭建 以及提供注冊服務(wù) 的 服務(wù)配置

![]()


![]()
server:
??port:?8700?# 端口自己決定
??
# 指定當(dāng)前eureka客戶端的注冊地址,也就是eureka服務(wù)的提供方,當(dāng)前配置的服務(wù)的注冊服務(wù)方
eureka:
??client:
????service-url:
??????defaultZone:?http://${eureka.instance.hostname}:${server.port}/eureka
????register-with-eureka: false #自身 不在向eureka注冊
????fetch-registry: false #啟動時禁用client的注冊
??instance:
????hostname: localhost
?
#指定應(yīng)用名稱
spring:
??application:
????name: eureka-server


package?com.yun;
?
import?org.springframework.boot.SpringApplication;
import?org.springframework.boot.autoconfigure.SpringBootApplication;
import?org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
?
@SpringBootApplication
@EnableEurekaServer?//當(dāng)前使用eureka的server
public?class?EurekaServerApplication?{
????public?static?void?main(String[] args)?{
????????SpringApplication.run(EurekaServerApplication.class,args);
????}
}



2.3 客戶端client? 提供真正服務(wù)的角色的配置, 它提供服務(wù) 在 服務(wù)注冊方server (注冊中心)進(jìn)行注冊



![]()


server:
??port:?8701?# 服務(wù)提供方
?
# 指定當(dāng)前eureka客戶端的注冊地址,
eureka:
??client:
????service-url:
??????defaultZone:?http://${eureka.instance.hostname}:8700/eureka
??instance:
????hostname: localhost
?
#當(dāng)前服務(wù)名稱
spring:
??application:
????name: eureka-service

@RestController
@RequestMapping("/Hello")
public?class?Controller {
????@RequestMapping("/World")
????public?String?helloWorld(String?s){
????????System.out.println("傳入的值為:"+s);
????????return?"傳入的值為:"+s;
????}
}
@SpringBootApplication
@EnableDiscoveryClient//代表自己是一個服務(wù)提供方
public class EurekaServiceApplication {
????public?static?void?main(String[] args) {
????????SpringApplication.run(EurekaServiceApplication.class,args);
????}
}



2.4 服務(wù)的調(diào)用方式
第一種調(diào)用方式:restTemplate+ribbon ????


?第二種調(diào)用方式:feign?

?2.4.1 restTemplate+ribbon? ?
而客戶端負(fù)載均衡和服務(wù)端負(fù)載均衡最大的不同點(diǎn)在于上面所提到服務(wù)清單所存儲的位置。在客戶端負(fù)載均衡中,所有客戶端節(jié)點(diǎn)都維護(hù)著自己要訪問的服務(wù)端清單,而這些服務(wù)端端清單來自于服務(wù)注冊中心,比如上一章我們介紹的Eureka服務(wù)端。 同服務(wù)端負(fù)載均衡的架構(gòu)類似,在客戶端負(fù)載均衡中也需要心跳去維護(hù)服務(wù)端清單的健康性,默認(rèn)會創(chuàng)建針對各個服務(wù)治理框架的Ribbon自動化整合配置,比如Eureka中的org.springframework.cloud.netflix.ribbon.eureka.RibbonEurekaAutoConfiguration,Consul中的org.springframework.cloud.consul.discovery.RibbonConsulAutoConfiguration。在實(shí)際使用的時候,我們可以通過查看這兩個類的實(shí)現(xiàn),以找到它們的配置詳情來幫助我們更好地使用它。
<dependency>
???????<groupId>org.springframework.cloudgroupId>
???????<artifactId>spring-cloud-starter-ribbonartifactId>
dependency>
server:
??port:?8702?# 服務(wù)消費(fèi)方
?
# 指定當(dāng)前eureka客戶端的注冊地址,
eureka:
??client:
????service-url:
??????defaultZone:?http://${eureka.instance.hostname}:8700/eureka
??instance:
????hostname: localhost
?
#當(dāng)前服務(wù)名稱
spring:
??application:
????name: eureka-consumer
@SpringBootApplication
@EnableDiscoveryClient?//當(dāng)前使用eureka的server
public class EurekaConsumerApplication {
????public?static?void?main(String[] args) {
????????SpringApplication.run(EurekaConsumerApplication.class,args);
????}
}

@RestController
@RequestMapping("/Hello")
class?ConsumerController {
????@Autowired
????private?LoadBalancerClient loadBalancerClient;
????@Autowired
????private?RestTemplate restTemplate;
????@RequestMapping("/Consumer")
????public?String?helloWorld(String?s){
????????System.out.println("傳入的值為:"+s);
????????//第一種調(diào)用方式
????????//String forObject = new RestTemplate().getForObject("http://localhost:8071/Hello/World?s=" + s, String.class);
?
????????//第二種調(diào)用方式
????????//根據(jù)服務(wù)名 獲取服務(wù)列表 根據(jù)算法選取某個服務(wù) 并訪問某個服務(wù)的網(wǎng)絡(luò)位置。
????????//ServiceInstance serviceInstance = loadBalancerClient.choose("EUREKA-SERVICE");
????????//String forObject = new RestTemplate().getForObject("http://"+serviceInstance.getHost()+":"+serviceInstance.getPort()+"/Hello/World?s="+s,String.class);
?
????????//第三種調(diào)用方式 需要restTemplate注入的方式
????????String?forObject = restTemplate.getForObject("http://EUREKA-SERVICE/Hello/World?s="?+ s,?String.class);
????????return?forObject;
????}
}
??? @Autowired
??? private LoadBalancerClient loadBalancerClient;
@Configuration
public class Beans {
????//管理簡單對象
????@Bean
????@LoadBalanced
????public RestTemplate getRestTemplate(){
????????return?new?RestTemplate();
????}
}
String forObject =? restTemplate.getForObject("http://EUREKA-SERVICE/Hello/World?s=" + s, String.class);
![]()
![]()
![]()

訪問服務(wù)消費(fèi)方@RequestMapping指定的路徑及消費(fèi)方的端口來訪問消費(fèi)方的controller controller根據(jù)服務(wù)名去server方獲取獲取服務(wù)列表,獲取服務(wù)列表后根據(jù)隨機(jī)的模式負(fù)載勻衡后去選擇服務(wù)地址去訪問servicesupport:如下圖

2.5 ? Eureka server的高可用配置





















![]()

慢一點(diǎn)才能更快
推薦閱讀:
微信掃描二維碼,關(guān)注我的公眾號
朕已閱?
評論
圖片
表情

