在上一篇博客中,咱們介紹了《Spring Cloud 系列(一)Eureka 服務註冊與發現》介紹了 Spring Cloud Eureka
作爲一個服務註冊中心的基本概念與知識。可是上述服務,只適用於單點服務,並不知足咱們在生產環境中的需求。git
在微服務架構的分佈式環境中,咱們須要充分考慮發生故障的狀況,因此在生產環境中,必須對各個組件進行高可用部署。所以,在本篇文章中,咱們主要講解如何改善 Eureka-Server
github
本次咱們目標將服務改善爲如下結構:web
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
複製代碼
maven 依賴與上篇文章並無區別,主要仍是引入spring-cloud-starter-netflix-eureka-server
spring
咱們須要配置高可用的 Eureka-Server
所以,在單機環境下,咱們經過區分 properties-profile
來區分多個服務segmentfault
## 服務應用名稱
spring.applicaiton.name = spring-cloud-eureka-server
## 向註冊中心註冊
eureka.client.register-with-eureka = true
## 向獲取註冊信息
eureka.client.fetch-registry = true
複製代碼
這裏記錄公用屬性,不須要區分服務。bash
在上一篇文章中,咱們將eureka.client.register-with-eureka
和 eureka.client.fetch-registry
都設置成了 false ,避免在單機狀況下將本身註冊到註冊中心中。而在分佈式環境中,咱們須要經過這兩個參數來完成註冊中心的相互關聯服務器
## peer 1 端口 9090
server.port = 9090
## peer 2 主機:localhost , 端口 9091
peer2.server.host = localhost
peer2.server.port = 9091
# Eureka 註冊信息
eureka.client.serviceUrl.defaultZone = http://${peer2.server.host}:${peer2.server.port}/eureka
複製代碼
這裏配置第一臺註冊中心的信息。能夠看到,咱們這裏使用 eureka.client.serviceUrl.defaultZone = http://${peer2.server.host}:${peer2.server.port}/eureka
這個地址來註冊服務,即將本地服務註冊到 peer2 註冊中心中。架構
## 配置 服務器端口
## peer 2 端口 9091
server.port = 9091
## peer 1 主機:localhost , 端口 9090
peer1.server.host = localhost
peer1.server.port = 9090
# Eureka 註冊信息
eureka.client.serviceUrl.defaultZone = http://${peer1.server.host}:${peer1.server.port}/eureka
複製代碼
在啓動類SpringCloudAvaliabilityEurkaApplication
中加入 @EnableEurekaServer
註解app
@SpringBootApplication
@EnableEurekaServer
public class SpringCloudAvaliabilityEurkaApplication {
public static void main(String[] args) {
SpringApplication.run(SpringCloudAvaliabilityEurkaApplication.class, args);
}
}
複製代碼
在Run Configurations 中設置啓動參數,而且啓動多個實例 maven
啓動結果:
咱們能夠留意如下這部份內容:
能夠看到,註冊中心的副本爲 咱們的 peer2
服務
接下來咱們改造 Eureka-Client
服務,註冊到高可用的註冊中心中
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<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-test</artifactId>
<scope>test</scope>
</dependency>
複製代碼
## 服務名稱
spring.application.name = spring-cloud-eureka-client
server.port = 8083
## 配置鏈接 Eureka 服務器
eureka.client.serviceUrl.defaultZone = http://localhost:9090/eureka,http://localhost:9091/eureka
## 調整獲取全部應用元信息間隔時間
eureka.client.registryFetchIntervalSeconds = 5
## 調整應用元信息間隔時間
eureka.client.instanceInfoReplicationIntervalSeconds = 5
複製代碼
這裏設置多個Eureka 服務器經過,
分隔,主要能夠參考 EurekaClientConfigBean
中:
public List<String> getEurekaServerServiceUrls(String myZone) {
String serviceUrls = this.serviceUrl.get(myZone);
if (serviceUrls == null || serviceUrls.isEmpty()) {
serviceUrls = this.serviceUrl.get(DEFAULT_ZONE);
}
if (!StringUtils.isEmpty(serviceUrls)) {
final String[] serviceUrlsSplit = StringUtils.commaDelimitedListToStringArray(serviceUrls);
List<String> eurekaServiceUrls = new ArrayList<>(serviceUrlsSplit.length);
for (String eurekaServiceUrl : serviceUrlsSplit) {
if (!endsWithSlash(eurekaServiceUrl)) {
eurekaServiceUrl += "/";
}
eurekaServiceUrls.add(eurekaServiceUrl);
}
return eurekaServiceUrls;
}
return new ArrayList<>();
}
複製代碼
源碼地址:https://github.com/jaycekon/Spring-Cloud
參考: https://juejin.im/post/5b65479a6fb9a04fe11b0143
http://blog.didispace.com/springcloud6/
https://segmentfault.com/ls/1650000011386794