微服務的配置文檔怎麼管理
1. 微服務入門這一篇就夠了
剛開始進入軟體行業時還是單體應用的時代,前後端分離的概念都還沒普及,開發的時候需要花大量的時間在「強大」的JSP上面,那時候SOA已經算是新技術了。現在,微服務已經大行其道,有哪個互聯網產品不說自己是微服務架構呢?
但是,對於微服務的理解每個人都不太一樣,這篇文章主要是聊一聊我對微服務的理解以及如何搭建經典的微服務架構,目的是梳理一下自己的一些想法,如果存在不同看法的歡迎指正!
首先,什麼是微服務呢?
相對的,要理解什麼是微服務,那麼可以先理解什麼是單體應用,在沒有提出微服務的概念的「遠古」年代,一個軟體應用,往往會將應用所有功能都開發和打包在一起,那時候的一個B/S應用架構往往是這樣的:
但是,當用戶訪問量變大導致一台伺服器無法支撐時怎麼辦呢?加伺服器加負載均衡,架構就變成這樣了:
後面發現把靜態文件獨立出來,通過CDN等手段進行加速,可以提升應用的整體相應,單體應用的架構就變成:
上面3中架構都還是單體應用,只是在部署方面進行了優化,所以避免不了單體應用的根本的缺點:
我認為任何技術的演進都是有跡可循的,任何新技術的出現都是為了解決原有技術無法解決的需求,所以,微服務的出現就是因為原來單體應用架構已經無法滿足當前互聯網產品的技術需求。
在微服務架構之前還有一個概念:SOA(Service-Oriented Architecture)-面向服務的體系架構。我認為的SOA只是一個架構模型的方法論,並不是一個明確而嚴謹的架構標准,只是後面很多人將SOA與The Open Group的SOA參考模型等同了,認為嚴格按照TOG-SOA標準的才算真正的SOA架構。SOA就已經提出的面向服務的架構思想,所以微服務應該算是SOA的一種演進吧。
撇開架構先不說,什麼樣的服務才算微服務呢?
微服務架構,核心是為了解決應用微服務化之後的服務治理問題。
應用微服務化之後,首先遇到的第一個問題就是服務發現問題,一個微服務如何發現其他微服務呢?最簡單的方式就是每個微服務裡面配置其他微服務的地址,但是當微服務數量眾多的時候,這樣做明顯不現實。所以需要使用到微服務架構中的一個最重要的組件: 服務注冊中心 ,所有服務都注冊到服務注冊中心,同時也可以從服務注冊中心獲取當前可用的服務清單:
解決服務發現問題後,接著需要解決微服務分布式部署帶來的第二個問題:服務配置管理的問題。當服務數量超過一定程度之後,如果需要在每個服務裡面分別維護每一個服務的配置文件,運維人員估計要哭了。那麼,就需要用到微服務架構裡面第二個重要的組件: 配置中心 ,微服務架構就變成下面這樣了:
以上應用內部的服務治理,當客戶端或外部應用調用服務的時候怎麼處理呢?服務A可能有多個節點,服務A、服務B和服務C的服務地址都不同,服務授權驗證在哪裡做?這時,就需要使用到服務網關提供統一的服務入口,最終形成典型微服務架構:
上面是一個典型的微服務架構,當然微服務的服務治理還涉及很多內容,比如:
目前國內企業使用的微服務框架主要是Spring Cloud和Dubbo(或者DubboX),但是Dubbo那兩年的停更嚴重打擊了開發人員對它的信心,Spring Cloud已經逐漸成為主流,比較兩個框架的優劣勢的文章在網上有很多,這里就不重復了,選擇什麼框架還是按業務需求來吧,業務框架決定技術框架。
Spring Cloud全家桶提供了各種各樣的組件,基本可以覆蓋微服務的服務治理的方方面面,以下列出了Spring Cloud一些常用組件:
本章節主要介紹如何基於Spring Cloud相關組件搭建一個典型的微服務架構。
首先,創建一個Maven父項目 spring-cloud-examples ,用於管理項目依賴包版本。由於Spring Cloud組件很多,為保證不同組件之間的兼容性,一般通過 spring-cloud-dependencies 統一管理Spring Cloud組件版本,而非每個組件單獨引入。
pom.xml配置如下:
參考上面業務服務A搭建另外一個業務服務B。
目前網上很多說是下一代微服務架構就是Service Mesh,Service Mesh主流框架有Linkerd和Istio,其中Istio有大廠加持所以呼聲更高。Service Mesh我接觸還不多,但是個人感覺並不一定能稱為下一代微服務架構,可能認為是服務治理的另外一種解決方案更合適,是否能夠取代當前的微服務架構還需要持續觀察。
2. 微服務架構 | 2.1 使用 Spring Cloud Config 管理服務配置項
參考資料 :
《Spring Microservices in Action》
《Spring Cloud Alibaba 微服務原理與實戰》
《B站 尚矽谷 SpringCloud 框架開發教程 周陽》
SpringCloud Config 為微服務架構中的微服務提供集中化的外部配置支持,配置伺服器為各個不同微服務應用的所有環境提供了一個中心化的外部配置;
特點 :
@EnableConfigServer :表明該服務是個 config 配置伺服器;
@SpringBootApplication :表明是一個 Spring Boot 應用;
3. 微服務初體驗(二):使用Nacos作為配置中心並集成Dubbo
首先啟動Nacos,按照上篇文章的步驟,啟動Nacos服務和項目,訪問Nacos的web頁面。確保項目中的服務都注冊到注冊中心當中了。在application.yml同級目錄下添加bootstrap.yml,在Spring boot項目中bootstrap.yml會比application.yml優先初始化,所以我們需要在bootstrap.yml中引入Nacos官方指定的配置文件即可(上篇文章中已經把Nacos作為配置中心的配置寫入了application.yml,現在只需要把它從applicaiton.yml中剪切出來即可, 其中的spring:application:name會作為Nacos中新增配置時的Data ID,需要留意 ),再新增屬性gorup進行分組測試,如下圖
接著打開Nacos的服務的web頁面,打開配置管理->配置列表,點擊右側新增按鈕,進行新增。
Data ID: bootstrap.yml配置文件中spring:application:name對應的名稱 ;
Group:指定分組(便於不同環境下的項目配置管理,因為筆者這里屬於測試,所以填寫的是和上文中的配置文件中group對應的test一致);
描述:針對於該配置的描述;
配置格式:配置文件的格式,要和Data ID中的後綴格式一致(這里筆者用的是yml,那麼下面就選擇yaml,注意該位置也可以選擇properties,但是必須和上面bootstrap.yml文件中的file-extension的值相匹配);
配置內容:具體的配置內容(這里筆者將項目中的application.yml中的配置全部拷貝至其中);
測試啟動consumer服務,在application.yml中為空的時候,項目啟動埠還是如Nacos配置中的9011,說明項目依賴Nacos的配置中心成功,其他服務如法炮製即可:
新增一個測試Controller,然後加上@RefreshScope註解,表明該Controller中的配置數據為自動刷新 。
編輯Nacos中的配置文件consumer新增相關參數type: test,訪問Controller,返回test。效果如下圖:
將Nacos中consumer.yml文件的type: test修改為type: prod,在不重啟項目的情況下重新訪問對應的controller,效果如下圖:
因為Dubbo是屬於各個服務之間都要公用的依賴,所以將其引入cloud-common當中,詳細的版本可以去 mvnrepository 搜索合適自己項目的
引入依賴後需要編寫消費者服務中的配置文件,將Dubbo服務注冊至Nacos,新增如下內容,其中subscribed-services指的是生產者服務,prot:-1指的是埠隨機,registry:address:指的是Dubbo對應的注冊中心那這里就應該設置為Nacos
接下來新增介面服務,項目類型為Maven項目,在項目中新增一個介面。並在cloud-provider(生產者)和cloud-consumer(消費者)pom.xml文件中都引入該模塊
在生產者實際服務中實現該介面對應的方法
在服務消費者的Controller中引入該Service,並在該Service上加入@Reference註解,注意在引入jar包的時候選擇帶有Dubbo的,不要使用Jdk原生的
編寫消費者服務中測試Dubbo調用的介面,進行測試,測試結果如下圖:
4. 微服務中如何獲取配置文件以及多環境切換配置
同關閉系統還原沒有關系!同AVAST有關系! windows xp 速度提升和優化指南 Win XP以其華麗的操作畫面和穩定的性能成為不少電腦玩家的首選操作系統,但在使用Windows XP的過程中你會發現,隨著時間的推移操作系統在速度上是越來越慢了。
5. Spring Cloud 微服務實戰
閱讀《Spring微服務實戰》筆記
項目地址: https://gitee.com/liaozb1996/spring-cloud-in-action
配置管理原則:
Spring Cloud Config 後端存儲:文件系統、Git
標注引導類:
配置伺服器配置:
創建配置文件:
訪問配置:
客戶端配置:
spring-cloud-config-client 依賴
boostrap.properties
刷新屬性:
服務發現至關重要的原因:
傳統服務位置解析(DNS+負載均衡器)的缺點:
服務發現實現組件:
構建 Eureka 服務:
標注引導類:
單機模式配置 :
每次注冊服務都需要等待30秒,因為 eureka 需要連續接收 3 個心跳包才能使用該服務。
緩存注冊表後,客戶端每隔30秒會重新到 eureka 刷新注冊表。
服務注冊:
解決多網卡問題:
通過API獲取注冊表信息:(設置請求頭 Accept:application/json )
http://localhost:8761/eureka/apps
http://localhost:8761/eureka/apps/organization
與 Ribbon 交互的客戶端:
當使用二方包時需要在引導類添加 @EntityScan :
配置 RestTemplate:
DiscoveryClient:
支持 Ribbon 的 RestTemplate:
Feign:
OpenFeign 依賴:
Feign 會在運行時動態生成代理對象:
遠程調用包括對遠程資源和遠程服務的調用。
遠程調用會遇到兩個問題:
四種客戶端彈性模式:
為什麼客戶端彈性模式很重要:
客戶端彈性模式提供了三種構建能力:
在引導類啟動斷路器:
配置屬性手冊: https://github.com/Netflix/Hystrix/wiki/Configuration
使用 Hystrix 默認配置對遠程調用進行管理:
超時配置: execution.isolation.thread.timeoutInMilliseconds
配置後備策略:後備方法必須在同一類中並且具有相同的方法簽名
配置艙壁:
Hystrix 斷路的策略:
Hystrix 有三個級別的配置:
類級別配置:
Hystrix 有兩個隔離策略:
如果使用 TREAD 策略,並且要將父線程的上下文傳遞到子線程中,需要自定義 HystrixConcurrencyStrategy
Zuul 提供的功能:路由映射、構建過濾器
依賴:zuul、eureka-client
標注引導類:
zuul 配置:
Zuul路由映射機制:
查詢路由: http://localhost:8080/actuator/routes
調用服務: http://localhost:8080/license/license/1 (第一個 license 是服務ID,/license/1 是請求路徑)
使用服務發現手動映射路由:
添加前綴:
手動配置靜態路由:前面都是基於 eureka 上的服務id進行路由映射的,而這里是直接配置URL
Git + http://localhost:8080/actuator/refresh (POST)
Zuul 使用 Hystrix 和 Ribbon
Zuul 支持三種過濾器類型:前置過濾器、後置過濾器、路由過濾器
前置過濾器:向通過網關的請求添加 tracking-id
這里使用了 Zuul 的 RequestContext:
Zuul 不允許直接修改請求頭部,這里通過 addZuulRequestHeader 添加頭部信息,在調用遠程服務會自動合並
為了方便應用獲取 tracking-id,這里使用 Filter 獲取請求頭信息並映射到 UserContext 中:
為了在服務間調用傳播 tracking-id 這里需要定義一個 和 RestTemplate:
項目中 license 會遠程調用 orgnization,這里需要在兩個微服務配置 Filter
6. 微服務SpringCloudAlibaba配置匯總
在 pom.xml 中添加 spring-cloud-alibaba-dependencies 統一管理版本:
Nacos 致力於幫助您發現、配置和管理微服務。Nacos 提供了一組簡單易用的特性集,幫助您快速實現動態服務發現、服務配置、服務元數據及流量管理。
通過 @EnableDiscoveryClient 註解表明是一個 Nacos 客戶端,該註解是 Spring Cloud 提供的原生註解
註:server-addr為Nacos Server 網址
Sentinel 以流量為切入點,從流量控制、熔斷降級、系統負載保護等多個維度保護服務的穩定性。
Sentinel 以流量為切入點,從流量控制、熔斷降級、系統負載保護等多個維度保護服務的穩定性。
使用 Spring Cloud Alibaba Nacos Config,您可以在 Nacos Server 集中管理你 Spring Cloud 應用的外部屬性配置。
注意:Spring Boot 配置文件的載入順序,依次為 bootstrap.properties -> bootstrap.yml -> application.properties -> application.yml ,其中 bootstrap.properties 配置為最高優先順序
RocketMQ 是一款開源的分布式消息系統,基於高可用分布式集群技術,提供低延時的、高可靠的消息發布與訂閱服務。
配置 Output(Source.class) 的 Binding 信息並配合 @EnableBinding 註解使其生效
運行成功後即可在 RocketMQ 控制台的 消息 列表中選擇 test-topic 主題即可看到發送的消息
配置 Input(Sink.class) 的 Binding 信息並配合 @EnableBinding 註解使其生效
RPC框架分為提供方和消費方,提供方提供服務,消費方消費服務。這里採用nacos注冊中心和Dubbo框架配置。