一、服務(wù)治理
所謂服務(wù)治理就是用來(lái)實(shí)現(xiàn)各個(gè)微服務(wù)實(shí)例的自動(dòng)化注冊(cè)于發(fā)現(xiàn)。當(dāng)多個(gè)微服務(wù)互相調(diào)用時(shí),就需要維護(hù)一個(gè)靜態(tài)的配置文件,來(lái)說(shuō)明各自所承擔(dān)的服務(wù)內(nèi)容、地址、端口等信息,其他服務(wù)調(diào)用時(shí),就需要去查詢(xún)這個(gè)配置文件,以獲取服務(wù)。但是隨著業(yè)務(wù)的發(fā)展,系統(tǒng)功能越發(fā)變得復(fù)雜,之前的靜態(tài)配置文件維護(hù)起來(lái)也越發(fā)的耗費(fèi)精力時(shí)間,并且由于需求的不管變更,使得服務(wù)的命名、地址都會(huì)發(fā)生變化,所以為了解決這樣的問(wèn)題,在微服務(wù)架構(gòu)中,會(huì)使用服務(wù)治理來(lái)注冊(cè)和發(fā)現(xiàn)微服務(wù)中的實(shí)例,并進(jìn)行統(tǒng)一的管理。
二、服務(wù)的注冊(cè)與發(fā)現(xiàn)

關(guān)系調(diào)用說(shuō)明:
- 服務(wù)生產(chǎn)者啟動(dòng)時(shí),向服務(wù)注冊(cè)中心注冊(cè)自己提供的服務(wù)
- 服務(wù)消費(fèi)者啟動(dòng)時(shí),在服務(wù)注冊(cè)中心訂閱自己所需要的服務(wù)
- 注冊(cè)中心返回服務(wù)提供者的地址信息個(gè)消費(fèi)者
- 消費(fèi)者從提供者中調(diào)用服務(wù)
三、Eureka
Eureka是Spring Cloud Netflix微服務(wù)套件中的一部分,可以與Springboot構(gòu)建的微服務(wù)很容易的整合起來(lái)。
Eureka包含了服務(wù)器端和客戶(hù)端組件。服務(wù)器端,也被稱(chēng)作是服務(wù)注冊(cè)中心,用于提供服務(wù)的注冊(cè)與發(fā)現(xiàn)。Eureka支持高可用的配置,當(dāng)集群中有分片出現(xiàn)故障時(shí),Eureka就會(huì)轉(zhuǎn)入自動(dòng)保護(hù)模式,它允許分片故障期間繼續(xù)提供服務(wù)的發(fā)現(xiàn)和注冊(cè),當(dāng)故障分片恢復(fù)正常時(shí),集群中其他分片會(huì)把他們的狀態(tài)再次同步回來(lái)。
客戶(hù)端組件包含服務(wù)消費(fèi)者與服務(wù)生產(chǎn)者。在應(yīng)用程序運(yùn)行時(shí),Eureka客戶(hù)端向注冊(cè)中心注冊(cè)自身提供的服務(wù)并周期性的發(fā)送心跳來(lái)更新它的服務(wù)租約。同時(shí)也可以從服務(wù)端查詢(xún)當(dāng)前注冊(cè)的服務(wù)信息并把他們緩存到本地并周期性的刷新服務(wù)狀態(tài)。
四、使用Eureka進(jìn)行服務(wù)治理
1. 搭建服務(wù)注冊(cè)中心
單獨(dú)創(chuàng)建一個(gè)Springboot項(xiàng)目,并添加如下的依賴(lài)
<dependencies>
<!--添加Eureka服務(wù)器端依賴(lài)-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka-server</artifactId>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Brixton.SR5</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
在Springboot項(xiàng)目中的main入口,添加@EnableEurekaServer注解,來(lái)開(kāi)啟服務(wù)注冊(cè)中心
@EnableEurekaServer
@SpringBootApplication
public class EurekaServerApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaServerApplication.class, args);
}
}
在默認(rèn)情況下,服務(wù)注冊(cè)中心也會(huì)把自己當(dāng)做是一個(gè)服務(wù),將自己注冊(cè)進(jìn)服務(wù)注冊(cè)中心,所以我們可以通過(guò)配置來(lái)禁用他的客戶(hù)端注冊(cè)行為,在application.properties中添加如下配置:
server.port=3333
eureka.instance.hostname=localhost
#不要向注冊(cè)中心注冊(cè)自己
eureka.client.register-with-eureka=false
#禁止檢索服務(wù)
eureka.client.fetch-registry=false
eureka.client.service-url.defaultZone=http://${eureka.instance.hostname}:${server.port}/eureka
啟動(dòng)應(yīng)用,并訪問(wèn)http://localhost:3333/即可看到Eureka信息面板,如下:

從上圖看到,在"Instances currently registered with Eureka"信息中,沒(méi)有一個(gè)實(shí)例,說(shuō)明目前還沒(méi)有服務(wù)注冊(cè)。
2. 注冊(cè)服務(wù)
基于文章[微服務(wù)系列] 微服務(wù)構(gòu)建框架--Spring Boot中構(gòu)建的第一個(gè)Springboot項(xiàng)目,來(lái)進(jìn)行改造。首先在pom文件中添加Eureka客戶(hù)端相關(guān)的依賴(lài):
<dependencies>
<!---->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Brixton.RS5</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
在之前的TestRestful方法中添加如下代碼,將org.springframework.cloud.client.discovery.DiscoveryClient;對(duì)象注入,并且在日志中打印出與服務(wù)相關(guān)的一些信息。
@RestController
public class TestRestful {
private final Logger logger=Logger.getLogger(getClass());
@Autowired
private DiscoveryClient client;
@RequestMapping(value = "/hello",method = RequestMethod.GET)
public String home(){
ServiceInstance instance=client.getLocalServiceInstance();
logger.info("serviceId"+instance.getServiceId()+"host:post="+instance.getHost()+":"+instance.getPort());
return "hello spring";
}
}
在主類(lèi)上添加@EnableEurekaClient注解以實(shí)現(xiàn)Eureka中的DiscoveryClient實(shí)現(xiàn)。
@EnableEurekaClient
@SpringBootApplication
public class SpringbootdemoApplication {
public static void main(String[] args) {
SpringApplication.run(SpringbootdemoApplication.class, args);
}
}
最后在配置文件application.yml中配置與服務(wù)相關(guān)的一些基本信息,如服務(wù)名、注冊(cè)中心地址(即上一節(jié)中設(shè)置的注冊(cè)中心地址http://localhost:3333/eureka)
# 設(shè)置服務(wù)名
spring:
application:
name: hello-service
# 設(shè)置注冊(cè)中心地址
eureka:
client:
service-url:
defaultZone: http://localhost:3333/eureka
3. 測(cè)試
- 啟動(dòng)注冊(cè)中心服務(wù)
- 啟動(dòng)springbootdemo項(xiàng)目,可以看到如下的信息,說(shuō)明此服務(wù)已經(jīng)注冊(cè)在了注冊(cè)中心

同時(shí)訪問(wèn)http://localhost:3333/可以在Instances currently registered with Eureka中看到已經(jīng)有一個(gè)服務(wù)注冊(cè)了進(jìn)來(lái),并且名稱(chēng)為HELLO-SERVICE的服務(wù)

- 訪問(wèn)http://localhost:8088/hello可以在控制臺(tái)中看到如下日志信息:

五、 小結(jié)
在本章中,主要介紹在微服務(wù)中服務(wù)治理的基本概念,通過(guò)簡(jiǎn)單的實(shí)踐,搭建單節(jié)點(diǎn)服務(wù)注冊(cè)中心,并實(shí)現(xiàn)了服務(wù)的注冊(cè),了解服務(wù)治理的基本工作流程。