欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

灰度發(fā)布

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

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

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

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

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

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

實(shí)現(xiàn)設(shè)計(jì)

實(shí)現(xiàn)重點(diǎn)主要在:

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

公共配置

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;
}

請(qǐng)求頭常量

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請(qǐng)求攔截處理

@Aspect
@Order(1)
@Component
public class PermissionsValidationAspect {
    private final Logger logger = LoggerFactory.getLogger(getClass());
    /**
     * 權(quán)限校驗(yà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)限校驗(yàn),不要去查數(shù)據(jù)庫(kù)?。。?!
        // 來(lái)這里的token肯定都是有用的,因?yàn)樵诰W(wǎng)關(guān)那里就會(huì)進(jìn)行token有效的校驗(yàn)
        // 校驗(yàn)成功之后進(jìn)行用戶身份的賦值,比如uid、username等關(guān)鍵信息
        // 本次請(qǐng)求涉及到的灰度發(fā)布
        // FIXME: 通過(guò)用戶所屬的用戶組或其他標(biāo)識(shí)信息,專門指定某些用戶是灰度發(fā)布測(cè)試用戶,來(lái)設(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請(qǐng)求規(guī)則

將會(huì)從Nacos中獲取元服務(wù)器的信息,并根據(jù)這個(gè)信息選擇服務(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攔截器

將需要傳遞給下個(gè)微服務(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ù)配置

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

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

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

相關(guān)文章

  • 解決IDEA2020控制臺(tái)亂碼的方法

    解決IDEA2020控制臺(tái)亂碼的方法

    這篇文章主要介紹了解決IDEA2020控制臺(tái)亂碼的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07
  • Java獲取當(dāng)前時(shí)間并轉(zhuǎn)化為yyyy-MM-dd?HH:mm:ss格式的多種方式

    Java獲取當(dāng)前時(shí)間并轉(zhuǎn)化為yyyy-MM-dd?HH:mm:ss格式的多種方式

    這篇文章主要介紹了Java獲取當(dāng)前時(shí)間并轉(zhuǎn)化為yyyy-MM-dd?HH:mm:ss格式的多種方式,每種方式結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧
    2024-03-03
  • IDEA 集成log4j將SQL語(yǔ)句打印在控制臺(tái)上的實(shí)現(xiàn)操作

    IDEA 集成log4j將SQL語(yǔ)句打印在控制臺(tái)上的實(shí)現(xiàn)操作

    這篇文章主要介紹了IDEA 集成log4j將SQL語(yǔ)句打印在控制臺(tái)上的實(shí)現(xiàn)操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-02-02
  • 關(guān)于SpringMVC在Controller層方法的參數(shù)解析詳解

    關(guān)于SpringMVC在Controller層方法的參數(shù)解析詳解

    在SpringMVC中,控制器Controller負(fù)責(zé)處理由DispatcherServlet分發(fā)的請(qǐng)求,下面這篇文章主要給大家介紹了關(guān)于SpringMVC在Controller層方法的參數(shù)解析的相關(guān)資料,需要的朋友可以參考下
    2021-12-12
  • java常用工具類 IP、File文件工具類

    java常用工具類 IP、File文件工具類

    這篇文章主要為大家詳細(xì)介紹了java常用工具類,包括IP、File文件工具類,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-05-05
  • Java自動(dòng)生成編號(hào)的方法步驟

    Java自動(dòng)生成編號(hào)的方法步驟

    在新增數(shù)據(jù)時(shí),往往需要自動(dòng)生成編號(hào),本文主要介紹了Java自動(dòng)生成編號(hào)的方法步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • Spring Boot 中使用cache緩存的方法

    Spring Boot 中使用cache緩存的方法

    Spring Cache是Spring針對(duì)Spring應(yīng)用,給出的一整套應(yīng)用緩存解決方案。下面小編給大家?guī)?lái)了Spring Boot 中使用cache緩存的方法,感興趣的朋友參考下吧
    2018-01-01
  • JAVA實(shí)現(xiàn)Excel和PDF上下標(biāo)的操作代碼

    JAVA實(shí)現(xiàn)Excel和PDF上下標(biāo)的操作代碼

    這篇文章主要介紹了JAVA實(shí)現(xiàn)Excel和PDF上下標(biāo),本文通過(guò)示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-09-09
  • java線程池使用后到底要關(guān)閉嗎

    java線程池使用后到底要關(guān)閉嗎

    這篇文章主要給大家介紹了關(guān)于java線程池使用后到底要不要關(guān)閉的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-01-01
  • SpringBoot整合Netty+Websocket實(shí)現(xiàn)消息推送的示例代碼

    SpringBoot整合Netty+Websocket實(shí)現(xiàn)消息推送的示例代碼

    WebSocket使得客戶端和服務(wù)器之間的數(shù)據(jù)交換變得更加簡(jiǎn)單,允許服務(wù)端主動(dòng)向客戶端推送數(shù)據(jù),本文主要介紹了SpringBoot整合Netty+Websocket實(shí)現(xiàn)消息推送的示例代碼,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-01-01

最新評(píng)論