日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當(dāng)前位置:首頁 > 科技  > 軟件

微服務(wù)如何灰度發(fā)布?你會嗎?

來源: 責(zé)編: 時間:2024-05-17 17:44:54 232觀看
導(dǎo)讀微服務(wù)中的灰度發(fā)布(又稱為金絲雀發(fā)布)是一種持續(xù)部署策略,它允許在正式環(huán)境的小部分用戶群體上先部署新版本的應(yīng)用程序或服務(wù),而不是一次性對所有用戶同時發(fā)布全新的版本。這種方式有助于在生產(chǎn)環(huán)境中逐步驗證新版本的穩(wěn)

微服務(wù)中的灰度發(fā)布(又稱為金絲雀發(fā)布)是一種持續(xù)部署策略,它允許在正式環(huán)境的小部分用戶群體上先部署新版本的應(yīng)用程序或服務(wù),而不是一次性對所有用戶同時發(fā)布全新的版本。oTS28資訊網(wǎng)——每日最新資訊28at.com

這種方式有助于在生產(chǎn)環(huán)境中逐步驗證新版本的穩(wěn)定性和兼容性,同時最小化潛在風(fēng)險,不影響大部分用戶的正常使用。oTS28資訊網(wǎng)——每日最新資訊28at.com

1.灰度發(fā)布關(guān)鍵步驟

在 Spring Cloud 微服務(wù)架構(gòu)中,實(shí)現(xiàn)灰度發(fā)布通常涉及到以下幾個方面:oTS28資訊網(wǎng)——每日最新資訊28at.com

  1. 流量分割

根據(jù)一定的策略(如用戶 ID、請求頭信息、IP 地址等)將流入的請求分配給不同版本的服務(wù)實(shí)例。oTS28資訊網(wǎng)——每日最新資訊28at.com

使用 Spring Cloud Gateway、Zuul 等 API 網(wǎng)關(guān)組件實(shí)現(xiàn)路由規(guī)則,將部分請求定向至新版本的服務(wù)節(jié)點(diǎn)。oTS28資訊網(wǎng)——每日最新資訊28at.com

  1. 版本標(biāo)識

新版本服務(wù)啟動時會注冊帶有特定版本標(biāo)簽的服務(wù)實(shí)例到服務(wù)注冊中心(如 Eureka 或 Nacos)。oTS28資訊網(wǎng)——每日最新資訊28at.com

請求在路由時可以根據(jù)版本標(biāo)簽選擇相應(yīng)版本的服務(wù)實(shí)例。oTS28資訊網(wǎng)——每日最新資訊28at.com

  1. 監(jiān)控與評估oTS28資訊網(wǎng)——每日最新資訊28at.com

在灰度發(fā)布的階段,運(yùn)維團(tuán)隊會對新版本服務(wù)的性能、穩(wěn)定性以及用戶體驗等方面進(jìn)行實(shí)時監(jiān)控和評估。oTS28資訊網(wǎng)——每日最新資訊28at.com

如果新版本表現(xiàn)良好,則可以逐漸擴(kuò)大灰度范圍直至全面替換舊版本。oTS28資訊網(wǎng)——每日最新資訊28at.com

  1. 故障恢復(fù)與回滾:若新版本出現(xiàn)問題,可通過快速撤銷灰度發(fā)布策略,使所有流量恢復(fù)到舊版本服務(wù),實(shí)現(xiàn)快速回滾,確保服務(wù)整體可用性。oTS28資訊網(wǎng)——每日最新資訊28at.com

通過 Spring Cloud 的擴(kuò)展組件和自定義路由策略,開發(fā)人員可以輕松實(shí)現(xiàn)灰度發(fā)布功能,確保在微服務(wù)架構(gòu)中安全、平滑地進(jìn)行版本迭代升級。oTS28資訊網(wǎng)——每日最新資訊28at.com

2.實(shí)現(xiàn)思路

灰色發(fā)布的常見實(shí)現(xiàn)思路有以下幾種:oTS28資訊網(wǎng)——每日最新資訊28at.com

  • 根據(jù)用戶劃分:根據(jù)用戶標(biāo)識或用戶組進(jìn)行劃分,在整個用戶群體中只選擇一小部分用戶獲得新功能。
  • 根據(jù)地域劃分:在不同地區(qū)或不同節(jié)點(diǎn)上進(jìn)行劃分,在其中的一小部分地區(qū)或節(jié)點(diǎn)進(jìn)行新功能的發(fā)布。
  • 根據(jù)流量劃分:根據(jù)流量的百分比或請求次數(shù)進(jìn)行劃分,只將一部分請求流量引導(dǎo)到新功能上。

而在生產(chǎn)環(huán)境中,比較常用的是根據(jù)用戶標(biāo)識來實(shí)現(xiàn)灰色發(fā)布,也就是說先讓一小部分用戶體驗新功能,以發(fā)現(xiàn)新服務(wù)中可能存在的某種缺陷或不足。oTS28資訊網(wǎng)——每日最新資訊28at.com

3.底層實(shí)現(xiàn)

Spring Cloud 全鏈路灰色發(fā)布的關(guān)鍵實(shí)現(xiàn)思路如下圖所示:oTS28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片oTS28資訊網(wǎng)——每日最新資訊28at.com

灰度發(fā)布的具體實(shí)現(xiàn)步驟如下:oTS28資訊網(wǎng)——每日最新資訊28at.com

  1. 前端程序在灰度測試的用戶 Header 頭中打上標(biāo)簽,例如在 Header 中添加“gray-tag: true”,其表示要進(jìn)行灰常測試(訪問灰度服務(wù)),而其他則為訪問正式服務(wù)。
  2. 在負(fù)載均衡器 Spring Cloud LoadBalancer 中,拿到 Header 中的“gray-tag”進(jìn)行判斷,如果此標(biāo)簽不為空,并等于“true”的話,表示要訪問灰度發(fā)布的服務(wù),否則只訪問正式的服務(wù)。
  3. 在網(wǎng)關(guān) Spring Cloud Gateway 中,將 Header 標(biāo)簽“gray-tag: true”繼續(xù)往下一個調(diào)用服務(wù)中傳遞。
  4. 在后續(xù)的調(diào)用服務(wù)中,需要實(shí)現(xiàn)以下兩個關(guān)鍵功能:

在負(fù)載均衡器 Spring Cloud LoadBalancer 中,判斷灰度發(fā)布標(biāo)簽,將請求分發(fā)到對應(yīng)服務(wù)。oTS28資訊網(wǎng)——每日最新資訊28at.com

將灰度發(fā)布標(biāo)簽(如果存在),繼續(xù)傳遞給下一個調(diào)用的服務(wù)。oTS28資訊網(wǎng)——每日最新資訊28at.com

經(jīng)過第四步的反復(fù)傳遞之后,整個 Spring Cloud 全鏈路的灰度發(fā)布就完成了。oTS28資訊網(wǎng)——每日最新資訊28at.com

4.具體實(shí)現(xiàn)

4.1 版本標(biāo)識

在灰度發(fā)布的執(zhí)行流程中,有一個核心的問題,如果在 Spring Cloud LoadBalancer 進(jìn)行服務(wù)調(diào)用時,區(qū)分正式服務(wù)和灰度服務(wù)呢?oTS28資訊網(wǎng)——每日最新資訊28at.com

這個問題的解決方案是:在灰度服務(wù)既注冊中心的 MetaData(元數(shù)據(jù))中標(biāo)識自己為灰度服務(wù)即可,而元數(shù)據(jù)中沒有標(biāo)識(灰度服務(wù))的則為正式服務(wù),以 Nacos 為例,它的設(shè)置如下:oTS28資訊網(wǎng)——每日最新資訊28at.com

spring:  application:    name: gray-user-service  cloud:    nacos:      discovery:        username: nacos        password: nacos        server-addr: localhost:8848        namespace: public        register-enabled: true         metadata: { "gray-tag":"true" } # 標(biāo)識自己為灰度服務(wù)

4.2 負(fù)載均衡調(diào)用灰度服務(wù)

Spring Cloud LoadBalancer 判斷并調(diào)用灰度服務(wù)的關(guān)鍵實(shí)現(xiàn)代碼如下:oTS28資訊網(wǎng)——每日最新資訊28at.com

private Response<ServiceInstance> getInstanceResponse(List<ServiceInstance> instances,                                                          Request request) {        // 實(shí)例為空        if (instances.isEmpty()) {            if (log.isWarnEnabled()) {                log.warn("No servers available for service: " + this.serviceId);            }            return new EmptyResponse();        } else { // 服務(wù)不為空            RequestDataContext dataContext = (RequestDataContext) request.getContext();            HttpHeaders headers = dataContext.getClientRequest().getHeaders();            // 判斷是否為灰度發(fā)布(請求)            if (headers.get(GlobalVariables.GRAY_KEY) != null &&                    headers.get(GlobalVariables.GRAY_KEY).get(0).equals("true")) {                // 灰度發(fā)布請求,得到新服務(wù)實(shí)例列表                List<ServiceInstance> findInstances = instances.stream().                        filter(s -> s.getMetadata().get(GlobalVariables.GRAY_KEY) != null &&                                s.getMetadata().get(GlobalVariables.GRAY_KEY).equals("true"))                        .toList();                if (findInstances.size() > 0) { // 存在灰度發(fā)布節(jié)點(diǎn)                    instances = findInstances;                }            } else { // 查詢非灰度發(fā)布節(jié)點(diǎn)                // 灰度發(fā)布測試請求,得到新服務(wù)實(shí)例列表                instances = instances.stream().                        filter(s -> s.getMetadata().get(GlobalVariables.GRAY_KEY) == null ||                                !s.getMetadata().get(GlobalVariables.GRAY_KEY).equals("true"))                        .toList();            }            // 隨機(jī)正數(shù)值 ++i( & 去負(fù)數(shù))            int pos = this.position.incrementAndGet() & Integer.MAX_VALUE;            // ++i 數(shù)值 % 實(shí)例數(shù) 取模 -> 輪詢算法            int index = pos % instances.size();            // 得到服務(wù)實(shí)例方法            ServiceInstance instance = (ServiceInstance) instances.get(index);            return new DefaultResponse(instance);        }    }

以上代碼為自定義負(fù)載均衡器,并使用了輪詢算法。如果 Header 中有灰度標(biāo)簽,則只查詢灰度服務(wù)的節(jié)點(diǎn)實(shí)例,否則則查詢出所有的正式節(jié)點(diǎn)實(shí)例(以供服務(wù)調(diào)用或服務(wù)轉(zhuǎn)發(fā))。oTS28資訊網(wǎng)——每日最新資訊28at.com

4.3 網(wǎng)關(guān)傳遞灰度標(biāo)識

要在網(wǎng)關(guān) Spring Cloud Gateway 中傳遞灰度標(biāo)識,只需要在 Gateway 的全局自定義過濾器中設(shè)置 Response 的 Header 即可,具體實(shí)現(xiàn)代碼如下:oTS28資訊網(wǎng)——每日最新資訊28at.com

package com.example.gateway.config;import com.loadbalancer.canary.common.GlobalVariables;import org.springframework.cloud.gateway.filter.GatewayFilterChain;import org.springframework.cloud.gateway.filter.GlobalFilter;import org.springframework.core.Ordered;import org.springframework.http.HttpStatus;import org.springframework.http.server.reactive.ServerHttpRequest;import org.springframework.http.server.reactive.ServerHttpResponse;import org.springframework.stereotype.Component;import org.springframework.web.server.ServerWebExchange;import reactor.core.publisher.Mono;@Componentpublic class LoadBalancerFilter implements GlobalFilter {    @Override    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {        // 得到 request、response 對象        ServerHttpRequest request = exchange.getRequest();        ServerHttpResponse response = exchange.getResponse();        if (request.getQueryParams().getFirst(GlobalVariables.GRAY_KEY) != null) {            // 設(shè)置金絲雀標(biāo)識            response.getHeaders().set(GlobalVariables.GRAY_KEY,                    "true");        }        // 此步驟正常,執(zhí)行下一步        return chain.filter(exchange);    }}

4.4 微服務(wù)中傳遞灰度標(biāo)簽

HTTP 調(diào)用工具 Openfeign,我們需要在微服務(wù)間繼續(xù)傳遞灰度標(biāo)簽,它的實(shí)現(xiàn)代碼如下:oTS28資訊網(wǎng)——每日最新資訊28at.com

import feign.RequestInterceptor;import feign.RequestTemplate;import jakarta.servlet.http.HttpServletRequest;import org.springframework.stereotype.Component;import org.springframework.web.context.request.RequestContextHolder;import org.springframework.web.context.request.ServletRequestAttributes;import java.util.Enumeration;import java.util.LinkedHashMap;import java.util.Map;@Componentpublic class FeignRequestInterceptor implements RequestInterceptor {    @Override    public void apply(RequestTemplate template) {        // 從 RequestContextHolder 中獲取 HttpServletRequest        ServletRequestAttributes attributes = (ServletRequestAttributes)                RequestContextHolder.getRequestAttributes();        // 獲取 RequestContextHolder 中的信息        Map<String, String> headers = getHeaders(attributes.getRequest());        // 放入 openfeign 的 RequestTemplate 中        for (Map.Entry<String, String> entry : headers.entrySet()) {            template.header(entry.getKey(), entry.getValue());        }    }    /**     * 獲取原請求頭     */    private Map<String, String> getHeaders(HttpServletRequest request) {        Map<String, String> map = new LinkedHashMap<>();        Enumeration<String> enumeration = request.getHeaderNames();        if (enumeration != null) {            while (enumeration.hasMoreElements()) {                String key = enumeration.nextElement();                String value = request.getHeader(key);                map.put(key, value);            }        }        return map;    }}


oTS28資訊網(wǎng)——每日最新資訊28at.com

本文鏈接:http://m.www897cc.com/showinfo-26-88919-0.html微服務(wù)如何灰度發(fā)布?你會嗎?

聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 一篇文章帶你了解JavaScript While 循環(huán)

下一篇: C++ algorithm.h 頭文件的常見算法的使用

標(biāo)簽:
  • 熱門焦點(diǎn)
Top 日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不
国产精品超碰97尤物18| 米奇777在线欧美播放| 亚洲一区在线看| 欧美一级片一区| 久久久久99精品国产片| 欧美电影在线播放| 欧美揉bbbbb揉bbbbb| 国产精品无码专区在线观看| 国产一区二区三区四区在线观看| 亚洲国产视频直播| 99国产精品视频免费观看一公开| 亚洲一区图片| 免费成人在线观看视频| 欧美日韩精品在线观看| 国产亚洲精品美女| 日韩视频在线永久播放| 亚洲欧美一级二级三级| 欧美1区2区| 国产伦精品一区二区三区四区免费 | 国产一区二区三区的电影| 亚洲国产一区在线观看| 亚洲欧美国产精品va在线观看| 久久亚洲国产精品日日av夜夜| 欧美日韩国产黄| 国产一区二区中文字幕免费看| 亚洲伦理中文字幕| 久久精品一区二区| 国产精品大片wwwwww| 在线观看国产日韩| 亚洲摸下面视频| 欧美高清视频一二三区| 国产伦精品一区二区三| 亚洲精品在线观看视频| 久久不射中文字幕| 欧美婷婷久久| 亚洲激情综合| 久久精品国产第一区二区三区最新章节 | 免费在线看成人av| 国产欧美日韩视频| 一区二区三区高清不卡| 免费成人av在线看| 国产专区精品视频| 亚洲欧美日韩区| 欧美日韩国产在线| 激情成人在线视频| 欧美一级片一区| 国产精品啊啊啊| 亚洲精品乱码久久久久| 久久久久久久网| 国产欧美精品一区| 亚洲视频999| 欧美日本韩国一区| 亚洲激情亚洲| 老牛影视一区二区三区| 国产一区二区三区久久精品| 亚洲女优在线| 欧美日一区二区在线观看| 亚洲欧洲精品天堂一级| 另类av导航| 精品动漫一区| 欧美在线影院| 国产精品夜夜夜| 亚洲一区二区四区| 欧美午夜三级| 一本综合久久| 欧美日韩三级视频| 日韩视频不卡| 欧美激情久久久久久| 亚洲国产精品久久久久秋霞影院| 久久综合亚洲社区| 极品尤物av久久免费看| 久久精品亚洲国产奇米99| 国产欧美日韩精品专区| 亚洲欧美韩国| 国产精品一二三四区| 亚洲综合电影| 国产精品乱人伦中文| 亚洲欧美成人一区二区在线电影| 国产精品高潮在线| 亚洲视频在线观看网站| 国产精品v欧美精品∨日韩| 一区二区三区高清在线| 欧美亚州一区二区三区| 一区二区三区精品视频| 欧美亚州韩日在线看免费版国语版| 亚洲精品一区二区三区福利 | 激情国产一区二区| 久久久久久久久蜜桃| 精品电影在线观看| 老司机成人网| 亚洲国产精品一区制服丝袜| 欧美大片免费观看在线观看网站推荐| 亚洲国产婷婷香蕉久久久久久99 | 欧美福利视频在线观看| 亚洲精品日韩一| 欧美日韩另类字幕中文| 亚洲午夜在线视频| 国产精品入口麻豆原神| 欧美在线精品一区| 极品av少妇一区二区| 久热精品视频在线免费观看| 亚洲国产日韩欧美| 欧美日韩在线免费观看| 亚洲男人第一网站| 国产一区二区三区四区| 久久亚洲欧洲| 亚洲美女视频在线观看| 国产精品久久久久久久久动漫| 欧美一级淫片aaaaaaa视频| 狠狠色香婷婷久久亚洲精品| 美腿丝袜亚洲色图| 99精品视频免费全部在线| 国产精品久久综合| 久久久久久亚洲精品中文字幕 | 久久国产婷婷国产香蕉| 亚洲国产精品久久久久秋霞影院| 欧美日韩色综合| 亚洲欧美在线播放| 激情欧美国产欧美| 欧美日韩成人免费| 欧美一级一区| 91久久夜色精品国产九色| 欧美午夜在线| 久久天天狠狠| 一区二区三区欧美视频| 国产一区二区三区无遮挡| 欧美黄色小视频| 欧美一区二区私人影院日本| 亚洲激情女人| 国产欧美不卡| 欧美大片免费久久精品三p | 国产精品成人一区二区三区吃奶 | 欧美日韩和欧美的一区二区| 亚洲一区在线观看免费观看电影高清| 国产欧美一区二区精品婷婷 | 欧美在线综合| 亚洲国产精品欧美一二99| 国产精品大片免费观看| 久久在精品线影院精品国产| 中文网丁香综合网| 在线播放亚洲| 国产精品人成在线观看免费| 免费在线观看成人av| 香蕉成人久久| 日韩天天综合| 激情综合自拍| 国产乱码精品一区二区三区av| 美女国内精品自产拍在线播放| 亚洲午夜电影在线观看| 亚洲国产日韩欧美在线图片| 国产日韩欧美视频| 欧美日韩和欧美的一区二区| 久久野战av| 欧美亚洲一区| 日韩视频在线你懂得| 影音先锋日韩有码| 亚洲欧美久久久| 国内激情久久| 欧美日韩调教| 麻豆精品国产91久久久久久| 亚洲午夜在线观看| 亚洲激情影院| 狠狠色丁香婷婷综合影院| 国产精品www| 欧美激情按摩| 久久综合久久综合久久| 欧美一区激情| 亚洲视频在线观看一区| 亚洲国产视频一区| 国产一区二区三区高清在线观看| 欧美午夜片在线观看| 欧美国产视频日韩| 久久综合九色综合久99| 欧美自拍偷拍午夜视频| 亚洲一区二区三区高清 | 一本久久青青| 91久久精品一区二区别| 在线观看国产精品淫| 国产一区二区黄色| 国产精品综合不卡av| 欧美视频一区在线| 欧美区二区三区| 欧美大片第1页| 欧美mv日韩mv国产网站| 久久综合国产精品| 久久久蜜臀国产一区二区| 久久精品成人| 久久国产精品高清| 久久成人免费视频| 国模一区二区三区| 欧美一级大片在线观看| 在线日韩成人| 国产日韩在线亚洲字幕中文| 欧美日韩一区二区三区四区在线观看| 另类国产ts人妖高潮视频| 久久精品一区二区三区中文字幕| 亚洲欧美日韩在线一区| 亚洲午夜激情| 一本色道久久综合亚洲精品按摩| 亚洲精品久久久一区二区三区| 亚洲国内精品在线| 91久久在线播放| 亚洲黄色有码视频| 亚洲国产欧美一区二区三区丁香婷|