apollo集群部署_ribbon+apollo实现灰度发布
一、前言
在一般情況下,升級服務(wù)器端應(yīng)用,需要將應(yīng)用源碼或程序包上傳到服務(wù)器,然后停止掉老版本服務(wù),再啟動新版本。但是這種簡單的發(fā)布方式存在兩個問題,一方面,在新版本升級過程中,服務(wù)是暫時中斷的,另一方面,如果新版本有BUG,升級失敗,回滾起來也非常麻煩,容易造成更長時間的服務(wù)不可用。
二、Apollo簡介
Apollo(阿波羅)是攜程框架部門研發(fā)的分布式配置中心,能夠集中化管理應(yīng)用不同環(huán)境、不同集群的配置,配置修改后能夠?qū)崟r推送到應(yīng)用端,并且具備規(guī)范的權(quán)限、流程治理等特性,適用于微服務(wù)配置管理場景。
三、場景介紹
大致的場景如下,消費端通過gateway訪問提供端,提供端為集群部署(A1、A2),我們部署新應(yīng)用時讓所有流量都切換到A1,我們部署A2。當(dāng)A2部署完成后我們切換部分流量到A2無異常后我們再切換部署A1,這樣我們就能實現(xiàn)不停機發(fā)布。
四、實現(xiàn)過程
1.配置提供端eureka元數(shù)據(jù):
需要實現(xiàn)灰度發(fā)布我們需要用到Eureka注冊中心的特性,Eureka的元數(shù)據(jù)有兩種:標(biāo)準(zhǔn)元數(shù)據(jù)和自定義元數(shù)據(jù),這里我們用到了自定義元數(shù)據(jù),自定義元數(shù)據(jù)可以使用eureka.instance.metadata-map配置,這些元數(shù)據(jù)可以在遠(yuǎn)程客戶端中訪問,但一般不會改變客戶端的行為,除非客戶端知道該元數(shù)據(jù)的含義,例如將提供端集群(A1、A2)分別添加如下配置:
A1:
eureka.instance.metadata-map.group-name=server01A2:
eureka.instance.metadata-map.group-name=server022.Apollo配置中心新增灰度配置:
apollo如何搭建及配置灰度這里就不做介紹官網(wǎng)有詳細(xì)的文檔說明,配置完成后如下圖:
將灰度配置和主配置分別指定集群的不同主機,這樣我們的eureka自定義元數(shù)據(jù)就推送到了相應(yīng)的服務(wù)端。
3.自定義Ribbon規(guī)則
在spring cloud Gateway網(wǎng)關(guān)中我們自定義Ribbon負(fù)載均衡的規(guī)則,利用eureka自定義元數(shù)據(jù)的特性,我們可以在ribbon中獲取遠(yuǎn)程服務(wù)的元數(shù)據(jù)配置,在網(wǎng)關(guān)gateway中我們增加如下兩項配置:
# 指定當(dāng)前流量引流的集群名稱eureka.instance.metadata-map.group-name=server01#將規(guī)則應(yīng)用到哪些服務(wù)eureka.instance.metadata-map.gray-server-name=wxt-k3-provider、wxt-act-provider通過在apollo上我們可以實現(xiàn)動態(tài)的切換,將請求流量轉(zhuǎn)發(fā)到group-name指定的集群。
Ribbon自定義配置相關(guān)代碼如下,主要實現(xiàn)了如下兩點:
1.獲取遠(yuǎn)程服務(wù)的自定義元數(shù)據(jù)配置。
2.獲取網(wǎng)關(guān)自定義灰度規(guī)則。
2.遠(yuǎn)端服務(wù)配置與gateway配置比較如果一致將流量發(fā)送到對應(yīng)服務(wù)。
public class RibbonFilter extends AbstractLoadBalancerRule {/**服務(wù)分組[all,server01,server02]*/@Value("${eureka.instance.metadata-map.group-name}")private String appGroupName;/**灰度服務(wù)[all:所有服務(wù),none:不進(jìn)行灰度,uaf-k3-provider,uaf-intellicredit-provider:指定服務(wù)]*/@Value("${eureka.instance.metadata-map.gray-server-name}")private String grayServerName;/**初始隨機規(guī)則*/Random rand = new Random();@Overridepublic void initWithNiwsConfig(IClientConfig iClientConfig) {}@Overridepublic Server choose(Object o) {/**可用服務(wù)*/List upList = getLoadBalancer().getReachableServers();/**所有服務(wù)*/List allList = getLoadBalancer().getAllServers();/**服務(wù)數(shù)*/int serverCount = allList.size();if (serverCount == 0) {return null;}/**服務(wù)名稱*/String serverName = ((DiscoveryEnabledServer) upList.get(0)).getInstanceInfo().getAppName();/**判定是否進(jìn)入灰度流程*/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);}}/** * 灰度調(diào)用規(guī)則 * @param upList eureka可用服務(wù)列表 */public Server grayStrategy(List upList) {for (Server server : upList) {/**服務(wù)分組*/String upAppGroupName = ((DiscoveryEnabledServer) server).getInstanceInfo().getMetadata().get("group-name");if (appGroupName.equals(upAppGroupName)) {MySlf4j.textInfo("進(jìn)入灰度規(guī)則,服務(wù)地址:{0},集群組:{1}", server.getHost(), upAppGroupName);return server;}}return null;}}自此我們完成了灰度部署相關(guān)的配置,通過分布式配置中心apollo,我們可以實現(xiàn)不停機維護(hù)。
總結(jié)
以上是生活随笔為你收集整理的apollo集群部署_ribbon+apollo实现灰度发布的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 老电脑如何瞬间翻新笔记本电脑如何翻新
- 下一篇: docker 容器保存为镜像_Docke