AVt天堂网 手机版,亚洲va久久久噜噜噜久久4399,天天综合亚洲色在线精品,亚洲一级Av无码毛片久久精品

當前位置:首頁 > 科技  > 軟件

微服務如何灰度發布?你會嗎?

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

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

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

1.灰度發布關鍵步驟

在 Spring Cloud 微服務架構中,實現灰度發布通常涉及到以下幾個方面:yRV28資訊網——每日最新資訊28at.com

  1. 流量分割

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

使用 Spring Cloud Gateway、Zuul 等 API 網關組件實現路由規則,將部分請求定向至新版本的服務節點。yRV28資訊網——每日最新資訊28at.com

  1. 版本標識

新版本服務啟動時會注冊帶有特定版本標簽的服務實例到服務注冊中心(如 Eureka 或 Nacos)。yRV28資訊網——每日最新資訊28at.com

請求在路由時可以根據版本標簽選擇相應版本的服務實例。yRV28資訊網——每日最新資訊28at.com

  1. 監控與評估yRV28資訊網——每日最新資訊28at.com

在灰度發布的階段,運維團隊會對新版本服務的性能、穩定性以及用戶體驗等方面進行實時監控和評估。yRV28資訊網——每日最新資訊28at.com

如果新版本表現良好,則可以逐漸擴大灰度范圍直至全面替換舊版本。yRV28資訊網——每日最新資訊28at.com

  1. 故障恢復與回滾:若新版本出現問題,可通過快速撤銷灰度發布策略,使所有流量恢復到舊版本服務,實現快速回滾,確保服務整體可用性。yRV28資訊網——每日最新資訊28at.com

通過 Spring Cloud 的擴展組件和自定義路由策略,開發人員可以輕松實現灰度發布功能,確保在微服務架構中安全、平滑地進行版本迭代升級。yRV28資訊網——每日最新資訊28at.com

2.實現思路

灰色發布的常見實現思路有以下幾種:yRV28資訊網——每日最新資訊28at.com

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

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

3.底層實現

Spring Cloud 全鏈路灰色發布的關鍵實現思路如下圖所示:yRV28資訊網——每日最新資訊28at.com

圖片圖片yRV28資訊網——每日最新資訊28at.com

灰度發布的具體實現步驟如下:yRV28資訊網——每日最新資訊28at.com

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

在負載均衡器 Spring Cloud LoadBalancer 中,判斷灰度發布標簽,將請求分發到對應服務。yRV28資訊網——每日最新資訊28at.com

將灰度發布標簽(如果存在),繼續傳遞給下一個調用的服務。yRV28資訊網——每日最新資訊28at.com

經過第四步的反復傳遞之后,整個 Spring Cloud 全鏈路的灰度發布就完成了。yRV28資訊網——每日最新資訊28at.com

4.具體實現

4.1 版本標識

在灰度發布的執行流程中,有一個核心的問題,如果在 Spring Cloud LoadBalancer 進行服務調用時,區分正式服務和灰度服務呢?yRV28資訊網——每日最新資訊28at.com

這個問題的解決方案是:在灰度服務既注冊中心的 MetaData(元數據)中標識自己為灰度服務即可,而元數據中沒有標識(灰度服務)的則為正式服務,以 Nacos 為例,它的設置如下:yRV28資訊網——每日最新資訊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" } # 標識自己為灰度服務

4.2 負載均衡調用灰度服務

Spring Cloud LoadBalancer 判斷并調用灰度服務的關鍵實現代碼如下:yRV28資訊網——每日最新資訊28at.com

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 中有灰度標簽,則只查詢灰度服務的節點實例,否則則查詢出所有的正式節點實例(以供服務調用或服務轉發)。yRV28資訊網——每日最新資訊28at.com

4.3 網關傳遞灰度標識

要在網關 Spring Cloud Gateway 中傳遞灰度標識,只需要在 Gateway 的全局自定義過濾器中設置 Response 的 Header 即可,具體實現代碼如下:yRV28資訊網——每日最新資訊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) {            // 設置金絲雀標識            response.getHeaders().set(GlobalVariables.GRAY_KEY,                    "true");        }        // 此步驟正常,執行下一步        return chain.filter(exchange);    }}

4.4 微服務中傳遞灰度標簽

HTTP 調用工具 Openfeign,我們需要在微服務間繼續傳遞灰度標簽,它的實現代碼如下:yRV28資訊網——每日最新資訊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;    }}


yRV28資訊網——每日最新資訊28at.com

本文鏈接:http://www.tebozhan.com/showinfo-26-88919-0.html微服務如何灰度發布?你會嗎?

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

上一篇: 一篇文章帶你了解JavaScript While 循環

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

標簽:
  • 熱門焦點
  • K60至尊版剛預熱 一加Ace2 Pro正面硬剛

    Redmi這邊剛如火如荼的宣傳了K60 Ultra的各種技術和硬件配置,作為競品的一加也坐不住了。一加中國區總裁李杰發布了兩條微博,表示在自家的一加Ace2上早就已經采用了和PixelWo
  • Python異步IO編程的進程/線程通信實現

    這篇文章再講3種方式,同時講4中進程間通信的方式一、 Python 中線程間通信的實現方式共享變量共享變量是多個線程可以共同訪問的變量。在Python中,可以使用threading模塊中的L
  • JVM優化:實戰OutOfMemoryError異常

    一、Java堆溢出堆內存中主要存放對象、數組等,只要不斷地創建這些對象,并且保證 GC Roots 到對象之間有可達路徑來避免垃 圾收集回收機制清除這些對象,當這些對象所占空間超過
  • 使用AIGC工具提升安全工作效率

    在日常工作中,安全人員可能會涉及各種各樣的安全任務,包括但不限于:開發某些安全工具的插件,滿足自己特定的安全需求;自定義github搜索工具,快速查找所需的安全資料、漏洞poc、exp
  • 東方甄選單飛:有些鳥注定是關不住的

    文/彭寬鴻編輯/羅卿東方甄選創始人俞敏洪帶隊的&ldquo;7天甘肅行&rdquo;直播活動已在近日順利收官。成立后一年多時間里,東方甄選要脫離抖音自立門戶的傳聞不絕于耳,&ldquo;7
  • 華為和江淮汽車合作開發百萬元問界MPV?雙方回應來了

    8月1日消息,郭明錤今天在社交平臺發文稱,華為正在和江淮汽車合作,開發售價在100萬元的問界MPV,預計在2024年第2季度量產,銷量目標為上市首年交付5萬輛。
  • 三星獲批量產iPhone 15全系屏幕:蘋果史上最驚艷直屏

    按照慣例,蘋果將繼續在今年9月舉辦一年一度的秋季新品發布會,有傳言稱發布會將于9月12日舉行,屆時全新的iPhone 15系列將正式與大家見面,不出意外的話
  • 三星顯示已開始為AR設備研發硅基LED微顯示屏

    7月18日消息,據外媒報道,隨著蘋果首款頭顯產品Vision Pro在6月份正式推出,AR/VR/MR等頭顯產品也就將成為各大公司下一個重要的競爭領域,對顯示屏這一關
  • OPPO K11搭載長壽版100W超級閃充:26分鐘充滿100%

    據此前官方宣布,OPPO將于7月25日也就是今天下午14:30舉辦新品發布會,屆時全新的OPPO K11將正式與大家見面,將主打旗艦影像,和同檔位競品相比,其最大的賣
Top