Spring cloud微服務架構服務註冊與發現Eureka

Spring cloud微服務架構服務註冊與發現Eureka

前言

對於微服務架構,相信大家都不陌生。隨著互聯網的發展,網站應用的規模不斷擴大,常規的垂直應用架構已無法應對,在不斷應對日益增長的業務量而演化出來的微服務。當網站流量很小時,只需一個應用,將所有功能都部署在一起,以減少部署節點和成本。垂直應用架構當訪問量逐漸增大,單一應用增加機器帶來的加速度越來越小,將應用拆成互不相干的幾個應用,以提升效率。服務註冊與發現是服務治理的一個非常必要環節,這裡可能又引出一個問題,為什麼需要服務治理。

Spring cloud微服務架構服務註冊與發現Eureka

在大規模服務化之前,應用可能只是通過RMI或Hessian等工具,簡單的暴露和引用遠程服務,通過配置服務的URL地址進行調用,通過F5等硬件進行負載均衡。

(1) 當服務越來越多時,服務URL配置管理變得非常困難,F5硬件負載均衡器的單點壓力也越來越大。

此時需要一個服務註冊中心,動態的註冊和發現服務,使服務的位置透明。

並通過在消費方獲取服務提供方地址列表,實現軟負載均衡和Failover,降低對F5硬件負載均衡器的依賴,也能減少部分成本。

(2) 當進一步發展,服務間依賴關係變得錯蹤複雜,甚至分不清哪個應用要在哪個應用之前啟動,架構師都不能完整的描述應用的架構關係。

這時,需要自動畫出應用間的依賴關係圖,以幫助架構師理清理關係。

(3) 接著,服務的調用量越來越大,服務的容量問題就暴露出來,這個服務需要多少機器支撐?什麼時候該加機器?

為了解決這些問題,第一步,要將服務現在每天的調用量,響應時間,都統計出來,作為容量規劃的參考指標。

Spring cloud是服務治理的一個框架,裡面包含很多子項目,其中包含config,Netflix,consul,OpenFeign 等等,其中在微服務架構用的最多應該是Netflix的服務發現(Eureka),斷路器(Hystrix),智能路由(Zuul),負載均衡(Ribbon)等

Eureka Server(註冊中心服務端)

首先我們新建一個註冊中心服務,新建一個maven的parent應用,pom引入如下


<dependencies>
<dependency>
<groupid>org.springframework.boot/<groupid>
<artifactid>spring-boot-starter/<artifactid>
/<dependency>
<dependency>
<groupid>org.springframework.boot/<groupid>
<artifactid>spring-boot-starter-test/<artifactid>
<scope>test/<scope>
/<dependency>
/<dependencies>
<dependencymanagement>
<dependencies>
<dependency>
<groupid>org.springframework.cloud/<groupid>
<artifactid>spring-cloud-dependencies/<artifactid>
<version>${spring-cloud.version}/<version>
<type>pom/<type>
<scope>import/<scope>
/<dependency>
/<dependencies>
/<dependencymanagement>

我們用較新的 Spring boot 2.1.9.RELEASE 和Spring cloud Greenwich.SR3

新建Eureka-server模塊,pom引入

<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>

配置文件application.yml 如下:

server:
port: 8761
eureka:
instance:
hostname: localhost
client:
registerWithEureka: false
fetchRegistry: false
serviceUrl:
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/

Eureka啟動註冊中心,只需要EnableEurekaServer註解就可以標註為是Eureka Server,啟動類如下:


@SpringBootApplication
@EnableEurekaServer
public class EurekaServerApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaServerApplication.class, args);
}
}

完成上面幾步,註冊中心服務就已經做好了,啟動之後,訪問

http://localhost:8761/ 會出現如下頁面

Spring cloud微服務架構服務註冊與發現Eureka

你的註冊中心就已經起來了。

關於註冊中心的application.yml 的配置有幾點需要說明:

eureka.instance.hostname

這是當前eureka server 主機的hostname,當然,很多情況下,我們更希望用ip代替hostname,可以在application.yml文件中將eureka.instance.preferIpAddress 設置為true,這樣就可以使用ip作為hostname了。

eureka.client下面的 registerWithEureka,fetchRegistry,defaultZone

由於Eureka server 是沒有後端服務區存儲它的狀態,但是Eureka server也必須得有地方記錄Eureka server 的狀態以保證它的註冊信息是最新的,Eureka server也發必須發心跳檢查給註冊中心。但Eureka server本身也是註冊中心,這是怎麼回事呢?

在默認情況下,每個Eureka server 既是註冊中心的server 也是client。所以它需要serviceUrl來發送它的註冊信息。如果沒有提供這個url,日誌會一直報註冊連接失敗的信息。

在單個eureka-server 的情況下,它既是 server,又是client,server和client的cache互相組合,互相發心跳。在只有個eureka-server的情況下,server作為client是沒有意義的,所以我們的把client端屬性去掉,所以把 registerWithEureka 和 fetchRegistry 設置為false以關掉它作為eureka client 的行為。

Eureka client(註冊中心客戶端)

新建Eureka client模塊,在pom引入

<dependencies>
<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-web/<artifactid>
/<dependency>
<dependency>
<groupid>org.springframework.boot/<groupid>
<artifactid>spring-boot-starter-test/<artifactid>

<scope>test/<scope>
/<dependency>
/<dependencies>

新建啟動類,在新版本中其實並不需要加上EnableEurekaClient註解,出於習慣還是加上

pringBootApplication
@EnableEurekaClient
public class EurekaClientApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaClientApplication.class, args);
}
}

application.yml 文件配置

server:
port: 8764
spring:
application:
name: eureka-client
eureka:
client:
serviceUrl:
defaultZone: http://eureka-server1:8761/eureka/

完成上面三步,eureka 客戶端建好,啟動之後會默認把數據發送到註冊中心,我們可看到

Spring cloud微服務架構服務註冊與發現Eureka

注意:

spring.application.name 必須配置,在註冊中心裡是以 spring.application.name,虛擬host,端口來區分不同的環境

eureka 客戶端註冊

當一個客戶端註冊到註冊中心時,會把該應用的一些元數據,如ip,端口,健康檢查url,home page等等一些發送到註冊。註冊中心通過心跳接收消息來確定每個應用是否還活著,如果超過配置的時間沒有心跳,則將該應用從註冊中心移出。

eureka 健康檢查

eureka client健康檢查的 status page 和 health indicators 分別是 /info 和 /health ,這是eureka 客戶端啟動時候默認幫我們配置好的,如果需要改變這個地址,或者你的應用的上下文不是默認的,則需要改這些配置型

eureka:
instance:
statusPageUrlPath: ${server.servletPath}/info
healthCheckUrlPath: ${server.servletPath}/health

在默認情況下,客戶端成功啟動註冊到註冊中心,註冊中心會宣佈改實例是可用的,然後通過心跳該實例的運行狀態。同時,客戶也會緩存一份註冊中心的數據到自己的實例中。如果不想客戶端做心跳的話,可以用 eureka.client.healthcheck.enabled=true 設置,心跳的時間週期默認是 30s,也可以修改心跳週期,通eureka.instance.leaseRenewalIntervalInSeconds,

DiscoveryClient

在 eureka client 中還可以使用DiscoveryClient 從註冊中心操作數據,例如

@Autowired
private DiscoveryClient discoveryClient;
public String serviceUrl() {
List<serviceinstance> list = discoveryClient.getInstances("STORES");
if (list != null && list.size() > 0 ) {
return list.get(0).getUri();
}
return null;
}
/<serviceinstance>

Eureka 高可用服務註冊中心

在前面的例子中,單個eureka-server存在著單點行為,顯然不符合微服務架構中的高可用原則。eureka可以做到更加的彈性伸縮高可用,通過運行多個 eureka-server實例,並它們互相註冊。這是eureka 默認的行為,eureka並不建議單個server使用,除非是測試。我們只需要添加一個有效的serviceUrl就可以做到高可用。

雙 Eureka server

在本地測試雙Eureka Server,我們需要新建兩份配置文件(在生產真實機器情況下並不需要這樣做)

application-peer1.yml

server: 

port: 8761
eureka:
instance:
hostname: eureka-server1
client:
serviceUrl:
defaultZone: http://eureka-server2:8762/eureka/

application-peer2.yml

server:
port: 8762
eureka:
instance:
hostname: eureka-server2
client:
serviceUrl:
defaultZone: http://eureka-server1:8761/eureka/

分別以這兩份配置文件啟動,則雙註冊中心建好。

多個 Eureka server

一般情況下我們會建三個以上的註冊中心做高可用,各個註冊中心互聯連接,它們之間互相同步註冊中心的信息,同樣的道理,我們需要在本地測試新建三個測試yml文件。

application-peer1.yml

server:
port: 8761
eureka:
instance:
hostname: eureka-server1
client:
serviceUrl:
defaultZone: http://eureka-server2:8762/eureka/https://eureka-server1:8761/eureka/,http://eureka-server2:8762/eureka/,http://eureka-server3:8763/eureka/

application-peer2.yml

server:
port: 8762
eureka:
instance:
hostname: eureka-server2
client:
serviceUrl:
defaultZone: http://eureka-server2:8762/eureka/https://eureka-server1:8761/eureka/,http://eureka-server2:8762/eureka/,http://eureka-server3:8763/eureka/

application-peer3.yml

server:
port: 8762
eureka:
instance:
hostname: eureka-server2
client:
serviceUrl:
defaultZone: http://eureka-server2:8762/eureka/https://eureka-server1:8761/eureka/,http://eureka-server2:8762/eureka/,http://eureka-server3:8763/eureka/

分別以這三份配置文件啟動,則三註冊中心建好。


分享到:


相關文章: