亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

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

背景

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

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

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

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

說(shuō)這個(gè)之前可以先鋪墊一下,將故事講的生動(dòng)一點(diǎn),我們來(lái)簡(jiǎn)單模擬一下。

面試官:“簡(jiǎn)歷上說(shuō)你對(duì)spring源碼比較熟悉,能簡(jiǎn)單講講你對(duì)ioc、aop的理解嗎?”

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

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

面試官:你說(shuō)對(duì)spring源碼很熟悉,有多熟悉,在實(shí)際開(kāi)發(fā)中有用過(guò)?擴(kuò)展過(guò)嗎?

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

實(shí)現(xiàn)方案

自定義注解

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

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

自定義HandleMapping

自定義HandleMapping,繼承spring家的HandleMapping,并重寫兩個(gè)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);
    }
}

實(shí)現(xiàn)RequestCondition接口

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

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;
/**
 * 注冊(cè)自定義的 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();
    }
}

測(cè)試類

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擴(kuò)展之基于HandlerMapping實(shí)現(xiàn)接口灰度發(fā)布實(shí)例的文章就介紹到這了,更多相關(guān)基于HandlerMapping實(shí)現(xiàn)接口灰度發(fā)布內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • springBoot 項(xiàng)目排除數(shù)據(jù)庫(kù)啟動(dòng)方式

    springBoot 項(xiàng)目排除數(shù)據(jù)庫(kù)啟動(dòng)方式

    這篇文章主要介紹了springBoot 項(xiàng)目排除數(shù)據(jù)庫(kù)啟動(dòng)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • Spring MVC請(qǐng)求參數(shù)的深入解析

    Spring MVC請(qǐng)求參數(shù)的深入解析

    這篇文章主要給大家介紹了關(guān)于Spring MVC請(qǐng)求參數(shù)解析的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-05-05
  • 阿里規(guī)范:為何boolean類型變量命名禁用is開(kāi)頭

    阿里規(guī)范:為何boolean類型變量命名禁用is開(kāi)頭

    這篇文章主要給大家介紹了關(guān)于阿里規(guī)范:為何boolean類型變量命名禁用is開(kāi)頭的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-08-08
  • Springboot自動(dòng)裝配之注入DispatcherServlet的實(shí)現(xiàn)方法

    Springboot自動(dòng)裝配之注入DispatcherServlet的實(shí)現(xiàn)方法

    這篇文章主要介紹了Springboot自動(dòng)裝配之注入DispatcherServlet,Springboot向外界提供web服務(wù),底層依賴了springframework中的web模塊來(lái)實(shí)現(xiàn),那么springboot在什么時(shí)機(jī)向容器注入DispatcherServlet這個(gè)核心類的呢?帶著這個(gè)問(wèn)題一起通過(guò)本文學(xué)習(xí)吧
    2022-05-05
  • SpringBoot?Mail郵件任務(wù)詳情

    SpringBoot?Mail郵件任務(wù)詳情

    這篇文章主要介紹了SpringBoot?Mail郵件任務(wù)詳情,文章通過(guò)spring-boot-starter-mail包展開(kāi)詳細(xì)內(nèi)容,需要的小伙伴可以參考一下
    2022-05-05
  • 淺談MyBatis中@MapKey的妙用

    淺談MyBatis中@MapKey的妙用

    這篇文章主要介紹了MyBatis中@MapKey的妙用,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-01-01
  • java中申請(qǐng)不定長(zhǎng)度數(shù)組ArrayList的方法

    java中申請(qǐng)不定長(zhǎng)度數(shù)組ArrayList的方法

    今天小編就為大家分享一篇java中申請(qǐng)不定長(zhǎng)度數(shù)組ArrayList的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-07-07
  • java開(kāi)發(fā)中常遇到的各種難點(diǎn)以及解決思路方案

    java開(kāi)發(fā)中常遇到的各種難點(diǎn)以及解決思路方案

    Java項(xiàng)目是一個(gè)復(fù)雜的軟件開(kāi)發(fā)過(guò)程,其中會(huì)涉及到很多技術(shù)難點(diǎn),這篇文章主要給大家介紹了關(guān)于java開(kāi)發(fā)中常遇到的各種難點(diǎn)以及解決思路方案的相關(guān)資料,需要的朋友可以參考下
    2023-07-07
  • Java基礎(chǔ)知識(shí)精通二維數(shù)組的應(yīng)用

    Java基礎(chǔ)知識(shí)精通二維數(shù)組的應(yīng)用

    為了方便組織各種信息,計(jì)算機(jī)常將信息以表的形式進(jìn)行組織,然后再以行和列的形式呈現(xiàn)出來(lái)。二維數(shù)組的結(jié)構(gòu)決定了其能非常方便地表示計(jì)算機(jī)中的表,以第一個(gè)下標(biāo)表示元素所在的行,第二個(gè)下標(biāo)表示元素所在的列。下面簡(jiǎn)單了解一下二維數(shù)組,包括數(shù)組的聲明和初始化
    2022-04-04
  • lombok?子類中如何使用@Builder問(wèn)題

    lombok?子類中如何使用@Builder問(wèn)題

    這篇文章主要介紹了lombok?子類中如何使用@Builder問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-09-09

最新評(píng)論