【SpringCloud学习笔记】gateway网关

gateway网关

核心概念:

  • 路由(route):路由信息由id、目标url、一组断言和一组过滤器组成。如果断言路由为真,则说明请求的 URI 和配配
  • 断言(predicate): Java8 中的断言函数,可以配置http请求的断言条件,断言成功会对匹配的路径进行路由
  • 过滤器(filter):过滤器分为两种类型,分别是 Gateway Filter 和Global Filter。过滤器可以对请求和响应进行处理

工作原理

【SpringCloud学习笔记】gateway网关_第1张图片
客户端向Spring Cloud网关发出请求。如果网关处理程序映射确定请求与路由匹配,则将其发送到网关Web处理程序。该处理程序运行通过特定于请求的筛选器链发送请求。筛选器由虚线分隔的原因是,筛选器可以在发送代理请求之前或之后执行逻辑。执行所有“前置”过滤器逻辑,然后发出代理请求。发出代理请求后,将执行“后”过滤器逻辑

开始使用

  • 工程目录

gateway-demo
|----eureka-server 注册中心 8761
|----gateway-server 网关服务 9002
|----user-service 用户服务 9001,提供一个查询用户列表的功能

  • 添加依赖
<dependency>
    <groupId>org.springframework.cloudgroupId>
    <artifactId>spring-cloud-starter-gatewayartifactId>
dependency>
<dependency>
    <groupId>org.springframework.cloudgroupId>
    <artifactId>spring-cloud-starter-netflix-eureka-clientartifactId>
dependency>
  • 配置文件添加路由配置
server:
  port: 9002
spring:
  application:
    name: gateway-server
  cloud:
    gateway:
      routes:
        - id: user-service #路由id
          uri: http://localhost:9001 #目标url,路由到微服务的地址
          predicates: #断言条件
            - Path=/user-service/**
          filters: #过滤器
            - StripPrefix=1
  • 将网关服务注册到注册中心
eureka:
  instance:
    prefer-ip-address: true
    instance-id: ${spring.cloud.client.ip-address}:${server.port}
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka/

最初的路由配置还没有接入到注册中心,路由的配置uri: http://localhost:9001写死的映射地址。注册到注册中心后映射地址通过服务名动态获取

cloud:
    gateway:
      routes:
        - id: user-service #路由id
          uri: lb://user-service #目标url,路由到微服务的地址
          predicates: #断言条件
            - Path=/user-service/**
          filters: #过滤器
            - StripPrefix=1

断言的使用

predicates路由匹配规则,当匹配对应的断言条件为true,才回映射到目标url

  • Path=/user/** 匹配对应的url,将匹配的url追加在目标url后面
  • Query=xxx 匹配请求参数中有指定参数的请求
  • Method=GET,POST 匹配任意get请求
  • After= 路由指定时间之后的请求
  • Before=路由指定时间之前的请求
  • RemoteAddr=192.168.21.1 匹配请求远程地址是RemoteAddr的地址
  • Header=X-Reques-Id \d+ 匹配包含指定请求头的请求
  • Cookie=匹配带有指定cookie的请求
cloud:
  gateway:
    enabled: true
    routes:
      - id: user-service #路由id
        uri: lb://user-service
        predicates: #断言条件
          - Path=/user-service/**
          - Query=abc
          - Method=post
          - After=

filters使用

  • 全局过滤器:Spring Cloud Gateway内置了很多不同类型的过滤器,另外也可以自定义全局过滤器
@Component
public class CustomGlobalGateWayFilter implements GlobalFilter, Ordered {

    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        System.out.println("自定义全局过滤器执行了");
        return chain.filter(exchange);
    }
    
    /*
     * 过滤器执行顺序,数值越小优先级越高
     */
    @Override
    public int getOrder() {
        return 0;
    }
}
  • 局部过滤器
@Component
public class CustomGateWayFilter implements GatewayFilter, Ordered {
    
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        System.out.println("自定义过滤器执行了");
        return chain.filter(exchange);
    }

    /*
     * 过滤器执行顺序,数值越小优先级越高
     */
    @Override
    public int getOrder() {
        return 0;
    }
}
  • 注册过滤器
@Configuration
public class RoutesConfiguration {
    @Bean
    public RouteLocator routeLocator(RouteLocatorBuilder builder) {
        return builder.routes().route(r -> r
                .path("/user/**")
                .uri("lb://user-service")
                .filters(new CustomGateWayFilter())
                .id("user-service"))
                .build();
    }
}

你可能感兴趣的:(spring,cloud)