文章目錄
一,註冊中心概述
1.1 註冊中心解決了什麼問題?
微服務是不同的服務分佈在不同的主機上,服務跟服務之間可能存在調用關係,那麼之前我們可能是通過硬編碼寫死服務地址的方式來調用其他服務,這樣對於後期服務的新增,服務的重新部署都有很朵不便利的地方,所以註冊中心解決的就是這樣一個問題
1.2 微服務的註冊中心
註冊中心是微服務架構中的通訊錄,記錄了服務和服務地址的映射關係,在分佈式架構中,服務都會註冊到這裏,當服務需要調用其他服務時,就通過註冊中心尋找服務地址,當新增一個服務時,也會將服務地址註冊到註冊中心
簡單調用過程:
所以註冊中心的一大作用就是提供服務的註冊和服務的發現,新增進來的服務在啓動後將自己的服務地址註冊到註冊中心,服務調用者在調用服務時,發現自身服務地址緩存不存在需要的服務時就會向註冊中心去通過服務名獲取所有的服務地址並且緩存,獲取了服務地址後就請求指定地址。
其實說到底,註冊中心就是一個服務名和服務地址相關聯的中心
服務的實例都必須註冊到註冊中心
1.3 常見的註冊中心
- zookeeper
- Eureka
- Consul
- Nacos
二,Eureka
2.1 Eureka基本組成
- Eureka註冊中心
- 提供服務註冊和服務發現
- 服務提供者
- 服務提供方,將自身服務的元數據註冊到Eureka註冊中心,供其他服務發現
- 服務發現者
- 服務消費者,從註冊中心獲取到服務提供者的地址,發起遠程調用
2.2 Eureka服務治理機制
服務提供者:
- 服務註冊:
- 啓動的時候會發送rest請求將自身服務的元數據信息註冊到註冊中心上(元數據信息包括服務名,服務地址等)
- 服務續約:
- 註冊好的服務通過心跳,每30s一次發給註冊中心,來告訴註冊中心,服務還存活着。
- 服務下線:
- 當服務實例進行正常的關閉操作時,它會觸發一個服務下線的REST請求給Eureka Server, 告訴服務註冊中心剔除自己的信息
服務消費者:
- 獲得服務:服務消費者從註冊中心中拉取服務清單,然後在發起遠程調用
服務註冊中心:
- 失效剔除:默認每隔一段時間(默認爲60秒) 將當前清單中超時(默認爲90秒)沒有續約的服務剔除出去。
- 自我保護機制:EurekaServer 在運行期間,會統計心跳失敗的比例在15分鐘之內是否低於85%(通常由於網絡不穩定導致)。 Eureka Server會將當前的實例註冊信息保護起來, 讓這些實例不會過期,儘可能保護這些註冊信息。
整體流程:
- eureka註冊中心先啓動
- eureka客戶端後啓動
- eureka客戶端會將自身信息註冊到eureka服務端
- 在進行服務調用時,eureka客戶端會通過服務別名的方式去eureka服務端(註冊中心)獲取真實的服務調用地址
- 獲取到地址後,eureka會將地址緩存在自身JVM緩存中(30s更新一次),並且通過httpclient去請求遠程服務
2.3 搭建Eureka server
pom.xml
pom文件中導入eureka-server的依賴
<!-- eureka-server -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
配置文件
server:
port: 7777
spring:
application:
name: eureka_server_7777
eureka:
instance:
hostname: localhost
client:
fetch-registry: false # false表示自己就是註冊中心
register-with-eureka: false # false表示不向服務註冊中心註冊自己
service-url:
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
啓動類聲明爲Eureka服務中心
@SpringBootApplication
@EnableEurekaServer //
public class EurekaServer7777 {
public static void main(String[] args) {
SpringApplication.run(EurekaServer7777.class,args);
}
}
查看網頁端圖形管理界面
2.4 搭建Eureka client
引入依賴
<!-- eureka-client -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
配置文件修改
server:
port: 8102
spring:
application:
name: order8102
eureka:
client:
register-with-eureka: true # 向註冊中心註冊自己
fetch-registry: true # true表示自己不是註冊中心
service-url:
defaultZone: http://localhost:7777/eureka/ # eureka服務端地址
啓動類修改
@SpringBootApplication
@EnableEurekaClient //聲明自己是eureka客戶端
public class Order8102 {
public static void main(String[] args) {
SpringApplication.run(Order8102.class,args);
}
}
啓動後查看圖形管理界面
2.5 註冊中心集羣部署
上面搭建的其實是單機版的註冊中心,單機版會存在一個高可用的問題,如果註冊中心掛了,就形成了單點故障,從而導致整體的服務註冊和服務發現不可用,造成整個系統的癱瘓
那解決方法就是搭建eureka服務端的集羣,實現負載均衡和故障容錯
集羣搭建
eureka集羣搭建的原理就是利用eureka無論是客戶端還是服務端都會在啓動時默認註冊自己,成爲一個服務,所以eureka server也是一個客戶端,集羣配置了多個eureka server 讓他們相互註冊,當服務提供者其中一個eureka server註冊時,該eureka server就有擁有了該服務提供者的信息,也會將這個信息共享到其他的eureka server上。那麼當其中一個eureka server掛掉之後,客戶端會根據配置的service url去尋找下一個eureka server
配置地址映射,修改host文件
127.0.0.1 eureka7777.com
127.0.0.1 eureka7778.com
127.0.0.1 eureka7779.com
修改yaml,互相註冊
server:
port: 7779
spring:
application:
name: eureka7779
eureka:
instance:
hostname: eureka7779.com
client:
fetch-registry: false # false表示自己就是註冊中心
register-with-eureka: false # false表示不向服務註冊中心註冊自己
service-url:
defaultZone: http://eureka7777.com:7777/eureka/,http://eureka7778.com:7778/eureka/
到此服務端集羣搭建完畢
客戶端進入集羣
修改下service url即可,配置上所有eureka server的地址
server:
port: 8101
spring:
application:
name: payment8101
eureka:
client:
register-with-eureka: true
fetch-registry: true
service-url:
defaultZone: http://eureka7777.com:7777/eureka/, http://eureka7778.com:7778/eureka/, http://eureka7779.com:7779/eureka/
2.6 Eureka自我保護機制
自我保護機制主要是針對心跳包在出現網絡分區的情況下大部分失敗的情景,一旦進入保護模式,eureka server將會嘗試保護其服務註冊表中的信息,不在刪除服務註冊表中的數據。
出現這段話就是開啓了自我保護機制