Spring Cloud Gateway集成聚合型Spring Boot API发布组件knife4j,增强Swagger

devtools/2024/9/20 6:50:38/ 标签: spring boot, 后端, java

大家都知道,在前后端分离开发的时代,前后端接口对接是一项必不可少的工作。

可是,后端开发,怎么和前端更好的配合,才能让自己不心累、脑累,直接扔给前端一个后端开放api接口文档或者页面,让前端不用看着难受,也不用前端老问你,来愉快的合作呢?

原来可能我们一直用的是Swagger,不得不说Swagger是一个非常好的框架,自从它的出现,大大减少了我们对接的繁重工作。(以前我们开发可是经常要写开发接口文档的)

可是我们在用Swagger时,不管是Swagger本身,还是SwaggerUI,用起来其实不是那么的便捷,尤其是SwaggerUI,反正我用起来真的很是难受,也许是因为它不是我们国人开发的,所以操作方面根本没有我们国人的操作习惯设计。

幸好啊,我们国人也是很厉害的。

Knife4j这个东东,简直是及时雨,用起来丝滑的很。看看它的界面,是不是就是国人的思维设计?

有了这个东东,那么我们来研究一下,怎么让他来集成我们的Gateway,那么如何实现Gateway,可以查看我的上一篇文章。

轻量级的Spring Cloud Gateway实践,实现api和websocket转发icon-default.png?t=N7T8https://blog.csdn.net/t610654893/article/details/137783310?spm=1001.2014.3001.5501

那么,我在这个项目基础上,实现Knife4j的集成实现。

首先,我来说一下我的整体项目结构:

--- 俩个主要的Spring Boot名
【app-server】前端接口服务
【manager-server】后端管理平台服务器接口
--- 微服网关、配置等平台服务
【cloud-server】
---【gateway-starter】路由套件 
--- 等等
【common-server】公共starter目录的服务
---【boot-starter】公共套件 
--- 等等

好,那么我们先从gateway着手来实现。首先pom.xml内引入:

<dependency><groupId>com.github.xiaoymin</groupId><artifactId>knife4j-spring-boot-starter</artifactId><version>3.0.3</version>
</dependency>

在Gateway项目内,新增一个类集成SwaggerResourcesProvider配置SwaggerProvider,获取Api-doc!

/*** <b>功能:</b>SWAGGER聚合服务<br>*/
@Slf4j
@Component
@Primary
@AllArgsConstructor
public class SwaggerResourceConfig implements SwaggerResourcesProvider {@Resourceprivate Environment env;private final RouteLocator routeLocator;private final GatewayProperties gatewayProperties;@Overridepublic List<SwaggerResource> get() {List<SwaggerResource> resources = new ArrayList<>();List<String> routes = new ArrayList<>();routeLocator.getRoutes().subscribe(route -> routes.add(route.getId()));gatewayProperties.getRoutes().stream().filter(routeDefinition -> routes.contains(routeDefinition.getId())).forEach(route -> {route.getPredicates().stream().filter(predicateDefinition ->("Path").equalsIgnoreCase(predicateDefinition.getName())).forEach(predicateDefinition ->resources.add(swaggerResource(route.getId(),predicateDefinition.getArgs().get(NameUtils.GENERATED_NAME_PREFIX + "0").replace("**", "v3/api-docs"))));});return resources;}private SwaggerResource swaggerResource(String name, String location) {log.info("name:{},location:{}", name, location);SwaggerResource swaggerResource = new SwaggerResource();swaggerResource.setName(env.getProperty(name));swaggerResource.setLocation(location + "?group=KN");swaggerResource.setSwaggerVersion("3.0.3");return swaggerResource;}
}

​​​​​为了能更好的实现界面的客观性,我们这里写了一个swaggerResource的方法,此方法主要是为了能更好的表达我们的Api接口是属于谁的。比如说我们在Gateway的配置内配置了:routes[0].id=lb://app-server, 那么我们在配置后再加一个app-server=分组接口,那么在Knife4j内就可以更直观的选择属于app-server的项目API了。

图片

我们这里主要还是你为了集成Swagger的内容,来完成Knife4j的前段实现。

因为Gateway里没有配置SwaggerConfig,而运行Swagger-ui又需要依赖一些接口,所以我们还需要自己来实现swagger-resource端点。

这里其实也很简单,我们再新建一个类,来完成我们对swagger-resource的实现。

/*** <b>功能:</b>SWAGGER聚合服务<br>*/
@RestController
public class SwaggerHandler {@Autowired(required = false)private SecurityConfiguration securityConfiguration;@Autowired(required = false)private UiConfiguration uiConfiguration;private final SwaggerResourcesProvider swaggerResources;@Autowiredpublic SwaggerHandler(SwaggerResourcesProvider swaggerResources) {this.swaggerResources = swaggerResources;}@GetMapping("/swagger-resources/configuration/security")public Mono<ResponseEntity<SecurityConfiguration>> securityConfiguration() {return Mono.just(new ResponseEntity<>(Optional.ofNullable(securityConfiguration).orElse(SecurityConfigurationBuilder.builder().build()), HttpStatus.OK));}@GetMapping("/swagger-resources/configuration/ui")public Mono<ResponseEntity<UiConfiguration>> uiConfiguration() {return Mono.just(new ResponseEntity<>(Optional.ofNullable(uiConfiguration).orElse(UiConfigurationBuilder.builder().build()), HttpStatus.OK));}@GetMapping("/swagger-resources")public Mono<ResponseEntity> swaggerResources() {return Mono.just((new ResponseEntity<>(swaggerResources.get(), HttpStatus.OK)));}@GetMapping("/api")@SentinelResource("api")public Set<ApiDefinition> apiRules() {return GatewayApiDefinitionManager.getApiDefinitions();}@GetMapping("/gateway")@SentinelResource("gateway")public Set<GatewayFlowRule> apiGateway() {return GatewayRuleManager.getRules();}@GetMapping("/flow")@SentinelResource("flow")public List<FlowRule> apiFlow() {return FlowRuleManager.getRules();}
}

Gateway端接口已经配置完成。接下来配置实现客户端,由于我的工程俩个server都引入了boot-server,所以这里我只在boot-server内实现即可。

<dependency><groupId>com.github.xiaoymin</groupId><artifactId>knife4j-micro-spring-boot-starter</artifactId><version>3.0.3</version>
</dependency>

客户端服务基本也就是按照Swagger的配置写config即可。这样更加方便我们以Swagger为基础更增强我们的api接口发布。为了更详尽的使用,我们一一实现。

增加Swagger 配置类

@EnableOpenApi
@Configuration
@EnableConfigurationProperties(value = {SwaggerProperties.class})
public class SwaggerConfiguration {@Resourceprivate SwaggerProperties swaggerProperties;@Beanpublic Docket createRestApi() {Boolean enable = swaggerProperties.getEnable();String tryHost = swaggerProperties.getTryHost();return new Docket(DocumentationType.OAS_30).groupName("KN")// 定义是否开启swagger,false为关闭,可以通过变量控制.enable(enable)// 将api的元信息设置为包含在json ResourceListing响应中。.apiInfo(apiInfo())// 接口调试地址.host(tryHost)// 选择哪些接口作为swagger的doc发布.select().apis(RequestHandlerSelectors.any()).paths(PathSelectors.regex("/api/.*")).build();}/*** <b>功能描述:</b>API 页面上半部分展示信息<br>* <b>修订记录:</b><br>* <li>20201225&nbsp;&nbsp;|&nbsp;&nbsp;田星亮&nbsp;&nbsp;|&nbsp;&nbsp;创建方法</li><br>*/private ApiInfo apiInfo() {return new ApiInfoBuilder().title(swaggerProperties.getApplicationName()).description(swaggerProperties.getApplicationDescription()).termsOfServiceUrl("https://www.kn.com/").contact(new Contact("KN", null, "admin@kn.com")).version(swaggerProperties.getApplicationVersion()).build();}
}

​​​​​​​这里我们再增强一下,使我们的接口更符合api接口规范,给API头增加名为Token的头,在createRestApi方法Docket实现内增加俩个方法后缀,并付上实现:

.build()
// 授权信息设置,必要的header token等认证信息
.securitySchemes(securitySchemes())
.securityContexts(securityContexts());
 /*** <b>功能描述:</b>设置授权信息<br>*/private List<SecurityScheme> securitySchemes() {return Collections.singletonList(new ApiKey("token", "token", In.HEADER.toValue()));}/*** <b>功能描述:</b>授权信息全局应用<br>*/private List<SecurityContext> securityContexts() {return Collections.singletonList(SecurityContext.builder().securityReferences(Collections.singletonList(new SecurityReference("token", new AuthorizationScope[]{new AuthorizationScope("global", "")}))).build());}

​​​​​​​上方内配置项详解,完成灵活调用

@Data
@ConfigurationProperties("swagger")
public class SwaggerProperties {/*** 是否开启swagger,生产环境一般关闭,所以这里定义一个变量*/private Boolean enable;/*** 项目应用名*/private String applicationName;/*** 项目版本信息*/private String applicationVersion;/*** 项目描述信息*/private String applicationDescription;/*** 接口调试地址*/private String tryHost;
}

至此,我们配置完成,打开Gateway所属的端口链接即可完成Knife4j的访问。Knife4j的配置内还有一些高级项配置,大家按照自己需要增强哦,比如说api排序这个我就很喜欢。


http://www.ppmy.cn/devtools/6516.html

相关文章

ROS分布式通讯配置

4WD 必读&#xff1a;分布式通讯是相对于用虚拟机来连接小车上主机来说&#xff0c;如果是 4WD 笔记本无主 机用户&#xff0c;不存在分布式通讯一说。 1.4WD 用户单笔记设置一&#xff0c;连接底盘和雷达还有摄像头。 因为虚拟机带宽问题&#xff0c;无法保证摄像头正常运行。…

LeetCode 383.赎金信(模拟,for(char c : 容器)的使用)

给你两个字符串&#xff1a;ransomNote 和 magazine &#xff0c;判断 ransomNote 能不能由 magazine 里面的字符构成。 如果可以&#xff0c;返回 true &#xff1b;否则返回 false 。 magazine 中的每个字符只能在 ransomNote 中使用一次。 示例 1&#xff1a; 输入&#…

GlobalRouting - FastRoute布线算法运行流程(二)

文章目录 1. 运行步骤 FT::run 1. 运行步骤 首先生成2D的布线&#xff0c;然后进行层分配以及生成3D的布线&#xff0c;最后计算结果并返回。具体流程如下&#xff1a; 读取查找表flut, POST9.dat, POWV9.dat使用查找表生成RSMT&#xff0c;将多pin线网拆分为2pin线网进行第…

【Xilinx】时序约束学习 TIMING-1: 时钟修改块上的时钟波形无效

在 <cell_type> 输出 <pin_name> 上指定的时钟 <clock_name> 的时钟波形无效&#xff0c; 与时钟修改块 (CMB) 设置不匹配。该时钟波形为 <VALUE>。期望的波形为 <VALUE>。 描述 Vivado Design Suite 会根据 CMB 设置和传入主时钟的特性&#xf…

Java的垃圾回收机制

Java垃圾回收机制是Java平台内存管理的重要组成部分&#xff0c;它负责自动回收不再使用的对象所占用的内存&#xff0c;从而防止内存泄漏和内存溢出。这一机制大大简化了Java程序员的内存管理任务&#xff0c;使程序员能够更专注于业务逻辑的实现。下面将详细解释Java垃圾回收…

利用大语言模型,矢量数据库实现数据库的智能搜索

目的 数据库使用SQL 语言查询数据&#xff0c;数据库的记录中要有一个关键字段&#xff08;通常称为主键字段&#xff0c;它的值在数据库列表中是唯一的&#xff09;,数据记录是结构化的. 如果你需要根据数据记录的内容来查询数据记录&#xff0c;就需要通过Select 语句在数据库…

无法连接到MongoDB Atlas 的Cloud Database

打开Mongodb网页: 选择允许任何地址连接 连接成功

负载均衡集群——HAProxy

目录 1 HAProxy介绍 2 功能简介 3 实验组网介绍 4 实验步骤 4.1 通过 HAProxy 实现简单负载均衡调度功能 步骤 1 安装 HAProxy 步骤 2 修改配置 HAProxy 文件 4.2 HAProxy 监控页面配置 步骤 1 修改 HAProxy 配置文件 步骤 2 查看监控页面 3.3 HAProxy 日志相关配置 …

什么是神经网络和机器学习?【云驻共创】

什么是神经网络和机器学习&#xff1f; 一.背景 在当今数字化浪潮中&#xff0c;神经网络和机器学习已成为科技领域的中流砥柱。它们作为人工智能的支柱&#xff0c;推动了自动化、智能化和数据驱动决策的进步。然而&#xff0c;对于初学者和专业人士来说&#xff0c;理解神经…

论文笔记:Are Human-generated Demonstrations Necessary for In-context Learning?

iclr 2024 reviewer 评分 6668 1 intro 大型语言模型&#xff08;LLMs&#xff09;已显示出在上下文中学习的能力 给定几个带注释的示例作为演示&#xff0c;LLMs 能够为新的测试输入生成输出然而&#xff0c;现行的上下文学习&#xff08;ICL&#xff09;范式仍存在以下明显…

微服务面试题

这里写目录标题 1.微服务是什么2.你知道哪些RPC架构3.SpringCloud和Dubbo有什么区别4.SpringCloud由什么组成5.Eureka包含几个组件6.Eureka的工作原理7.说一下什么是Eureka的自我保护机制8.什么是CAP原则9.都是服务注册中心&#xff0c;Eureka比Zookeeper好在哪里10.Ribbon的作…

请陪伴Kimi和GPT成长

经验的闪光汤圆 但是我想要写实的 你有吗&#xff1f; 岁数大了&#xff0c;希望如何学习新知识呢&#xff1f;又觉得自己哪些能力亟需补强呢&#xff1f; 看论文自然得用Kimi&#xff0c;主要是肝不动了&#xff0c;眼睛也顶不住了。 正好昨天跟专业人士学会了用工作流的办法跟…

EI Scopus双检索 | 2024年清洁能源与智能电网国际会议(CCESG 2024)

会议简介 Brief Introduction 2024年清洁能源与智能电网国际会议(CCESG 2024) 会议时间&#xff1a;2024年 11月27-29日 召开地点&#xff1a;澳大利亚悉尼 大会官网&#xff1a;CCESG 2024-2024 International Joint Conference on Clean Energy and Smart Grid 由CoreShare科…

Springboot项目中Controller层的单元测试

源码展示&#xff1a; 原来的controller类&#xff1a; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import org.springframework.web.bind.annotation.*;RestController RequestMapping("/web") Slf4j Service public clas…

Taro-vue微信小程序用户隐私保护

Taro-vue微信小程序用户隐私保护 一、在 微信公众平台的【设置】- 【服务内容与声明】 &#xff0c;设置用户隐私保护指引&#xff0c;添加项目需要的接口权限。 【用户隐私保护指引】提交之后&#xff0c;官方会进行审核。审核通过之后&#xff0c;对应的接口权限才会生效。 …

js设置:root得样式

在CSS中&#xff0c;:root 是一个伪类选择器&#xff0c;它匹配文档树的根元素。在HTML文档中&#xff0c;根元素通常是 <html> 元素。:root 选择器常用于定义CSS变量&#xff08;也称为自定义属性&#xff09;&#xff0c;以便在整个文档范围内使用这些变量。 关于“水…

Automated CNN approach

图1有点简单 作者未提供代码

【MySQL】表的增删改查

目录 前言&#xff1a; 新增&#xff08;Create&#xff09;&#xff1a; 查询&#xff08;Retrieve&#xff09;&#xff1a; 别名&#xff1a; 去重&#xff1a;DISTINCT 排序&#xff1a;ORDER BY &#xff1a; 条件查询&#xff1a;WHERE &#xff1a; 分页查询&am…

acwing算法提高之图论--无向图的双连通分量

目录 1 介绍2 训练 1 介绍 本博客用来记录无向图的双连通分量的相关题目。 以下所有概念都是针对无向图而言的。 桥&#xff1a;本质是边&#xff0c;去掉它&#xff0c;图就不连通了。这样的边叫作桥。 边双连通分量&#xff1a;不包含桥的连通块&#xff0c;且边的数目最大…

速盾:cdn可以加速哪些服务器

CDN&#xff08;Content Delivery Network&#xff0c;内容分发网络&#xff09;是一种通过将网站的静态资源部署到全球各地的服务器上&#xff0c;以提供更快速、更可靠的访问体验的技术。CDN可以加速许多类型的服务器&#xff0c;包括但不限于以下几种&#xff1a; 静态资源服…