[學習微服務-第2天] ServiceComb + SpringCloud Zuul源碼解讀

上一篇文章咱們介紹了ServiceComb與SpringCloud的Zuul網關組件協同工做,以構建微服務應用。爲了給ServiceComb作貢獻的夥伴提供指引,本篇將介紹ServiceComb與SpringCloud Zuul的集成源碼。html

 

ServiceComb 對接 Spring Cloud Zuul 思路java

ServiceComb沒有修改SpringCloud Zuul的源代碼,而是利用了 SpringCloud 提供的可擴展的接口。git

 

Spring Cloud Zuul官網有以下兩段描述github

▼▼▼spring

•Zuul starter不包括服務發現客戶端, 因此爲了實現基於service ID的路由轉發,你必須同時在類路徑下提供一個服務發現客戶端 ( 可使用 Eureka )apache

•DiscoveryClientRouteLocator 過濾器從一個DiscoveryClient(例如Eureka)和屬性文件中加載了路由定義信息。springboot

詳情參考:https://cloud.spring.io/spring-cloud-netflix/multi/multi__router_and_filter_zuul.html微信

 

從以上的描述看,SpringCloud Zuul容許咱們自定義服務發現客戶端來實現本身的服務發現邏輯。其中DiscoveryClient接口是Spring Cloud Commons提供的與服務治理相關的抽象接口,Spring Cloud Commons作了一層抽象,很好的解耦了服務治理體系,使得咱們能夠輕易的替換不一樣的服務治理設施。負載均衡

 

在咱們的上篇文章[天天5分鐘學習微服務-網關]ServiceComb+SpringCloud Zuul中實現的zuulserver項目中,pom文件中有以下依賴↓↓↓框架

以上就是一個自定義discovery client。這個discovery client是專門與ServiceComb的服務與發現註冊中心ServiceCenter進行交互的。

 

 

以下圖所示,客戶端和各個微服務都與Zuul網關直接通訊,而Zuul網關經過ServiceComb Discovery與ServiceCenter獲取服務的實例信息(真實IP地址和端口等)

ServiceComb Discovery源碼分析

目錄結構

源碼從github上下載↓↓↓

https://github.com/apache/servicecomb-java-chassis/tree/master/java-chassis-spring-boot/spring-boot-starter/spring-boot-starter-discovery   

很明顯這是一個自定義的SpringBoot的starter項目。
關於SpringBoot自定義starter能夠參考: Creating your own starter(https://docs.spring.io/spring-boot/docs/1.5.12.RELEASE/reference/htmlsingle/#boot-features-custom-starter)

springboot的starter項目通常是作自動配置(auto-configure)。那麼如下按照starter項目的思路來分析。

 

1. 自動配置入口

org.apache.servicecomb.springboot.starter.discovery包下面的ScbDiscoveryClientConfiguration類中和ScbRibbonConfiguration類中找到了AutoConfigureBefore和AutoConfigureAfter註解

 

  • AutoConfigureBefore:類級別的註解,在指定類初始化配置以前自動執行當前配置類

  • AutoConfigureAfter:類級別的註解,在指定類初始化配置以後自動執行當前配置類

 

tips:

查看spring.factories文件是否有org.springframework.boot.autoconfigure.EnableAutoConfiguration的配置或者包下面的類是否有@AutoConfigureBefore,@AutoConfigureAfter註解

 

 

2. ScbDiscoveryClientConfiguration類

這是一個Spring自動配置類,在這個類裏只實例化了DiscoveryClient對象

這個配置類只實例化了一個DiscoveryClient對象。

重點來了,這個DiscoveryClient對象就是給Zuul使用的!!! 

最終會被Zuul的 DiscoveryClientRouteLocator 過濾器 用來加載路由定義信息。

 

3. ScbRibbonConfiguration類

這是個Spring自動配置類,這個類是爲了導入配置類RibbonAutoConfiguration.class

代碼如上,沒有任何實現,注意看註解@RibbonClients ,指定了ScbRibbonClientConfiguration類來配置RibbonClient。下面看這個類。

 

4. ScbRibbonClientConfiguration類

這個類是Spring配置類,實例化了Ribbon相關的Bean

ServerList是Ribbon框架的東西(Ribbon是客戶端負載均衡框架)。ServerList是獲取服務列表的接口
ServiceCombServerList類繼承於抽象類AbstractServerList,而AbstractServerList實現了ServerList接口

接着看下ServiceCombServerList作了什麼事情。

5. ServiceCombServerList 類

這個類是給Ribbon使用,負責獲取服務實例信息(真實IP地址和端口等)。

重點在下面這個方法,這個方法使用DiscoveryTree對象真正獲取服務實例。最終返回的是可用微服務實例的真實ip地址和端口。
DiscoveryTree是ServiceComb的service-registry包的,這個包是負責服務註冊的。

DiscoveryTree的邏輯比較複雜,能夠經過下面的處理流程瞭解其處理過程。

參考官方文檔 ↓↓↓

https://docs.servicecomb.io/java-chassis/zh_CN/references-handlers/loadbalance.html

感興趣的同窗能夠研究下ServiceComb的service-registry包的實現,這裏不展開分析。

DiscoveryTree最終會調用到ServiceRegistryClientImpl.findServiceInstances方法

▼▼▼

ServiceRegistryClientImpl.findServiceInstances

在這個方法內直接調用ServiceCenter的rest接口Const.REGISTRY_API.MICROSERVICE_INSTANCES來獲取相應的微服務實例信息(http://127.0.0.1:30100/v4/default/registry/instances)

 

文/末/小/結

 

本文向社區讀者從源碼角度闡述了ServiceComb是如何支持SpringCloud Zuul的。

單純使用的用戶實際上沒必要關心這些細節:)

固然,咱們也很是歡迎愛好者們向社區提問和貢獻代碼。

下章咱們將介紹ServiceComb內置的EdgeService網關能力

 

若是在閱讀ServiceComb對Zuul相關支持代碼時有任何疑問想交流,歡迎掃碼加入進微信羣。

 

相關文章
相關標籤/搜索