一起來學Spring Cloud | 第一篇:認識Eureka
Spring Cloud
為開發者提供了在分散式系統中的一些常用的元件(例如配置管理,服務發現,斷路器,智慧路由,微代理,控制匯流排,一次性令牌,全域性鎖定,決策競選,分散式會話叢集狀態)。使用Spring Cloud開發人員可以快速地完成實現這些模式的服務和應用程式。它們在任何分散式環境中都能很好地工作
Eureka
Eureka
是 Netflix
開發的服務發現框架,本身是一個基於REST的服務,目前 Spring Cloud
將它整合在其子專案 spring-cloud-netflix
中,用做 Spring Cloud
的服務註冊發現功能。
- 純正的
Servlet
應用,jar/war 包部署 - 使用
Jersey
框架實現自身的RESTful HTTP
介面 - peer 之間的同步與服務的註冊全部通過 HTTP 協議實現
- 利用
JDK Timer
實現 心跳檢測、定時清理過期服務、節點同步等功能 - 使用
Google
的guava
包管理記憶體快取
Eureka 的 Server 與 Client
-
Eureka Server:
提供服務註冊與發現,Client 節點啟動後,會向 Eureka Server 傳送註冊事件,Eureka Server 登錄檔中將會儲存所有可用服務節點的資訊,服務節點的資訊可以在介面中直觀的看到。基於Jersey
框架實現自身的RESTful HTTP
介面,只要滿足規範任何語言程式都能向其進行註冊 -
Eureka Client:
任何形式的客戶端,只要滿足Eureka Server
訂製的註冊標準。
你好 Eureka Server
搭建一個 Eureka Server
是最為容易的,只需要一個依賴即可完成。 在 Finchley
版本中 artifactId
與早期的有所差異,所以大家在使用 Spring Cloud
一定要注意自己所使用的版本,如果詢問它人相關問題,也應該告知對方你所採用的版本
依賴
<!-- 此處我只給出了 Eureka Server 需要用到的包依賴, 為了篇幅考慮 spring-boot-starter-parent 及 spring-cloud-dependencies 並未將其粘貼出來,有需要的可以點選文末的 GITHUB 連線進去 copy --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId> </dependency>
配置檔案
在 src/main/resources
目錄下建立一個 bootstrap.yml
的檔案,文中我已經將部分需要注意的配置項羅列出來,並附寫好相關說明,更多配置可以參考 EurekaInstanceConfigBean
、 EurekaClientConfigBean
、 EurekaServerConfigBean
。絕大多數情況下對於 Eureka Server
只需瞭解每個配置的作用及其意義即可,因為錯誤的配置反而會破壞原有的保護特性
server: port: 7071 eureka: instance: prefer-ip-address: true # 生產環境中官方是不建議修改預設配置,因為那樣會破壞 eureka server 的保護模式 server: # 關閉保護模式(生產環境不建議修改) enable-self-preservation: false # 清理間隔(預設是60 * 1000 毫秒)(生產環境不建議修改) eviction-interval-timer-in-ms: 60000 # Eureka 拉取服務列表時間(預設:30秒)(生產環境不建議修改) remote-region-registry-fetch-interval: 5 client: # eureka server 沒必要自己把自己註冊上去,所以可以設定成 false register-with-eureka: false # 是否從Eureka Server上獲取註冊資訊,預設為true,此處建議修改成 false (單機設定的意義不大,如果設定成 true 啟動會去抓取一次登錄檔,獲取不到更新快取就會出錯(該錯誤不影響 eureka 正常使用)) fetch-registry: false service-url: # 預設註冊地址 this.serviceUrl.put("defaultZone", "http://localhost:8761/eureka/"); # 劃重點:此處的 defaultZone 千萬別寫成 default-zone defaultZone: http://localhost:${server.port}/eureka/ # 從 Eureka 伺服器端獲取註冊資訊的間隔時間(預設:30秒) registry-fetch-interval-seconds: 5
主函式
與往常 Spring Boot
啟動類類似,不同的是多了一個 @EnableEurekaServer
註解,用來標識當前工程是 Eureka Server
,到此我們 Server 就算是搭建完成了。
package com.battcn; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer; /** * @author Levin */ @EnableEurekaServer @SpringBootApplication public class EurekaServer { public static void main(String[] args) { SpringApplication.run(EurekaServer.class, args); } }
訪問 http://localhost:7071/
能看到如下內容就代表專案搭建成功,圖中紅色的表示我們關閉了 Eureka
保護模式,在網路波動的情況下 Eureka Server
可能無法及時的保護客戶端例項
你好 Eureka Client
搭建一個 Eureka Client
也是相當容易的,只需要兩個小小的依賴即可完成。
依賴
<!-- 此處我只給出了 Eureka Server 需要用到的包依賴, 為了篇幅考慮 spring-boot-starter-parent 及 spring-cloud-dependencies 並未將其粘貼出來,有需要的可以點選文末的 GITHUB 連線進去 copy --> <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>
配置檔案
下面羅列一部分需要注意的配置項,需要注意的都已經寫好相關說明,更多配置可以參考 EurekaInstanceConfigBean
、 EurekaClientConfigBean
、 InetUtilsProperties
以下配置適用於大部分情況
server: port: 7072 # 如果不寫 Eureka Server 中的介面中 Application 就會是 Unknown 儘量寫 spring: application: name: eureka-client cloud: inetutils: # 忽略指定網絡卡(支援正則),假設你的電腦有 VM 那麼該選項是非常有用的一個選項 ignored-interfaces:#忽略 docker0 網絡卡以及 veth 開頭的網絡卡 - docker0 - veth.* preferred-networks:# 使用指定網路地址,選擇 eth0 網絡卡,當然也可以直接寫 IP (192.168) - eth0 eureka: instance: # 此處建議寫,不寫預設是機器名 prefer-ip-address: true # 優先順序小於 application.properties ,如果你想知道當前註冊上去的版本必須使用 application.properties 中的配置寫法 # 因為 bootstrap.yml 最早初始化,那時候還無法讀取到 pom.xml 中的屬性 instance-id: ${spring.cloud.client.ip-address}:${spring.application.instance_id:${server.port}} # ip-address 強行指定此例項 IP ,不是很推薦,絕大多數情況 prefer-ip-address 與preferred-networks 配合都夠用了 client: service-url: # 劃重點:此處的 defaultZone 千萬別寫成 default-zone defaultZone: http://localhost:7071/eureka/
擴充套件知識
如果你覺得 Eureka Server UI
中預設顯示的 instance-id
讓你看著不爽,你可以試著在根目錄下建立一個 application.properties
填寫如下內容,因為 Spring Cloud
和 Spring Boot
啟動裝載的配置有優先順序之分, bootstrap
檔案優先於 application
檔案之前裝載,所以一些配置只在 application
中生效
# 預設值:XB-201704242009:eureka-client:7072 # 修改前(bootstrap配置的 instance-id):192.168.13.22:7072 # 修改後(application 配置的 instance-id):192.168.13.22:7072:0.0.1-SNAPSHOT # 是不是後者更為直觀,如果要用 @project.version@ 那麼必須在 pom.xml 外掛做一下小小的配置,具體請看 GITHUB ,當然如果你不需要顯示 version 那麼該檔案你可以忽略 eureka.instance.instance-id=${spring.cloud.client.ip-address}:${spring.application.instance_id:${server.port}}:@project.version@
主函式
與往常 Spring Boot
啟動類類似,不同的是多了一個 @EnableDiscoveryClient
註解,用來標識當前工程是 Discovery Client
。因為 Spring Cloud
提供了非常多的服務註冊發現的元件,如 euerka
、 zookeeper
、 consul
、 etcd
、所以為統一標識客戶端身份,所以它用的是 @EnableDiscoveryClient
註解
package com.battcn; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; /** * @author Levin */ @EnableDiscoveryClient @SpringBootApplication public class MyEurekaClient { public static void main(String[] args) { SpringApplication.run(MyEurekaClient.class, args); } }
總結
目前很多大佬都寫過關於 Spring Cloud
的教程了,如有雷同,請多多包涵,本教程基於最新的 spring-cloud:Finchley.SR1
編寫…