springcloud网关聚合swagger2的方法示例

  

  

在搭建分布式应用时,每个应用通过纳科在网关出装配了路由,我们希望网关也可以将所有的应用的轻便界面聚合起来。这样前端开发的时候只需要访问网关的狂妄就可以,而不用访问每个应用的狂妄。

  

  

springcloud +网关+纳科+大摇大摆

  

  

大摇大摆页面是一个单页面应用,所有的显示的数据都是通过和springfox.documentation.swagger.web。ApiResponseController进行数据交互,首先通过/swagger-resources获取大摇大摆资源信息,获取的信息格式如下:[{名称:“默认”,url:“/v2/api文档”,swaggerVersion:“2.0”,地点:“/v2/api文档”}],其中名字代表大摇大摆生成的接口组的组名,如图所示:

  

 springcloud网关聚合swagger2的方法示例

url   

代表大摇大摆接口组的详细信息可以通过localhost: 8081/v2/api文档来获取,如下图:

  

 springcloud网关聚合swagger2的方法示例“> <br/>
  </p>
  <p>在网关处,如果访问/swagger-resources能够获取到所有应用的大摇大摆的资源信息,那么我们的问题就可以解决了,所以我们需要做的是修改/swagger-resources接口的处理方式,使得这个接口能够按照我们的需求返回大摇大摆资源。</p>
  <p> </p>
  <p>我们首先在网关处引入大摇大摆的相关依赖,然后实现一个获取其他应用的轻便资源的组件:</p>
  
  <pre类=/* *   *聚合各个服务的大摇大摆接口   *   * @author ksyzz   * @since & lt; pre> 2019/04/09</pre>   */@ component   公共类MySwaggerResourceProvider实现SwaggerResourcesProvider {/* *   * swagger2默认的url后缀   */私有静态最终字符串SWAGGER2URL="/v2/api文档”;/* *   *网关路由   */私人最终RouteLocator RouteLocator;/* *   *网关应用名称   */@ value (" $ {spring.application.name} ")   私人弦自我;      @ autowired   公共MySwaggerResourceProvider (RouteLocator RouteLocator) {   这一点。routeLocator=routeLocator;   }      @Override   公共Listget () {   List资源=new ArrayList<在();   List,routeHosts=new ArrayList<的在();//由于我的网关采用的是负载均衡的方式,因此我需要拿到所有应用的serviceId//获取所有可用的主持人:serviceId   routeLocator.getRoutes ()。过滤器(路线→.getHost route.getUri () () !=null)   .filter(默认路由环境;.getHost ! self.equals (route.getUri () ()))   .subscribe(默认路由环境;.getHost routeHosts.add (route.getUri () ()));//记录已经添加过的服务器,存在同一个应用注册了多个服务在纳科上   Set,论述=new HashSet<的在();   routeHosts。forEach(默认实例环境;{//拼接url,样式为/serviceId/v2/api-info,当网关调用这个接口时,会自动通过负载均衡寻找对应的主机   字符串url=" +实例+ SWAGGER2URL;   如果(! dealed.contains (url)) {   dealed.add (url);   SwaggerResource SwaggerResource=new SwaggerResource ();   swaggerResource.setUrl (url);   swaggerResource.setName(实例);   resources.add (swaggerResource);   }   });   返回资源;   }   }      

然后定义一个接口类:

     /* *   *大摇大摆聚合接口,三个接口都是swagger-ui.html需要访问的接口   *   * @author ksyzz   * @since & lt; pre> 2019/04/09</pre>   */@RestController   @RequestMapping ("/swagger-resources”)   公开课SwaggerResourceController {   私人MySwaggerResourceProvider swaggerResourceProvider;      @ autowired   公共SwaggerResourceController (MySwaggerResourceProvider swaggerResourceProvider) {   这一点。swaggerResourceProvider=swaggerResourceProvider;   }      @RequestMapping (value=" https://www.yisu.com/configuration/security ")   公共ResponseEntitysecurityConfiguration () {   返回新ResponseEntity<祝辞(SecurityConfigurationBuilder.builder () .build (), HttpStatus.OK);   }      @RequestMapping (value=" https://www.yisu.com/configuration/ui ")   公共ResponseEntityuiConfiguration () {   返回新ResponseEntity<祝辞(UiConfigurationBuilder.builder () .build (), HttpStatus.OK);   }      @RequestMapping   公共ResponseEntity比;swaggerResources () {   返回新ResponseEntity<祝辞(swaggerResourceProvider.get (), HttpStatus.OK);   }   }

springcloud网关聚合swagger2的方法示例