日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

apollo集群部署_ribbon+apollo实现灰度发布

發布時間:2024/9/18 编程问答 56 豆豆
生活随笔 收集整理的這篇文章主要介紹了 apollo集群部署_ribbon+apollo实现灰度发布 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、前言

在一般情況下,升級服務器端應用,需要將應用源碼或程序包上傳到服務器,然后停止掉老版本服務,再啟動新版本。但是這種簡單的發布方式存在兩個問題,一方面,在新版本升級過程中,服務是暫時中斷的,另一方面,如果新版本有BUG,升級失敗,回滾起來也非常麻煩,容易造成更長時間的服務不可用。

二、Apollo簡介

Apollo(阿波羅)是攜程框架部門研發的分布式配置中心,能夠集中化管理應用不同環境、不同集群的配置,配置修改后能夠實時推送到應用端,并且具備規范的權限、流程治理等特性,適用于微服務配置管理場景。

三、場景介紹

大致的場景如下,消費端通過gateway訪問提供端,提供端為集群部署(A1、A2),我們部署新應用時讓所有流量都切換到A1,我們部署A2。當A2部署完成后我們切換部分流量到A2無異常后我們再切換部署A1,這樣我們就能實現不停機發布。

四、實現過程

1.配置提供端eureka元數據:

需要實現灰度發布我們需要用到Eureka注冊中心的特性,Eureka的元數據有兩種:標準元數據和自定義元數據,這里我們用到了自定義元數據,自定義元數據可以使用eureka.instance.metadata-map配置,這些元數據可以在遠程客戶端中訪問,但一般不會改變客戶端的行為,除非客戶端知道該元數據的含義,例如將提供端集群(A1、A2)分別添加如下配置:

A1:

eureka.instance.metadata-map.group-name=server01

A2:

eureka.instance.metadata-map.group-name=server02

2.Apollo配置中心新增灰度配置:

apollo如何搭建及配置灰度這里就不做介紹官網有詳細的文檔說明,配置完成后如下圖:

將灰度配置和主配置分別指定集群的不同主機,這樣我們的eureka自定義元數據就推送到了相應的服務端。

3.自定義Ribbon規則

在spring cloud Gateway網關中我們自定義Ribbon負載均衡的規則,利用eureka自定義元數據的特性,我們可以在ribbon中獲取遠程服務的元數據配置,在網關gateway中我們增加如下兩項配置:

# 指定當前流量引流的集群名稱eureka.instance.metadata-map.group-name=server01#將規則應用到哪些服務eureka.instance.metadata-map.gray-server-name=wxt-k3-provider、wxt-act-provider

通過在apollo上我們可以實現動態的切換,將請求流量轉發到group-name指定的集群。

Ribbon自定義配置相關代碼如下,主要實現了如下兩點:

1.獲取遠程服務的自定義元數據配置。

2.獲取網關自定義灰度規則。

2.遠端服務配置與gateway配置比較如果一致將流量發送到對應服務。

public class RibbonFilter extends AbstractLoadBalancerRule {/**服務分組[all,server01,server02]*/@Value("${eureka.instance.metadata-map.group-name}")private String appGroupName;/**灰度服務[all:所有服務,none:不進行灰度,uaf-k3-provider,uaf-intellicredit-provider:指定服務]*/@Value("${eureka.instance.metadata-map.gray-server-name}")private String grayServerName;/**初始隨機規則*/Random rand = new Random();@Overridepublic void initWithNiwsConfig(IClientConfig iClientConfig) {}@Overridepublic Server choose(Object o) {/**可用服務*/List upList = getLoadBalancer().getReachableServers();/**所有服務*/List allList = getLoadBalancer().getAllServers();/**服務數*/int serverCount = allList.size();if (serverCount == 0) {return null;}/**服務名稱*/String serverName = ((DiscoveryEnabledServer) upList.get(0)).getInstanceInfo().getAppName();/**判定是否進入灰度流程*/if ("all".equalsIgnoreCase(grayServerName) && !appGroupName.equalsIgnoreCase("all")) {return grayStrategy(upList);} else if (grayServerName.toUpperCase().contains(serverName) && !appGroupName.equalsIgnoreCase("all")) {return grayStrategy(upList);} else {int index = this.rand.nextInt(serverCount);return upList.get(index);}}/** * 灰度調用規則 * @param upList eureka可用服務列表 */public Server grayStrategy(List upList) {for (Server server : upList) {/**服務分組*/String upAppGroupName = ((DiscoveryEnabledServer) server).getInstanceInfo().getMetadata().get("group-name");if (appGroupName.equals(upAppGroupName)) {MySlf4j.textInfo("進入灰度規則,服務地址:{0},集群組:{1}", server.getHost(), upAppGroupName);return server;}}return null;}}

自此我們完成了灰度部署相關的配置,通過分布式配置中心apollo,我們可以實現不停機維護。

總結

以上是生活随笔為你收集整理的apollo集群部署_ribbon+apollo实现灰度发布的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。