精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

如何實現SpringCloud全鏈路灰色發布?

開發 前端
在傳統的全量發布中,新版本的功能會一次性全部部署到所有的用戶或節點上。然而,這種方式潛在的風險是,如果新版本存在缺陷或問題,可能會對所有用戶或節點產生嚴重的影響,導致系統崩潰或服務不可用。

灰度發布(Gray Release,也稱為灰度發布或金絲雀發布)是指在軟件或服務發布過程中,將新版本的功能或服務以較小的比例引入到生產環境中,僅向部分用戶或節點提供新功能的一種發布策略。

在傳統的全量發布中,新版本的功能會一次性全部部署到所有的用戶或節點上。然而,這種方式潛在的風險是,如果新版本存在缺陷或問題,可能會對所有用戶或節點產生嚴重的影響,導致系統崩潰或服務不可用。

相比之下,灰度發布采用較小的規模,并逐步將新版本的功能引入到生產環境中,僅向一小部分用戶或節點提供新功能。通過持續監測和評估,可以在發現問題時及時回滾或修復。這種逐步引入新版本的方式可以降低風險,并提高系統的穩定性和可靠性。

1.實現思路

灰色發布的常見實現思路有以下幾種:

  • 根據用戶劃分:根據用戶標識或用戶組進行劃分,在整個用戶群體中只選擇一小部分用戶獲得新功能。
  • 根據地域劃分:在不同地區或不同節點上進行劃分,在其中的一小部分地區或節點進行新功能的發布。
  • 根據流量劃分:根據流量的百分比或請求次數進行劃分,只將一部分請求流量引導到新功能上。

而在生產環境中,比較常用的是根據用戶標識來實現灰色發布,也就是說先讓一小部分用戶體驗新功能,以發現新服務中可能存在的某種缺陷或不足。

2.具體實現

Spring Cloud 全鏈路灰色發布的關鍵實現思路如下圖所示:

圖片圖片

灰度發布的具體實現步驟如下:

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

在負載均衡器 Spring Cloud LoadBalancer 中,判斷灰度發布標簽,將請求分發到對應服務。

將灰度發布標簽(如果存在),繼續傳遞給下一個調用的服務。

經過第四步的反復傳遞之后,整個 Spring Cloud 全鏈路的灰度發布就完成了。

3.核心實現思路和代碼

灰度發布的關鍵實現技術和代碼如下。

3.1 區分正式服務和灰度服務

在灰度發布的執行流程中,有一個核心的問題,如果在 Spring Cloud LoadBalancer 進行服務調用時,區分正式服務和灰度服務呢?

這個問題的解決方案是:在灰度服務既注冊中心的 MetaData(元數據)中標識自己為灰度服務即可,而元數據中沒有標識(灰度服務)的則為正式服務,以 Nacos 為例,它的設置如下:

spring:
  application:
    name: canary-user-service
  cloud:
    nacos:
      discovery:
        username: nacos
        password: nacos
        server-addr: localhost:8848
        namespace: public
        register-enabled: true 
        metadata: { "grap-tag":"true" } # 標識自己為灰度服務

3.2 負載均衡調用灰度服務

Spring Cloud LoadBalancer 判斷并調用灰度服務的關鍵實現代碼如下:

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

以上代碼為自定義負載均衡器,并使用了輪詢算法。如果 Header 中有灰度標簽,則只查詢灰度服務的節點實例,否則則查詢出所有的正式節點實例(以供服務調用或服務轉發)。

3.3 網關傳遞灰度標識

要在網關 Spring Cloud Gateway 中傳遞灰度標識,只需要在 Gateway 的全局自定義過濾器中設置 Response 的 Header 即可,具體實現代碼如下:

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;

@Component
public 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) {
            // 設置金絲雀標識
            response.getHeaders().set(GlobalVariables.GRAY_KEY,
                    "true");
        }
        // 此步驟正常,執行下一步
        return chain.filter(exchange);
    }
}

3.4 Openfeign 傳遞灰度標簽

HTTP 調用工具 Openfeign 傳遞灰度標簽的實現代碼如下:

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;

@Component
public 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;
    }
}

小結

灰度發布是微服務時代保證生產環境安全的必備措施,而其關鍵實現思路是:

1、注冊中心區分正常服務和灰度服務;

2、負載均衡正確轉發正常服務和灰度服務;

3、網關和 HTTP 工具傳遞灰度標簽。

這樣,我們就完整的實現 Spring Cloud 全鏈路灰度發布功能了。

責任編輯:武曉燕 來源: Java面試真題解析
相關推薦

2023-11-13 10:41:44

Spring微服務

2024-01-05 00:29:36

全鏈路灰度發布云原生

2023-11-21 09:35:49

全量部署微服務

2024-12-16 13:34:35

2025-03-04 08:53:10

2022-01-18 08:12:34

JWT鏈路微服務

2023-01-30 22:34:44

Node.js前端

2025-05-26 08:50:00

SLF4JMDC全鏈路追蹤

2025-01-20 08:10:00

微服務架構SLF4J

2022-08-31 22:25:53

微服務架構DevOPs

2022-02-15 17:56:19

SpringBoot日志

2023-10-16 23:43:52

云原生可觀測性

2025-09-02 01:40:00

2022-12-28 09:07:41

2022-05-23 08:23:24

鏈路追蹤SleuthSpring

2023-03-02 09:17:50

全鏈路監控系統

2024-03-13 08:56:17

全鏈路壓力測試

2022-01-04 17:08:02

全鏈路觀測平臺

2022-04-27 10:53:34

web優化性能

2022-07-22 07:59:17

日志方案
點贊
收藏

51CTO技術棧公眾號

亚洲欧美另类在线视频| 强迫凌虐淫辱の牝奴在线观看| 第一视频专区在线| 精品一区二区三区影院在线午夜 | 亚洲网站视频| 亚洲级视频在线观看免费1级| 国产成人a亚洲精v品无码| www.av在线播放| 国产麻豆午夜三级精品| 98视频在线噜噜噜国产| 第一次破处视频| 日韩中文字幕视频网| 日韩欧美在线中文字幕| 黄色一级大片免费| 国产h视频在线观看| 国产成人免费视频一区| 国产精品久久久久久中文字| 精品无码一区二区三区电影桃花 | 国产又色又爽又黄的| 日韩在线观看| 精品亚洲国产视频| 日批视频在线看| 99久久亚洲国产日韩美女| 亚洲成人在线免费| 久久久国产精华液999999| 亚洲人成色777777精品音频| 黄页视频在线91| 日本国产精品视频| 久久精品无码人妻| 91高清一区| 中文字幕在线成人| 好吊一区二区三区视频| 欧洲大片精品免费永久看nba| 91黄色免费观看| 日本a视频在线观看| av电影高清在线观看| 国产精品视频你懂的| 欧美日本亚洲| 亚洲av成人精品毛片| 国产福利91精品一区二区三区| 国产精品精品视频| 亚洲视频 欧美视频| 一本色道久久综合亚洲精品高清 | 伦理av在线| 成人欧美一区二区三区视频网页| 秋霞久久久久久一区二区| 性xxxx18| 成人av动漫在线| 97人人澡人人爽| 99免费在线视频| 激情小说亚洲一区| 成人免费视频网| 91福利免费视频| 久久电影网站中文字幕| 国产精品欧美一区二区| 波多野结衣午夜| 日本欧美一区二区三区乱码| 国产精品99蜜臀久久不卡二区| 色屁屁影院www国产高清麻豆| 99精品福利视频| 97香蕉超级碰碰久久免费的优势| 久久精品女人毛片国产| 亚洲精选成人| 91国内免费在线视频| 激情五月色婷婷| 91久久综合| 久久免费视频网站| 亚洲免费在线观看av| 国产视频一区免费看| 日本乱人伦a精品| 中文永久免费观看| 老司机免费视频一区二区| 国产日韩精品在线播放| av中文字幕免费| 成人性生交大片免费看中文网站| 国产一区在线观| 欧美精品a∨在线观看不卡| 亚洲国产精品v| 一区二区三区一级片| 91高清在线观看视频| 亚洲自拍另类综合| 无码aⅴ精品一区二区三区浪潮| 日韩三区在线| 7777精品伊人久久久大香线蕉完整版 | 哥也色在线视频| 亚洲午夜精品在线| 国产性xxxx18免费观看视频| www.久久| 欧美不卡在线视频| 日本高清www| 国产精品99久久久久久动医院| 久久国产精品视频| 亚洲最大的黄色网址| 黄色av成人| 国产成人小视频在线观看| 中文字幕码精品视频网站| 国产福利一区在线| 久久精品国产99精品国产亚洲性色| 国产乱视频在线观看| 亚洲精品国久久99热| 国产精品久久久久影视| 亚洲天堂网站| 一区二区视频免费| 伊人av在线播放| 久草在线新免费首页资源站| 天天色图综合网| 激情五月开心婷婷| 96视频在线观看欧美| 亚洲韩国日本中文字幕| 黑人狂躁日本娇小| 亚久久调教视频| 91精品久久久久久久久久另类| 四虎免费在线观看| 中文欧美字幕免费| 欧美三级在线观看视频| 伊人亚洲精品| 亚洲欧美成人网| 伊人在线视频观看| 老司机久久99久久精品播放免费| 91天堂在线观看| 狠狠狠综合7777久夜色撩人| 亚洲一区二区欧美激情| 亚洲成人天堂网| 色综合久久中文| 欧美日韩国产123| 中文字幕在线观看第二页| www..com久久爱| 成人国产一区二区三区| 国模私拍国内精品国内av| 亚洲欧美中文另类| 日韩 欧美 综合| 高潮精品一区videoshd| 欧美性视频在线播放| av一区在线| 日韩精品中文字幕在线| 久久草视频在线| 成人美女在线视频| 国产精品va在线观看无码| 9999精品免费视频| 日韩在线视频网站| 久久久久久av无码免费看大片| 97久久精品人人做人人爽50路| av一区二区三区免费观看| 国产日本久久| 国产一区二区精品丝袜| 亚洲综合图片网| 91香蕉视频在线| 乱妇乱女熟妇熟女网站| 极品一区美女高清| 亚洲**2019国产| 天天色综合av| 欧美视频在线免费看| 无码人妻精品一区二区三区温州 | 五月婷婷一区二区| 精品一区二区三区在线观看| 亚洲欧美精品| 久久久久久一区二区三区四区别墅| 国产一区二区三区中文| 国产又粗又猛又黄视频| 欧美激情一区不卡| 一区二区三区视频网| 久久伦理在线| 91日本视频在线| av免费在线观| 精品精品欲导航| 国产做受高潮漫动| 26uuu精品一区二区在线观看| 午夜肉伦伦影院| 精品国产欧美日韩| 国产女人精品视频| 欧美性受ⅹ╳╳╳黑人a性爽| 欧美mv和日韩mv的网站| 欧美a∨亚洲欧美亚洲| 久久亚洲精精品中文字幕早川悠里 | 66国产精品| 国产精品免费一区二区三区| 国产黄大片在线观看| 亚洲欧美在线x视频| 中文文字幕一区二区三三| 日韩电影一区| 最新国产一区二区| 在线天堂中文资源最新版| 精品国产一级片| 在线综合亚洲| 日本午夜精品一区二区| 成人看片毛片免费播放器| 色婷婷**av毛片一区| 亚洲黄色片视频| 一本久道久久综合中文字幕| 国产精品1区2区3区4区| 国产高清久久久| 精品视频一区二区在线| 91av精品| 蜜桃91精品入口| 成人51免费| 97免费视频在线播放| 中文日本在线观看| 亚洲成人网av| 国产三级理论片| 亚洲午夜久久久久久久久电影网 | 国产精品自在欧美一区| a级黄色一级片| 久久一区二区三区喷水| 国产伦理久久久| 欧美爱爱视频| 77777少妇光屁股久久一区| 最新国产在线观看| 日韩精品在线第一页| 国产口爆吞精一区二区| 色伊人久久综合中文字幕| 老妇女50岁三级| 久久九九久久九九| 亚洲av成人片无码| 国产在线麻豆精品观看| 无码人妻h动漫| 国产精品vip| 一区二区视频在线播放| 婷婷成人影院| 国产精品一区二区三区观看| 精品176极品一区| 欧美一区二区三区精品电影| 深夜国产在线播放| 色777狠狠综合秋免鲁丝| 欧美日韩国产综合视频| 蜜桃av综合| 午夜影院久久久| 午夜诱惑痒痒网| 日韩精品一二三| 一区二区传媒有限公司| 欧美午夜不卡| 男同互操gay射视频在线看| 日韩精品一区二区久久| 欧美主播一区二区三区美女 久久精品人| 伊人久久大香线蕉av超碰| 91精品在线观看视频| 国产精品蜜月aⅴ在线| 国产91精品在线播放| 性欧美18~19sex高清播放| 欧美激情欧美狂野欧美精品| 成人黄色在线电影| 久久精品电影网| 女女色综合影院| 在线观看欧美成人| 成av人电影在线观看| 亚洲新中文字幕| 九色网友自拍视频手机在线| 精品呦交小u女在线| 四虎在线免费看| 精品在线欧美视频| 久久久久久青草| 亚洲情综合五月天| 国产精品99999| 中文字幕视频在线免费欧美日韩综合在线看| 噜噜噜噜噜在线视频| 亚洲人a成www在线影院| 免费福利在线观看| 国产一区二区三区在线播放免费观看 | 给我免费观看片在线电影的| jiyouzz国产精品久久| 亚洲观看黄色网| 91蝌蚪国产九色| 精品人妻一区二区三区蜜桃视频| 久久精品在线观看| 黄色av免费播放| 18欧美亚洲精品| 国产免费无码一区二区视频| 亚洲综合色网站| 亚洲 欧美 视频| 一本色道久久综合亚洲91| 这里只有久久精品视频| 欧美人牲a欧美精品| www.五月婷| 亚洲精品mp4| 国产一二三区在线| 久久视频国产精品免费视频在线| 手机在线免费观看av| 欧美一性一乱一交一视频| 欧美特黄aaaaaaaa大片| 国产精品香蕉国产| 亚洲精品不卡在线观看| 麻豆av一区二区三区久久| 日韩成人综合| 野外做受又硬又粗又大视频√| 国产精品一页| 一区二区三区四区毛片| 成人激情校园春色| 嘿嘿视频在线观看| 一区二区三区在线视频观看58| 青青操免费在线视频| 欧美性一二三区| 色婷婷综合网站| 国产一区二区在线电影| 国产成人av无码精品| 欧美国产精品一区二区三区| 69xx绿帽三人行| 色婷婷综合久久久中文一区二区| 亚洲午夜精品久久久| 欧美白人最猛性xxxxx69交| 男男激情在线| 色综合男人天堂| 欧美日韩五区| 国产精品区一区| 99九九热只有国产精品| 奇米精品一区二区三区| 国产在线精品免费| x88av在线| 亚洲电影激情视频网站| 一级黄色片免费看| 亚洲午夜精品久久久久久久久久久久 | 国产一区亚洲一区| 精品成人av一区二区三区| 亚洲精品国产高清久久伦理二区| 97人妻一区二区精品视频| 日韩精品一区二区三区中文不卡 | 国产伦精品一区二区三区视频痴汉| 亚洲精品一线二线三线无人区| h视频在线观看免费| 97视频在线免费观看| 一区二区日韩| 日本丰满少妇黄大片在线观看| 丝瓜av网站精品一区二区| 制服丝袜在线第一页| 17c精品麻豆一区二区免费| 亚洲图片欧美日韩| 亚洲国产精品成人一区二区| 老司机99精品99| 国产精品久久久久久久久影视| 欧美变态网站| youjizz.com在线观看| 韩国一区二区在线观看| 林心如三级全黄裸体| 欧美伊人久久大香线蕉综合69| 性xxxfllreexxx少妇| 97精品在线观看| 国产精品传媒| 草b视频在线观看| 国产 日韩 欧美大片| 欧美日韩成人免费观看| 91麻豆精品国产91久久久| 在线观看免费网站黄| 国产精品爽黄69天堂a| 精品国产91| 熟女少妇精品一区二区| 久久网这里都是精品| 天天干天天干天天| 精品视频—区二区三区免费| 理论不卡电影大全神| 国产一区二区不卡视频| 一区二区91| 亚洲人人夜夜澡人人爽| 日韩欧美在线一区| 国产在线电影| 国产在线一区二区三区| 国产大片一区| 免费不卡av网站| 亚洲激情网站免费观看| 亚洲高清视频网站| 国自产精品手机在线观看视频| 蜜桃久久久久| 欧美成人一区二区在线观看| 91免费视频网址| 亚洲综合成人av| 精品久久久999| 日韩中文字幕| 北条麻妃在线视频观看| 国产欧美日韩在线看| 一级aaaa毛片| 欧美夫妻性生活视频| 国偷自产av一区二区三区| 国产肉体ⅹxxx137大胆| а√中文在线8| wwwwww.欧美系列| 日韩免费高清在线观看| 91日韩中文字幕| 日本视频在线一区| 亚洲最大av网| 欧美日韩国产在线观看网站 | 99久热re在线精品996热视频| 国产精品www.| 久久久精品人妻无码专区| 欧美日韩亚洲丝袜制服| 一色桃子av在线| 久久久7777| 激情六月婷婷久久| www成人在线| 中文字幕亚洲精品| 国产色噜噜噜91在线精品| 91av在线免费播放| 亚洲婷婷综合久久一本伊一区| 日韩有码第一页| 国产精品美女久久| 91久久中文| 麻豆网址在线观看| 国产丝袜一区视频在线观看| 亚洲欧洲二区| 国产无套内射久久久国产| 亚洲人成网站精品片在线观看| 日韩有码电影| 91精品中文在线| 丝袜诱惑制服诱惑色一区在线观看|