微服务系列之-Gateway集成

一.Gateway核心概念

网关简单的说就是提供一个对外统一的API入口和出口,统管企业对外的所有API出口。一般来说,网关对外暴露的URL或者接口信息,我们统称之为路由信息。如果研发过网关中间件,或者使用或了解过ZUUL的,网关的核心肯定是Filter以及Filter Chain(Filter责任链)。Spring Cloud Gateway也具有路由信息和Filter。

  1. 路由(route):
    路由网关的基本构建块。它由一个ID、一个目的URI、一组谓词和一组过滤器定义。如果聚合谓词为真,则路由匹配。

  2. 断言(predicate):
    java 8中的断言函数。Spring Cloud Gateway中的断言函数输入类型是Spring 5.0框架中的ServerWebExchange。Spring Cloud Gateway中的断言函数允许开发者去定义匹配来自于http request中的任何信息,比如请求头和参数等。

  3. 过滤器(filter):
    一个标准的Spring webFilter。Spring Cloud Gateway中的Filter分为两种类型的Filter,分别是Gateway Filter和Global Filter.网关 Filter实例是由Spring 框架中的网关Filter的特殊工厂构造。request在转发到目前服务之前,response在返回到调用端之前都可以被修改或者自定义。

二.Gateway如何工作

客户端向云网关发出请求。如果网关处理程序映射确定请求与路由匹配,则将其发送到网关Web处理程序。该处理程序运行通过特定于请求的筛选器链发送请求。筛选器被虚线分隔的原因是,筛选器在代理请求发送之前或之后执行逻辑。执行所有预过滤器(pre)逻辑,然后进行代理请求。代理请求完成后,执行“邮政”器(post)逻辑。

微服务系列之-Gateway集成_第1张图片即在最前端,启动一个netty server(默认端口为8080)接受请求,然后通过Routes(每个Route由Predicate(等同于HandlerMapping)和Filter(等同于HandlerAdapter))处理后通过Netty Client发给响应的微服务。

三.Gateway集成

  1. 依赖添加
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-gateway</artifactId>
        </dependency>
  1. 路由配置
spring:
  application:
    name: qygatewayserver
  cloud:
      gateway:
        locator:
          enabled: true
        routes:
        - id: qymybatisplusclient
          uri: lb://qymybatisplusclient
          predicates:
          - Path=/v1/**
          filters:
          - StripPrefix=1
eureka:
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka/
logging:
  level:
    org.springframework.cloud.gateway: debug
    com.windmt.filter: debug
management:
  endpoints:
    web:
      exposure:
        include: "*"
  1. 启动对应配置微服务以及Gateway
    微服务系列之-Gateway集成_第2张图片可以通过Gateway正常访问接口。

  2. Gateway 集成Swagger
    4.1 依赖添加

       <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
            <exclusions>
                <exclusion>
                    <artifactId>guava</artifactId>
                    <groupId>com.google.guava</groupId>
                </exclusion>
            </exclusions>
        </dependency>

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
            <exclusions>
                <exclusion>
                    <artifactId>guava</artifactId>
                    <groupId>com.google.guava</groupId>
                </exclusion>
                <exclusion>
                    <artifactId>HdrHistogram</artifactId>
                    <groupId>org.hdrhistogram</groupId>
                </exclusion>
                <exclusion>
                    <artifactId>jsr305</artifactId>
                    <groupId>com.google.code.findbugs</groupId>
                </exclusion>
            </exclusions>
        </dependency>

        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger-ui</artifactId>
            <version>2.9.2</version>
            <exclusions>
                <exclusion>
                    <artifactId>guava</artifactId>
                    <groupId>com.google.guava</groupId>
                </exclusion>
            </exclusions>
        </dependency>

        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger2</artifactId>
            <version>2.9.2</version>
            <exclusions>
                <exclusion>
                    <artifactId>guava</artifactId>
                    <groupId>com.google.guava</groupId>
                </exclusion>
            </exclusions>
        </dependency>

4.2 关键代码

@Override
    public List<SwaggerResource> get()
    {
     
        List<SwaggerResource> resources = new ArrayList<>();
        List<String> routes = new ArrayList<>();
        // 取出Spring Cloud Gateway中的route
        routeLocator.getRoutes().subscribe(route -> routes.add(route.getId()));
        // 结合application.yml中的路由配置,只获取有效的route节点
        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.concat("0"))
                                        .replace("/**", API_URI)))));
        return resources;
    }

具体代码参考:谦奕爸爸-微服务集成项目

4.3 重新启动Gateway
微服务系列之-Gateway集成_第3张图片成功获取mybatisplus客户端接口,并且可以 正常访问接口。
微服务系列之-Gateway集成_第4张图片至于Gateway具体的权限管理啥的,我目前还没有负责这块的开发,后面自己会研究把权限、限流啥的集成到项目做范例。

具体代码参考:谦奕爸爸-微服务集成项目

参考资源:
Spring Cloud Gateway网关实战及原理解析

你可能感兴趣的:(微服务架构)