從本章節開始,正式進入
SpringCloud
的基礎教程。從第一章《什麼是SpringCloud》中咱們能夠知道,一個微服務框架覆蓋的東西是不少的,而如何去管理這些服務或者說API
接口,就顯得異常重要了。因此本章節,主要介紹下SpringCloud
中使用Eureka
實現服務的註冊與發現。html
服務治理是微服務架構中最爲核心和基礎的模塊。它主要用來實現各個微服務實例的自動化註冊與發現。java
來一張經典的圖:git
能夠知道,隨着服務的愈來愈多,愈來愈雜,服務之間的調用會愈來愈複雜,愈來愈難以管理。而當某個服務發生了變化,或者因爲壓力性能問題,多部署了幾臺服務,怎麼讓服務的消費者知曉變化,就顯得很重要了。否則就會存在調用的服務其實已經下線了,但調用者不知道等異常狀況。github
這個時候有個服務組件去統一治理就至關重要了。簡單來講,一個服務治理組件應該具有如下幾個功能:web
服務註冊表spring
服務治理組件的核心,它用來記錄各個微服務的信息,好比說微服務的名稱、IP、端口等。服務註冊組件提供查詢API和管理API,查詢API用來查詢可用的微服務實例,管理API用於服務的註冊和註銷。api
服務註冊與發現緩存
服務檢查安全
服務治理組件使用必定機制定時檢測已註冊的服務,是否在線,或者是否沒法鏈接等,若發現沒法訪問,就會從服務註冊表中移除該實例,進行下線操做。微信
Eureka
是Netflix
開源的服務發現組件,自己是一個基於REST
的服務。它包含Server
和Client
兩部分。Spring Cloud
將它集成在子項目Spring Cloud Netflix
中,從而實現微服務的註冊與發現。
題外話:有興趣的同窗,能夠搜索看看這家在線影片租賃提供商:Netflix。全家桶裏面大部分接觸的都是這家公司開源的,老牛逼了!
Netflix官方github地址瞭解下:https://github.com/Netflix
Eureka服務端
也稱爲註冊中心,用於提供服務的註冊與發現。支持高可用配置,依託與強一致性提供良好的服務實例可用性,能夠應對多種不一樣的故障場景。
Eureka客戶端
主要處理服務的註冊與發現。客戶端服務經過註解和參數配置方式,嵌入在客戶端的應用程序代碼中,在應用程序啓動時,向註冊中心註冊自身提供的服務並週期性地發送心跳來更新它的服務租約。同時,它也能從服務端查詢當前註冊的服務信息並把它們緩存到本地並週期性地刷新服務狀態。
簡單看下,Eureka
整體架構:
從這個簡圖中,能夠看出,Eureka
有三部分組成:
而咱們使用Eureka
主要是實現服務治理功能
,經過下圖咱們來大體瞭解下其治理體系:
簡單來講,客戶端經過註冊中心,獲取服務端服務的地址信息,再根據地址進行服務調用,而註冊中心來維護各服務的狀態,好比發送心跳驗證健康狀態,判斷是否在線,同時記錄其服務地址,以供查詢。
開始講解實例前,先說明下爲了版本可統一管理,本系列教程建立了一個父類pom文件,利用Maven
的dependencyManagement
對模塊版本進行了統一管理。後續如果升級版本時,正常就更新此父類pom版本便可。
建立一個Eureka服務端很簡單,咱們只須要簡單幾步便可完成。
建立個名爲spring-cloud-eureka-server
的SpringBoot
項目。
0.加入pom依賴。
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId> </dependency>
這裏注意,和E版不一樣,E版是引入:spring-cloud-starter-eureka-server
。
1.添加配置文件配置。
spring.application.name=eureka-service # 修改端口 server.port=1000 # 實例的主機名稱 eureka.instance.hostname=127.0.0.1 ## 不要向註冊中心註冊本身 eureka.client.register-with-eureka=false ## 表示不去檢索其餘的服務,由於服務註冊中心自己的職責就是維護服務實例,它也不須要去檢索其餘服務 eureka.client.fetch-registry=false # 指定服務註冊中心地址 這裏直接指向了本服務 eureka.client.service-url.defaultZone=http://${eureka.instance.hostname}:${server.port}/eureka/
友情提示:因爲eureka.client.service-url
在配置類org.springframework.cloud.netflix.eureka.EurekaClientConfigBean
是個map對象,因此呢,使用IDE的提示功能是不會出現的,並且要注意map
對象的值,大小寫要一致,和其餘對象不同,這個要注意。
因此從源碼能夠看出,默認不寫時,是註冊至:DEFAULT_URL
中,默認就是http://localhost:8761/eureka
。
2.啓動類,添加註解@EnableEurekaServer。
/** * Eureka服務端 * @author oKong * */ @SpringBootApplication @EnableEurekaServer @Slf4j public class EureakServiceApplication { public static void main(String[] args) throws Exception { SpringApplication.run(EureakServiceApplication.class, args); log.info("spring-cloud-eureka-service啓動!"); } }
3.啓動應用,訪問:http://127.0.0.1:1000/,
目前爲止一個單機的Eureka
服務端就搭建完畢了。是否是很簡單,基本就幾行代碼。從上圖也能夠看出,目前尚未服務註冊上去,因此應用列表是空的。接下來,建立個客戶端同時註冊到此註冊中心下。
Eureka
客戶端,其實就是服務的提供方,對外提供服務的應用。
建立個spring-cloud-eureka-client
工程項目。
0.加入pom依賴
<!-- 客戶端依賴 --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency> <!-- 引入web,提供一個簡單的api接口 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency>
1.配置文件添加註冊中心配置。
spring.application.name=eureka-client server.port=2000 # 註冊中心地址 eureka.client.service-url.defaultZone=http://127.0.0.1:1000/eureka # 啓用ip配置 這樣在註冊中心列表中看見的是以ip+端口呈現的 eureka.instance.prefer-ip-address=true # 實例名稱 最後呈現地址:ip:2000 eureka.instance.instance-id=${spring.cloud.client.ip-address}:${server.port}
友情提示:這裏有個坑,變量spring.cloud.client.ipAaddress
在F版中應該寫成spring.cloud.client.ip-address
。具體緣由就是字段名修改了。
org.springframework.cloud.client.HostInfoEnvironmentPostProcessor
類:
2.啓動類加入註解EnableDiscoveryClient。
/** * 服務提供者示例-eureka客戶端 * @author oKong * */ @SpringBootApplication //注意這裏也可以使用@EnableEurekaClient //但因爲springcloud是靈活的,註冊中心支持eureka、consul、zookeeper等 //若寫了具體的註冊中心註解,則當替換成其餘註冊中心時,又須要替換成對應的註解了。 //因此 直接使用@EnableDiscoveryClient 啓動發現。 //這樣在替換註冊中心時,只須要替換相關依賴便可。 @EnableDiscoveryClient @Slf4j public class EurekaClientApplication { public static void main(String[] args) throws Exception { SpringApplication.run(EurekaClientApplication.class, args); log.info("spring-cloud-eureka-client啓動!"); } }
注意:這裏也可以使用@EnableEurekaClient註解,但通常不這麼用,直接使用@EnableDiscoveryClient實現自動發現。由於SpringCloud
自己支持Eureka
、Consul
、zookeeper
等實現註冊中心功能,若寫死了某個註冊中心的相關注解,以後替換時,還須要修改註解類。
3.編寫一個簡單的api接口。
/** * 簡單api示例 * @author oKong * */ @RestController public class DemoController { @GetMapping("/") public String index() { return "spring-cloud-eureka-client!"; } }
4.啓動應用,再次訪問:http://127.0.0.1:1000/ ,能夠看見服務被註冊上去了。
在開發階段,很常常會出現如下文字:
默認狀況下,若是Eureka Server
在必定時間內沒有接收到某個微服務實例的心跳,Eureka Server
將會註銷該實例(默認90秒)。可是當網絡分區故障發生時,微服務與Eureka Server之間沒法正常通訊,這就可能變得很是危險了,由於微服務自己是健康的,此時本不該該註銷這個微服務。
Eureka Server
經過「自我保護模式」來解決這個問題,當Eureka Server
節點在短期內丟失過多客戶端時(可能發生了網絡分區故障),那麼這個節點就會進入自我保護模式。一旦進入該模式,Eureka Server
就會保護服務註冊表中的信息,再也不刪除服務註冊表中的數據(也就是不會註銷任何微服務)。當網絡故障恢復後,該Eureka Server
節點會自動退出自我保護模式。
自我保護模式是一種對網絡異常的安全保護措施。使用自我保護模式,而讓Eureka集羣更加的健壯、穩定。
開發階段能夠經過配置:eureka.server.enable-self-preservation=false
關閉自我保護模式。
生產階段,理應以默認值進行配置。
至於具體具體的配置參數,可至官網查看:http://cloud.spring.io/spring-cloud-static/Finchley.RELEASE/single/spring-cloud.html#_appendix_compendium_of_configuration_properties
或者直接查看EurekaClientConfigBean
和EurekaInstanceConfigBean
類相關默認配置:
至於字段中文說明,你們可查看網站:微服務架構:Eureka參數配置項詳解,裏面很詳細的說明了。
「你說,英語很差連字段啥意思都不知道,多尷尬,學好英語很重要,(┬_┬)」
本文主要講解了如何搭建
Eureka
註冊中心,及使用Eureka
客戶端註冊服務至註冊中心。配置和使用都相對來講很簡單的,主要仍是要理解下Eureka
爲咱們作了什麼,提供了什麼服務治理策略。目前咱們搭建的是單機版的註冊中心,原本想繼續寫Eureka
的高可用和其訪問安全的。奈何今天又出差了,晚上回酒店遲了。寫完本章最後一個章節以爲困了,就分爲上下章節吧。諒解,諒解呀,(┬_┬)
目前互聯網上大佬都有分享
SpringCloud
系列教程,內容可能會相似,望多多包涵了。原創不易,碼字不易,還但願你們多多支持。若文中有錯誤之處,還望提出,謝謝。
499452441
lqdevOps
我的博客:http://blog.lqdev.cn
源碼示例:https://github.com/xie19900123/spring-cloud-learning
原文地址:http://blog.lqdev.cn/2018/09/06/SpringCloud/chapter-two/