javascript
sentinel 官方文档_SpringCloud网关聚合Swagger接口文档实践
目前大多數(shù)項(xiàng)目都是以微服務(wù)架構(gòu)設(shè)計(jì),以前后端分離技術(shù)解耦前端開(kāi)發(fā)工程師和后端開(kāi)發(fā)工程師的工作量,這樣一來(lái)前后端的對(duì)接將是一項(xiàng)重要的溝通工作量,如果后端沒(méi)有一個(gè)合適的API文檔,那么這樣的前后端對(duì)接將是一項(xiàng)繁瑣的工作。
大多數(shù)情況下,開(kāi)發(fā)人員可能會(huì)使用在線文檔工具或者離線文檔來(lái)描述接口的一些信息。離線文檔存在最大的缺點(diǎn)就是當(dāng)接口發(fā)生變化后,需要對(duì)接口文檔進(jìn)行更新,無(wú)形中增加了開(kāi)發(fā)人員的工作量。如果接口文檔更新不及時(shí),那么在前后端對(duì)接的過(guò)程中將會(huì)產(chǎn)生誤差,這樣將會(huì)大大增加前后端對(duì)接的溝通成本。
目前后端開(kāi)發(fā)中應(yīng)用到最多的可能是在線文檔生成工具,例如:swagger。當(dāng)我們的后端接口源代碼發(fā)生變更或者重構(gòu)后能夠及時(shí)的生成接口文檔。方便前端開(kāi)發(fā)人員進(jìn)行對(duì)接,減少了后端開(kāi)發(fā)人員編寫(xiě)接口文檔的工作量,同時(shí)也節(jié)省了前后端對(duì)接過(guò)程中溝通成本。
Swagger在線文檔生成工具整合到后端框架中也是比較簡(jiǎn)單的,本文將以SpringCloud的微服務(wù)架構(gòu)演示如何將swagger整合到網(wǎng)關(guān)服務(wù)中。下面詳細(xì)介紹下整合的詳細(xì)過(guò)程:
swagger官方文檔:
https://swagger.io/docs/
分別新建三個(gè)微服務(wù)其中具體功能如下:
一,在pom.xml中引入swagger的依賴(lài):
io.springfoxspringfox-swagger22.9.2io.springfoxspringfox-swagger-ui2.9.2二,分別在兩個(gè)微服務(wù)nacos-microservice-user和nacos-microservice-order配置swagger:
@Configuration@EnableSwagger2public class Swagger2Config { @Value("${swagger.enable:true}") private boolean enableSwagger; @Bean public Docket createRestApi() { return new Docket(DocumentationType.SWAGGER_2).apiInfo(apiInfo()).enable(enableSwagger).select() .apis(RequestHandlerSelectors.basePackage("com.spring.cloud.alibaba.controller")).paths(PathSelectors.any()) .build(); } private ApiInfo apiInfo() { return new ApiInfoBuilder().title("SprintBoot Swagger2 build API docs") .description("Spring Boot Swagger2 Restful API").contact(new Contact("xiaobaoqiang", "https://github.com/bq-xiao", "xiaobaoqiang@163.com")) .version("1.0").build(); }}三,在網(wǎng)關(guān)服務(wù)中新建SwaggerProvider類(lèi)實(shí)現(xiàn)SwaggerResourcesProvider接口:
@Primary@Component@Slf4j@AllArgsConstructorpublic class SwaggerProvider implements SwaggerResourcesProvider { public static final String API_URI = "/v2/api-docs"; private final RouteLocator routeLocator; private final GatewayProperties gatewayProperties; @Override public List get() { List resources = new ArrayList<>(); List routes = new ArrayList<>(); //取出gateway的route routeLocator.getRoutes().subscribe(route -> routes.add(route.getId())); //結(jié)合配置的route-路徑(Path),和route過(guò)濾,只獲取有效的route節(jié)點(diǎn) gatewayProperties.getRoutes().stream().filter(routeDefinition -> routes.contains(routeDefinition.getId())) .forEach(routeDefinition -> routeDefinition.getPredicates().stream() .filter(predicateDefinition -> ("Path").equalsIgnoreCase(predicateDefinition.getName())) .forEach(predicateDefinition -> resources.add(swaggerResource(routeDefinition.getId(), predicateDefinition.getArgs().get(NameUtils.GENERATED_NAME_PREFIX + "0") .replace("/**", API_URI))))); return resources; } private SwaggerResource swaggerResource(String name, String location) { SwaggerResource swaggerResource = new SwaggerResource(); swaggerResource.setName(name); swaggerResource.setLocation(location); swaggerResource.setSwaggerVersion("2.0"); return swaggerResource; }}四,在網(wǎng)關(guān)服務(wù)中新建SwaggerHandler類(lèi):
@RestController@RequestMapping("/swagger-resources")public class SwaggerHandler { @Autowired(required = false) private SecurityConfiguration securityConfiguration; @Autowired(required = false) private UiConfiguration uiConfiguration; private final SwaggerResourcesProvider swaggerResources; @Autowired public SwaggerHandler(SwaggerResourcesProvider swaggerResources) { this.swaggerResources = swaggerResources; } @GetMapping("/configuration/security") public Mono> securityConfiguration() { return Mono.just(new ResponseEntity<>( Optional.ofNullable(securityConfiguration).orElse(SecurityConfigurationBuilder.builder().build()), HttpStatus.OK)); } @GetMapping("/configuration/ui") public Mono> uiConfiguration() { return Mono.just(new ResponseEntity<>( Optional.ofNullable(uiConfiguration).orElse(UiConfigurationBuilder.builder().build()), HttpStatus.OK)); } @GetMapping("") public Mono swaggerResources() { return Mono.just((new ResponseEntity<>(swaggerResources.get(), HttpStatus.OK))); }}五,SpringCloud后端微服務(wù)路由application.yml配置如下:
spring: application: name: sentinel-cloud-gateway cloud: sentinel: transport: dashboard: localhost:8090 eager: true enabled: true nacos: discovery: server-addr: localhost:8848 gateway: enabled: true discovery: locator: lower-case-service-id: true routes: - id: nacos-microservice-order uri: lb://nacos-microservice-order predicates: - Path=/order/** filters: - StripPrefix=1 #從前面截取一個(gè),實(shí)際上就是截取url - id: nacos-microservice-user uri: lb://nacos-microservice-user predicates: - Path=/user/** filters: - StripPrefix=1 #從前面截取一個(gè),實(shí)際上就是截取urlStripPrefix:從前面截取一個(gè),實(shí)際上就是截取url,不然從網(wǎng)關(guān)訪問(wèn)聚合swagger會(huì)報(bào)404錯(cuò)誤信息。
六,驗(yàn)證
分別啟動(dòng)SpringCloud后端的兩個(gè)微服務(wù)nacos-microservice-order和nacos-microservice-user,分別訪問(wèn)單個(gè)微服務(wù)的swagger接口文檔
驗(yàn)證結(jié)果
然后啟動(dòng)sentinel-cloud-gateway網(wǎng)關(guān)服務(wù):
驗(yàn)證結(jié)果
可以看到,在微服務(wù)的網(wǎng)關(guān)服務(wù)中聚合了swagger接口文檔,當(dāng)后端某個(gè)微服務(wù)代碼發(fā)生變更或者代碼重構(gòu)后,swagger接口文檔就會(huì)實(shí)時(shí)更新,而且方便測(cè)試后端的微服務(wù)接口。
不積跬步,無(wú)以至千里;不積小流,無(wú)以成江海!
總結(jié)
以上是生活随笔為你收集整理的sentinel 官方文档_SpringCloud网关聚合Swagger接口文档实践的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 如何正确地做面条?
- 下一篇: python爬去百度搜索结果_pytho