Spring Cloud Eureka

服務治理

服務治理是微服務架構中最爲核心和基礎的模塊,它主要用來實現各個微服務實例的自動化註冊和發現。
在微服務架構體系中,每個服務都是相對獨立的,包括其部署、擴展和升級,都不應和其他服務產生耦合。但是微服務之間是無法避免業務關係的,也就是說服務之間需要互相調用。對於Restful接口而言,服務A要調用服務B的接口,必須知道具體的url,這樣服務A就必須與服務B的部署位置產生依賴關係。另一方面,爲了實現服務B的高可用,不論採用服務端負載均衡還是客戶端負載均衡,都需要手工維護服務B的實例列表。
爲了解決微服務架構中的服務實例維護問題,產生了大量的服務治理框架和產品。服務治理的功能主要有一下幾點:

  • 對開發新服務和升級現有服務的計劃管理服務的生命週期;
  • 確保升級服務不會影響目前的服務消費者制定方針來限制服務行爲;
  • 制定所有服務都要遵從的規則,確保服務的一致性監控服務的性能;
  • 由於服務組合,服務停機和性能低下的後果是嚴重的。通過監控服務的性能和可用性,當問題出現的時候能馬上採取應對措施;
  • 管理由誰來調用服務、怎樣調用服務

服務註冊

在服務治理框架中,通常需要一個註冊中心。每個服務想註冊中心登記自己提供的服務,將服務的位置、調用方式等告知註冊中心。註冊中心會按服務名分類組織分類清單。另外服務註冊中心還需定時監控清單中的服務的健康狀態,及時剔除不可用的實例。

服務發現

在服務治理框架下,服務之間的調用不在依賴於服務的具體位置(如ip:port),而是通過服務名調用,從而將服務的部署從微服務的調用中解決關聯。通過服務名調用,還可以方便地實現負載均衡。由於服務註冊,我們有一份清單可以找到某個服務的具體實例,若是服務不止一個實例,我們可以很方便地動態選擇服務的實例進行調用,從而實現負載均衡。這也有利於服務的橫向擴展,實現高可用。

Spring Cloud Eureka

Netflix Eureka是Netflix開發的一套基於jvm和restful的服務治理框架。其服務端是用java語言編寫,主要適用於java實現的分佈式系統。但是其通信協議爲基於http的restful,所以客戶端理論上用什麼語言實現都可以。這也是微服務的一大特點,服務可以根據自身特點選用相應的語言或平臺實現,不必侷限於同一的平臺。

搭建服務註冊中心

Spring Cloud中的微服務就是一個個Spring Boot應用程序,服務註冊中心也不例外。按上篇文章的步驟,搭建一個spring boot模塊。

修改build.gradle,引入spring-cloud-starter-eureka-server

group 'com.zhuangqf.demo'
version '1.0-SNAPSHOT'

dependencies {
    compile "org.springframework.cloud:spring-cloud-starter-eureka-server"
    compile "org.springframework.boot:spring-boot-starter-web"
}

添加Application啓動類,通過EnableEurekaServer註解啓動一個註冊服務中心。

@EnableEurekaServer
@SpringBootApplication
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class,args);
    }

}

添加application.yml:

spring:
  application:
    name: eureka-server
server:
  port: 9000

eureka:
  instance:
    instance-id: ${spring.cloud.client.ipAddress}:${server.port}
    hostname: ${spring.cloud.client.ipAddress}
  client:
    fetch-registry: false
    register-with-eureka: false
    serviceUrl.defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/

先重點關注eureka.client配置:

  • eureka.client.fetch-registry 默認爲true,是否拉取註冊的實例信息,註冊中心不需要遠程調用實例,所以不需要檢索服務,設爲false。
  • eureka.client.register-with-eureka 對於單註冊中心,不需要向自己註冊
  • eureka.client.serviceUrl.defaultZone 註冊中心地址

接入客戶端

註冊中心已經跑起來了,那麼怎麼讓我們的服務註冊到註冊中心呢?讓我們對之前寫過的example模塊做一些改造。

在example模塊的build.gradle中添加依賴

compile "org.springframework.cloud:spring-cloud-starter-eureka"

相應的,在Application類加一個註解:

@SpringBootApplication
@EnableDiscoveryClient
public class Application {

    public static void main(String[] arg) {
        SpringApplication.run(Application.class,arg);
    }

}

接着,在application.yml中指定註冊地址:

eureka:
  instance:
    instance-id: ${spring.cloud.client.ipAddress}:${server.port}
    hostname: ${spring.cloud.client.ipAddress}
  client:
    serviceUrl.defaultZone: http://localhost:9000/eureka/

高可用註冊中心

高可用集羣是指以減少服務中斷時間爲目的的服務器集羣技術。它通過保護用戶的業務程序對外不間斷提供的服務,把因軟件/硬件/人爲造成的故障對業務的影響降低到最小程度。

在微服務架構系統中,故障是不可能避免的。Eureka Server的設計一開始就考慮了高可用的問題,在Eureka的服務治理設計中,所有節點既是服務提供方,又是服務消費方,服務註冊中心也不例外。

Eureka Server的高可用實際上是將自己作爲服務向其他服務註冊中心註冊自己,這樣就可以形成一組互相註冊的服務註冊中心。註冊中心之間會共享彼此的服務清單,註冊中心可以在一個zone中,也可以按業務或服務的部署位置分爲多個zone。

在這裏,我們先簡單實現同一個zone的兩個註冊中心,讓它們彼此註冊,實現高可用。

首先,在eureka-server的application.yml中增加以下配置

-- peer1
server.port: 9001

eureka:
  client:
    fetch-registry: true
    register-with-eureka: true
    serviceUrl.defaultZone: http://${eureka.instance.hostname}:9002/eureka

-- peer2
server.port: 9002

eureka:
  client:
    fetch-registry: true
    register-with-eureka: true
    serviceUrl.defaultZone: http://${eureka.instance.hostname}:9001/eureka

peer1和peer2是可選的兩組配置,在配置中,我們從彼此註冊到對方。

分別啓動peer1和peer2

啓動example

修改example的註冊服務器地址:


此時,peer1或者peer2有一個出現故障在短時間內不會對系統的業務有太大的影響,因爲另一個註冊中心可以臨時性承接所有的流量。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章