微服务架构➖SpringCloud➖Gateway(2)

微服务架构➖SpringCloud➖Gateway

关于作者

  • 作者介绍

🍓 博客主页:作者主页

🍓 简介:JAVA领域优质创作者🥇、一名在校大三学生🎓、在校期间参加各种省赛、国赛,斩获一系列荣誉 🏆、阿里云专家博主51CTO专家博主

🍓 关注我:关注我学习资料、文档下载统统都有,每日定时更新文章,励志做一名JAVA资深程序猿👨‍💻


7. 动态路由

从之前的配置里面我们可以看到我们的 URL 都是写死的,这不符合我们微服务的要求,我们 微服务是只要知道服务的名字,根据名字去找,而直接写死就没有负载均衡的效果了 默认情况下 Gateway 会根据注册中心的服务列表,以注册中心上微服务名为路径创建动态路 由进行转发,从而实现动态路由的功能 需要注意的是 uri 的协议为 lb(load Balance),表示启用 Gateway 的负载均衡功能。

lb://serviceName 是 spring cloud gateway 在微服务中自动为我们创建的负载均衡 uri 协议:就是双方约定的一个接头暗号 http://

7.1 配置文件

application.yml

yml 复制代码
server:
  port: 80
spring:
  application:
    name: gateway-server
  cloud:
    gateway:
      enabled: true #只要加了依赖,默认开启
      routes:
        - id: login-service-route  #路由id,保持唯一
          uri: http://localhost:8088  #  或者直接使用uri: lb://login-service 来进行动态路由  #uri 统一资源定位符   url统一资源标识符
          predicates:  #断言是给某个路由来做的  断言不能给动态路由来配置,只能在写好的predicates断言内才能生效
            - Path=/doLogin   #断言匹配规则,只要匹配上/doLogin   就往uri转发 并且将路径带上
            - After=2022-10-09T17:18:39.831+08:00[Asia/Shanghai]
            - Method=GET,POST
#            - Query=name,admin.   #正则表达式的值
#            - Path=/mySerivice/**  #多个路径进行匹配
          filters:
            - name: RequestRateLimiter  #这个是过滤器的名称
              args: #过滤器的参数
                key-resolver: '#{@ipKeyResolver}'  #通过spel表达式取IOC容器中的值
                redis-rate-limiter.replenishRate: 1 #生成令牌的速度
                redis-rate-limiter.burstCapacity: 3 #桶容量
      discovery:
        locator:
          enabled: true  #开启动态路由  开启通过业务名称找到对应服务的功能
          lower-case-service-id: true   #服务名称小写开启
#      globalcors:
#          corsConfigurations:
#              '[/**]':
#                  allowCredentials: true  # 可以携带cookie
#                  allowedHeaders: '*'
#                  allowedMethods: '*'
#                  allowedOrigins: '*'
eureka:
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka
    registry-fetch-interval-seconds: 3  #网关拉去服务列表的时间缩短
  instance:
    hostname: localhost
    instance-id: ${eureka.instance.hostname}:${spring.application.name}:${server.port}

7.2 启动服务,开启动态路由

启动 eureka-server

启动两个服务为 02-login-service、03-teacher-service 的服务,和 uri 里面 lb://服务名一致 在 provider 里面提供两个接口 访问测试:http://localhost:8089/teacher 正常访问

以03-teacher-service服务为例,那么 gateway 可以实现服务发现功能,并没有再 routers 里面配置路由规则,然而我们访问 新起的 teacher-service,测试访问 http://localhost/teacher-service/teacher 可以成功,这就是动态路由和服务发现。

8. 断言工厂

8.1 初识断言

断言就是路由添加一些条件(丰富路由功能的) 通俗的说,断言就是一些布尔表达式,满足条件的返回 true,不满足的返回 false。

Spring Cloud Gateway 将路由作为 Spring WebFlux HandlerMapping 基础架构的一部分 进行匹配。Spring Cloud Gateway 包括许多内置的路由断言工厂。所有这些断言都与 HTTP 请求的不同属性匹配。您可以将多个路由断言可以组合使用 Spring Cloud Gateway 创建对象时,使用 RoutePredicateFactory 创建 Predicate 对象, Predicate 对象可以赋值给 Route。

8.2 如何使用断言

使用断言判断时,我们常用 yml 配置文件的方式进行配

yml 复制代码
spring:
	application:
		name: gateway-80
	cloud:
		gateway:
			enabled: true #开启网关,默认是开启的
			routes: #设置路由,注意是数组,可以设置多个,按照 id 做隔离
                - id: user-service #路由 id,没有要求,保持唯一即可
                uri: lb://provider #使用 lb 协议 微服务名称做负均衡
                predicates: #断言匹配
                    - Path=/info/** #和服务中的路径匹配,是正则匹配的模式
                    - After=2022-10-09T20:18:39.831+08:00[Asia/Shanghai] #此断言匹配发生在指定
                    日期时间之后的请求,ZonedDateTime dateTime=ZonedDateTime.now()获得
                    - Before=2022-10-09T17:18:39.831+08:00[Asia/Shanghai] #此断言匹配发生在指定
                    日期时间之前的请求
                    -
                    Between=2020-06-18T21:26:26.711+08:00[Asia/Shanghai],2020-06-18T21:32:26.711+08:00[Asia/Shanghai]
                    #此断言匹配发生在指定日期时间之间的请求
                    - Cookie=name,xiaobai #Cookie 路由断言工厂接受两个参数,Cookie 名称和 regexp(一
                    个 Java 正则表达式)。此断言匹配具有给定名称且其值与正则表达式匹配的 cookie
                    - Header=token,123456 #头路由断言工厂接受两个参数,头名称和 regexp(一个 Java 正
                    则表达式)。此断言与具有给定名称的头匹配,该头的值与正则表达式匹配。
                    - Host=**.bai*.com:* #主机路由断言工厂接受一个参数:主机名模式列表。该模式是一
                    个 ant 样式的模式。作为分隔符。此断言匹配与模式匹配的主机头
                    - Method=GET,POST #方法路由断言工厂接受一个方法参数,该参数是一个或多个参数:
                    要匹配的 HTTP 方法
                    - Query=username,cxs #查询路由断言工厂接受两个参数:一个必需的 param 和一个
                    可选的 regexp(一个 Java 正则表达式)。
                    - RemoteAddr=192.168.1.1/24 #RemoteAddr 路由断言工厂接受一个源列表(最小大小 1),
                    这些源是 cidr 符号(IPv4 或 IPv6)字符串,比如 192.168.1.1/24(其中 192.168.1.1 是 IP 地址,24 是子网掩码)。

还有一个访问权重的设置,意思是说: 80%的请求一个url,20%的请求另一个url

yml 复制代码
spring:
	cloud:
		gateway:
			routes:
			- id: weight_high
                uri: url1
                predicates:
					- Weight=group1, 8
			- id: weight_low
                uri: url2
                predicates:
					- Weight=group1, 2

8.3 总结

Predicate 就是为了实现一组匹配规则,让请求过来找到对应的 Route 进行处理

相关推荐
大腕先生3 小时前
微服务环境搭建&架构介绍(附超清图解&源代码)
微服务·云原生·架构
WeiLai111210 小时前
面试基础--微服务架构:如何拆分微服务、数据一致性、服务调用
java·分布式·后端·微服务·中间件·面试·架构
茶本无香11 小时前
kafka+spring cloud stream 发送接收消息
spring cloud·kafka·java-zookeeper
Swift社区12 小时前
【微服务优化】ELK日志聚合与查询性能提升实战指南
spring·elk·微服务·云原生·架构
陌殇殇16 小时前
002 SpringCloudAlibaba整合 - Feign远程调用、Loadbalancer负载均衡
java·spring cloud·微服务
lllsure1 天前
Linux 实用指令
linux·物联网
m0_675447081 天前
Java版企电子招标采购系统源业码Spring Cloud + Spring Boot +二次开发+ MybatisPlus + Redis
java·spring cloud·企业电子招投标系统源码·招投标系统源码
楼台的春风1 天前
【详细讲解在STM32的UART通信中使用DMA机制】
stm32·单片机·嵌入式硬件·mcu·物联网·嵌入式·信息与通信
LUCIAZZZ1 天前
EasyExcel快速入门
java·数据库·后端·mysql·spring·spring cloud·easyexcel
落落落sss1 天前
MongoDB
数据库·windows·redis·mongodb·微服务·wpf