微服务架构➖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 进行处理

相关推荐
地瓜伯伯2 小时前
Nginx终极配置指南:负载均衡、限流、反向代理、IP白名单、SSL、云原生、DNS解析、缓存加速全都有
spring boot·nginx·spring·spring cloud·微服务·云原生·负载均衡
Hernon4 小时前
微服务架构设计 - 配置中心的选择
微服务·架构
小李做物联网6 小时前
【单片机毕业设计】65.1基于单片机物联网智能书桌-超声+升降系统项目程序开发
stm32·单片机·嵌入式硬件·物联网
Light606 小时前
进行 MQTT5 的压测:从场景到落地的系统方法论(含脚本、流程图与对比表)
物联网·流程图·压力测试·可观测性·mqtt5·分布式负载
hg011811 小时前
豫非搭建“黄金水道” 河南首个海外港口枢纽启动试运营
大数据·人工智能·物联网
Crazy Struggle11 小时前
.NET 8 微服务框架长什么样?集成 AI 智能体、多租户、自动调度与实时通信
微服务·.net·.net 8.0
小安同学iter12 小时前
天机学堂day05
java·开发语言·spring boot·分布式·后端·spring cloud·微服务
明月惊雀13 小时前
微服务搭建踩坑
微服务·云原生·架构
我是小妖怪,潇洒又自在14 小时前
springcloud alibaba(六)Sentinel 配置
spring·spring cloud·sentinel
檐下翻书17314 小时前
集团组织架构图在线设计 多部门协作编辑工具
大数据·论文阅读·人工智能·物联网·架构·流程图·论文笔记