单一的微服务集成swagger:

maven:

  1. <dependency>
  2. <groupId>io.springfox</groupId>
  3. <artifactId>springfox-swagger2</artifactId>
           <version>2.9.2</version>    
  4. </dependency>
  5. <dependency>
  6. <groupId>io.springfox</groupId>
  7. <artifactId>springfox-swagger-ui</artifactId>
           <version>2.9.2</version>
  8. </dependency>
  1. package fwz.cpjiang.ums.utils;
  2.  
  3. import org.springframework.context.annotation.Bean;
  4. import org.springframework.context.annotation.Configuration;
  5. import springfox.documentation.builders.ApiInfoBuilder;
  6. import springfox.documentation.builders.ParameterBuilder;
  7. import springfox.documentation.builders.PathSelectors;
  8. import springfox.documentation.builders.RequestHandlerSelectors;
  9. import springfox.documentation.schema.ModelRef;
  10. import springfox.documentation.service.ApiInfo;
  11. import springfox.documentation.service.Parameter;
  12. import springfox.documentation.spi.DocumentationType;
  13. import springfox.documentation.spring.web.plugins.Docket;
  14. import springfox.documentation.swagger2.annotations.EnableSwagger2;
  15.  
  16. import java.util.ArrayList;
  17. import java.util.List;
  18.  
  19. @Configuration
  20. @EnableSwagger2
  21. public class SwaggerConfig {
  22.  
  23. @Bean
  24. public Docket createRestApi(){
  25. ParameterBuilder tokenPar = new ParameterBuilder();
  26.  
  27. List<Parameter> pars = new ArrayList<Parameter>();
  28. tokenPar.name("token").description("令牌").modelRef(new ModelRef("string")).parameterType("header").required(false).build();
  29. pars.add(tokenPar.build());
  30. return new Docket(DocumentationType.SWAGGER_2).apiInfo(apiInfo())
  31. .select()
  32. .apis(RequestHandlerSelectors.any())
  33. .paths(PathSelectors.any()).build().globalOperationParameters(pars);
  34. }
  35.  
  36. private ApiInfo apiInfo(){
  37. return new ApiInfoBuilder()
  38. .title("用户管理 API Doc")
  39. .description("This is a restful api document of 用户管理.")
  40. .version("1.0")
  41. .build();
  42. }
  43.  
  44. }

此时swagger只是存在于单一的微服务,很不方便

gateway整合swagger:

所有的微服务均按上述配置swagger

然后在gateway微服务中,添加如下配置:

  1. package fwz.cpjiang.gateway.utils;
  2.  
  3. import org.springframework.context.annotation.Bean;
  4. import org.springframework.context.annotation.Configuration;
  5. import springfox.documentation.swagger.web.SecurityConfiguration;
  6. import springfox.documentation.swagger.web.SecurityConfigurationBuilder;
  7. import springfox.documentation.swagger.web.UiConfiguration;
  8. import springfox.documentation.swagger.web.UiConfigurationBuilder;
  9.  
  10. @Configuration
  11. public class SwaggerConfig {
  12.  
  13. @Bean
  14. public SecurityConfiguration securityConfiguration() {
  15. return SecurityConfigurationBuilder.builder().build();
  16. }
  17.  
  18. @Bean
  19. public UiConfiguration uiConfiguration() {
  20. return UiConfigurationBuilder.builder().build();
  21. }
  22.  
  23. }
  1. package fwz.cpjiang.gateway.utils;
  2.  
  3. import org.springframework.beans.factory.annotation.Autowired;
  4. import org.springframework.http.HttpStatus;
  5. import org.springframework.http.ResponseEntity;
  6. import org.springframework.web.bind.annotation.GetMapping;
  7. import org.springframework.web.bind.annotation.RequestMapping;
  8. import org.springframework.web.bind.annotation.RestController;
  9. import reactor.core.publisher.Mono;
  10. import springfox.documentation.swagger.web.*;
  11.  
  12. import java.util.List;
  13. import java.util.Optional;
  14.  
  15. @RestController
  16. @RequestMapping("/swagger-resources")
  17. public class SwaggerHandler {
  18.  
  19. private final SecurityConfiguration securityConfiguration;
  20. private final UiConfiguration uiConfiguration;
  21. private final SwaggerResourcesProvider swaggerResources;
  22.  
  23. @Autowired
  24. public SwaggerHandler(SwaggerResourcesProvider swaggerResources, SecurityConfiguration securityConfiguration, UiConfiguration uiConfiguration) {
  25. this.swaggerResources = swaggerResources;
  26. this.securityConfiguration = securityConfiguration;
  27. this.uiConfiguration = uiConfiguration;
  28. }
  29.  
  30. @GetMapping("/configuration/security")
  31. public Mono<ResponseEntity<SecurityConfiguration>> securityConfiguration() {
  32. return Mono.just(new ResponseEntity<>(
  33. Optional.ofNullable(securityConfiguration).orElse(SecurityConfigurationBuilder.builder().build()),
  34. HttpStatus.OK));
  35. }
  36.  
  37. @GetMapping("/configuration/ui")
  38. public Mono<ResponseEntity<UiConfiguration>> uiConfiguration() {
  39. return Mono.just(new ResponseEntity<>(
  40. Optional.ofNullable(uiConfiguration).orElse(UiConfigurationBuilder.builder().build()), HttpStatus.OK));
  41. }
  42.  
  43. @GetMapping
  44. public Mono<ResponseEntity<List<SwaggerResource>>> swaggerResources() {
  45. return Mono.just((new ResponseEntity<>(swaggerResources.get(), HttpStatus.OK)));
  46. }
  47.  
  48. }
  1. package fwz.cpjiang.gateway.utils;
  2.  
  3. import lombok.AllArgsConstructor;
  4. import org.springframework.cloud.gateway.config.GatewayProperties;
  5. import org.springframework.cloud.gateway.route.RouteLocator;
  6. import org.springframework.cloud.gateway.support.NameUtils;
  7. import org.springframework.context.annotation.Primary;
  8. import org.springframework.stereotype.Component;
  9. import springfox.documentation.swagger.web.SwaggerResource;
  10. import springfox.documentation.swagger.web.SwaggerResourcesProvider;
  11.  
  12. import java.util.ArrayList;
  13. import java.util.List;
  14.  
  15. @Primary
  16. @Component
  17. @AllArgsConstructor
  18. public class SwaggerProvider implements SwaggerResourcesProvider {
  19.  
  20. public static final String API_URI = "/v2/api-docs";
  21. private final RouteLocator routeLocator;
  22. private final GatewayProperties gatewayProperties;
  23.  
  24. @Override
  25. public List<SwaggerResource> get() {
  26. List<SwaggerResource> resources = new ArrayList<>();
  27. List<String> routes = new ArrayList<>();
  28. routeLocator.getRoutes().subscribe(route -> routes.add(route.getId()));
  29. gatewayProperties.getRoutes().stream()
  30. .filter(routeDefinition -> routes.contains(routeDefinition.getId()))
  31. .forEach(routeDefinition -> routeDefinition.getPredicates().stream()
  32. .filter(predicateDefinition -> ("Path").equalsIgnoreCase(predicateDefinition.getName()))
  33. .forEach(predicateDefinition -> resources
  34. .add(swaggerResource(routeDefinition.getId(), predicateDefinition.getArgs()
  35. .get(NameUtils.GENERATED_NAME_PREFIX + "0").replace("/**", API_URI)))));
  36. return resources;
  37. }
  38.  
  39. private SwaggerResource swaggerResource(String name, String url) {
  40. SwaggerResource swaggerResource = new SwaggerResource();
  41. swaggerResource.setName(name);
  42. swaggerResource.setUrl(url);
  43. swaggerResource.setSwaggerVersion("2.0");
  44. return swaggerResource;
  45. }
  46. }
  1. package fwz.cpjiang.gateway.utils;
  2.  
  3. import org.springframework.boot.context.properties.ConfigurationProperties;
  4. import org.springframework.context.annotation.Configuration;
  5.  
  6. import java.util.List;
  7.  
  8. @Configuration
  9. @ConfigurationProperties(prefix = "system")
  10. public class UrlConfig {
  11. // 配置文件使用list接收
  12. private List<String> whiteList;
  13.  
  14. public List<String> getWhiteList() {
  15. return whiteList;
  16. }
  17. public void setWhiteList(List<String> whiteList) {
  18. this.whiteList = whiteList;
  19. }
  20. }

yml配置文件:

  1. system:
  2. whiteList:
  3. - "/swagger-ui.html"
  4. - "/swagger-resources/**"
  5. - "/v2/api-docs"
  6. - "/admin/login"
  1. routes:
    - id: hbistc-ums
    uri: lb://hbistc-ums
    predicates:
    - Path=/ums/**
    filters:
    - StripPrefix=1
    - id: hbistc-mall
    uri: lb://hbistc-mall
    predicates:
    - Path=/mall/**
    filters:
    - StripPrefix=1
  1. package fwz.cpjiang.gateway.utils;
  2.  
  3. import io.jsonwebtoken.Claims;
  4. import io.jsonwebtoken.JwtBuilder;
  5. import io.jsonwebtoken.Jwts;
  6. import io.jsonwebtoken.SignatureAlgorithm;
  7.  
  8. import javax.crypto.SecretKey;
  9. import javax.crypto.spec.SecretKeySpec;
  10. import java.util.Base64;
  11. import java.util.Date;
  12. import java.util.UUID;
  13.  
  14. /**
  15. * JWT工具类
  16. */
  17. public class JwtUtils {
  18.  
  19. //有效期为
  20. public static final Long JWT_TTL = 3600000L;// 60 * 60 *1000 一个小时
  21. //设置秘钥明文
  22. public static final String JWT_KEY = "joijgisdlwejjjfeawoGdeizeffsaz";
  23.  
  24. /**
  25. * 创建token
  26. *
  27. * @param id
  28. * @param subject
  29. * @param ttlMillis
  30. * @return
  31. */
  32. public static String createJWT(String id, String subject, Long ttlMillis) {
  33.  
  34. SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256;
  35. long nowMillis = System.currentTimeMillis();
  36. Date now = new Date(nowMillis);
  37. if (ttlMillis == null) {
  38. ttlMillis = JwtUtils.JWT_TTL;
  39. }
  40. long expMillis = nowMillis + ttlMillis;
  41. Date expDate = new Date(expMillis);
  42. SecretKey secretKey = generalKey();
  43.  
  44. JwtBuilder builder = Jwts.builder()
  45. .setId(id) //唯一的ID
  46. .setSubject(subject) // 主题 可以是JSON数据
  47. .setIssuer("admin") // 签发者
  48. .setIssuedAt(now) // 签发时间
  49. .signWith(signatureAlgorithm, secretKey) //使用HS256对称加密算法签名, 第二个参数为秘钥
  50. .setExpiration(expDate);// 设置过期时间
  51. return builder.compact();
  52. }
  53.  
  54. /**
  55. * 生成加密后的秘钥 secretKey
  56. *
  57. * @return
  58. */
  59. public static SecretKey generalKey() {
  60. byte[] encodedKey = Base64.getDecoder().decode(JwtUtils.JWT_KEY);
  61. SecretKey key = new SecretKeySpec(encodedKey, 0, encodedKey.length, "AES");
  62. return key;
  63. }
  64.  
  65. /**
  66. * 解析
  67. *
  68. * @param jwt
  69. * @return
  70. * @throws Exception
  71. */
  72. public static Claims parseJWT(String jwt) throws Exception {
  73. SecretKey secretKey = generalKey();
  74. return Jwts.parser()
  75. .setSigningKey(secretKey)
  76. .parseClaimsJws(jwt)
  77. .getBody();
  78.  
  79. }
  80.  
  81. public static void main(String[] args) throws Exception {
  82. String token = createJWT(UUID.randomUUID().toString(), "ggggggg", null);
  83. System.out.println(token);
  84. Claims c = parseJWT(token);
  85. String id = c.getId();
  86. System.out.println(id);
  87. }
  88. }
  1. package fwz.cpjiang.gateway.filter;
  2.  
  3. import cn.hutool.core.util.StrUtil;
  4. import com.fasterxml.jackson.core.JsonProcessingException;
  5. import com.fasterxml.jackson.databind.ObjectMapper;
  6. import fwz.cpjiang.gateway.utils.JwtUtils;
  7. import fwz.cpjiang.gateway.utils.UrlConfig;
  8. import org.springframework.beans.factory.annotation.Autowired;
  9. import org.springframework.cloud.gateway.filter.GatewayFilterChain;
  10. import org.springframework.cloud.gateway.filter.GlobalFilter;
  11. import org.springframework.core.Ordered;
  12. import org.springframework.http.HttpHeaders;
  13. import org.springframework.http.HttpStatus;
  14. import org.springframework.http.server.reactive.ServerHttpRequest;
  15. import org.springframework.http.server.reactive.ServerHttpResponse;
  16. import org.springframework.stereotype.Component;
  17. import org.springframework.web.server.ServerWebExchange;
  18. import reactor.core.publisher.Flux;
  19. import reactor.core.publisher.Mono;
  20. import reactor.netty.ByteBufFlux;
  21.  
  22. import java.util.HashMap;
  23. import java.util.Map;
  24.  
  25. /**
  26. * 鉴权过滤器 验证token
  27. */
  28.  
  29. @Component
  30. public class AuthorizeFilter implements GlobalFilter, Ordered {
  31. private static final String AUTHORIZE_TOKEN = "token";
  32. @Autowired
  33. private UrlConfig urlConfig;
  34. @Override
  35. public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
  36. //1. 获取请求
  37. ServerHttpRequest request = exchange.getRequest();
  38. //2. 则获取响应
  39. ServerHttpResponse response = exchange.getResponse();
  40. //3. 如果是登录请求则放行
  41. for (int i = 0; i <urlConfig.getWhiteList().size() ; i++) {
  42. if (request.getURI().getPath().contains(urlConfig.getWhiteList().get(i))) {
  43. return chain.filter(exchange);
  44. }
  45. }
  46.  
  47. //4. 获取请求头
  48. HttpHeaders headers = request.getHeaders();
  49. //5. 请求头中获取令牌
  50. String token = headers.getFirst(AUTHORIZE_TOKEN);
  51.  
  52. //6. 判断请求头中是否有令牌
  53. if (StrUtil.isEmpty(token)) {
  54. //7. 响应中放入返回的状态吗, 没有权限访问
  55. response.setStatusCode(HttpStatus.UNAUTHORIZED);
  56. //8. 返回
  57. //return response.setComplete();
  58. //设置响应头信息Content-Type类型
  59. response.getHeaders().add("Content-Type","application/json");
  60. //设置返回json数据
  61. return response.writeAndFlushWith(Flux.just(ByteBufFlux.just(response.bufferFactory().wrap(getWrapData()))));
  62.  
  63. }
  64.  
  65. //9. 如果请求头中有令牌则解析令牌
  66. try {
  67. JwtUtils.parseJWT(token);
  68. } catch (Exception e) {
  69. e.printStackTrace();
  70. //10. 解析jwt令牌出错, 说明令牌过期或者伪造等不合法情况出现
  71. response.setStatusCode(HttpStatus.UNAUTHORIZED);
  72. //11. 返回
  73. //设置响应头信息Content-Type类型
  74. response.getHeaders().add("Content-Type","application/json");
  75. //设置返回json数据
  76. return response.writeAndFlushWith(Flux.just(ByteBufFlux.just(response.bufferFactory().wrap(getWrapData()))));
  77.  
  78. }
  79. //12. 放行
  80. return chain.filter(exchange);
  81. }
  82.  
  83. @Override
  84. public int getOrder() {
  85. return 0;
  86. }
  87.  
  88. private byte[] getWrapData() {
  89. Map<String,String> map = new HashMap<>();
  90. map.put("code","1");
  91. map.put("msg","token is empty or illegal");
  92. try {
  93. return new ObjectMapper().writeValueAsString(map).getBytes();
  94. } catch (JsonProcessingException e) {
  95. //
  96. }
  97. return "".getBytes();
  98. }
  99. }

进行白名单过滤

然后访问网关:

可以发现红框内出现了微服务切换的选项,至此整合完毕

springcloud+gateway微服务整合swagger的更多相关文章

  1. SpringCloud Gateway微服务网关实战与源码分析-上

    概述 定义 Spring Cloud Gateway 官网地址 https://spring.io/projects/spring-cloud-gateway/ 最新版本3.1.3 Spring Cl ...

  2. 用SpringCloud进行微服务架构演进

    在<架构师必须要知道的阿里的中台战略与微服务> 中已经阐明选择SpringCloud进行微服务架构实现中台战略,因此下面介绍SpringCloud的一些内容,SpringCloud已经出来 ...

  3. SpringCloud学习--微服务架构

    目录 微服务架构快速指南 SOA Dubbo Spring Cloud Dubbo与SpringCloud对比 微服务(Microservice)架构快速指南 什么是软件架构? 软件架构是一个包含各种 ...

  4. springCloud搭建微服务集群+Zuul服务器端负载均衡

    概述 最近研究了一下springCloud的微服务集群,主要用到了SpringCloud的服务发现和服务器端负载均衡,所有的项目都是用的springboot,可以和springCloud无缝对接. 技 ...

  5. SpringCloud与微服务Ⅲ --- SpringCloud入门概述

    一. 什么是SpringCloud SpringCloud基于SpringBoot提供了一套微服务解决方案,包括服务注册与发现,配置中心,全链路监控,服务网关,负载均衡,熔断器等组件,除了基于NetF ...

  6. 一个C#开发者学习SpringCloud搭建微服务的心路历程

    前言 Spring Cloud很火,很多文章都有介绍如何使用,但对于我这种初学者,我需要从创建项目开始学起,所以这些文章对于我的启蒙,帮助不大,所以只好自己写一篇文章,用于备忘. SpringClou ...

  7. 基于Spring-Cloud的微服务框架设计

    基于Spring-Cloud的微服务框架设计 先进行大的整体的框架整理,然后在针对每一项进行具体的详细介绍

  8. SpringCloud与微服务系列专栏

    一. 前置知识 学习SpringCloud之前需要具备和掌握如下框架和工具的使用:SpringMVC,Spring,Spring Boot,Mybatis,Maven,Git. SpringCloud ...

  9. springCloud进阶(微服务架构&Eureka)

    springCloud进阶(微服务架构&Eureka) 1. 微服务集群 1.1 为什么要集群 为了提供并发量,有时同一个服务提供者可以部署多个(商品服务).这个客户端在调用时要根据一定的负责 ...

随机推荐

  1. SpringBoot 之 国际化

    增加国际化i18n语言配置: # src/main/resources/i18n/login.properties login.btn=登录 # src/main/resources/i18n/log ...

  2. Linux上天之路(九)之文件和文件夹的权限

    主要内容 linux 基本权限 linux特殊权限 linux隐藏权限 linux file ACL 权限 1. Linux的基本权限 使用ls -l filename 命令查看文件或文件夹详细权限 ...

  3. ​第3届云原生技术实践峰会(CNBPS 2020)重磅开启,“原”力蓄势待发!

    CNBPS 2020将在11月19-21日全新启动!作为国内最有影响力的云原生盛会之一,云原生技术实践峰会(CNBPS)至今已举办三届. 在2019年的CNBPS上,灵雀云CTO陈恺喊出"云 ...

  4. css3中transition属性详解

    css3中通过transition属性可以实现一些简单的动画过渡效果~ 1.语法 transition: property duration timing-function delay; transi ...

  5. Vulnhub - THE PLANETS: EARTH

    环境配置 从www.vulnhub.com下载靶机,在VMware中导入,自动分配IP 主机发现 通过对内网主机的扫描,VMware为目标主机 端口扫描 使用nmap对主机进行扫描 发现443端口信息 ...

  6. [Raspberry Pi] 入门使用

    今天开始介绍Raspberry Pi(简称RPi,下同)入门的一些基础知识. 第1部分: 安装RPi 1.1  从 http://www.raspberrypi.org/downloads 下载RPi ...

  7. 【刷题-LeetCode】238. Product of Array Except Self

    Product of Array Except Self Given an array nums of n integers where n > 1, return an array outpu ...

  8. netty系列之:请netty再爱UDT一次

    目录 简介 netty对UDT的支持 搭建一个支持UDT的netty服务 异常来袭 TypeUDT和KindUDT 构建ChannelFactory SelectorProviderUDT 使用UDT ...

  9. 多线程-线程间通信-多生产者多消费者问题解决(notifyAll)

    1 package multithread4; 2 3 /* 4 * 生产者,消费者. 5 * 6 * 多生产者,多消费者的问题. 7 * 8 * if判断标记,只有一次,会导致不该运行的线程运行了. ...

  10. spring内嵌cglib包,这里藏着一个大坑

    问题发现 2022-01-21 早上 9 点,订单系统出现大面积的"系统未知错误"报错,导致部分用户无法正常下单.查询后台日志,可以看到大量的 duplicate class at ...