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

Spring擴展之基于HandlerMapping實現(xiàn)接口灰度發(fā)布實例

 更新時間:2023年08月31日 08:32:39   作者:輕塵×  
這篇文章主要介紹了Spring擴展之基于HandlerMapping實現(xiàn)接口灰度發(fā)布實例,灰度發(fā)布是指在黑與白之間,能夠平滑過渡的一種發(fā)布方式,灰度發(fā)布可以保證整體系統(tǒng)的穩(wěn)定,在初始灰度的時候就可以發(fā)現(xiàn)、調(diào)整問題,以保證其影響度,需要的朋友可以參考下

背景

面試經(jīng)常被問到,你了解spring源碼嗎?有基于spring做過什么擴展嗎?

除了PropertyPlaceholderConfigurer處理占位符(被說爛了)還有其他的嗎?

看了springmvc的源碼,有了一個新的案例可講(吹)

基于HandlerMapping實現(xiàn)接口灰度發(fā)布

說這個之前可以先鋪墊一下,將故事講的生動一點,我們來簡單模擬一下。

面試官:“簡歷上說你對spring源碼比較熟悉,能簡單講講你對ioc、aop的理解嗎?”

張三:“ioc是……aop是……巴拉巴拉”

(背了一大段八股文,毫無新意,面試官面無表情,然后打斷張三,繼續(xù)問)

面試官:你說對spring源碼很熟悉,有多熟悉,在實際開發(fā)中有用過?擴展過嗎?

張三:“有過呀,當(dāng)時有個系統(tǒng),升級改動比較大,對于同一批接口,老用戶和新用戶返回的數(shù)據(jù)不一樣,為了實現(xiàn)系統(tǒng)的最小化改動,我當(dāng)時就用spring的HandlerMapping解決了這個問題,前端訪問的接口不變,只在參數(shù)中加一個接口版本號,就能實現(xiàn)灰度……,具體實現(xiàn)是這樣的”

實現(xiàn)方案

自定義注解

新增一個自定義注解,用來標(biāo)注接口的適配的版本號,默認(rèn)為1.0版本

package com.fast.alibaba.annotation;
import java.lang.annotation.*;
/**
 * 自定義版本號注解
 */
@Documented
@Target({ElementType.TYPE,ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface ApiVersion {
    double value() default 1.0;
}
 

自定義HandleMapping

自定義HandleMapping,繼承spring家的HandleMapping,并重寫兩個getCustomTypeCondition方法

package com.fast.alibaba.handlemapping;
import com.fast.alibaba.annotation.ApiVersion;
import com.fast.alibaba.condition.ApiVersionRequestCondition;
import org.springframework.core.annotation.AnnotationUtils;
import org.springframework.web.servlet.mvc.condition.RequestCondition;
import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping;
import java.lang.reflect.Method;
public class ApiVersionHandleMapping extends RequestMappingHandlerMapping {
    @Override
    protected RequestCondition<?> getCustomTypeCondition(Class<?> handlerType) {
        ApiVersion apiVersion = AnnotationUtils.getAnnotation(handlerType, ApiVersion.class);
        return new ApiVersionRequestCondition(apiVersion != null ? apiVersion.value() : 1.0);
    }
    @Override
    protected RequestCondition<?> getCustomMethodCondition(Method method) {
        ApiVersion apiVersion = AnnotationUtils.getAnnotation(method, ApiVersion.class);
        if(apiVersion == null){
            apiVersion = AnnotationUtils.getAnnotation(method.getDeclaringClass(), ApiVersion.class);
        }
        return new ApiVersionRequestCondition(apiVersion != null ? apiVersion.value() : 1.0);
    }
}

實現(xiàn)RequestCondition接口

以便識別前端傳送的版本與接口上注解版本匹配

package com.fast.alibaba.condition;
import com.alibaba.cloud.commons.lang.StringUtils;
import org.springframework.web.servlet.mvc.condition.RequestCondition;
import javax.servlet.http.HttpServletRequest;
public class ApiVersionRequestCondition implements RequestCondition<ApiVersionRequestCondition> {
    private double apiVersion = 1.0;
    private static final String VERSION_NAME = "api-version";
    public double getApiVersion() {
        return apiVersion;
    }
    public ApiVersionRequestCondition(double apiVersion){
        this.apiVersion=apiVersion;
    }
    @Override
    public ApiVersionRequestCondition combine(ApiVersionRequestCondition method) {
        return method;
    }
    @Override
    public int compareTo(ApiVersionRequestCondition other, HttpServletRequest request) {
        return Double.compare(other.getApiVersion(),this.getApiVersion());
    }
    @Override
    public ApiVersionRequestCondition getMatchingCondition(HttpServletRequest request) {
        double reqVersionDouble = 1.0;
        String reqVersion = request.getHeader(VERSION_NAME);
        if(StringUtils.isEmpty(reqVersion)){
            reqVersion = request.getParameter(VERSION_NAME);
        }
        if(!StringUtils.isEmpty(reqVersion)){
            reqVersionDouble = Double.parseDouble(reqVersion);
        }
        if(this.getApiVersion() == reqVersionDouble){
            return this;
        }
        return null;
    }
}

自定義WebMvcRegistrations

package com.fast.alibaba.register;
import com.fast.alibaba.handlemapping.ApiVersionHandleMapping;
import org.springframework.boot.autoconfigure.web.servlet.WebMvcRegistrations;
import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping;
/**
 * 注冊自定義的 ApiVersionHandleMapping
 */
public class ApiVersionMappingRegister implements WebMvcRegistrations {
    @Override
    public RequestMappingHandlerMapping getRequestMappingHandlerMapping() {
        return new ApiVersionHandleMapping();
    }
}

注入WebMvcRegistrations

package com.fast.alibaba.config;
import com.fast.alibaba.register.ApiVersionMappingRegister;
import org.springframework.boot.autoconfigure.web.servlet.WebMvcRegistrations;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class BaseConfiguration {
    @Bean
    public WebMvcRegistrations getWebMvcRegistrations(){
        return new ApiVersionMappingRegister();
    }
}

測試類

package com.fast.alibaba.controller;
import com.fast.alibaba.annotation.ApiVersion;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class TestHandlerMappingController {
    @GetMapping("/getInfo")
    @ApiVersion(1.0)
    public String getSomeInfoByV1(){
        return "version 1.0";
    }
    @GetMapping("/getInfo")
    @ApiVersion(2.0)
    public String getSomeInfoByV2(){
        return "version 2.0";
    }
    @GetMapping("/getInfo")
    @ApiVersion(3.0)
    public String getSomeInfoByV3(){
        return "version 3.0";
    }
}

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

相關(guān)文章

  • Java遞歸以及根據(jù)節(jié)點取子集合方式

    Java遞歸以及根據(jù)節(jié)點取子集合方式

    文章介紹了Java中遞歸的使用方法,包括如何根據(jù)節(jié)點構(gòu)建樹形結(jié)構(gòu)以及如何反向遞歸獲取所有子節(jié)點,提供了遞歸方法的參數(shù)解釋和示例代碼,希望對大家有所幫助
    2024-12-12
  • 30w+數(shù)據(jù)使用RedisTemplate?pipeline空指針NullPointerException異常分析

    30w+數(shù)據(jù)使用RedisTemplate?pipeline空指針NullPointerException異常分析

    這篇文章主要為大家介紹了30w+數(shù)據(jù)使用RedisTemplate?pipeline空指針NullPointerException異常分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-08-08
  • log4j中l(wèi)ogger標(biāo)簽中additivity屬性的用法說明

    log4j中l(wèi)ogger標(biāo)簽中additivity屬性的用法說明

    這篇文章主要介紹了log4j中l(wèi)ogger標(biāo)簽中additivity屬性的用法說明,基于很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • 詳解SpringBoot讀取配置文件的N種方法

    詳解SpringBoot讀取配置文件的N種方法

    這篇文章主要介紹了詳解SpringBoot讀取配置文件的N種方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-02-02
  • Java經(jīng)典排序算法之希爾排序詳解

    Java經(jīng)典排序算法之希爾排序詳解

    這篇文章主要為大家詳細(xì)介紹了Java經(jīng)典排序算法之希爾排序,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-04-04
  • 從0到1學(xué)SpringCloud之SpringCloud?gateway網(wǎng)關(guān)路由配置示例詳解

    從0到1學(xué)SpringCloud之SpringCloud?gateway網(wǎng)關(guān)路由配置示例詳解

    Spring?Cloud?Gateway的目標(biāo)提供統(tǒng)一的路由方式且基于Filter?鏈的方式提供了網(wǎng)關(guān)基本的功能,?例如:安全、監(jiān)控、指標(biāo)和限流?,這篇文章主要介紹了從0到1學(xué)SpringCloud之SpringCloud?gateway網(wǎng)關(guān)路由配置示例詳解,需要的朋友可以參考下
    2023-04-04
  • SpringBoot查詢數(shù)據(jù)庫導(dǎo)出報表文件方式

    SpringBoot查詢數(shù)據(jù)庫導(dǎo)出報表文件方式

    這篇文章主要介紹了SpringBoot查詢數(shù)據(jù)庫導(dǎo)出報表文件方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-04-04
  • Spring中如何使用Comparator接口

    Spring中如何使用Comparator接口

    Comparator比較器接口可以將自身傳遞給排序方法(比如Collections.sort或Arrays.sort),以便對排序順序進(jìn)行精確控制。本文講述Spring中如何使用Comparator接口
    2021-06-06
  • java調(diào)用接口返回亂碼問題及解決

    java調(diào)用接口返回亂碼問題及解決

    這篇文章主要介紹了java調(diào)用接口返回亂碼問題及解決,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-05-05
  • SpringMVC整合SSM實現(xiàn)異常處理器詳解

    SpringMVC整合SSM實現(xiàn)異常處理器詳解

    SpringMVC是一種基于Java,實現(xiàn)了Web MVC設(shè)計模式,請求驅(qū)動類型的輕量級Web框架,即使用了MVC架構(gòu)模式的思想,將Web層進(jìn)行職責(zé)解耦?;谡埱篁?qū)動指的就是使用請求-響應(yīng)模型,框架的目的就是幫助我們簡化開發(fā),SpringMVC也是要簡化我們?nèi)粘eb開發(fā)
    2022-10-10

最新評論

绍兴市| 岳普湖县| 天等县| 丰原市| 香港 | 来安县| 从化市| 始兴县| 尼玛县| 彰化市| 方山县| 太仆寺旗| 临湘市| 许昌县| 合川市| 天津市| 连州市| 衡山县| 龙州县| 安吉县| 寿阳县| 奈曼旗| 清镇市| 滨州市| 宜章县| 南丰县| 灌阳县| 黑龙江省| 莎车县| 合川市| 长白| 洪江市| 石阡县| 宁陵县| 兴义市| 镇康县| 兴和县| 绥江县| 梧州市| 鹿泉市| 赣州市|