服務(wù)治理
服務(wù)治理是微服務(wù)架構(gòu)中最為核心和基礎(chǔ)的模塊。它主要用來實現(xiàn)各個微服務(wù)實例的自動化注冊與發(fā)現(xiàn)戒悠。隨著服務(wù)的越來越多舞虱,越來越雜,服務(wù)之間的調(diào)用會越來越復雜,越來越難以管理凉袱。而當某個服務(wù)發(fā)生了變化闷板,或者由于壓力性能問題,多部署了幾臺服務(wù)蛹头,怎么讓服務(wù)的消費者知曉變化顿肺,就顯得很重要了戏溺。不然就會存在調(diào)用的服務(wù)其實已經(jīng)下線了,但調(diào)用者不知道等異常情況挟冠。這個時候有個服務(wù)組件去統(tǒng)一治理就相當重要了于购。Eureka便是服務(wù)治理的組件。
Eureka介紹
Eureka包含Server和Client兩部分知染。Server也稱為注冊中心肋僧,用于提供服務(wù)的注冊與發(fā)現(xiàn)(服務(wù)注冊是指微服務(wù)在啟動時,將自己的信息注冊到服務(wù)治理組件上的過程控淡,服務(wù)發(fā)現(xiàn)是指查詢可用微服務(wù)列表及其網(wǎng)絡(luò)地址的機制嫌吠。)。支持高可用配置掺炭,依托與強一致性提供良好的服務(wù)實例可用性辫诅,可以應對多種不同的故障場景。
Client主要處理服務(wù)的注冊與發(fā)現(xiàn)涧狮;客戶端服務(wù)通過注解和參數(shù)配置方式炕矮,嵌入在客戶端的應用程序代碼中,在應用程序啟動時者冤,向注冊中心注冊自身提供的服務(wù)并周期性地發(fā)送心跳來更新它的服務(wù)租約肤视。同時,它也能從服務(wù)端查詢當前注冊的服務(wù)信息并把它們緩存到本地并周期性地刷新服務(wù)狀態(tài)涉枫。
創(chuàng)建Eureka服務(wù)端
1.創(chuàng)建一個springboot工程邢滑,導入依賴:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
2.配置
spring.application.name=eureka-service
# 修改端口
server.port=8180
# 實例的主機名稱
eureka.instance.hostname=localhost
## 不要向注冊中心注冊自己
eureka.client.register-with-eureka=false
## 表示不去檢索其他的服務(wù),因為服務(wù)注冊中心本身的職責就是維護服務(wù)實例愿汰,它也不需要去檢索其他服務(wù)
eureka.client.fetch-registry=false
# 指定服務(wù)注冊中心地址 這里直接指向了本服務(wù) localhost:8180/eureka/
# map對象困后,使用IDE的提示功能是不會出現(xiàn) 注意大小寫
eureka.client.service-url.defaultZone=http://${eureka.instance.hostname}:${server.port}/eureka/
3.啟動類上添加注解@EnableEurekaServer
EnableEurekaServer
@SpringBootApplication
public class SpringcloudApplication {
public static void main(String[] args) {
SpringApplication.run(SpringcloudApplication.class, args);
}
}
啟動項目后訪問 http://localhost:8180/ 就能看到注冊中心界面了
創(chuàng)建Eureka客戶端
Eureka客戶端,其實就是服務(wù)的提供方衬廷,對外提供服務(wù)的應用摇予。
1.創(chuàng)建一個springboot項目,導入依賴
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
// 寫一個接口方便測試
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
2.配置
spring.application.name=eureka-client
server.port=8080
# 注冊中心地址
eureka.client.service-url.defaultZone=http://localhost:8180/eureka
# 啟用ip配置 這樣在注冊中心列表中看見的是以ip+端口呈現(xiàn)的
eureka.instance.prefer-ip-address=true
# 實例名稱 最后呈現(xiàn)地址:ip:8080
eureka.instance.instance-id=${spring.cloud.client.ip-address}:${server.port}
3.啟動類加入注解@EnableEurekaClient (也可使用 @EnableDiscoveryClient)
@EnableEurekaClient
@SpringBootApplication
public class MsetApplication {
public static void main(String[] args) {
SpringApplication.run(MsetApplication.class, args);
}
}
4.寫個接口
RestController
public class TestController {
@GetMapping("/")
public String index(){
return "sss";
}
}
啟動應用吗跋,再次訪問:http://localhost:8180/ 趾盐,可以看見服務(wù)已經(jīng)注冊成功。
Eureka自我保護模式
默認情況下小腊,如果Eureka Server在一定時間內(nèi)沒有接收到某個微服務(wù)實例的心跳救鲤,Eureka Server將會注銷該實例(默認90秒)。但是當網(wǎng)絡(luò)分區(qū)故障發(fā)生時秩冈,微服務(wù)與Eureka Server之間無法正常通信本缠,這就可能變得非常危險了,因為微服務(wù)本身是健康的入问,此時本不應該注銷這個微服務(wù)丹锹。
Eureka Server通過“自我保護模式”來解決這個問題稀颁,當Eureka Server節(jié)點在短時間內(nèi)丟失過多客戶端時(可能發(fā)生了網(wǎng)絡(luò)分區(qū)故障),那么這個節(jié)點就會進入自我保護模式楣黍。一旦進入該模式匾灶,Eureka Server就會保護服務(wù)注冊表中的信息,不再刪除服務(wù)注冊表中的數(shù)據(jù)(也就是不會注銷任何微服務(wù))租漂。當網(wǎng)絡(luò)故障恢復后阶女,該Eureka Server節(jié)點會自動退出自我保護模式。
可以通過配置:eureka.server.enable-self-preservation=false關(guān)閉自我保護模式哩治。
springcloud官方文檔:http://cloud.spring.io/spring-cloud-static/Finchley.RELEASE/single/spring-cloud.html#_appendix_compendium_of_configuration_properties