項目開發練習涉及的模塊
- Eureka:負責服務發現相關。Eureka Server/Client、高可用、服務發現機制。
- Config:負責統一配置中心。Config Server/Client、SpringCloudBus+RabibtMQ實現配置自動刷新。
- Ribbon:服務通信。RestTemplate和Feign通信方法、Ribbon實現原理。
- Zuul:APIgateWay。動態路由、校驗。
- Hystrix:熔斷機制。Hystrix Dashboar熔斷機制。
- 容器編排:Docker+Rancher
- 服務追蹤:SpringCloud Sleuth + Zipkin
- 環境參數:SpringBoot2.0.0M3,SpringCloud Finchley.M2(可在官網查看SpringCloud和SpringBoot版本對應關係。實際上操作中,使用的是 SpringBoot 2.0.6.RELEASE,SpringCloud Finchley.SR2)。
微服務概念
- 由一系列微小的服務共同組成。
- 在自己的進程中運行,互不干擾。
- 每個服務爲獨立的業務開發。
- 獨立部署,每個服務可以獨立部署。
- 分佈式的管理。(微服務是一種架構風格)
涉及的架構形態
- 單體架構。優點:容易測試;容易部署。缺點:開發效率低;代碼維護困難;部署不靈活;擴展性不夠;穩定性差。
- 基於AJAX前後端分離。
- 分佈式(水平擴展&服務拆分)。旨在支持應用程序和服務的開發,可以利用物理架構 由多個自治的處理元素,不共享主內存,但通過網絡發送消息合作。(集羣:例如廚房多個員工一起炒菜。分佈式:例如廚房多個員工,一個洗菜,一個切菜,一個炒菜。)
微服務架構的基礎框架/組件
- 服務註冊與發現。
- 服務網關(Service Gateway)。
- 後端通用服務(中間層服務:啓動時將地址信息註冊到服務註冊表)。
- 前端服務(邊緣服務:查詢註冊表,發現和調用後端服務;對後端服務進行裁剪(基於不同設備將1個API數據的詳細情況進行控制等)和聚合(將多個API進行集合)再暴露給不同的設備)。
微服務架構實現途徑
阿里系:Dubbo-服務化治理;Zookeeper-服務註冊中心;SpringMVC或SpringBoot。
SpringCloud全家桶:SpringCloud Netflix Eureka;SpringBoot。
SpringCloud概念
是什麼:
- SpringCloud是一個開發工具集,包含多個子項目;
- 利用SpringBoot的開發便利,實現了服務註冊、服務註冊與發現、負載均衡、數據監控、RestAPI發佈方式等等;
- 主要是基於對NetFlix開源組件的進一步封裝。
作用:簡化了分佈式開發。
Spring Cloud Eureka
概念:
- 基於Netflix EureKa進行了二次封裝。
- 由兩個組件組成:Eureka Server 註冊中心——供服務註冊的服務器;Eureka Client服務註冊——簡化與服務器的交互,提供服務的故障切換支持。(eureka是一個服務註冊中心,並且其本身也是一個服務,需要被註冊到自身應用中。)
- 主要功能是 提供 服務的註冊 與 發現。
構建Eureka服務註冊中心 —— Eureka Server
1. 新建Spring Initializer——>應用名:eureka——>添加依賴:Spring Cloud Discovery—EurekaServer——>項目位置選擇:自定義空文件夾\eureka。
2. 在pom.xml中將SpringBoot版本和SpringCloud版本修改成文章開頭設定的版本:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.0.M3</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
<spring-cloud.version>Finchley.M2</spring-cloud.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
3. 啓動類中添加註解:@EnableEurekaServer,聲明註冊中心的功能。
@SpringBootApplication
@EnableEurekaServer
public class EurekaApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaApplication.class, args);
}
}
4. 啓動項目(由於服務沒被註冊,會報錯,但沒關係),訪問:http://IP:端口/,即可進入註冊中心。爲了將自身服務註冊到自身應用中,可以添加如下配置到application.yml配置文件中:本例中項目啓動後訪問—— http://localhost:8761/ 進入Eureka服務註冊中心。
eureka:
client:
service-url:
defaultZone: http://localhost:8761/eureka
register-with-eureka: false # 註冊的應用服務列表中不顯示自己本身(自身也是個服務)
server:
enable-self-preservation: false # 自我保護機制關閉
spring:
application:
name: eureka
server:
port: 8761
5. 在cmd中使用命令:maven clean package -Dmaven.test.skip=true 打包項目,使其不依賴idea,可以獨立運行。運行命令:java -jar eureka-0.0.1.SNAPSHOT.jar 即可啓動項目。也可以 後臺啓動。若在後臺運行,啓動後關閉的命令如下(管理員模式打開cmd):tasklist | findstr "java";查看java線程的PID。殺死線程:taskkill /pid 12123 /f (win系統也可在任務管理器中殺死java線程)。即可關閉項目。(linux:ps -ef | grep jarName.jar kill -9 pid)
構建一個Eureka服務註冊中心 —— Eureka Client
1. 新建Spring Initializer——>應用名:client——>添加依賴:Spring Cloud Discovery—EurekaDiscovery——>項目位置選擇:自定義文件夾\client。
2. pom依賴中統一SpringBoot和SpringCloud的版本。然後在application.yml中進行服務註冊的如下配置(不配置則不能被註冊到EurekaServer服務註冊中心)。並且還需要在項目啓動類中添加服務發現註解@EnableDiscoveryClient。
eureka:
client:
service-url:
defaultZone: http://localhost:8761/eureka/
spring:
application:
name: client
3. 啓動項目,然後前往 服務註冊中心(http://localhost:8761/)查看。實際項目啓動時,一直失敗,添加web依賴後才啓動成功。成功後可以看到 Application表單中已經有了新增加的client服務。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
4. Eureka頁面中紅字(EMERGENCY! EUREKA MAY BE INCORRECTLY CLAIMING INSTANCES ARE UP WHEN THEY'RE)的出現原因:https://cloud.tencent.com/developer/article/1152507。server通過心跳機制檢查client端,判斷其是否還在線上運行。當client不在線上運行時,保護機制仍會視爲在線(如下圖已關閉client應用)。在開發環境中,最好關閉該模式。在server端的applicaton.yml配置中配置:server: enable-self-preservation: false。(結果啓動服務後又tm出現紅字:THE SELF PRESERVATION MODE IS TURNED OFF.THIS MAY NOT PROTECT INSTANCE EXPIRY IN CASE OF NETWORK/OTHER PROBLEMS.cou!我這強迫症哦!)
Eureka的高可用
1. 高可用:爲避免服務宕機,可以創建多個Eureka服務註冊中心,通過之間的相互註冊創建聯繫。(使用不同的端口啓動eureka服務端即可實現多服務註冊,修改application.yml的註冊地址即可實現相互創建聯繫)。
2. 創建兩個測試類:
3. 在啓動application1時,將application.yml的註冊地址修改成 eureka: client: service-url: defaultZone: http://localhost:8762/eureka。然後在啓動application2時,將application.yml的註冊地址端口修改爲 8761.即可模擬啓動兩個eureka的服務端。啓動成功後,分別訪問 localhost:8761和localhost:8762即可進入兩個服務的註冊中心。
4. 啓動eureka的客戶端。雖然client的註冊端口仍然是8761,但是client會被兩個eureka註冊。因爲被8761的服務同步了。此時掛掉eureka1,eureka2和client都不會受到影響。從而實現了高可用。但是若重啓了client,則client會報錯,因爲請求註冊的地址服務已經不在了。但由於心跳機制,eureka2中註冊的客戶端仍然存在,也只是服務的“自我欺騙”。
5. 爲了實現eureka掛掉一個,client重啓也不會受到影響,那麼只需要每次都將client註冊到兩個eureka服務中即可。修改client的application.yml配置:(此時掛掉任何一個eureka服務都不會被影響了。)
eureka:
client:
service-url:
defaultZone: http://localhost:8761/eureka/,http://localhost:8762/eureka/
spring:
application:
name: client
6. 如果是三個eureka,那麼需要eureka的服務兩兩相互註冊,客戶端也需要註冊三個eureka服務中心。(服務端:8761端口的註冊到8762和8763,8762的端口註冊到8761和8763,8763端口的註冊到8761和8762。客戶端註冊到8761、8762、8763)。
總結
- @EnableEurekaServer、@EnableDiscoveryClient兩個註解分別註解服務端和客戶端的啓動類。
- eureka具有心跳檢測機制、健康檢查機制、負載均衡等功能。
- Eureka的高可用,在生產環境上建議至少兩臺以上(三臺或大於三臺,以保證項目的穩定運行)。
- 分佈式系統中,服務註冊中心是最重要的基礎部分。
- Eureka採用的是客戶端發現方式。(服務端發現服務:Nginx,Zookeeper,Kubernetes)。
- SpringCloud的服務調用方式:http的Restful風格接口。
微服務特點:由一系列微小的服務共同組成;單獨部署,運行在自己的進程中;每個服務爲獨立的業務開發;分佈式管理。(異構——不同編程語言、不同類型的數據庫。)
不適合使用微服務框架的業務形態:系統中包含很多強事務的場景;業務相對穩定成熟,迭代週期長;訪問壓力小,可用性要求不高。
康威定律和微服務:任何組織在設計一套系統(廣義概念的系統)時,所交付的設計方案在結構上都與該組織的溝通結構保持一致。簡而言之:溝通的問題會影響系統的設計。