微服务使用knife4j进行在线接口调试
微服务使用knife4j进行在线接口调试
前言
之前发布了一个博客是关于SpringBoot
使用knife4j
进行在线接口调试,那是一个单节点下的教程,那么在微服务情况,每一个服务都是一个独立的knife4j
的话,显然是不方便的,那么对于微服务的情况下,我们如何使用knife4j
呢?
SpringBoot使用knife4j可参考我的博客:SpringBoot使用knife4j进行在线接口调试
Nacos安装以及其使用可参考我的博客:Nacos服务治理中心和配置中心
正文
微服务使用knife4j进行在线接口调试
我们这里以微服务使用Gateway
举例,它是由两个模块组成:
spring-dubbo-gateway
:Gateway
模块gateway-producer-service
:producer
模块
网关模块:spring-dubbo-gateway
注入依赖
<dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>3.0.1</version><scope>provided</scope>
</dependency><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId><version>2.1.2.RELEASE</version>
</dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId><version>2.1.2.RELEASE</version>
</dependency><!--knife4j接口-->
<dependency><groupId>com.github.xiaoymin</groupId><artifactId>knife4j-spring-boot-starter</artifactId><version>2.0.4</version>
</dependency>
<!--lombok-->
<dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.2</version><optional>true</optional>
</dependency>
application.properties:配置文件
server.port=9000
spring.application.name=spring-dubbo-gateway
spring.main.allow-bean-definition-overriding=truespring.cloud.nacos.discovery.server-addr=127.0.0.7:8848
spring.cloud.gateway.discovery.locator.enabled=true
spring.cloud.gateway.discovery.locator.lower-case-service-id=true
spring.cloud.gateway.routes[0].id=gateway-producer-service
spring.cloud.gateway.routes[0].uri=lb://spring-dubbo-producer
spring.cloud.gateway.routes[0].predicates[0]=Path=/producer/**#swagger配置
spring.cloud.gateway.routes[0].filters[0] = SwaggerHeaderFilter
spring.cloud.gateway.routes[0].filters[1] = StripPrefix=1
spring.cloud.gateway.x-forwarded.enabled=false
SwaggerResourceConfig.java:Swagger配置类
@Slf4j
@Component
@Primary
@AllArgsConstructor
public class SwaggerResourceConfig implements SwaggerResourcesProvider {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("**", "v2/api-docs"))));});return resources;}private SwaggerResource swaggerResource(String name, String location) {log.info("name:{},location:{}",name,location);SwaggerResource swaggerResource = new SwaggerResource();swaggerResource.setName(name);swaggerResource.setLocation(location);swaggerResource.setSwaggerVersion("2.0");return swaggerResource;}
}
SwaggerHandler.java:资源处理类
@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)));}
}
SwaggerHeaderFilter.java:以拦截器的方式管理请求Header
@Component
public class SwaggerHeaderFilter extends AbstractGatewayFilterFactory {private static final String HEADER_NAME = "X-Forwarded-Prefix";private static final String URI = "/v2/api-docs";@Overridepublic GatewayFilter apply(Object config) {return (exchange, chain) -> {ServerHttpRequest request = exchange.getRequest();String path = request.getURI().getPath();if (!StringUtils.endsWithIgnoreCase(path,URI )) {return chain.filter(exchange);}String basePath = path.substring(0, path.lastIndexOf(URI));ServerHttpRequest newRequest = request.mutate().header(HEADER_NAME, basePath).build();ServerWebExchange newExchange = exchange.mutate().request(newRequest).build();return chain.filter(newExchange);};}
}
代理服务模块:spring-dubbo-producer
注入依赖
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId><version>0.9.0.RELEASE</version>
</dependency>
<!--knife4j接口-->
<dependency><groupId>com.github.xiaoymin</groupId><artifactId>knife4j-spring-boot-starter</artifactId><version>2.0.4</version>
</dependency>
<!--lombok-->
<dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.2</version><optional>true</optional>
</dependency>
application.properties:配置文件
server.port=8080
spring.application.name=spring-dubbo-producer
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
SwaggerConfig.class:Swagger配置类
/*** swagger配置*/
@Configuration
@EnableSwagger2
@EnableKnife4j
@Import(BeanValidatorPluginsConfiguration.class)
public class SwaggerConfig {/*** 这里配置swagger扫描的包* @return*/@Beanpublic Docket createRestApi() {return new Docket(DocumentationType.SWAGGER_2).apiInfo(apiInfo()).select().apis(RequestHandlerSelectors.basePackage("com.luo.producer")).paths(PathSelectors.any()).build();}/*** 这里配置swagger对外提供服务的端口* @return*/private ApiInfo apiInfo() {return new ApiInfoBuilder().title("发布模拟boos接口").description("简单优雅的发布模拟boos接口restful风格接口")// .termsOfServiceUrl("http://127.0.0.1:8080/doc.html").version("1.0").build();}
}
验证
启动项目在Nacos可看到服务
测试接口
@RestController
@Slf4j
@RequestMapping("/producer")
public class UserController {@GetMapping("/helloword")public String hello(String input){return "你好,"+input;}}
进入knife4j管理界面进行接口测试
微服务使用knife4j进行在线接口调试相关推荐
- 钉钉H5微应用开发免登以及接口调试
钉钉H5微应用开发以及接口调试 企业内部应用免登 https://open.dingtalk.com/document/orgapp-server/enterprise-internal-applic ...
- 2023年最新黑马程序员Java微服务项目--学成在线
正式上线Java微服务项目<学成在线> 项目对程序员的重要性 不用播妞多说了吧 更重要的是 这次是完整!实战!企业级!项目! 划重点:全新发布!正式上线! <学成在线>项目以在 ...
- 若依微服务版前端怎样在接口返回500时去掉一直弹窗提示服务未找到
场景 若依微服务版手把手教你本地搭建环境并运行前后端项目: 若依微服务版手把手教你本地搭建环境并运行前后端项目_BADAO_LIUMANG_QIZHI的博客-CSDN博客_若依微服务 在上面的基础上, ...
- SpringCloud微服务使用Feign如何暴露接口并整合SpringBoot测试
文章目录 一. 问题背景 二. 解决方案 2.1 实现生产者中的接口 2.2 暴露接口 2.3 远程调用 2.4 SpringBoot整合测试 2.5 开始测试 三. 回调处理 四. 踩坑记录 一. ...
- 微服务springcloud+Vue的在线汽车用品销售商城平台
后端语言:Java 框架:springcloud+springboot 数据库:mysql 数据库工具:Navicat 前端vue+elementui, 1.关于汽车销售商城的基本要求 (1)功 ...
- Apizza在线接口调试文档工具如何方便添加测试用例
1. 什么是测试用例 当您测试完后需要将API参数保留,针对各个不同环境进行测试.同时我们需要在一个API中测试多种情况.我们不需要再填写API参数. 2. 保存测试用例 API测试完成后,我们可以把 ...
- 微服务+微信小程序实现社区服务
微服务+微信小程序实现社区服务 前言 我在上大学的时候毕业设计做的是微服务SpringCloud结合微信小程序实现一个提供一些生活服务的微信小程序,它主要可以提供豆瓣电影资讯.热点新闻.天气预报.停车 ...
- 微服务启动顺序_基于华为云CSE微服务接口兼容常见问题
微服务接口兼容常见问题 在进行微服务持续迭代开发的过程中,由于新特性在不停的加入,一些过时的特性在不停的修改,接口兼容问题面临巨大的挑战,特别是在运行环境多版本共存(灰度发布)的情况下.本章节主要描述 ...
- 基于华为云CSE微服务接口兼容常见问题
微服务接口兼容常见问题 在进行微服务持续迭代开发的过程中,由于新特性在不停的加入,一些过时的特性在不停的修改,接口兼容问题面临巨大的挑战,特别是在运行环境多版本共存(灰度发布)的情况下.本章节主要描述 ...
最新文章
- linux shell 删除文本 较长行
- nuxt渲染html文件,Nuxt页面级缓存
- 刚刚,国家新型互联网交换中心(以及新公司)正式成立!不止于降低网间结算费用...
- python下载地址
- [转]快速清除SQL Server日志的两种方法
- 3青春痘长在哪里不害怕
- 利用指针编程实现:删除一个字符串中的所有空格 c语言,C语言必考100题解析汇报...
- 软件三层架构和MVC模式的区别
- MySQL按照汉字拼音首字母排序
- python编程100个小程序-用python编写一个闹钟小程序
- python2.7输出语句,输入和输出 - 廖雪峰 Python 2.7 中文教程
- 递归算法经典实例python-浅谈Python 递归算法指归
- Xcode打包ipa的步骤
- 爬虫 requests User-Agent池 FakeUserAgent URL传参
- 组合导航GPS+IMU
- mysql提现_MYSQL事务教程之Yii2.0商户提现功能
- airbnb北京民宿运营情况分析
- 计算机防火墙无法关闭,为什么我电脑的防火墙关不了(win7电脑防火墙怎么关)
- 在UE4里实现四叉树查找最近点
- 从软件工程师到IT猎头:我的一点经历和感触 (转)