SpringBoot实现接口版本控制的示例代码

 更新时间:2024年03月10日 10:30:38   作者:zbmzbm00  
这篇文章主要介绍了springboot如何实现接口版本控制,接口版本控制,比如微服务请求中某个接口需要升级,正常做法是升级我们的版本,文中有详细的代码示例供大家参考,具有一定的参考价值,需要的朋友可以参考下

概述

接口版本控制,比如微服务请求中某个接口需要升级,正常做法是升级我们的版本
比如:localhost:80/api/v1/test

技术实现

我们可以将版本相关的控制以包的形式引入到我们的项目中,那么我们就需要开发我们的对应的版本控制的sdk

1,自定义注解

@Documented
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface ApiVersion {
    /**
     * 版本号
     * @return
     */
    int value() default 1;
}

2,控制开关属性

@RefreshScope
@Data
@ConfigurationProperties(prefix = "api.version")
public class ApiVersionProperties {

    boolean enabled;
}

3,重写RequestMapping

public class ApiRequestHandlerMapping extends RequestMappingHandlerMapping {

    @Override
    protected RequestCondition<ApiVersionCondition> getCustomTypeCondition(Class<?> handlerType) {
        ApiVersion apiVersion = AnnotationUtils.findAnnotation(handlerType, ApiVersion.class);
        return createCondition(apiVersion);
    }

    @Override
    protected RequestCondition<ApiVersionCondition> getCustomMethodCondition(Method method) {
        ApiVersion apiVersion = AnnotationUtils.findAnnotation(method, ApiVersion.class);
        return createCondition(apiVersion);
    }

    private RequestCondition<ApiVersionCondition> createCondition(ApiVersion apiVersion) {
        return apiVersion == null ? null : new ApiVersionCondition(apiVersion.value());
    }
}

public class ApiVersionCondition implements RequestCondition<ApiVersionCondition> {
    /**
     * extract the version part from url. example [v0-9]
     */
    private final static Pattern VERSION_PREFIX_PATTERN = Pattern.compile("v(\\d+)/");

    private int apiVersion;


    public ApiVersionCondition(int apiVersion) {
        this.apiVersion = apiVersion;
    }

    /**
     *  // 和另外一个请求匹配条件合并,具体合并逻辑由实现类提供
     * @param other
     * @return
     */
    @Override
    public ApiVersionCondition combine(ApiVersionCondition other) {
        // latest defined would be take effect, that means, methods definition with
        // override the classes definition
        return new ApiVersionCondition(other.getApiVersion());
    }

    /**
     * 	// 检查当前请求匹配条件和指定请求request是否匹配,如果不匹配返回null,
     * 	// 如果匹配,生成一个新的请求匹配条件,该新的请求匹配条件是当前请求匹配条件
     * 	// 针对指定请求request的剪裁。
     * 	// 举个例子来讲,如果当前请求匹配条件是一个路径匹配条件,包含多个路径匹配模板,
     * 	// 并且其中有些模板和指定请求request匹配,那么返回的新建的请求匹配条件将仅仅
     * 	// 包含和指定请求request匹配的那些路径模板。
     * @param request
     * @return
     */
    @Override
    public ApiVersionCondition getMatchingCondition(HttpServletRequest request) {
        Matcher m = VERSION_PREFIX_PATTERN.matcher(request.getRequestURI());
        if (m.find()) {
            Integer version = Integer.valueOf(m.group(1));
            // when applying version number bigger than configuration, then it will take
            if (version >= this.apiVersion) {
                // effect
                return this;
            }

        }
        return null;
    }

    /**
     *  针对指定的请求对象request比较两个请求匹配条件。
     *  该方法假定被比较的两个请求匹配条件都是针对该请求对象request调用了
     *  #getMatchingCondition方法得到的,这样才能确保对它们的比较
     *  是针对同一个请求对象request,这样的比较才有意义(最终用来确定谁是
     *  更匹配的条件)。
     * @param other
     * @param request
     * @return
     */
    @Override
    public int compareTo(ApiVersionCondition other, HttpServletRequest request) {
        // when more than one configured version number passed the match rule, then only
        // the biggest one will take effect.
        return other.getApiVersion() - this.apiVersion;
    }

    public int getApiVersion() {
        return apiVersion;
    }
}

4,注册

@Configuration
@EnableConfigurationProperties(ApiVersionProperties.class)
@ConditionalOnProperty(
        value = {"api.version.enabled"},
        matchIfMissing = true
)
public class WebConfig implements WebMvcRegistrations {

    @Override
    public RequestMappingHandlerMapping getRequestMappingHandlerMapping() {
        return new ApiRequestHandlerMapping();
    }
}

5,最后resource/MATE-INFO/spring.factories

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.example.springbootgray.apiversion.WebConfig,\

使用

@RestController
@ApiVersion(value = 1)
@RequestMapping("/api/{version}")

调用使用

localhost:8080/api/v1/test

到此这篇关于SpringBoot实现接口版本控制的示例代码的文章就介绍到这了,更多相关SpringBoot接口版本控制内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Springboot使用Junit测试没有插入数据的原因

    Springboot使用Junit测试没有插入数据的原因

    这篇文章主要介绍了Springboot使用Junit测试没有插入数据的原因,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-04-04
  • 如何在SpringBoot中添加拦截器忽略请求URL当中的指定字符串

    如何在SpringBoot中添加拦截器忽略请求URL当中的指定字符串

    这篇文章主要介绍了在SpringBoot中添加拦截器忽略请求URL当中的指定字符串,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-08-08
  • springboot 获取访问接口的请求的IP地址的实现

    springboot 获取访问接口的请求的IP地址的实现

    本文主要介绍了springboot获取访问接口的请求的IP地址的实现,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-07-07
  • Docker使用 Maven 插件构建镜像的方法

    Docker使用 Maven 插件构建镜像的方法

    本篇文章主要介绍了Docker使用 Maven 插件构建镜像的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-02-02
  • Ubuntu安装jdk8常用方法流程解析

    Ubuntu安装jdk8常用方法流程解析

    这篇文章主要介绍了Ubuntu安装jdk8常用方法流程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-11-11
  • Spring中的注解之@Override和@Autowired

    Spring中的注解之@Override和@Autowired

    看别人写的代码,经常会用到 @Override 和 @Autowired 这两个注解.这边总结一下这两个注解的作用,对正在学习java的小伙伴们有很好地帮助,需要的朋友可以参考下
    2021-05-05
  • SpringBoot整合tkMapper的方法

    SpringBoot整合tkMapper的方法

    项目使用SpringBoot2.0,H2数据库,使用了 Lombok 简化代码,下面是本人使用SpringBoot整合tkMapper的一个小demo,记录下来本人在此处踩得坑
    2022-11-11
  • java HashMap 的工作原理详解

    java HashMap 的工作原理详解

    本文主要介绍java HashMap 的资料,这里整理了相关资料,并详细说明了HashMap的用法,有需要的小伙伴可以参考下
    2016-09-09
  • springboot2.x集成swagger的方法示例

    springboot2.x集成swagger的方法示例

    这篇文章主要介绍了springboot2.x集成swagger的方法示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-05-05
  • Java中Stringbuild,Date和Calendar类的用法详解

    Java中Stringbuild,Date和Calendar类的用法详解

    这篇文章主要为大家详细介绍了Java中Stringbuild、Date和Calendar类的用法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起了解一下
    2023-04-04

最新评论