spring cloud 学习(Gateway)网关

spring cloud  之 Gateway

网关旨在为微服务架构提供一种简单而有效的统一的API路由管理方式

在微服务架构中,不同的微服务可以有不同的网络地址,各个微服务之间通过互相调用完成用户请求,客户端可能通过调用N个微服务的接口完成一个用户请求

存在的问题:

  1.  客户端多次请求不同的微服务,增加客户端的复杂性
  2. 认证复杂,每个服务都要进行认证
  3. http请求不同服务次数增加,性能不高

  网关就是系统的入口,封装了应用程序的内部结构,为客户端提供统一服务,一些与业务本身功能无关的公共逻辑可以在这里实现,诸如认证、鉴权、监控、缓存、负载均衡、流量管控、路由转发等

 在目前的网关解决方案里,有Nginx+ Lua、Netflix Zuul 、Spring Cloud Gateway等等 

1、Gateway的搭建

  • 注入依赖
    •  <dependencies>
              <!--引入gateway 网关-->
              <dependency>
                  <groupId>org.springframework.cloud</groupId>
                  <artifactId>spring-cloud-starter-gateway</artifactId>
              </dependency>
              <!-- eureka-client -->
              <dependency>
                  <groupId>org.springframework.cloud</groupId>
                  <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
              </dependency>
          </dependencies>

      注意:不能加 web这个文件,否则你会很开心,如果需要动态配置的话,需要添加eureka坐标

  • 启动类需要添加eureka注解
  • 编写配置类
    • 1.静态编写配置类
      • server:
          port: 80
        
        spring:
          application:
            name: api-gateway-server
        
          cloud:
            # 网关配置
            gateway:
              # 路由配置:转发规则
              routes: #集合。
              # id: 唯一标识。默认是一个UUID
              # uri: 转发路径
              # predicates: 条件,用于请求网关路径的匹配规则
              # filters:配置局部过滤器的
              - id: gateway-provider
                # 静态路由
                uri: http://localhost:8001/
                predicates:
                - Path=/goods/**
    • 动态编写配置  从Eureka中动态获取
        •  1 server:
           2   port: 80
           3 
           4 spring:
           5   application:
           6     name: api-gateway-server
           7 
           8   cloud:
           9     # 网关配置
          10     gateway:
          11       # 路由配置:转发规则
          12       routes: #集合。
          13       # id: 唯一标识。默认是一个UUID
          14       # uri: 转发路径
          15       # predicates: 条件,用于请求网关路径的匹配规则
          16       # filters:配置局部过滤器的
          17       - id: gateway-provider
          18         # 静态路由
          19         uri: http://localhost:8001/
          20         predicates:
          21         - Path=/goods/**
          22 eureka:
          23   instance:
          24     hostname: localhost
          25   client:
          26     service-url:
          27       defaultZone: http://eureka-server:10086/eureka

 微服务名称配置

1 # 微服务名称配置
2       discovery:
3 
4         locator:
5 
6           enabled: true # 设置为true 请求路径前可以添加微服务名称
7           lower-case-service-id: true # 允许为小写

解决服务过多可能存在的路径冲突问题

  http://localhost:10010/eureka-consumer/order/goods/1

2、Gateway过滤器

 Gateway支持过滤器功能,对请求或者响应进行拦截

Gateway 提供两种过滤器方式:“pre”和“post”

    pre 过滤器,在转发之前执行,可以做参数校验、权限校验、流量监控、日志输出、协议转换等。

    post 过滤器,在响应之前执行,可以做响应内容、响应头的修改,日志的输出,流量监控等。

  Gateway 还提供了两种类型过滤器

    GatewayFilter:局部过滤器,针对单个路由

    GlobalFilter :全局过滤器,针对所有路由

局部过滤器配置方式:

 1 server:
 2   port: 80
 3 spring:
 4   application:
 5     name: api-gateway-server
 6   cloud:
 7     # 网关配置
 8     gateway:
 9       # 路由配置:转发规则
10       routes: #集合。
11       # id: 唯一标识。默认是一个UUID
12       # uri: 转发路径
13       # predicates: 条件,用于请求网关路径的匹配规则
14       # filters:配置局部过滤器的
15 
16       - id: gateway-provider
17         # 静态路由
18         # uri: http://localhost:8001/
19         # 动态路由
20         uri: lb://GATEWAY-PROVIDER
21         predicates:
22         - Path=/goods/**
23         filters:
24         - AddRequestParameter=username,zhangsan
25 #该过滤器会在请求同上添加请求参数

这个参数后端可以直接接受到

全局过滤器配置

  定义类实现GlobalFilter和Ordered接口

  重写方法

  添加注解 ,注入ioc容器

 

 1 @Component
 2 public class MyFilter implements GlobalFilter, Ordered {
 3     @Override
 4     public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
 5 
 6         System.out.println("自定义全局过滤器执行了~~~");
 7 
 8         return chain.filter(exchange);//放行
 9     }
10 
11     /**
12      * 过滤器排序
13      * @return 数值越小 越先执行
14      */
15     @Override
16     public int getOrder() {
17         return 0;
18     }
19 }

       

原文地址:https://www.cnblogs.com/luckysupermarket/p/13812531.html