四、Spring cloud之服務發現/註冊(Eureka)
一、Spring Cloud Eureka
(一)Eureka伺服器
Eureka Server 是 Eureka Client 的註冊服務中心,管理所有註冊服務、以及其例項資訊和狀態。
1、引入Maven依賴
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
2、啟用Eureka伺服器
@EnableEurekaServer
/**
* 啟用 EurekaServer
*/
@EnableEurekaServer
@SpringBootApplication
public class EurekaServerApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaServerApplication.class, args);
}
}
3、調整Eureka伺服器配置
application.properties
# Spring Cloud Eureka 伺服器應用名稱 spring.application.name=spring-cloud-eureka-server # Spring Cloud Eureka 伺服器服務埠 server.port=9090 management.server.port=9091 management.endpoints.web.exposure.include=* management.endpoints.web.base-path=/
4、檢驗Eureka Server
異常堆疊資訊
2018-11-02 22:07:46.253 ERROR 8792 --- [ main] c.n.d.s.t.d.RedirectingEurekaHttpClient : Request execution error
com.sun.jersey.api.client.ClientHandlerException: java.net.ConnectException: Connection refused: connect
異常原因:Eureka Server既是註冊伺服器,也是客戶端。預設情況,也需要配置註冊中心地址。
5、再次調整Eureka伺服器配置(解決異常的方法)
# Spring Cloud Eureka 伺服器應用名稱
spring.application.name=spring-cloud-eureka-server
# Spring Cloud Eureka 伺服器服務埠
server.port=9090
management.server.port=9091
management.endpoints.web.exposure.include=*
management.endpoints.web.base-path=/
management.endpoint.health.show-details=always
#Spring Cloud Eureka 伺服器作為註冊中心
# 通常情況下,不需要再註冊到其他註冊中心
# 同時,它不需要湖區客戶端資訊
#非叢集模式下,需要配置 register-with-eureka 和 fetch-registry
#取消向註冊中心註冊
eureka.client.register-with-eureka=false
#取消向註冊中心獲取註冊資訊(服務、例項資訊)
eureka.client.fetch-registry=false
(二)Eureka客戶端
Eureka Client 為當前服務提供註冊、同步、查詢服務以及其例項資訊或狀態等能力。
1、引入Maven依賴
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
2、啟用Eureka客戶端
@EnableEurekaClient 或者 @EnableDiscoveryClient(二選一)
/**
* 啟用 Eureka 客戶端
*/
@EnableEurekaClient
@SpringBootApplication
public class EurekaClientApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaClientApplication.class, args);
}
}
3、調整Eureka客戶端配置
application.properties
# Spring Cloud Eureka 客戶端應用名稱
spring.application.name=spring-cloud-eureka-client
# Spring Cloud Eureka 客戶端服務埠
server.port=8080
management.server.port=8081
management.endpoints.web.exposure.include=*
management.endpoints.web.base-path=/
4、檢驗Eureka 客戶端
異常堆疊資訊
PS:和 Eureka 服務端 啟動異常相同!
2018-11-02 22:07:46.253 ERROR 8792 --- [ main] c.n.d.s.t.d.RedirectingEurekaHttpClient : Request execution error
com.sun.jersey.api.client.ClientHandlerException: java.net.ConnectException: Connection refused: connect
5、再次調整Eureka客戶端配置(解決異常的方法)
# Spring Cloud Eureka 客戶端應用名稱
spring.application.name=spring-cloud-eureka-client
# Spring Cloud Eureka 客戶端服務埠
server.port=8080
management.server.port=8081
management.endpoints.web.exposure.include=*
management.endpoints.web.base-path=/
#Spring Cloud Eureka 客戶端 註冊到 Eureka 伺服器
#Eureka 服務端的URI/eureka
eureka.client.service-url.defaultZone=http://localhost:9090/eureka
(三)配置 Eureka 客戶端 Actuator 端點
1、調整狀態頁面
#調整狀態頁面(PS:Eureka 伺服器會定時請求這個URI,檢查Eureka 客戶端的狀態,這裡我們自定義一個連結,StatusController)
#注意:這裡要採用自定義連結的話,Actuator 端點的埠必須保持和客戶端應用埠一致
eureka.instance.status-page-url-path=/status
2、調整健康檢查頁面
#調整健康檢查頁面
eureka.instance.health-check-url-path=/health
3、調整主頁(同上)
(四)客戶端配置API
1、Eureka 客戶端配置 API(配置客戶端的一些基本資訊)
EurekaClientConfigBean
2、Eureka 例項配置 API(配置 調整狀態頁面 相關的資訊)
EurekaInstanceConfigBean
二、Spring Cloud Config 和 Eureka 整合
(一)調整 spring-cloud-config-server 作為 Eureka 的客戶端
1、引入Maven依賴
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
2、啟用Eureka客戶端
@EnableEurekaClient 或者 @EnableDiscoveryClient(二選一)
/**
* 註解:@EnableConfigServer,啟用配置服務端
* 註解:@EnableEurekaClient,啟用Eureka客戶端
*/
@SpringBootApplication
@EnableEurekaClient
@EnableConfigServer
public class ConfigServerApplication {
public static void main(String[] args) {
SpringApplication.run(ConfigServerApplication.class, args);
}
}
3、調整 spring-cloud-config-server 配置
application.properties
# Spring Cloud Eureka 客戶端應用名稱
spring.application.name=spring-cloud-config-server
#配置伺服器遠端 git 倉庫(GitHub)
spring.cloud.config.server.git.uri=https://github.com/pc-nju/spring-cloud-config.git
#強制拉取 git 內容
spring.cloud.config.server.git.force-pull=true
# Spring Cloud Eureka 客戶端服務埠
server.port=7070
management.endpoints.web.exposure.include=*
management.endpoints.web.base-path=/
management.endpoint.health.show-details=always
eureka.instance.status-page-url-path=/health
#Spring Cloud Eureka 客戶端 註冊到 Eureka 伺服器
#Eureka 服務端的URI/eureka
eureka.client.service-url.defaultZone=http://localhost:9090/eureka
(二)調整 spring-cloud-eureka-client 成為 Spring Cloud Config Client(配置客戶端)
1、引入Maven依賴
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
2、ClassPath 下建立 bootstrap.properties,並配置 Config 客戶端
#配置 客戶端應用 關聯的 應用(通過該選項與 服務端 相連)
# spring.cloud.config.name 是可選的,若未配置,採用 ${spring.application.name}
spring.cloud.config.name=myapplication
#關聯 profile
spring.cloud.config.profile=prod
#關聯 label
spring.cloud.config.label=master
#配置 Config 配置伺服器URI
#啟用 Config 伺服器發現
spring.cloud.config.discovery.enabled=true
#配置 Config 伺服器的引用名稱(service-id)
spring.cloud.config.discovery.service-id=spring-cloud-config-server
3、檢驗效果
啟動發現,spring-cloud-config-server 服務無法找到,原因如下:
注意:
如果當前應用需要提前獲取應用資訊,那麼需要將 Eureka 客戶端 註冊到 Eureka 伺服器配置項“eureka.client.service-url.defaultZone”提前至 bootstrap.properties檔案。
原因:
我們在配置Config 伺服器的應用名稱時,實質是 Eureka 客戶端在 Eureka 伺服器中通過應用名稱,找到對應的 Config 伺服器,所以前提是,必須先將 Eureka 客戶端 註冊到 Eureka伺服器。而bootstrap 上下文是 Spring Boot 上下文的父上下文,它是最先載入的,所以需要將“eureka.client.service-url.defaultZone”配置項放到bootstrap.properties中。
4、將eureka.client.service-url.defaultZone
配置項由application.properties
轉至bootstrap.propertiess
調整後的bootstrap.properties
如下:
#Spring Cloud Eureka 客戶端 註冊到 Eureka 伺服器
#Eureka 服務端的URI/eureka
eureka.client.service-url.defaultZone=http://localhost:9090/eureka
#配置 客戶端應用 關聯的 應用(通過該選項與 服務端 相連)
# spring.cloud.config.name 是可選的,若未配置,採用 ${spring.application.name}
spring.cloud.config.name=myapplication
#關聯 profile
spring.cloud.config.profile=prod
#關聯 label
spring.cloud.config.label=master
#啟用 Config 伺服器發現
spring.cloud.config.discovery.enabled=true
#配置 Config 伺服器的應用名稱(service-id,注意這裡其實是 Eureka 客戶端在 Eureka 伺服器中通過
# 應用名稱,找到對應的 Config 伺服器,所以前提是,必須先將 Eureka 客戶端 註冊到 Eureka 伺服器。
# 而bootstrap 上下文是 Spring Boot 上下文的父上下文,它是最先載入的,所以需要將
# “eureka.client.service-url.defaultZone”配置項放到bootstrap.properties)
spring.cloud.config.discovery.service-id=spring-cloud-config-server
5、再次檢驗效果
訪問http://localhost:8080/env,即可發現讀取了遠端 git 倉庫中的配置檔案:
{
"name": "configService:configClient",
"properties": {
"config.client.version": {
"value": "76ad01e6c20aa2f60613eff2fd06aa902f8143e7"
}
}
}, {
"name": "configService:https://github.com/pc-nju/spring-cloud-config.git/myapplication-prod.properties",
"properties": {
"name": {
"value": "myapplication.com"
},
"my.user.id": {
"value": "1111111"
},
"my.user.name": {
"value": "nb"
}
}
}, {
"name": "configService:https://github.com/pc-nju/spring-cloud-config.git/myapplication.properties",
"properties": {
"name": {
"value": "myapplication"
}
}
},
三、Spring Cloud Config Server 、 Eureka Client 和 Eureka Server 整合之後的資料模型
1、首先建立一個Eureka Server
2、然後建立一個 Config Server,並將 Config Server改造成一個Eureka Client,然後將其註冊到Eureka Server
3、最後,建立一個Eureka Client,同時將其改造成一個 Config Client,然後將其註冊到 Eureka Server。所以這個應用,既是 Eureka 客戶端,又是 Config 客戶端
4、Eureka Client 通過 Config 伺服器應用名(service-id),去 Eureka Server 找到配置伺服器,從而讀取遠端配置。(有別於三、Spring cloud之伺服器配置和客戶端配置中 Config Client 通過具體的ip,去找配置伺服器,這樣更加靈活)