本篇主要介紹的是SpringCloud相關知識、微服務架構以及搭建一個高可用的服務註冊與發現的服務模塊(Eureka)。java
Spring Cloud是在Spring Boot的基礎上構建的,用於簡化分佈式系統構建的工具集,爲開發人員提供快速創建分佈式系統中的一些常見的模式。git
例如:github
配置管理(configuration management),服務發現(service
discovery),斷路器(circuit breakers),智能路由( intelligent routing),微代理(micro-proxy),控制總線(control bus),一次性令牌( one-time okens),全局鎖(global locks),領導選舉(leadership election),分佈式會話(distributed sessions),集羣狀態(cluster state)等等。spring
微服務架構風格是一種將單個應用程序開發爲一套小型服務的方法,每一個小型服務都在本身的流程中運行,並與輕量級機制(一般是HTTP資源API)進行通訊。這些服務圍繞業務功能構建,可經過全自動部署機制獨立部署。這些服務至少集中管理,能夠用不一樣的編程語言編寫,並使用不一樣的數據存儲技術。編程
Eureka是Netflix開源的一款提供服務註冊和發現的產品,它提供了完整的Service Registry和Service Discovery實現。也是springcloud體系中最重要最核心的組件之一。瀏覽器
Eureka主要由兩個組件組成:Eureka服務器和Eureka客戶端。
Eureka服務器用做服務註冊服務器。
Eureka客戶端是一個java客戶端,用來簡化與服務器的交互、做爲輪詢負載均衡器,並提供服務的故障切換支持。安全
開發環境服務器
注:不必定非要用上述的版本,能夠根據狀況進行相應的調整。須要注意的是SpringBoot2.x之後,jdk的版本必須是1.8以上!網絡
確認了開發環境以後,咱們再來添加相關的pom依賴。session
<dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies>
注: 基於SpringBoot1.x以上SpringCloud是Dalston版本的eureka 依賴是 <artifactId>spring-cloud-starter-eureka</artifactId>
,少了個 netflix 。SpringCloud的版本命名方式是經過倫敦的地方來命名的,版本順序是根據首字母的順序來的。
咱們先來實現Eureka的Hello World版,其實也就是實現簡單的服務註冊和發現功能。
首先創建一個服務端的工程,添加如上的依賴以後,在application.properties
添加以下的配置:
配置信息:
spring.application.name=springcloud-eureka-client server.port=8000 eureka.client.register-with-eureka=false eureka.client.fetch-registry=false eureka.client.serviceUrl.defaultZone=http://localhost:8000/eureka/
配置說明:
完成配置信息的添加後,咱們再來看代碼如何實現。
在服務端這邊只須要在SpringBoot啓動類添加@EnableEurekaServer
註解就能夠了,該註解表示此服務是一個服務註冊中心服務。
代碼示例:
@EnableEurekaServer @SpringBootApplication public class App { public static void main(String[] args) { SpringApplication.run(App.class, args); System.out.println("註冊中心服務啓動..."); } }
這裏咱們在新建一個客戶端的項目,添加如上的依賴以後,在application.properties
添加以下的配置:
配置信息:
spring.application.name=springcloud-eureka-client server.port=9001 eureka.client.serviceUrl.defaultZone=http://localhost:8000/eureka/
配置說明:
服務端這邊的實現也很簡單,只需在啓動類上添加@EnableDiscoveryClient
該註解便可,使用該註解表示該項目就具備了服務註冊的功能。
代碼示例:
@SpringBootApplication @EnableDiscoveryClient public class App { public static void main(String[] args) { SpringApplication.run(App.class, args); System.out.println("客戶端服務啓動..."); } }
完成如上的工程開發以後,咱們依次啓動服務端和客戶端程序,而後在瀏覽器界面輸入:http://localhost:8000/
,便可查看註冊中心的信息。
訪問界面地址:
經過上述示例圖中,能夠看到Eureka啓動成功了,而且有一個服務進行註冊了。
成功的實現了服務註冊功能以後,咱們來測試下Eureka服務的保護機制。
這裏咱們先關閉客戶端,查看界面信息,發現沒什麼改變,等待大約15分鐘左右以後,再到Eureka界面查看信息,發現出現了一長串紅字描述,描述的語句以下:
EMERGENCY! EUREKA MAY BE INCORRECTLY CLAIMING INSTANCES ARE UP WHEN THEY'RE NOT. RENEWALS ARE LESSER THAN THRESHOLD AND HENCE THE INSTANCES ARE NOT BEING EXPIRED JUST TO BE SAFE.
翻譯以後的意思:
緊急!EUREKA可能錯誤地聲稱實例已經啓動,而實際上並無。續訂小於閾值,所以實例不會爲了安全而過時。
界面示例圖:
這裏就順便說下Eureka的自我保護機制。
自我保護模式正是一種針對網絡異常波動的安全保護措施,使用自我保護模式能使Eureka集羣更加的健壯、穩定的運行。
自我保護機制的工做機制是若是在15分鐘內超過85%的客戶端節點都沒有正常的心跳,那麼Eureka就認爲客戶端與註冊中心出現了網絡故障,Eureka Server自動進入自我保護機制,此時會出現如下幾種狀況:
所以Eureka Server能夠很好的應對因網絡故障致使部分節點失聯的狀況,而不會像ZK那樣若是有一半不可用的狀況會致使整個集羣不可用而變成癱瘓。
自我保護機制的相關配置以下:
服務端的配置:
客戶端的配置:
這裏順便說下Eureka的的心跳機制。
Eureka Client須要每30秒給Eureka Server發一次心跳,同時更新Server上最新的註冊信息到本地,若是Server屢次沒有收到來自客戶端的心跳,那麼在90秒內會被Server上剔除。
上述的服務註冊中心示例是單點的,若是在生產環境中就顯得不適合,顯然這並不適合應用於線上生產環境。做爲分佈式系統最重要的註冊服務功能,爲了使其高可用,使用集羣是最廣泛的方式。Eureka能夠經過互相註冊的方式來實現高可用的部署。
Eureka實現相互註冊的方式很簡單,只須要將各個服務端的地址相互進行配置便可。
那麼咱們再來新建兩個服務端的工程,其中配置信息以下:
server2配置信息:
spring.application.name=springcloud-eureka-server server.port=8002 eureka.instance.hostname = server2 eureka.client.serviceUrl.defaultZone=http://server3:8003/eureka/
server3配置信息:
spring.application.name=springcloud-eureka-server server.port=8003 eureka.instance.hostname = server3 eureka.client.serviceUrl.defaultZone=http://server2:8002/eureka/
上述的配置在以前已經說過了,這裏就不在過多描述了。這裏的服務端配置和以前項目的服務端配置略有不一樣,容許本身進行註冊了。而且這裏的eureka.instance.hostname
至關因而對服務地址起一個別名,也能夠不配置,默認將會使用IP進行查找。eureka.client.serviceUrl.defaultZone
這裏配置的是另外一個服務端的地址,若是是多個就經過 ","逗號隔開。
由於這裏使用了別名進行區分服務,因此須要在hosts文件添加以下配置,用於作映射。
127.0.0.1 server2 127.0.0.1 server3
hosts文件地址:
Windows 系統地址:C:\Windows\System32\drivers\etc\hosts
Linux系統地址: /etc/hosts
配置完成以後,啓動這兩個服務,而後在瀏覽器輸入:
http://server2:8002/
或
http://server3:8003/
便可查看信息.
高可用註冊中心示例圖:
這裏咱們把以前的客戶端程序的配置改下,改爲指定這個高可用註冊中心的地址,而後在關閉其中一個服務,查看是否可以正常的使用。
示例圖:
能夠看到其中一個服務能夠正常運行和使用!
基於SpringBoot2.x、SpringCloud的Finchley版本開發的地址:https://github.com/xuwujing/springcloud-study
基於SpringBoot1.x、SpringCloud 的Dalston版本開發的地址: https://github.com/xuwujing/springcloud-study-old
若是感受項目不錯,但願能給個star,謝謝!
挺有節奏感的一首純音樂!
原創不易,若是感受不錯,但願給個推薦!您的支持是我寫做的最大動力! 版權聲明: 做者:虛無境 博客園出處:http://www.cnblogs.com/xuwujing CSDN出處:http://blog.csdn.net/qazwsxpcm 我的博客出處:http://www.panchengming.com