当前位置: 首页 > news >正文

springCloud-gateway按照服务名动态路由的改造(一)

我们知道在gateway中加入下面的配置,则网关会根据路径中的服务名会自动路由到对应的服务,

如 http://gateway.com/my-service-name/login这个请求,将会根据my-service-name这个服务名路由到该服务。

spring:
  cloud:
    gateway:
      discovery:
        locator:
          enabled: true  #开启根据微服务名称自动转发
          lower-case-service-id: true 

项目需求

现在的需求是:http://gateway.com后面第一级不是服务名,而是按照业务含义定义的业务模块名称,每个微服务中包含了多个业务模块,配置中心维护了业务模块名和服务名的映射关系。这些业务模块在整个平台是唯一的,所以需求就变成了,要根据模块的名称去路由到模块对应的服务上。

如下图所示:user和role模块都属于account-service,所以http://gateway.com/user/add-user和http://gateway.com/role/add-role都需要路由到account-service中。

我的实现

要想实现上面的需求,我们需要了解俩方面的知识,一是gateway路由的基本流程,而是按照服务名路由是如何实现的?

gateway路由的基本流程

一般我們配置网关时,都需要有如下的配置信息,下图配置了俩个路由,

spring:
  cloud:
    gateway:
      routes: # 路由可以有多个
        - id: service-id1
          uri: http://127.0.0.1:8096
          predicates: 
             - Path=/test1/**
        - id: service-id2
          uri: http://127.0.0.1:8081 # ⽬标服务地址
          predicates: 
             - Path=myservice/test2/**
          filters:
             - StripPrefix=1

上面的配置信息的每个路由在程序中都会对应到一个RouteDefinition对象,如下图所示

路由主要由3部分组成:uri,predicates(断言),filters(过滤器)。下面来说说这三部分的作用。

predicates的作用

当一个请求进入网关时,那么网关如何决定往哪个地址转发呢?

其实是网关会遍历所有的路由列表(下图配置了2个)中,然后从中获取出一个匹配的路由,那么根据什么规则判断一个路由是否匹配当前的路由呢,这就用到了路由中的predicates,

比如下图中配置了- Path=/test1/**,则会根据当前请求的path判断是否与/test1/**匹配,比如我当前请求的地址为http://www.aaa.com/test1/add-test,则会拿host后面的地址/test1/add-test与

/test1/**做匹配,如果匹配成功则就选择当前路由,不匹配则继续与下一个路由进行匹配。那么具体的实现代码在那块呢,其实是在PathRoutePredicateFactory这个类里,类的命名规则就是

- Path=/test1/**中=前面的Path加上RoutePredicateFactory。具体的实现为下图中的apply方法。

 

 

  

uri的作用

那么上面确定了具体的路由之后,到底往哪里转发呢,这就用到了uri,默认情况下,转发的完整地址为uri 拼接上我们请求的path,比如我们请求的地址为http://www.gateway.com/test1/add-test

,匹配到上面的第一个路由后,会转发到http://127.0.0.1:8096/test1/add-test 这个地址。这就是uri的作用。

 

filter的作用

讲解完上面的知识后,其实已经能实现基本的转发功能了,但是实际开发过程中,我们可能有修改转发路径的需求,或者我想在转发之前向请求头里设置一些属性等等一些特殊需求。其实filter就是干这个的。

如上图配置的第二个路由中有- StripPrefix=1,这个其实是去掉path中的第一级路径,然后完成转发,比如我的请求地址是  http://www.gateway.com/myservice/test2/add-test2,这样就匹配到了第二个路由,

但是由于加了 StripPrefix=1 配置,所以会把path(/myservice/test2/add-test2)中的第一级去掉,即path变成了test2/add-test2,然后与uri拼接成完整的地址http://127.0.0.1:8081/test2/add-test2。

StripPrefix的具体实现代码为StripPrefixGatewayFilterFactory类中的apply方法,类的命名也是  StripPrefix    加上固定的GatewayFilterFactory。实现逻辑如下图

下面我们说说按照服务名动态路由是如何实现的。

springCloud-gateway按照服务名动态路由的改造(二)

相关文章:

  • springCloud-gateway按照服务名动态路由的改造(二)
  • springCloud-gateway按照服务名动态路由的改造(三)
  • 前端传入数字,后端用枚举接收统一处理
  • Jackson2ObjectMapperBuilderCustomizer不生效解决
  • feign如何启用httpClient、OKhttp
  • easyExcel读数据后在写入另一个excel
  • nginx 丢失端口问题
  • centos 安装docker及docker-compose
  • 多个docker-compose文件共享一个网络
  • idea 远程调试springboot项目
  • spring-cloud-consul配置中心获取指定路径下的配置
  • 将red5项目部署到tomcat下,并且red5项目嵌入到J2EE项目中
  • mysql 本机登录错误提示及解决方法
  • 禅道程序员的10条原则
  • 完全删除MYSQL:windows 7下完全删除MYSQL,windows xp 下完全删除MYSQL
  • [case10]使用RSQL实现端到端的动态查询
  • 【162天】黑马程序员27天视频学习笔记【Day02-上】
  • iOS高仿微信项目、阴影圆角渐变色效果、卡片动画、波浪动画、路由框架等源码...
  • Java IO学习笔记一
  • leetcode378. Kth Smallest Element in a Sorted Matrix
  • underscore源码剖析之整体架构
  • vue和cordova项目整合打包,并实现vue调用android的相机的demo
  • 创建一个Struts2项目maven 方式
  • 面试题:给你个id,去拿到name,多叉树遍历
  • 你真的知道 == 和 equals 的区别吗?
  • 嵌入式文件系统
  • 删除表内多余的重复数据
  • const的用法,特别是用在函数前面与后面的区别
  • MPAndroidChart 教程:Y轴 YAxis
  • # 透过事物看本质的能力怎么培养?
  • $分析了六十多年间100万字的政府工作报告,我看到了这样的变迁
  • (附源码)spring boot车辆管理系统 毕业设计 031034
  • (译) 函数式 JS #1:简介
  • (转)自己动手搭建Nginx+memcache+xdebug+php运行环境绿色版 For windows版
  • ../depcomp: line 571: exec: g++: not found
  • .equal()和==的区别 怎样判断字符串为空问题: Illegal invoke-super to void nio.file.AccessDeniedException
  • .h头文件 .lib动态链接库文件 .dll 动态链接库
  • .sh
  • .sys文件乱码_python vscode输出乱码
  • @PreAuthorize注解
  • @RestController注解的使用
  • [ Linux ] git工具的基本使用(仓库的构建,提交)
  • [2021 蓝帽杯] One Pointer PHP
  • [BT]BUUCTF刷题第4天(3.22)
  • [BZOJ2208][Jsoi2010]连通数
  • [BZOJ2850]巧克力王国
  • [C#C++]类CLASS
  • [CISCN2019 华东北赛区]Web2
  • [Codeforces] combinatorics (R1600) Part.2
  • [codevs 1296] 营业额统计
  • [C和指针].(美)Kenneth.A.Reek(ED2000.COM)pdf
  • [Docker]十二.Docker consul集群搭建、微服务部署,Consul集群+Swarm集群部署微服务实战
  • [EFI]Atermiter X99 Turbo D4 E5-2630v3电脑 Hackintosh 黑苹果efi引导文件
  • [GN] 后端接口已经写好 初次布局前端需要的操作(例)
  • [hdu 3746] Cyclic Nacklace [kmp]