最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringCloud灰度發(fā)布的設(shè)計與實現(xiàn)詳解

 更新時間:2023年09月01日 08:54:37   作者:魔笛Love  
這篇文章主要介紹了SpringCloud灰度發(fā)布的設(shè)計與實現(xiàn)詳解,灰度從字面意思理解就是存在于黑與白之間的一個平滑過渡的區(qū)域,所以說對于互聯(lián)網(wǎng)產(chǎn)品來說,上線和未上線就是黑與白之分,而實現(xiàn)未上線功能平穩(wěn)過渡的一種方式就叫做灰度發(fā)布,需要的朋友可以參考下

灰度發(fā)布

什么是灰度發(fā)布呢?要想了解這個問題就要先明白什么是灰度。

灰度從字面意思理解就是存在于黑與白之間的一個平滑過渡的區(qū)域,所以說對于互聯(lián)網(wǎng)產(chǎn)品來說,上線和未上線就是黑與白之分,而實現(xiàn)未上線功能平穩(wěn)過渡的一種方式就叫做灰度發(fā)布。

在一般情況下,升級服務(wù)器端應(yīng)用,需要將應(yīng)用源碼或程序包上傳到服務(wù)器,然后停止掉老版本服務(wù),再啟動新版本。

但是這種簡單的發(fā)布方式存在兩個問題,一方面,在新版本升級過程中,服務(wù)是暫時中斷的,另一方面,如果新版本有BUG,升級失敗,回滾起來也非常麻煩,容易造成更長時間的服務(wù)不可用。

在了解了什么是灰度發(fā)布的定義以后,就可以來了解一下灰度發(fā)布的具體操作方法了。

可以通過抽取一部分用戶,比如說選擇自己的測試用戶,使這些用戶的請求全部訪問灰度發(fā)布的服務(wù),正式用戶請求走正常上線的服務(wù),那么就能夠?qū)⑿枰叶劝l(fā)布的版本也連接到正常上線服務(wù)中進(jìn)行測試,沒有問題之后將其設(shè)置為正常服務(wù)即完成版本的上線測試和發(fā)布。

實現(xiàn)設(shè)計

實現(xiàn)重點主要在:

  • 利用 ThreadLocal+Feign 實現(xiàn) http head 中實現(xiàn)信息的傳遞
  • 使用Nacos的元數(shù)據(jù),定義需要的灰度服務(wù)
  • 自定義Ribbon的路由規(guī)則,根據(jù)Nacos的元數(shù)據(jù)選擇服務(wù)節(jié)點

公共配置

ThreadLocal

public class PassParameters {
    private static final Logger log = LoggerFactory.getLogger(PassParameters.class);
    private static final ThreadLocal localParameters = new ThreadLocal();
    public static PassParametersModel get(){
        PassParametersModel model = (PassParametersModel) localParameters.get();
        log.info("ThreadID:{}, threadLocal {}", Thread.currentThread().getId(), model.toString());
        return model;
    }
    public static void set(PassParametersModel model){
        log.info("ThreadID:{}, threadLocal set {}", Thread.currentThread().getId(), model.toString());
        localParameters.set(model);
    }
}

攜帶灰度發(fā)布相關(guān)數(shù)據(jù)的類

public class PassParametersModel {
    private String token;
    private String grayPublish;
}

請求頭常量

public class HttpConstants {
    public static final String AUTHORIZATION_HEADER = "Authorization";
    public static final String GRAY_PUBLISH = "Gray-Publish";
    public static final String GRAY_PUBLISH_MEAT_KEY = "grayPublish";
}

AOP請求攔截處理

@Aspect
@Order(1)
@Component
public class PermissionsValidationAspect {
    private final Logger logger = LoggerFactory.getLogger(getClass());
    /**
     * 權(quán)限校驗以及一些參數(shù)的賦值O
     * @param joinPoint
     * @return
     * @throws Throwable
     */
    @Around(value = "需要攔截的方法")
    public Object check(ProceedingJoinPoint joinPoint) throws Throwable {
        // 獲取一些參數(shù)
        ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        HttpServletRequest request = attributes.getRequest();
        String token = request.getHeader(HttpConstants.AUTHORIZATION_HEADER);
        // FIXME:
        // token權(quán)限校驗,不要去查數(shù)據(jù)庫?。。?!
        // 來這里的token肯定都是有用的,因為在網(wǎng)關(guān)那里就會進(jìn)行token有效的校驗
        // 校驗成功之后進(jìn)行用戶身份的賦值,比如uid、username等關(guān)鍵信息
        // 本次請求涉及到的灰度發(fā)布
        // FIXME: 通過用戶所屬的用戶組或其他標(biāo)識信息,專門指定某些用戶是灰度發(fā)布測試用戶,來設(shè)置灰度發(fā)布的字段
        String grayPublish = request.getHeader(HttpConstants.GRAY_PUBLISH);
        PassParametersModel model = new PassParametersModel();
        model.setToken(token);
        model.setGrayPublish(grayPublish);
        PassParameters.set(model);
        return joinPoint.proceed();
    }
}

Feign配置

Ribbon請求規(guī)則

將會從Nacos中獲取元服務(wù)器的信息,并根據(jù)這個信息選擇服務(wù)器。

public class GrayPublishInterceptor implements RequestInterceptor {
    private Logger log = LoggerFactory.getLogger(this.getClass());
    @Override
    public void apply(RequestTemplate requestTemplate) {
        PassParametersModel model = PassParameters.get();
        // token
        if (StringUtils.isNotEmpty(model.getToken())) {
            requestTemplate.header(HttpConstants.AUTHORIZATION_HEADER, model.getToken());
        }
        // grayPublish
        if (StringUtils.isNotEmpty(model.getGrayPublish())) {
            requestTemplate.header(HttpConstants.GRAY_PUBLISH, model.getGrayPublish());
        }
		// FIXME: 補(bǔ)充其他需要傳遞的內(nèi)容
    }
}

Feign攔截器

將需要傳遞給下個微服務(wù)中的數(shù)據(jù)進(jìn)行賦值

public class GrayPublishInterceptor implements RequestInterceptor {
    private Logger log = LoggerFactory.getLogger(this.getClass());
    @Override
    public void apply(RequestTemplate requestTemplate) {
        PassParametersModel model = PassParameters.get();
        // token
        if (StringUtils.isNotEmpty(model.getToken())) {
            requestTemplate.header(HttpConstants.AUTHORIZATION_HEADER, model.getToken());
        }
        // grayPublish
        if (StringUtils.isNotEmpty(model.getGrayPublish())) {
            requestTemplate.header(HttpConstants.GRAY_PUBLISH, model.getGrayPublish());
        }
		// FIXME: 補(bǔ)充其他需要傳遞的內(nèi)容
    }
}

配置使用

這里是全局配置使用

@Configuration
public class FeignConfig {
    // 灰度發(fā)布Ribbon規(guī)則
    @Bean
    public IRule getRule(){
        return new GrayPublishRibbonRule();
    }
    // header傳遞
    @Bean
    public GrayPublishInterceptor getInterceptor(){
        return new GrayPublishInterceptor();
    }
}

Nacos元數(shù)據(jù)配置

通過在application.yml進(jìn)行配置

# 服務(wù)的元數(shù)據(jù)
spring:
  cloud:
    nacos:
      discovery:
        metadata.grayPublish: HAHAHA_TEST

到此這篇關(guān)于SpringCloud灰度發(fā)布的設(shè)計與實現(xiàn)詳解的文章就介紹到這了,更多相關(guān)SpringCloud灰度發(fā)布內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 自己寫的java日志類和方法代碼分享

    自己寫的java日志類和方法代碼分享

    這篇文章主要介紹了一個自己寫的java日志類和方法,下面把代碼分享給大家
    2014-01-01
  • SpringBoot整合RabbitMQ處理死信隊列和延遲隊列

    SpringBoot整合RabbitMQ處理死信隊列和延遲隊列

    這篇文章將通過示例為大家詳細(xì)介紹SpringBoot整合RabbitMQ時如何處理死信隊列和延遲隊列,文中的示例代碼講解詳細(xì),需要的可以參考一下
    2022-05-05
  • Java?Maven?Settings配置參考教程

    Java?Maven?Settings配置參考教程

    這篇文章主要介紹了Java?Maven?Settings配置參考,本文通過示例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-09-09
  • Springboot中加入druid連接池

    Springboot中加入druid連接池

    這篇文章主要介紹了Springboot中加入druid連接池,Druid是目前最好的數(shù)據(jù)庫連接池。在功能、性能、擴(kuò)展性方面,都超過其他數(shù)據(jù)庫連接池,同時加入了日志監(jiān)控,下面來看看文章的具體內(nèi)容吧
    2022-01-01
  • Java中@JSONField注解的使用詳解

    Java中@JSONField注解的使用詳解

    這篇文章主要介紹了Java中@JSONField注解的使用,@JSONField是阿里巴巴開源的JSON處理庫FastJSON提供的一個注解,用于在Java對象和JSON數(shù)據(jù)之間進(jìn)行序列化和反序列化時,對字段的行為進(jìn)行更精細(xì)的控制,需要的朋友可以參考下
    2025-05-05
  • Spring?web開發(fā)教程之Request獲取3種方式

    Spring?web開發(fā)教程之Request獲取3種方式

    這篇文章主要給大家介紹了關(guān)于Spring?web開發(fā)教程之Request獲取3種方式的相關(guān)資料,request對象是從客戶端向服務(wù)器發(fā)出請求,包括用戶提交的信息以及客戶端的一些信息,需要的朋友可以參考下
    2023-11-11
  • 使用log4j輸出一個類的所有參數(shù)的值

    使用log4j輸出一個類的所有參數(shù)的值

    這篇文章主要介紹了使用log4j輸出一個類的所有參數(shù)的值,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • Java線程死鎖代碼詳解

    Java線程死鎖代碼詳解

    本篇文章主要介紹了Java線程死鎖代碼詳解,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2021-11-11
  • Java中Minio的基本使用詳解

    Java中Minio的基本使用詳解

    這篇文章主要介紹了Java中Minio的基本使用詳解,MinIO 是一個基于Apache License v2.0開源協(xié)議的對象存儲服務(wù),它兼容亞馬遜S3云存儲服務(wù)接口,非常適合于存儲大容量非結(jié)構(gòu)化的數(shù)據(jù),例如圖片、視頻、日志文件、備份數(shù)據(jù)和容器/虛擬機(jī)鏡像等,需要的朋友可以參考下
    2024-01-01
  • springboot項目中后端接收前端傳參的方法示例詳解

    springboot項目中后端接收前端傳參的方法示例詳解

    這篇文章主要介紹了springboot項目中一些后端接收前端傳參的方法,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-06-06

最新評論

漳州市| 桦南县| 龙口市| 宜宾县| 岚皋县| 防城港市| 社旗县| 棋牌| 格尔木市| 湖口县| 乌兰浩特市| 奉新县| 涿鹿县| 鹤壁市| 蓬安县| 定南县| 韩城市| 沁源县| 开封市| 郧西县| 合山市| 灵丘县| 漳平市| 田阳县| 乐山市| 石屏县| 固阳县| 铜陵市| 比如县| 马龙县| 阿瓦提县| 德昌县| 易门县| 綦江县| 汉阴县| 独山县| 巧家县| 彝良县| 古丈县| 昌乐县| 南昌市|