亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

Spring Cloud Gateway 擴(kuò)展支持多版本控制及灰度發(fā)布

flybywind / 2092人閱讀

摘要:灰度發(fā)布就是通過(guò)一定策略保證多個(gè)版本客戶端服務(wù)端間能夠正確對(duì)應(yīng)。但由于是基于的反應(yīng)式編程,所以傳統(tǒng)的或者都不能正確的維護(hù)上下文請(qǐng)求。歡迎關(guān)注我們獲得更多的好玩實(shí)踐

灰度發(fā)布

什么是灰度發(fā)布,概念請(qǐng)參考,我們來(lái)簡(jiǎn)單的通過(guò)下圖來(lái)看下,通俗的講: 為了保證服務(wù)升級(jí)過(guò)程的平滑過(guò)渡提高客戶體驗(yàn),會(huì)一部分用戶 一部分用戶遞進(jìn)更新,這樣生產(chǎn)中會(huì)同時(shí)出現(xiàn)多個(gè)版本的客戶端,為了保證多個(gè)版本客戶端的可用需要對(duì)應(yīng)的多個(gè)版本的服務(wù)端版本。灰度發(fā)布就是通過(guò)一定策略保證 多個(gè)版本客戶端、服務(wù)端間能夠正確對(duì)應(yīng)。

所謂灰度發(fā)布,即某個(gè)服務(wù)存在多個(gè)實(shí)例時(shí),并且實(shí)例版本間的版本并不一致,通過(guò)

實(shí)現(xiàn)方案 nginx + lua (openresty)


Netflix Zuul

只需要自定義ribbon 的斷言即可,核心是通過(guò)TTL 獲取上下請(qǐng)求header中的版本號(hào)

@Slf4j
public class MetadataCanaryRuleHandler extends ZoneAvoidanceRule {

    @Override
    public AbstractServerPredicate getPredicate() {
        return new AbstractServerPredicate() {
            @Override
            public boolean apply(PredicateKey predicateKey) {
                String targetVersion = RibbonVersionHolder.getContext();
                RibbonVersionHolder.clearContext();
                if (StrUtil.isBlank(targetVersion)) {
                    log.debug("客戶端未配置目標(biāo)版本直接路由");
                    return true;
                }

                DiscoveryEnabledServer server = (DiscoveryEnabledServer) predicateKey.getServer();
                final Map metadata = server.getInstanceInfo().getMetadata();
                if (StrUtil.isBlank(metadata.get(SecurityConstants.VERSION))) {
                    log.debug("當(dāng)前微服務(wù){(diào)} 未配置版本直接路由");
                    return true;
                }

                if (metadata.get(SecurityConstants.VERSION).equals(targetVersion)) {
                    return true;
                } else {
                    log.debug("當(dāng)前微服務(wù){(diào)} 版本為{},目標(biāo)版本{} 匹配失敗", server.getInstanceInfo().getAppName()
                            , metadata.get(SecurityConstants.VERSION), targetVersion);
                    return false;
                }
            }
        };
    }
}

維護(hù)請(qǐng)求中的版本號(hào)

public class RibbonVersionHolder {
    private static final ThreadLocal context = new TransmittableThreadLocal<>();

    public static String getContext() {
        return context.get();
    }

    public static void setContext(String value) {
        context.set(value);
    }

    public static void clearContext() {
        context.remove();
    }
}
Spring Cloud Gateway 中實(shí)現(xiàn)

第一反應(yīng),參考zuul 的實(shí)現(xiàn),自定義斷言,然后從上下中獲取版本信息即可。但由于 spring cloud gateway 是基于webflux 的反應(yīng)式編程,所以傳統(tǒng)的TTL或者 RequestContextHolder 都不能正確的維護(hù)上下文請(qǐng)求。

先來(lái)看 spring clou的 gateway 默認(rèn)的lb 策略實(shí)現(xiàn) LoadBalancerClientFilter

public class LoadBalancerClientFilter implements GlobalFilter, Ordered {
    @Override
    public int getOrder() {
        return LOAD_BALANCER_CLIENT_FILTER_ORDER;
    }

    @Override
    @SuppressWarnings("Duplicates")
    public Mono filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        return chain.filter(exchange);
    }

    protected ServiceInstance choose(ServerWebExchange exchange) {
        return loadBalancer.choose(
                ((URI) exchange.getAttribute(GATEWAY_REQUEST_URL_ATTR)).getHost());
    }
}

我們只需要重寫(xiě) choose 方法,把上下文請(qǐng)求傳遞到路由斷言中即可,如下

@Override
protected ServiceInstance choose(ServerWebExchange exchange) {
    HttpHeaders headers = exchange.getRequest().getHeaders();
    return loadBalancer.choose(((URI) exchange.getAttribute(GATEWAY_REQUEST_URL_ATTR)).getHost(), headers);
}

然后在路由斷言中通過(guò) PredicateKey獲取到即可

public abstract class AbstractDiscoveryEnabledPredicate extends AbstractServerPredicate {

    /**
     * {@inheritDoc}
     */
    @Override
    public boolean apply(@Nullable PredicateKey input) {
        return input != null
                && input.getServer() instanceof NacosServer
                && apply((NacosServer) input.getServer(), (HttpHeaders) input.getLoadBalancerKey());
    }
}

最后根據(jù)版本來(lái)計(jì)算

    public class GrayMetadataAwarePredicate extends AbstractDiscoveryEnabledPredicate {

    @Override
    protected boolean apply(NacosServer server, HttpHeaders headers) {
        PigxRibbonRuleProperties ribbonProperties = SpringContextHolder.getBean(PigxRibbonRuleProperties.class);

        if (!ribbonProperties.isGrayEnabled()) {
            log.debug("gray closed,GrayMetadataAwarePredicate return true");
            return true;
        }

        final Map metadata = server.getMetadata();
        String version = metadata.get(CommonConstants.VERSION);
        // 判斷Nacos服務(wù)是否有版本標(biāo)簽
        if (StrUtil.isBlank(version)) {
            log.debug("nacos server tag is blank ,GrayMetadataAwarePredicate return true");
            return true;
        }

        // 判斷請(qǐng)求中是否有版本
        String target = headers.getFirst(CommonConstants.VERSION);
        if (StrUtil.isBlank(target)) {
            log.debug("request headers version is blank,GrayMetadataAwarePredicate return true");
            return true;
        }

        log.debug("請(qǐng)求版本:{} ,當(dāng)前服務(wù)版本:{}", target, version);
        return target.equals(version);
    }

}
整合nacos

結(jié)合nacos的動(dòng)態(tài)配置可以非常方便的實(shí)現(xiàn)灰度

總結(jié)

以上源碼參考個(gè)人項(xiàng)目 基于Spring Cloud、OAuth2.0開(kāi)發(fā)基于Vue前后分離的開(kāi)發(fā)平臺(tái)

QQ: 2270033969 一起來(lái)聊聊你們是咋用 spring cloud 的吧。

歡迎關(guān)注我們獲得更多的好玩JavaEE 實(shí)踐

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/45132.html

相關(guān)文章

  • Spring Cloud Gateway 擴(kuò)展支持版本控制灰度發(fā)布

    摘要:灰度發(fā)布就是通過(guò)一定策略保證多個(gè)版本客戶端服務(wù)端間能夠正確對(duì)應(yīng)。但由于是基于的反應(yīng)式編程,所以傳統(tǒng)的或者都不能正確的維護(hù)上下文請(qǐng)求。歡迎關(guān)注我們獲得更多的好玩實(shí)踐 灰度發(fā)布 什么是灰度發(fā)布,概念請(qǐng)參考,我們來(lái)簡(jiǎn)單的通過(guò)下圖來(lái)看下,通俗的講: 為了保證服務(wù)升級(jí)過(guò)程的平滑過(guò)渡提高客戶體驗(yàn),會(huì)一部分用戶 一部分用戶遞進(jìn)更新,這樣生產(chǎn)中會(huì)同時(shí)出現(xiàn)多個(gè)版本的客戶端,為了保證多個(gè)版本客戶端的可用需...

    Bamboy 評(píng)論0 收藏0
  • Spring Cloud Gateway 擴(kuò)展支持版本控制灰度發(fā)布

    摘要:灰度發(fā)布就是通過(guò)一定策略保證多個(gè)版本客戶端服務(wù)端間能夠正確對(duì)應(yīng)。但由于是基于的反應(yīng)式編程,所以傳統(tǒng)的或者都不能正確的維護(hù)上下文請(qǐng)求。歡迎關(guān)注我們獲得更多的好玩實(shí)踐 灰度發(fā)布 什么是灰度發(fā)布,概念請(qǐng)參考,我們來(lái)簡(jiǎn)單的通過(guò)下圖來(lái)看下,通俗的講: 為了保證服務(wù)升級(jí)過(guò)程的平滑過(guò)渡提高客戶體驗(yàn),會(huì)一部分用戶 一部分用戶遞進(jìn)更新,這樣生產(chǎn)中會(huì)同時(shí)出現(xiàn)多個(gè)版本的客戶端,為了保證多個(gè)版本客戶端的可用需...

    verano 評(píng)論0 收藏0
  • Spring Cloud Gateway 擴(kuò)展支持版本控制灰度發(fā)布

    摘要:灰度發(fā)布就是通過(guò)一定策略保證多個(gè)版本客戶端服務(wù)端間能夠正確對(duì)應(yīng)。但由于是基于的反應(yīng)式編程,所以傳統(tǒng)的或者都不能正確的維護(hù)上下文請(qǐng)求。歡迎關(guān)注我們獲得更多的好玩實(shí)踐 灰度發(fā)布 什么是灰度發(fā)布,概念請(qǐng)參考,我們來(lái)簡(jiǎn)單的通過(guò)下圖來(lái)看下,通俗的講: 為了保證服務(wù)升級(jí)過(guò)程的平滑過(guò)渡提高客戶體驗(yàn),會(huì)一部分用戶 一部分用戶遞進(jìn)更新,這樣生產(chǎn)中會(huì)同時(shí)出現(xiàn)多個(gè)版本的客戶端,為了保證多個(gè)版本客戶端的可用需...

    trilever 評(píng)論0 收藏0
  • 如何使用SpringCloud進(jìn)行灰度發(fā)布

    摘要:灰度發(fā)布是指在黑與白之間,能夠平滑過(guò)渡的一種發(fā)布方式。如何使用進(jìn)行灰度發(fā)布呢將分一下四步第一,設(shè)置網(wǎng)關(guān)權(quán)重路由設(shè)置中提供了去實(shí)現(xiàn)根據(jù)分組設(shè)置權(quán)重進(jìn)行路由,因此使用起來(lái)相對(duì)比較簡(jiǎn)單,有興趣的可以閱讀源碼。 灰度發(fā)布是指在黑與白之間,能夠平滑過(guò)渡的一種發(fā)布方式。在其上可以進(jìn)行A/B testing,即讓一部分用戶繼續(xù)用產(chǎn)品特性A,一部分用戶開(kāi)始用產(chǎn)品特性B,如果用戶對(duì)B沒(méi)有什么反對(duì)意見(jiàn),那...

    Jackwoo 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<