1. 程式人生 > >Spring-cloud體系搭建 01

Spring-cloud體系搭建 01

1. Eureka簡介

在任何的分散式架構中,都需要去尋找服務的物理機器地址,我們稱之為服務發現,Eureka就是解決這類問題的元件。它是類似於Zookeeper的服務註冊中心元件,但Eureka保證了服務的高可用性,它自身的叢集機制和服務保護機制是其核心機制,我們可以給予它提供的便利搭建一套完整的為服務體系。下面進行Eureka服務端和客戶端的簡單搭建。

2. Eureka 服務特點

2.1. 高可用

支援叢集環境熱部署,可以跨多個節點進行服務例項共享,只要有一個節點可用就可以維持服務的可用性;

2.2. 點對點

叢集中每個服務節點共享服務例項的狀態;

2.3. 負載均衡

服務可以對請求進行負載均衡處理,一般採用輪詢健康例項的方式,也可以自定義服務發現方式

2.4. 客戶端彈性

所有註冊到註冊中心的客戶端都應該在本地快取一份服務列表,在服務不可用時可以繼續承擔服務的可用行。

2.5. 容錯率

Eureka註冊中心採用心跳檢測機制確保服務的可用行,及時清理不可用的服務例項。

3. Eureka-Server 服務端搭建

注:本文專案採用idea工具進行搭建

  • 使用idea自身的spring initializr進行專案的初始化
  • 初始化完成專案之後進行pom檔案匯入
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
  • 修改application.yml檔案,新增如下配置:
server:
  # 指定該Eureka例項的埠
  port: 8761

eureka:
  instance:
    # 指定該Eureka例項的主機名
    hostname: localhost
    preferIpAddress: true
  server:
    # 關閉自我保護機制 不推薦
#    enableSelfPreservation: false
    #  清理無效的服務節點,清理間隔(單位毫秒,預設是60*1000)
    eviction-interval-timer-in-ms: 10000
  client:
registerWithEureka: false fetchRegistry: false serviceUrl: defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
  • 最後在Eureka服務上面新增***@EnableEurekaServer***註解就可以啟動了。

由於Eureka提供了高可用的服務機制,我們可以啟動多個Eureka服務例項,然後client段修改配置檔案中defaultZone引數就可以了。Eureka服務註冊是通過服務輪詢的方式,一般我們啟動多個例項,client端只要在一個服務例項上註冊成功,有不需要額外的去其他服務例項進行註冊,並且Eureka有自身的服務列表拉取機制會同步更新服務列表,深入理解可以參考Eureka Client註冊到Eureka Server的祕密

4. Eureka-Client端進行服務註冊

  • 此處我以config配置中心作為Eureka的Client端。

  • 首先我們構建一個maven工程,初始化完成後進行pom引入,

<!-- security 安全控制 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
</dependency>
<!-- eureka 服務註冊 -->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
  • 修改我們的配置檔案,注意Eureka客戶端的配置必須在Bootstrap.yml檔案中,涉及到配置檔案讀取順序的問題。 Bootstrap.yml 配置如下:
#服務註冊中心配置
eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:8761/eureka/  #,http://xxxxx:8761/eureka/
      # 指定多少秒從註冊中心獲取一次例項服務列表 預設 30秒
      # 減少值可以解決服務註冊慢問題,但一般不要設定太小
      registry-fetch-interval-seconds: 20
  instance:
    # 獲取例項ip地址
    prefer-ip-address: true
    # 心跳包傳送時間 預設 30秒
    lease-renewal-interval-in-seconds: 60
    # 最後一次心跳時間間隔以下值之後清楚例項列表中的值,不應該小於心跳檢測時間 預設90秒
    lease-expiration-duration-in-seconds: 100
#    instance-id: config-server
  • 配置完後需要在Client啟動類上加上*@EnableDiscoveryClient*註解。

  • 配置完成後分別啟動Eureka-Server例項和Eureka-Client例項(本文以config-server代替),訪問可以看到client例項註冊到server中了。

注:prefer-ip-address: true 在生產環境一般需要設定為true,原因如下:

為什麼偏向於 IP地址在預設情況下, Eureka在嘗試註冊服務時, 將會使用主機名讓外界與它進行聯絡。這種方式在基於伺服器的環境中執行良好,在這樣的環境中,服務會被分配一個DNS支援的主機名。但是,在基 於容器的部署(如 Docker )中,容器將以隨機生成的主機名啟動,並且該容器沒有 DNS 記錄。 如果沒有將 eureka . instance.preferipAddress 設定量為 true,那麼客戶端應用程式將無法 正確地解析主機名的位置,因為該容器不存在 DNS 記錄。設定preferipAddress 屬性將通知 Eureka 服務,客戶端想要通過 IP地址進行通告。