微服务使用knife4j进行在线接口调试

前言

之前发布了一个博客是关于SpringBoot使用knife4j进行在线接口调试,那是一个单节点下的教程,那么在微服务情况,每一个服务都是一个独立的knife4j的话,显然是不方便的,那么对于微服务的情况下,我们如何使用knife4j呢?

SpringBoot使用knife4j可参考我的博客:SpringBoot使用knife4j进行在线接口调试

Nacos安装以及其使用可参考我的博客:Nacos服务治理中心和配置中心

正文

微服务使用knife4j进行在线接口调试

我们这里以微服务使用Gateway举例,它是由两个模块组成:

  • spring-dubbo-gatewayGateway模块
  • gateway-producer-serviceproducer模块

网关模块: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进行在线接口调试相关推荐

  1. 钉钉H5微应用开发免登以及接口调试

    钉钉H5微应用开发以及接口调试 企业内部应用免登 https://open.dingtalk.com/document/orgapp-server/enterprise-internal-applic ...

  2. 2023年最新黑马程序员Java微服务项目--学成在线

    正式上线Java微服务项目<学成在线> 项目对程序员的重要性 不用播妞多说了吧 更重要的是 这次是完整!实战!企业级!项目! 划重点:全新发布!正式上线! <学成在线>项目以在 ...

  3. 若依微服务版前端怎样在接口返回500时去掉一直弹窗提示服务未找到

    场景 若依微服务版手把手教你本地搭建环境并运行前后端项目: 若依微服务版手把手教你本地搭建环境并运行前后端项目_BADAO_LIUMANG_QIZHI的博客-CSDN博客_若依微服务 在上面的基础上, ...

  4. SpringCloud微服务使用Feign如何暴露接口并整合SpringBoot测试

    文章目录 一. 问题背景 二. 解决方案 2.1 实现生产者中的接口 2.2 暴露接口 2.3 远程调用 2.4 SpringBoot整合测试 2.5 开始测试 三. 回调处理 四. 踩坑记录 一. ...

  5. 微服务springcloud+Vue的在线汽车用品销售商城平台

    后端语言:Java 框架:springcloud+springboot 数据库:mysql   数据库工具:Navicat  前端vue+elementui, 1.关于汽车销售商城的基本要求 (1)功 ...

  6. Apizza在线接口调试文档工具如何方便添加测试用例

    1. 什么是测试用例 当您测试完后需要将API参数保留,针对各个不同环境进行测试.同时我们需要在一个API中测试多种情况.我们不需要再填写API参数. 2. 保存测试用例 API测试完成后,我们可以把 ...

  7. 微服务+微信小程序实现社区服务

    微服务+微信小程序实现社区服务 前言 我在上大学的时候毕业设计做的是微服务SpringCloud结合微信小程序实现一个提供一些生活服务的微信小程序,它主要可以提供豆瓣电影资讯.热点新闻.天气预报.停车 ...

  8. 微服务启动顺序_基于华为云CSE微服务接口兼容常见问题

    微服务接口兼容常见问题 在进行微服务持续迭代开发的过程中,由于新特性在不停的加入,一些过时的特性在不停的修改,接口兼容问题面临巨大的挑战,特别是在运行环境多版本共存(灰度发布)的情况下.本章节主要描述 ...

  9. 基于华为云CSE微服务接口兼容常见问题

    微服务接口兼容常见问题 在进行微服务持续迭代开发的过程中,由于新特性在不停的加入,一些过时的特性在不停的修改,接口兼容问题面临巨大的挑战,特别是在运行环境多版本共存(灰度发布)的情况下.本章节主要描述 ...

最新文章

  1. linux shell 删除文本 较长行
  2. nuxt渲染html文件,Nuxt页面级缓存
  3. 刚刚,国家新型互联网交换中心(以及新公司)正式成立!不止于降低网间结算费用...
  4. python下载地址
  5. [转]快速清除SQL Server日志的两种方法
  6. 3青春痘长在哪里不害怕
  7. 利用指针编程实现:删除一个字符串中的所有空格 c语言,C语言必考100题解析汇报...
  8. 软件三层架构和MVC模式的区别
  9. MySQL按照汉字拼音首字母排序
  10. python编程100个小程序-用python编写一个闹钟小程序
  11. python2.7输出语句,输入和输出 - 廖雪峰 Python 2.7 中文教程
  12. 递归算法经典实例python-浅谈Python 递归算法指归
  13. Xcode打包ipa的步骤
  14. 爬虫 requests User-Agent池 FakeUserAgent URL传参
  15. 组合导航GPS+IMU
  16. mysql提现_MYSQL事务教程之Yii2.0商户提现功能
  17. airbnb北京民宿运营情况分析
  18. 计算机防火墙无法关闭,为什么我电脑的防火墙关不了(win7电脑防火墙怎么关)
  19. 在UE4里实现四叉树查找最近点
  20. 从软件工程师到IT猎头:我的一点经历和感触 (转)

热门文章

  1. Linux重启服务器设置程序自启;
  2. Cesium快速上手1-CesiumWidget-Scene结构
  3. 牛X素材推荐之StackOverView
  4. 专家解析跑步危害概率 过量运动同样对心脏不利
  5. 什么是单点登录?什么是SSO?什么是CAS?
  6. Xcode 5免证书真机调试
  7. Python - 字符串编解码
  8. 使用函数来处理BMI指数
  9. JavaScript阻止控制台输出信息
  10. C#之四十八 俄罗斯方块设计