SpringCloud--Eureka註冊中心
----------------------目錄------------------------------
一、主流伺服器中心對比
二、Eureka服務
1、單例Eureka Server服務註冊中心
2、高可用叢集服務註冊中心
三、Eureka客戶端註冊服務提供者
四、Eureka客戶端消費(呼叫)服務
五、Eureka配置優化
----------------------目錄------------------------------
一、主流服務中⼼對⽐
1、Zookeeper
Zookeeper它是⼀個分散式服務框架,是Apache Hadoop 的⼀個⼦項⽬,它主要是⽤來解決分散式應 ⽤中經常遇到的⼀些資料管理問題,如:統⼀命名服務、狀態同步服務、叢集管理、分散式應⽤配置項的管理等。簡單來說zookeeper本質=儲存+監聽通知
Zookeeper ⽤來做服務註冊中⼼,主要是因為它具有節點變更通知功能,只要客戶端監聽相關服務節點,服務節點的所有變更,都能及時的通知到監聽客戶端,這樣作為調⽤⽅只要使⽤Zookeeper 的客戶端就能實現服務節點的訂閱和變更通知功能了,⾮常⽅便。另外,Zookeeper可⽤性也可以,因為只要半數以上的選舉節點存活,整個叢集就是可⽤的。
2、Eureka
由Netflflix開源,並被Pivatal整合到SpringCloud體系中,它是基於 RestfulAPI ⻛格開發的服務註冊與發現元件。3、Consul
Consul是由HashiCorp基於Go語⾔開發的⽀持多資料中⼼分散式⾼可⽤的服務釋出和註冊服務軟體, 採⽤Raft演算法保證服務的⼀致性,且⽀持健康檢查。4、Nacos
Eureka 包含兩個元件:Eureka Server 和 Eureka Client,Eureka Client是⼀個Java客戶端,⽤於簡化與Eureka Server的互動;Eureka Server提供服務發現的能⼒,各個微服務啟動時,會通過Eureka Client向Eureka Server 進⾏註冊⾃⼰的資訊(例如⽹絡資訊),Eureka Server會儲存該服務的資訊;
1、單例Eureka Server服務註冊中心
第一步、建立父專案,在專案中引入一下依賴,目的是統一Springboot的版本管理,子專案引用不需要指定版本號,注意官方的springcloud與springboot版本的關係。<dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Greenwich.RELEASE</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement>
第二步、檢測Jdk版本,jdk9版本以後需要在父專案pom中引入jaxb的依賴jar,原因是jdk9以後預設不載入jaxb模組,EurekaServer啟動使用到該依賴,否則報錯
<!--引⼊Jaxb,開始--> <dependency> <groupId>com.sun.xml.bind</groupId> <artifactId>jaxb-core</artifactId> <version>2.2.11</version> </dependency> <dependency> <groupId>javax.xml.bind</groupId> <artifactId>jaxb-api</artifactId> </dependency> <dependency> <groupId>com.sun.xml.bind</groupId> <artifactId>jaxb-impl</artifactId> <version>2.2.11</version> </dependency> <dependency> <groupId>org.glassfish.jaxb</groupId> <artifactId>jaxb-runtime</artifactId> <version>2.2.10-b140310.1920</version> </dependency> <dependency> <groupId>javax.activation</groupId> <artifactId>activation</artifactId> <version>1.1.1</version> </dependency> <!--引⼊Jaxb,結束-->View Code
第三步、在EurekaServer專案中配置依賴
<dependencies> <!--Eureka server依賴--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId> </dependency> </dependencies>
第四步、配置application.yml或者application.properties配置檔案,以下為yml版本配置
#Eureka server服務端⼝ server: port: 8761 spring: application: #應⽤名稱,會在Eureka中作為服務的id標識(serviceId) name: lagou-cloud-eureka-server eureka: instance: hostname: localhost client: #客戶端與EurekaServer互動的地址,如果是叢集,也需要寫其它Server的地址 service-url: defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/ # ⾃⼰就是服務不需要註冊⾃⼰ register-with-eureka: false #⾃⼰就是服務不需要從Eureka Server獲取服務資訊,預設為true,置為false fetch-registry: false
第五步、啟動程式碼中新增@EnableEurekaServer
註解
package city.albert; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer; /** * @author niunafei * @function * @email [email protected] * @date 2020/9/3 4:42 PM * <b></> * @EnableEurekaServer 宣告本項⽬是⼀個Eureka服務 */ @SpringBootApplication @EnableEurekaServer public class EurekaServerApplication { public static void main(String[] args) { SpringApplication.run(EurekaServerApplication.class, args); } }
第六步、啟動專案訪問http://127.0.0.1:8761
注意:
EMERGENCY! EUREKA MAY BE INCORRECTLY CLAIMING INSTANCES ARE UP WHEN THEY'RE NOT. RENEWALS ARE LESSER THAN THRESHOLD AND HENCE THE INSTANCES ARE NOT BEING EXPIRED JUST TO BE SAFE.
如果EurekaServer在一定時間內沒有接收到某個微服務例項的心跳時,EurekaServer將會登出該例項(預設90s)。但是當網路發生故障時,微服務與EurekaServer之間無法通訊,這樣就會很危險了,因為微服務本身是很健康的,此時就不應該登出這個微服務,而Eureka通過自我保護機制來預防這種情況,當網路健康後,該EurekaServer節點就會自動退出自我保護模式;
eureka:
server:
enable-self-preservation: false # 關閉⾃我保護模式(預設為開啟),生產環境建議開啟
2、高可用叢集服務註冊中心
高可用叢集服務中Eureka相對來說比較簡單,僅僅需要修改配置檔案即可,注意配置如下:#Eureka server服務端⼝ server: port: 8761 spring: application: #應⽤名稱,會在Eureka中作為服務的id標識)叢集中需要保持相同 name: lagou-cloud-eureka-server eureka: instance:
#在叢集模式中hostname要保持唯一 hostname: 唯一服務名 client: #客戶端與EurekaServer互動的地址,叢集模式下,也需要寫其它 http://Server其他服務地址:其他服務埠/eureka,如果多個服務需要使用逗號分隔 service-url: defaultZone: http://其他服務ip或域名:其他服務埠/eureka/,http://其他服務ip或域名:其他服務埠/eureka/
# 叢集模式下需要向euraka進行註冊,應為true
register-with-eureka: true
#叢集模式下需要從伺服器獲取註冊服務的資訊,應該為true
fetch-registry: true
三、Eureka客戶端註冊服務提供者
第一步:在父pom中引入下面依賴
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-commons</artifactId> </dependency>
第二步:在服務提供者中新增eureka客戶端依賴
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency>
第三步:配置服務提供者配置檔案
eureka:
client:
#eureka server的路徑
serviceUrl:
#註冊單例項只需要寫一臺伺服器即可
#叢集模式下,也需要寫其它 http://Server其他服務地址:其他服務埠/eureka,如果多個服務需要使用逗號分隔
defaultZone: http://127.0.0.1:8761/eureka/
instance:
#使⽤ip註冊,否則會使⽤主機名註冊了(此處考慮到對⽼版本的相容,新版本經過實驗都是ip)
prefer-ip-address: true
#⾃定義例項顯示格式,加上版本號,便於多版本管理,注意是ip-address,早期版本是ipAddress
instance-id: ${spring.cloud.client.ip-address}:${spring.application.name}:${server.port}:@project.version@
第四步:在啟動類上新增服務註解
注意以下註解可以不新增,也可以同時新增,推薦新增@EnableDiscoveryClient註解即可
@EnableDiscoveryClient (推薦)//開啟註冊中心客戶端
@EnableEurekaClient //開啟eureka客戶端,eureka獨有客戶端
第五步:啟動觀察註冊成功
四、Eureka客戶端消費(呼叫)服務
前四步與“三、Eureka客戶端註冊服務提供者”中的相同,
第五步是注入DiscoveryClient客戶端物件,然後進行操作獲取客戶端調取方式極客其中ServiceInstance物件中的元資料為一下資訊
五、Eureka配置優化
1、Eureka的元資料
Eureka的元資料有兩種:標準元資料和⾃定義元資料。上面配圖為標準的元資料,下面自定義元資料為Key-Value形式(在服務提供端進行配置)ServiceInstance物件中的metadata中展現形式如下