微服务网关作为后台架构的入口,提供路由转发、API 管理、访问过滤器等作用,是微服务架构中的重要组件。开源社区中存在多种方式实现微服务网关的功能,但同时也存在不灵活、运维难的问题。本文从实际业务场景出发,通过实际操作为大家演示腾讯云微服务平台 TSF(Tencent Service Framework)是如何解决上述问题的。
微服务网关通过服务路由、API 管理、负载均衡、访问限制等功能,在一定程度上可以实现服务治理,帮助我们管理各个服务之间的调用及关联关系。我们来看这样一个场景:当有外部请求时,我们希望依据某些参数值来决定路由可转发到服务的某个版本,或依据参数值对请求进行限流、鉴权等操作。如下图所示,外网请求通过网关访问后端微服务,当请求参数 region = guangzhou 时,我们希望可以路由转发到微服务的版本 1 中;当 region = shanghai 时,路由可以转发到微服务的版本 2 中。
访问链路
这个场景在实际业务中非常常见,那我们先来看下使用开源方案如何实现基于业务参数的服务治理。
在开源社区中,根据不同语言和微服务的技术选型,有以下几种方式实现服务路由能力。
1. 传统路由配置
当我们不依赖服务发现机制的时候,我们通常需要通过具体的配置文件来指定路由的表达式与服务实例的映射关系。当网关调用某个微服务时,若微服务上有多个节点需要进行负载均衡,则需要如下配置:
zuul.routes.user-service.path=/user/**
zuul.routes.user-service.serviceId=user
ribbon.eureka.enabled=false
user-service.ribbon.listOfServers=http://localhost:8080/,http://localhost:8081/
通过上面的配置即可实现/user/**的请求转发到两个实例上去。但我们很容易发现这种配置方式存在以下几个问题:
2. Spring Cloud 实现
当我们依赖原生 Spring Cloud 的的注册中心:Consul 或 Euraka 以及 原生的微服务网关组件 Zuul 或者 Spring Cloud Gateway 来实现服务的自动注册与发现,在网关层面,不需要将节点 ip 配置在转发路径上,注册中心将为我们提供服务与节点的对应关系。
由于只有在网关处可以实现依据不同请求参数转发请求到不同微服务,上图中的架构图需要调整为:其中 A1 A2,B1 B2 都在不同的实例上。
在实现上,我们需要这样配置:在网关上配置不同请求参数转发到不同的微服务 A 中。尽管 B1 和 B2 服务仅仅有一些版本上的差异,接口相同,但是由于无法直接实现 A 服务依据不同参数转发到 B 服务的不同实例上,需要将 A 服务也拆成两个服务来保证请求的一一对应。
zuul.routes.A1=/user1/**
zuul.routes.A2=/user2/**
这样配置依然存在以下问题:
从上述业务场景中,开源 Spring Cloud 架构在实现上相对麻烦,很难满足实际业务中复杂多变的使用场景。在腾讯微服务平台 TSF 中,我们提供了以上场景的解决方案,方案的优势为:
开始进行本实践之前,你需要先了解 下 TSF 中的以下功能:
下面就开始我们的基于业务参数的服务治理实践指引。
1. 准备工作
准备两个微服务 consumer -demo;provider - demo。其中 provider - demo 存在两个版本的包 provider-demo-guangzhou.jar,provider-demo-shanghai.jar。两个版本在访问请求携带 region 参数并访问 /test-region 接口时,会分别返回 shanghai 和 guangzhou。请求 provider - demo 时,可以携带两个 Header 参数,region 和 usertype。
consumer - demo 部署在一个部署组上,provider - demo 部署在两个部署组上,每个部署组部署一个版本的 jar 包。
有关创建部署组的相关操作请参考:https://cloud.tencent.com/document/product/649/16932
新建微服务网关部署组
绑定网关部署组
分组发布
2. 配置微服务网关插件
在这一步中,我们在网关配置插件,将请求参数转化为 TSF 中的标签信息。
创建插件类型
绑定分组
3. 配置服务治理规则
在这一步中,我们配置依据上一步已经转化的标签,配置服务治理规则。当前 TSF 标签可以与服务路由、服务鉴权、服务限流、调用链进行联动。本文中为您介绍路由、鉴权、以及调用链联动功能。
3.1 服务路由
登陆 TSF 控制台,点击服务治理,找到创建好的 provider - demo 微服务,点击详情至服务路由页面。请注意,路由规则始终是在被调用方进行配置的。
创建服务路由规则
同理,当请求 Header 参数 = guangzhou 时,请求也路由到了返回值为 guangzhou 的部署组中。
3.2 服务鉴权
3.3 调用链查询
在 TSF 中,我们提供了基于请求标签过滤调用链的能力,你可以依据业务数据过滤对应请求的调用链。最为常见的场景是查询某个用户 id 的请求调用成功失败情况以及层级耗时。使用方法:
如图所示,下面查询的数据即为携带对应标签的请求 trace 列表。
头图:Unsplash
作者:杨蕊
原文:https://mp.weixin.qq.com/s/i5jZdvEeQ6qds0xdyMeFTA
原文:服务治理最佳实践:如何快速依据请求参数值进行服务路由、鉴权、限流?
来源:腾讯云中间件 - 微信公众号 [ID:gh_6ea1bc2dd5fd]
转载:著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
领取专属 10元无门槛券
私享最新 技术干货