SpringCloudGateway整合knife4j在線api文檔

SpringCloudGateway整合knife4j在線api文檔

整合官網: (點擊打開)

1.User用戶微服改造

1.1 添加依賴

	<!--knife4j-micro-包含swagger2依賴-->
        <dependency>
            <groupId>com.github.xiaoymin</groupId>
            <artifactId>knife4j-micro-spring-boot-starter</artifactId>
            <version>2.0.2</version>
        </dependency>

1.2 編寫Swagger2Config


@Configuration
@EnableSwagger2
@EnableKnife4j
public class Swagger2Config {
    
	/**
     * 創建RestApi 幷包掃描controller
     * @return
     */
    @Bean
    public Docket createRestApi() {
        return new Docket(DocumentationType.SWAGGER_2).apiInfo(apiInfo())
                .select()
                .apis(RequestHandlerSelectors.any())// 對所有api進行監控
                .paths(PathSelectors.any())
            	 //不顯示錯誤的接口地址
                .paths(Predicates.not(PathSelectors.regex("/error.*")))//錯誤路徑不監控
                .build();
    }
    
	/**
     * 創建Swagger頁面 信息
     * @return
     */
    private ApiInfo apiInfo() {
        return new ApiInfoBuilder().title("用戶微服")
                .description("用戶微服")
                .version("1.0.0-SNAPSHOT")
                .build();
    }
}

1.3 application配置文件加上,開啓生產環境不啓用文檔

#生產環境,屏蔽文檔接口(默認false)
knife4j.production=${knife4j}

1.4 接口註解編寫

@RestController
@Api(tags = "用戶管理",value = "獲取用戶信息")
public class WebController {
	
	@Autowired
	private OrderFeignService orderFeignService;

	@ApiOperation(value = "用戶查詢", notes = "獲取測試",response = String.class)
	@ApiImplicitParams({@ApiImplicitParam(name = "name", value = "用戶名", dataType = "STRING", paramType = "QUERY", defaultValue = "lilei",required = true)})
	@GetMapping(value = "/hi")
	public String hi(String name){
		String id = orderFeignService.findId(name);
		return id;
	}

	@ApiOperation(value = "MemberVip查詢", notes = "獲取MemberVip測試",response = MemberVip.class)
	@GetMapping(value = "/hello")
	public MemberVip hello(){
		MemberVip memberVip = new MemberVip();
		memberVip.setId("123456");
		memberVip.setMemberId("654321");
		memberVip.setUsedNubmer(888);
		memberVip.setLimitNumber(666);
		memberVip.setExpiredNumber(999);
		memberVip.setVipLevel(100);
		return memberVip;
	}
}

1.5 實體類註解編寫

public class MemberVip implements Serializable {

    private static final long serialVersionUID=1L;

    @ApiModelProperty(value = "主鍵")
    private String id;

    @ApiModelProperty(value = "用戶ID")
    private String memberId;
    ......
 }

2. spring-cloud-starter-gateway網關整合所有微服api

2.1 添加依賴

	<!--knife4j依賴-->
		<dependency>
			<groupId>com.github.xiaoymin</groupId>
			<artifactId>knife4j-spring-boot-starter</artifactId>
			<version>2.0.2</version>
		</dependency>

2.2編寫配置類

@Configuration
@Primary  //代表是Swagger主 配置
public class DocumentationConfig implements SwaggerResourcesProvider {

    public static final String API_URI = "v2/api-docs";
    private final RouteLocator routeLocator;
    private final GatewayProperties gatewayProperties;

    public DocumentationConfig(RouteLocator routeLocator, GatewayProperties gatewayProperties) {
        this.routeLocator = routeLocator;
        this.gatewayProperties = gatewayProperties;
    }

    @Override
    public 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("**", API_URI))));
        });
        return resources;
    }

    private SwaggerResource swaggerResource(String name, String location) {
        SwaggerResource swaggerResource = new SwaggerResource();
        swaggerResource.setName(name);
        swaggerResource.setLocation(location);
        swaggerResource.setSwaggerVersion("1.0");
        return swaggerResource;
    }
}

2.3 編寫SwaggerHandler獲取api接口信息

/**
 * 獲取api接口信息
 */
@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).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() {
        Mono<ResponseEntity> just = Mono.just((new ResponseEntity<>(swaggerResources.get(), HttpStatus.OK)));
        return just;
    }
}

2.4 啓動配置

最後,項目啓動類添加相關注解,代碼如下:

@SpringBootApplication
@EnableEurekaClient
@EnableDiscoveryClient

注意點

在集成Spring Cloud Gateway網關的時候,會出現沒有basePath的情況(即定義的例如/user、/order等微服務的前綴),這個情況在使用zuul網關的時候不會出現此問題,因此,在Gateway網關需要添加一個Filter實體Bean

解決看官網。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章