1. 程式人生 > >四、Spring cloud之服務發現/註冊(Eureka)

四、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,去找配置伺服器,這樣更加靈活)