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

面試官:如何實現微服務全鏈路灰度發布?

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

灰度發布(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. 在后續的調用服務中,需要實現以下兩個關鍵功能:
  1. 在負載均衡器 Spring Cloud LoadBalancer 中,判斷灰度發布標簽,將請求分發到對應服務。
  2. 將灰度發布標簽(如果存在),繼續傳遞給下一個調用的服務。

經過第四步的反復傳遞之后,整個 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中文社群
相關推薦

2024-03-06 15:38:06

Spring微服務架構擴展組件

2024-01-05 00:29:36

全鏈路灰度發布云原生

2024-12-16 13:34:35

2025-03-04 08:53:10

2023-11-14 09:04:15

用戶節點不可用

2022-12-05 10:47:08

RocketMQ灰度消息

2025-10-09 01:22:00

2022-08-31 22:25:53

微服務架構DevOPs

2024-03-12 14:36:44

微服務HTTPRPC

2024-02-20 14:10:55

系統緩存冗余

2023-12-15 09:57:13

微服務鏈路服務

2024-05-17 16:18:45

微服務灰度發布金絲雀發布

2024-09-11 22:51:19

線程通訊Object

2023-11-20 10:09:59

2024-08-23 11:51:39

2023-11-13 10:41:44

Spring微服務

2024-01-19 14:03:59

Redis緩存系統Spring

2024-01-26 13:16:00

RabbitMQ延遲隊列docker

2024-04-09 10:40:04

2018-07-12 09:59:39

microServicmockautoTest
點贊
收藏

51CTO技術棧公眾號

日本不卡免费播放| 激情五月激情综合| 大黄网站在线观看| 成人av电影在线播放| 久久久久久中文字幕| 极品白嫩少妇无套内谢| 黄色软件视频在线观看| 国产日韩v精品一区二区| 国产在线98福利播放视频| 国产人妻黑人一区二区三区| 小视频免费在线观看| 欧美激情一区二区三区| 91免费高清视频| 久久免费视频播放| 欧美**vk| 555夜色666亚洲国产免| 日韩一级性生活片| 天堂√在线中文官网在线| 日本网站在线观看一区二区三区| 亚洲一区二区三区爽爽爽爽爽| 午夜精品美女自拍福到在线| av黄色在线免费观看| 日韩视频1区| 欧美色电影在线| 免费看又黄又无码的网站| 欧美激情免费| 国产欧美日韩在线观看| 狠狠色综合网站久久久久久久| 久久精品波多野结衣| 精品99在线| 日韩国产激情在线| 美女被爆操网站| 玖玖精品在线| 欧美在线短视频| 成人免费观看视频在线观看| 丁香花高清在线观看完整版| 亚洲免费视频成人| 亚洲欧洲精品一区二区三区波多野1战4| 无码人妻丰满熟妇区bbbbxxxx | 黄网站在线免费| 久久综合色之久久综合| 国产高清一区视频| www.久久久久久久久久| 国产原创一区二区| 国产精品第三页| 无码人妻av一区二区三区波多野| 欧美电影一二区| 国产亚洲精品久久久优势| 中文人妻一区二区三区| 秋霞在线一区| 日韩电影第一页| 好男人香蕉影院| 91精品啪在线观看国产爱臀| 日韩欧美中文字幕精品| 中文字幕55页| 亚洲经典视频| 精品国产乱码久久| 成人免费看片载| av综合网址| 欧美精品一区视频| 7788色淫网站小说| 思热99re视热频这里只精品| 亚洲精品电影网在线观看| 亚洲图片综合网| 亚欧日韩另类中文欧美| 亚洲欧美自拍一区| 免费一级特黄3大片视频| 精品视频免费| 久久综合久久88| 免费在线一区二区三区| 在线一区欧美| 国产精品91视频| 国产精品视频a| 国产一区二区视频在线| caoporn国产精品免费公开| 性欧美1819| 久久99国产精品二区高清软件| 一区二区三区精品久久久| 800av在线免费观看| www.色在线| 91福利国产精品| 在线免费看v片| 国产精品任我爽爆在线播放| 亚洲激情中文字幕| av网在线播放| 亚洲最新av| 992tv成人免费视频| 波多野结衣高清视频| 精品在线亚洲视频| 国内精品视频免费| 午夜伦全在线观看| 亚洲精品大片www| 无码人妻丰满熟妇区96| 日韩在线你懂得| 欧美日本在线看| 性久久久久久久久久久| 精品久久久久中文字幕小说| 欧美成人精品影院| 性色av免费观看| 国产精品一品视频| 欧美日韩精品免费观看| 三级资源在线| 精品视频一区二区不卡| 中文字幕天堂av| 日本高清免费电影一区| 久久久久久久久久国产| 中文字幕 亚洲视频| 成人爽a毛片一区二区免费| 欧美一区二区三区精美影视| 亚洲无线看天堂av| 在线观看不卡一区| 五月开心播播网| 正在播放日韩欧美一页| 国产精品劲爆视频| 天堂中文在线资源| 亚洲激情自拍偷拍| 中文字幕av专区| 久久99蜜桃| 97在线精品国自产拍中文| 国产麻豆精品一区| 国产精品丝袜一区| 亚洲中文字幕无码不卡电影| 中文字幕区一区二区三| 日韩视频免费看| 免费黄色网址在线| proumb性欧美在线观看| 国产日韩欧美大片| 精品69视频一区二区三区| 亚洲免费中文字幕| 91九色丨porny丨肉丝| 国产v综合v亚洲欧| 中文字幕一区二区三区精彩视频| а√天堂官网中文在线| 欧美写真视频网站| 五月天激情小说| 很黄很黄激情成人| 9a蜜桃久久久久久免费| 浮生影视网在线观看免费| 日韩欧美a级成人黄色| www.四虎在线| 亚洲视频免费| 国产精品一区二区三区精品| 欧美人与禽性xxxxx杂性| 欧美一级电影网站| 国产三级国产精品国产国在线观看| 狠狠干综合网| 国产精品一区二区三区在线| 婷婷在线播放| 精品日韩欧美在线| 国产无遮挡又黄又爽在线观看| 久久精品国产清高在天天线| 久久天天狠狠| 欧美巨大丰满猛性社交| 婷婷国产在线综合| 熟妇女人妻丰满少妇中文字幕| 欧美自拍一区| 97超级碰碰碰| 免费福利在线观看| 欧美性高清videossexo| 少妇高潮在线观看| 国产麻豆欧美日韩一区| 乱子伦一区二区| av自拍一区| 18久久久久久| 国产福利免费在线观看| 欧美女孩性生活视频| 亚洲综合网在线| 成人污视频在线观看| 欧美视频第一区| 波多野结衣在线观看一区二区| 久久久久久91| 天堂网av2014| 欧美在线观看视频一区二区| 国产午夜精品理论片| 国产激情视频一区二区在线观看| 五月天色一区| 久久久久毛片免费观看| 性欧美亚洲xxxx乳在线观看| 国产午夜在线视频| 欧美一区二区私人影院日本| 久久久久久久久99| 久久久99久久| 捷克做爰xxxⅹ性视频| 亚洲久久在线| 亚洲一二三区精品| 国产日韩三级| 国产精品亚洲第一区| 欧美人与禽猛交乱配| 国产午夜精品一区理论片飘花| 美女又爽又黄免费视频| 中文字幕在线一区免费| 中国极品少妇xxxx| 日韩福利电影在线| 亚洲熟妇无码av在线播放| 深爱激情久久| 国产福利久久精品| 欧美激情不卡| 日本亚洲欧洲色α| 久久av色综合| 日韩视频第一页| 欧美孕妇孕交xxⅹ孕妇交| 欧美高清dvd| 无码人妻精品一区二区50| 亚洲精品视频观看| 91社区视频在线观看| 成人教育av在线| 国产成年人视频网站| 亚洲免费网站| 欧美黄网在线观看| 日韩欧美自拍| 免费看成人午夜电影| 一区二区三区四区精品视频| 国产精品v日韩精品| 福利影院在线看| 久热精品视频在线观看| 第一页在线观看| 国产手机视频精品| 免费看黄色一级视频| 337p亚洲精品色噜噜噜| 自拍偷拍色综合| 欧美日韩亚洲高清| 日本视频www| 一区二区三区不卡视频在线观看| 亚洲熟女一区二区三区| 精品一区二区三区免费毛片爱| 色呦呦网站入口| 成人精品久久| 日韩一二三区不卡在线视频| 色先锋久久影院av| 国产精品theporn88| 久久久久毛片免费观看| 亚洲理论电影| 青青草99啪国产免费| 国产探花视频在线观看| 久久成人这里只有精品| 男人的天堂在线视频免费观看| 欧美电影一区二区| 国产精品国产精品国产| 色婷婷综合久久久久中文一区二区| 国产黄色录像视频| 久久亚洲一级片| 亚洲精品乱码久久久久久久| www.av精品| 风间由美一二三区av片| 99re在线视频这里只有精品| 你懂得在线视频| 久久中文字幕电影| 成人午夜剧场视频网站| 久久久久国产精品麻豆ai换脸| 性生生活大片免费看视频| 麻豆成人免费电影| 中文字幕22页| 激情另类小说区图片区视频区| 日韩中文字幕在线视频观看| 在线一区视频| 国产三区在线视频| 日本不卡一区二区| 日韩一级理论片| 欧美aaaaaa午夜精品| 亚洲天堂国产视频| 国产一区视频在线看| 真实乱偷全部视频| 白白色亚洲国产精品| 菠萝菠萝蜜网站| 国产欧美一区二区三区鸳鸯浴| 特级特黄刘亦菲aaa级| 成人黄色小视频在线观看| 97人妻精品一区二区三区免费| 美女视频黄 久久| 免费成年人高清视频| 国产一区二区福利视频| 手机免费看av片| 久久久.com| 黑人操日本美女| 亚洲一区二区精品久久av| 欧美一级片免费在线观看| 91黄视频在线| 国产伦理吴梦梦伦理| 亚洲精品国产精品自产a区红杏吧| 国产婷婷在线视频| 亚洲电影免费观看| 久热av在线| 自拍偷拍免费精品| caoprom在线| 国产精品91一区| 99re6热只有精品免费观看| 国产一区二区三区高清视频| 欧洲视频一区| 国产九色porny| 日本成人中文字幕在线视频| 日本黄色大片在线观看| 久久综合丝袜日本网| 亚洲色图综合区| 色老汉一区二区三区| 99在线观看免费| 亚洲香蕉成视频在线观看| aaa大片在线观看| 国产成人精品日本亚洲专区61| 欧美大片免费| 亚洲a级在线观看| 欧美极品在线观看| 咪咪色在线视频| 久久激情视频| 久久久久亚洲av成人网人人软件| 国产91丝袜在线播放九色| 性欧美丰满熟妇xxxx性仙踪林| 久久久久久久久久久99999| 神马午夜精品91| 一本色道**综合亚洲精品蜜桃冫| 91黑人精品一区二区三区| 日韩亚洲欧美综合| 成人性爱视频在线观看| 久久久久久久国产精品| 亚洲网站免费| 欧美一区国产一区| 亚洲日本激情| 在线免费黄色小视频| 日本一区二区三区四区| 国产日韩精品视频| 两个人看的在线视频www| 91美女高潮出水| 日韩精品欧美| 国产视频一区二区三区在线播放| 夜夜嗨一区二区| 中文字幕在线视频一区二区| 国产精品麻豆一区二区| 亚洲国产成人无码av在线| 亚洲国产精久久久久久| 亚洲国产精品精华素| 91中文字幕一区| 91影院成人| 亚洲激情在线观看视频| 久久新电视剧免费观看| 中文字幕在线字幕中文| 精品国产三级电影在线观看| 大片免费在线看视频| 国产综合在线观看视频| 欧美wwwww| 国产原创精品在线| 国产精品美日韩| 在线观看免费高清视频| 中文日韩电影网站| www.26天天久久天堂| 日韩不卡av| 日本亚洲天堂网| 一级黄色毛毛片| 欧美日韩www| 黄a在线观看| 91亚洲永久免费精品| 一二三区不卡| 男女污污视频网站| 亚洲欧美成人一区二区三区| 国产高清在线免费| 九九久久精品一区| av日韩精品| 青青草原av在线播放| 久久久久久亚洲综合影院红桃| 欧美三根一起进三p| 欧美sm美女调教| 国产一二三在线| 欧美lavv| 久久精品国产第一区二区三区| 一女三黑人理论片在线| 欧美特黄级在线| www.国产精品.com| 91免费版网站入口| 激情五月***国产精品| 强迫凌虐淫辱の牝奴在线观看| 日韩理论片一区二区| 精品国产亚洲一区二区麻豆| 久久男人资源视频| 欧美人妖在线| 三上悠亚在线一区| 樱花草国产18久久久久| 午夜性色福利影院| 国产精品va在线| 午夜欧美视频| 极品白嫩丰满美女无套| 欧美视频中文一区二区三区在线观看| 婷婷开心激情网| 国产精品草莓在线免费观看| 久久中文亚洲字幕| 亚洲国产精品狼友在线观看| 欧美性生活大片免费观看网址| 日日躁夜夜躁白天躁晚上躁91| 精品中文字幕视频| 日韩精品免费一区二区夜夜嗨 | 乱码一区二区三区| 欧美午夜性色大片在线观看| 欧美性videos| 久久久久久高清| 精品一区二区三区不卡| 精品无码久久久久久久| 亚洲三级av在线| 视频二区欧美| 欧美精品性生活| 精品国产乱码久久久久久天美| 欧美一区,二区| 国产精品中文字幕在线观看| 综合精品久久|