1. 程式人生 > 其它 >【Soul閘道器探祕】springcloud外掛原理

【Soul閘道器探祕】springcloud外掛原理

技術標籤:souljavasoul閘道器

文章目錄

一、外掛概述

外掛定位

springcloud 外掛是一個 springcloud 正向代理外掛,所有的 springcloud 請求都由該外掛進行負載均衡處理。

生效時機

當請求頭的 rpcType = springcloud 且外掛啟用時,它將根據請求引數匹配規則,最終交由下游外掛進行響應式代理呼叫。

二、外掛處理流程

1)先回顧下請求處理類外掛的通用流程(AbstractSoulPlugin # execute):

public Mono<Void> execute(final ServerWebExchange exchange, final SoulPluginChain chain) {
    // 獲取外掛資料
    String pluginName = named();
    final PluginData pluginData = BaseDataCache.getInstance().obtainPluginData(pluginName);
    // 外掛生效判定
    if (pluginData != null && pluginData.getEnabled
()) { // 獲取選擇器資料 final Collection<SelectorData> selectors = BaseDataCache.getInstance().obtainSelectorData(pluginName); ... // 匹配選擇器 final SelectorData selectorData = matchSelector(exchange, selectors); ... // 獲取規則資料 final List<RuleData>
rules = BaseDataCache.getInstance().obtainRuleData(selectorData.getId()); ... // 匹配規則 RuleData rule; if (selectorData.getType() == SelectorTypeEnum.FULL_FLOW.getCode()) { //get last rule = rules.get(rules.size() - 1); } else { rule = matchRule(exchange, rules); } ... // 執行自定義處理 return doExecute(exchange, chain, selectorData, rule); } // 繼續執行外掛鏈處理 return chain.execute(exchange); }

AbstractSoulPlugin 判斷外掛是否存在且啟用:

  • 判斷通過,則開始執行該外掛處理
    1. 匹配選擇器
    2. 匹配規則
    3. 執行自定義處理
  • 否則,繼續執行外掛鏈處理。

2)再來看看 springcloud 外掛的自定義處理流程(SpringCloudPlugin # doExecute):

protected Mono<Void> doExecute(final ServerWebExchange exchange, final SoulPluginChain chain, final SelectorData selector, final RuleData rule) {
    ...
    // 獲取規則處理物件
    final SpringCloudRuleHandle ruleHandle = GsonUtils.getInstance().fromJson(rule.getHandle(), SpringCloudRuleHandle.class);
    // 獲取選擇器處理物件
    final SpringCloudSelectorHandle selectorHandle = GsonUtils.getInstance().fromJson(selector.getHandle(), SpringCloudSelectorHandle.class);
    ...
    // 負載均衡器選擇服務例項
    final ServiceInstance serviceInstance = loadBalancer.choose(selectorHandle.getServiceId());
    ...
    // 重建 URI
    final URI uri = loadBalancer.reconstructURI(serviceInstance, URI.create(soulContext.getRealUrl()));
    // 生成真實的 URL
    String realURL = buildRealURL(uri.toASCIIString(), soulContext.getHttpMethod(), exchange.getRequest().getURI().getQuery());
    // 設定真實 url 和超時時間
    exchange.getAttributes().put(Constants.HTTP_URL, realURL);
    exchange.getAttributes().put(Constants.HTTP_TIME_OUT, ruleHandle.getTimeout());
    // 繼續執行外掛鏈處理
    return chain.execute(exchange);
}

SpringCloudPlugin 先獲取到選擇器處理物件,然後使用負載均衡器根據處理物件的服務 id 選擇服務例項並重建 URI,據此 URI 生成真實的 URL,最後設定最終的 url 和超時時間交由外掛鏈下游進行處理。

注意:

springcloud 外掛自身只是負責根據選擇器、規則和注入的負載均衡器選出待分發的伺服器例項,並不直接向後端服務發起請求。

三、負載均衡器

springcloud 外掛在處理過程中,外掛本身並不承擔如 divide 外掛一般的探活和負載均衡的職責,而是交由一個負載均衡器去處理。

該負載均衡器需要實現 org.springframework.cloud.client.loadbalancer.LoadBalancerClient,官方使用的是 org.springframework.cloud.netflix.ribbon.RibbonLoadBalancerClient。

3.1 Ribbon 是什麼?

Ribbon 是 Netflix 釋出的一個開源的客戶端負載均衡器,是 SpringCloud-Netflix 中重要的一環,通過它將 Netflix 的中間層服務連線在一起。
Ribbon 客戶端元件提供一系列完善的配置項,如連線超時、重試等。簡單的說,就是在配置檔案中列出 Load Balancer 後面所有的服務,Ribbon 會自動的基於某種規則(如簡單輪詢,隨機連線等)去連線這些服務,也很容易實現自定義的負載均衡演算法。

3.2 Ribbon 能幹什麼?

Ribbon 是在客戶端來實現負載均衡的訪問服務,主要的功能:

  • 服務發現,發現依賴服務的列表
  • 服務選擇規則,在多個服務中如何選擇一個有效服務
  • 服務監聽,檢測失效的服務,高效剔除失效服務

3.3 Ribbon 在外掛中的職責

通過整合 ribbon,springcloud 外掛可以輕易地實現 springcloud 服務的服務發現及負載均衡策略。

在 springcloud 外掛中,ribbon 主要承擔以下職責:

  • 服務發現:自動發現依賴的服務列表
  • 服務監聽:自動剔除失效服務,維護有效服務列表
  • 服務選擇:根據某種規則選擇一個有效服務(負載均衡)

四、小結

springcloud 外掛通過負載均衡器,實現了對 springcloud 服務的負載均衡,選擇出一個有效服務的真實 URL 後,交由外掛鏈下游進行處理。

負載均衡器是 springcloud 外掛中至關重要的一環,外掛的負載均衡器預設使用 ribbon 實現。