eureka+gateWay+SwaggerUI

环境

环境
<java.version>1.8</java.version>
<spring-cloud.version>Greenwich.SR1</spring-cloud.version>
<spring-boot.version>2.1.3.RELEASE</spring-boot.version>
<dependency>
   <groupId>org.springframework.cloud</groupId>
   <artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>

swaggerui版本
<!--添加Swagger依赖 -->
 <dependency>
       <groupId>io.springfox</groupId>
       <artifactId>springfox-swagger2</artifactId>
       <version>2.9.2</version>
 </dependency>
 <!--添加Swagger-UI依赖 -->
 <dependency>
 <groupId>io.springfox</groupId>
 <artifactId>springfox-swagger-ui</artifactId>
 <version>2.9.2</version>
 </dependency>

需要在网关gateway上配置三个文件:

1.SwaggerProvider

配置SwaggerProvider,获取Api-doc,即SwaggerResources

package com.othp.gateway.config;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.gateway.config.GatewayProperties;
import org.springframework.cloud.gateway.route.RouteLocator;
import org.springframework.cloud.gateway.support.NameUtils;
import org.springframework.context.annotation.Primary;
import org.springframework.stereotype.Component;
import lombok.AllArgsConstructor;
import springfox.documentation.swagger.web.SwaggerResource;
import springfox.documentation.swagger.web.SwaggerResourcesProvider;

/** 
* gateway 整合swaager
*/
@Component
@Primary
@AllArgsConstructor
public class SwaggerProvider implements SwaggerResourcesProvider {
	
	public static final String API_URI = "/v2/api-docs";
    public static final String PATH = "Path";
    private final RouteLocator routeLocator;
    private final GatewayProperties gatewayProperties;

    @Override
    public List<SwaggerResource> get() {
        List<SwaggerResource> resources = new ArrayList<>();
        List<String> routes = new ArrayList<>();
        //取出gateway的route
        routeLocator.getRoutes().subscribe(route -> routes.add(route.getId()));
        //结合配置的route-路径(Path),和route过滤,只获取有效的route节点
        gatewayProperties.getRoutes().stream().filter(routeDefinition -> routes.contains(routeDefinition.getId()))
                .forEach(routeDefinition -> routeDefinition.getPredicates().stream()
                        .filter(predicateDefinition -> (PATH).equalsIgnoreCase(predicateDefinition.getName()))
                        .forEach(predicateDefinition -> {
                        	String name = routeDefinition.getId();
                        	String location = predicateDefinition.getArgs().get(NameUtils.GENERATED_NAME_PREFIX + "0").replace("/**", API_URI);
                        	resources.add(swaggerResource(name,location));
                        }));
          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;
    }
    
    
}

2.SwaggerHeaderFilter

路由为admin/test/{a}/{b},在swagger会显示为test/{a}/{b},缺少了admin这个路由节点。断点源码时发现在Swagger中会根据X-Forwarded-Prefix这个Header来获取BasePath,将它添加至接口路径与host中间,这样才能正常做接口测试,而Gateway在做转发的时候并没有这个Header添加进Request,所以发生接口调试的404错误。解决思路是在Gateway里加一个过滤器来添加这个header。

package com.othp.gateway.filter;

import org.apache.commons.lang.StringUtils;
import org.springframework.cloud.gateway.filter.GatewayFilter;
import org.springframework.cloud.gateway.filter.factory.GatewayFilterFactory;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import com.othp.gateway.config.SwaggerProvider;

@Component
public class SwaggerHeaderFilter implements GatewayFilterFactory  {
	
	 private static final String HEADER_NAME = "X-Forwarded-Prefix";

	    @Override
	    public GatewayFilter apply(Object config) {
	        return (exchange, chain) -> {
	            ServerHttpRequest request = exchange.getRequest();
	            String path = request.getURI().getPath();

	            if (!StringUtils.endsWithIgnoreCase(path, SwaggerProvider.API_URI)) {
	                return chain.filter(exchange);
	            }

	            String basePath = path.substring(0, path.lastIndexOf(SwaggerProvider.API_URI));
	            ServerHttpRequest newRequest = request.mutate().header(HEADER_NAME, basePath).build();
	            ServerWebExchange newExchange = exchange.mutate().request(newRequest).build();
	            return chain.filter(newExchange);
	        };
	    }
}

3.SwaggerHandler

因为Gateway里没有配置SwaggerConfig,而运行Swagger-ui又需要依赖一些接口,所以我的想法是自己建立相应的swagger-resource端点。

package com.othp.gateway.handler;

import java.util.Optional;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import reactor.core.publisher.Mono;
import springfox.documentation.swagger.web.SecurityConfiguration;
import springfox.documentation.swagger.web.SecurityConfigurationBuilder;
import springfox.documentation.swagger.web.SwaggerResourcesProvider;
import springfox.documentation.swagger.web.UiConfiguration;
import springfox.documentation.swagger.web.UiConfigurationBuilder;

@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<ResponseEntity<SecurityConfiguration>> securityConfiguration() {
        return Mono.just(new ResponseEntity<>(
                Optional
                        .ofNullable(securityConfiguration)
                        //SecurityConfigurationBuilder需要高版本swaggerui(2.7.0不行,现使用2.9.2版本)
                        .orElse(SecurityConfigurationBuilder.builder().build()), HttpStatus.OK));
    }

    @GetMapping("/configuration/ui")
    public Mono<ResponseEntity<UiConfiguration>> uiConfiguration() {
        return Mono.just(new ResponseEntity<>(
                Optional
                        .ofNullable(uiConfiguration)
                        .orElse(UiConfigurationBuilder.builder().build()), HttpStatus.OK));
    }

    @GetMapping("")
    public Mono<ResponseEntity> swaggerResources() {
        return Mono.just((new ResponseEntity<>(swaggerResources.get(), HttpStatus.OK)));
    }

}

4.gateway的配置文件

#服务端口
server:
  port: 8763
  servlet:
   context-path: /gateWayServer
  
eureka:
  client:
    service-url:
      defaultZone: http://administrator:123456@10.0.199.19:8761/eurekaServer/eureka/
  instance:
    prefer-ip-address: true
    instance-id: ${spring.cloud.client.ip-address}:${spring.application.name}:${server.port}
    
spring:
  cloud:
    gateway:
      discovery:
        locator:
          enabled: true  
      routes: 
       
      - id: othp-mine-route
        #指向的服务(即applicationName)
        uri: lb://othp-mine
        predicates:
        #path中需要写成各个服务的上下文,不然swaggerui的跳转出现问题
        #匹配拦截的条件
        - Path=/mineServer/**
        filters:
        #不替换
        - StripPrefix=0
        
      - id: othp-manage-route
        uri: lb://othp-manage
        predicates:
        - Path=/manageServer/**
        filters:
        - StripPrefix=0
        
      - id: othp-order-route
        uri: lb://othp-order
        predicates:
        - Path=/orderServer/**
        filters:
        - StripPrefix=0
        

5.单服务配置waggerui查看

SpringBoot+Swagger2 地址:
https://blog.csdn.net/qq_35761348/article/details/106814499

6.查看

gatewayIp:port/swagger-ui.html

7.如果是配合oauth2的需要在oauth2配置过滤

@Configuration
@EnableResourceServer
public class ResourceServerConfig extends ResourceServerConfigurerAdapter {

    @Override
    public void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
            .antMatchers(
                    "/webjars/**",
                    "/resources/**",
                    "/swagger-ui.html",
                    "/swagger-resources/**",
                    "/v2/api-docs")
            .permitAll();
    }
}
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值