Spring Cloud 系列之 Gateway 服务网关(二)

本篇文章为系列文章,未读第一集的同学请猛戳这里:Spring Cloud 系列之 Gateway 服务网关(一)

本篇文章讲解 Gateway 网关的多种路由规则、动态路由规则(配合服务发现的路由规则)。

  

路由规则

  

  点击链接观看:路由规则视频(获取更多请关注公众号「哈喽沃德先生」)

  

  Spring Cloud Gateway 创建 Route 对象时, 使用 RoutePredicateFactory 创建 Predicate 对象,Predicate 对象可以赋值给 Route。

  • Spring Cloud Gateway 包含许多内置的 Route Predicate Factories。
  • 所有这些断言都匹配 HTTP 请求的不同属性。
  • 多个 Route Predicate Factories 可以通过逻辑与(and)结合起来一起使用。

  

  路由断言工厂 RoutePredicateFactory 包含的主要实现类如图所示,包括 Datetime、 请求的远端地址、 路由权重、 请求头、 Host 地址、 请求方法、 请求路径和请求参数等类型的路由断言。

  

  

  接下来我们举例说明其中一部分如何使用,其余等大家工作中需要应用时再查询资料学习或者咨询我也可以。

  

Path

  

spring:
  application:
    name: gateway-server # 应用名称
  cloud:
    gateway:
      # 路由规则
      routes:
        - id: product-service           # 路由 ID,唯一
          uri: http://localhost:7070/   # 目标 URI,路由到微服务的地址
          predicates:                   # 断言(判断条件)
            - Path=/product/**          # 匹配对应 URL 的请求,将匹配到的请求追加在目标 URI 之后
  • 请求 http://localhost:9000/product/1 将会路由至 http://localhost:7070/product/1

  

Query

  

spring:
  application:
    name: gateway-server # 应用名称
  cloud:
    gateway:
      # 路由规则
      routes:
        - id: product-service           # 路由 ID,唯一
          uri: http://localhost:7070/   # 目标 URI,路由到微服务的地址
          predicates:                   # 断言(判断条件)
            #- Query=token               # 匹配请求参数中包含 token 的请求
            - Query=token, abc.         # 匹配请求参数中包含 token 并且其参数值满足正则表达式 abc. 的请求

  

Method

  

spring:
  application:
    name: gateway-server # 应用名称
  cloud:
    gateway:
      # 路由规则
      routes:
        - id: product-service           # 路由 ID,唯一
          uri: http://localhost:7070/   # 目标 URI,路由到微服务的地址
          predicates:                   # 断言(判断条件)
            - Method=GET                # 匹配任意 GET 请求

  

Datetime

  

spring:
  application:
    name: gateway-server # 应用名称
  cloud:
    gateway:
      # 路由规则
      routes:
        - id: product-service           # 路由 ID,唯一
          uri: http://localhost:7070/   # 目标 URI,路由到微服务的地址
          predicates:                   # 断言(判断条件)
            # 匹配中国上海时间 2020-02-02 20:20:20 之后的请求
            - After=2020-02-02T20:20:20.000+08:00[Asia/Shanghai]

  

RemoteAddr

  

spring:
  application:
    name: gateway-server # 应用名称
  cloud:
    gateway:
      # 路由规则
      routes:
        - id: product-service           # 路由 ID,唯一
          uri: http://localhost:7070/   # 目标 URI,路由到微服务的地址
          predicates:                   # 断言(判断条件)
            - RemoteAddr=192.168.10.1/0 # 匹配远程地址请求是 RemoteAddr 的请求,0表示子网掩码

  

  

spring:
  application:
    name: gateway-server # 应用名称
  cloud:
    gateway:
      # 路由规则
      routes:
        - id: product-service           # 路由 ID,唯一
          uri: http://localhost:7070/   # 目标 URI,路由到微服务的地址
          predicates:                   # 断言(判断条件)
            # 匹配请求头包含 X-Request-Id 并且其值匹配正则表达式 \d+ 的请求
            - Header=X-Request-Id, \d+

  

  

动态路由(服务发现的路由规则)

  

  动态路由其实就是面向服务的路由,Spring Cloud Gateway 支持与 Eureka 整合开发,根据 serviceId 自动从注册中心获取服务地址并转发请求,这样做的好处不仅可以通过单个端点来访问应用的所有服务,而且在添加或移除服务实例时不用修改 Gateway 的路由配置。

  

添加依赖

  

<!-- netflix eureka client 依赖 -->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>

  

动态获取 URI

  

  点击链接观看:动态获取 URI视频(获取更多请关注公众号「哈喽沃德先生」)

  

配置文件

  

  配置注册中心和动态路由规则。

server:
  port: 9000 # 端口

spring:
  application:
    name: gateway-server # 应用名称
  cloud:
    gateway:
      # 路由规则
      routes:
        - id: product-service           # 路由 ID,唯一
          uri: lb://product-service     # lb:// 根据服务名称从注册中心获取服务请求地址
          predicates:                   # 断言(判断条件)
            - Path=/product/**          # 匹配对应 URL 的请求,将匹配到的请求追加在目标 URI 之后

# 配置 Eureka Server 注册中心
eureka:
  instance:
    prefer-ip-address: true       # 是否使用 ip 地址注册
    instance-id: ${spring.cloud.client.ip-address}:${server.port} # ip:port
  client:
    service-url:                  # 设置服务注册中心地址
      defaultZone: http://localhost:8761/eureka/,http://localhost:8762/eureka/

  

启动类

  

package com.example;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

// 开启 EurekaClient 注解,目前版本如果配置了 Eureka 注册中心,默认会开启该注解
//@EnableEurekaClient
@SpringBootApplication
public class GatewayServerApplication {

    public static void main(String[] args) {
        SpringApplication.run(GatewayServerApplication.class, args);
    }

}

  

访问

  

  访问:http://localhost:9000/product/1 结果如下:

  

服务名称转发

  

  点击链接观看:服务名称转发视频(获取更多请关注公众号「哈喽沃德先生」)

  

  即使配置了动态获取 URI 的方式,项目中微服务一旦过多几十上百个时,配置中仍然要写很多配置,这时候就可以使用服务名称转发,与服务发现组件进行结合,通过 serviceId 转发到具体服务实例。默认匹配URL /微服务名称/** 路由到具体微服务。

  

配置文件

  

  配置注册中心和动态路由规则。

server:
  port: 9000 # 端口

spring:
  application:
    name: gateway-server # 应用名称
  cloud:
    gateway:
      discovery:
        locator:
          # 是否与服务发现组件进行结合,通过 serviceId 转发到具体服务实例。
          enabled: true                  # 是否开启基于服务发现的路由规则
          lower-case-service-id: true    # 是否将服务名称转小写

# 配置 Eureka Server 注册中心
eureka:
  instance:
    prefer-ip-address: true       # 是否使用 ip 地址注册
    instance-id: ${spring.cloud.client.ip-address}:${server.port} # ip:port
  client:
    service-url:                  # 设置服务注册中心地址
      defaultZone: http://localhost:8761/eureka/,http://localhost:8762/eureka/

  

启动类

  

package com.example;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

// 开启 EurekaClient 注解,目前版本如果配置了 Eureka 注册中心,默认会开启该注解
//@EnableEurekaClient
@SpringBootApplication
public class GatewayServerApplication {

    public static void main(String[] args) {
        SpringApplication.run(GatewayServerApplication.class, args);
    }

}

  

访问

  

  配置文件中没有配置任何订单服务的信息,访问:http://localhost:9000/order-service/order/1 结果如下:

下一篇我们讲解 Gateway 网关过滤器和全局过滤器以及自定义过滤器的使用,记得关注噢~

  本文采用 知识共享「署名-非商业性使用-禁止演绎 4.0 国际」许可协议

  大家可以通过 分类 查看更多关于 Spring Cloud 的文章。

  

  🤗 您的点赞转发是对我最大的支持。

  📢 扫码关注 哈喽沃德先生「文档 + 视频」每篇文章都配有专门视频讲解,学习更轻松噢 ~

posted @ 2020-04-21 10:15  哈喽沃德先生  阅读(1934)  评论(1编辑  收藏  举报