NVIDIA 初创加速计划,免费加速您的创业启动 了解详情
写点什么

服务治理最佳实践:如何快速依据请求参数值进行服务路由、鉴权、限流?

  • 2021-01-11
  • 本文字数:3292 字

    阅读完需:约 11 分钟

服务治理最佳实践:如何快速依据请求参数值进行服务路由、鉴权、限流?

微服务网关作为后台架构的入口,提供路由转发、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=falseuser-service.ribbon.listOfServers=http://localhost:8080/,http://localhost:8081/
复制代码


通过上面的配置即可实现/user/**的请求转发到两个实例上去。但我们很容易发现这种配置方式存在以下几个问题:


  1. 对于实现前文中架构图的路由方式,至少需要将 B 服务拆分成为两个不同名称的微服务,在网关、A 服务上共配置三次路由规则才能实现三个微服务之间基于请求参数的服务路由能力。配置非常复杂。

  2.  由于没有注册中心,我们没法对节点的状态进行检测和剔除,当系统中出现坏死节点,必须改变路由配置才能让业务恢复运行。运维困难。

  3. 配置后需要重启网关实例配置才能生效,无法热生效。


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/**
复制代码


这样配置依然存在以下问题:


  1. 尽管不需要配置实际的节点对应关系,但是由于无法实现微服务之间的不同请求参数转发到不同节点,需要拆分多个微服务,非常复杂。

  2. 而且由于路由配置需要写在 properties 中,如果需要调整路由则需要重启网关。无法灵活调整。


TSF 微服务网关路由能力


从上述业务场景中,开源 Spring Cloud 架构在实现上相对麻烦,很难满足实际业务中复杂多变的使用场景。在腾讯微服务平台 TSF 中,我们提供了以上场景的解决方案,方案的优势为:


  • 页面化配置,无需修改代码,上手方便。管理方便。

  • 随时控制规则生效状态,立即生效,无需重启

  • 可以灵活实现基于业务参数的路由、限流、鉴权策略,并且可以依据业务参数进行单条请求的过滤,方便运维

  • 支持可视化运维,可直接查看路由、限流规则的生效情况,也可以查看监控平台。


基于 TSF 的服务治理实践


开始进行本实践之前,你需要先了解 下 TSF 中的以下功能:


  • 微服务网关的部署:微服务网关是微服务的请求入口,它本身也是一个微服务。用户可以通过微服务网关托管不同微服务的 API。详细微服务网关的部署方式请参考:https://cloud.tencent.com/document/product/649/40200

  • 服务路由:用户可以配置流量分配权重,设置某些权重的流量被分配到某个版本号中,为灰度发布等上线模式提供了无需终止服务的底层能力支持。


下面就开始我们的基于业务参数的服务治理实践指引。


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


  • 部署一个微服务网关,使用官网 demo ,部署后服务名为 msgw - demo,部署组名称为 test,默认端口为 8080 (请注意给对应机器开放 8080 端口。)在本 demo 中,将直接通过网关访问微服务 provider。有关部署微服务网关的操作请参考:

    https://cloud.tencent.com/document/product/649/40200

  • 新建微服务网关分组,并将微服务网关分组绑定在创建好的网关应用部署组上。 


新建微服务网关部署组


绑定网关部署组


  • 将微服务 API 导入到分组中,并将分组进行发布。


分组发布


2. 配置微服务网关插件


在这一步中,我们在网关配置插件,将请求参数转化为 TSF 中的标签信息。


  • 在 TSF 控制台 选择组建中心 - 微服务网关 - 插件管理,点击新建插件

  • 创建插件类型为 tag 类型插件,将请求参数中 Header 参数中的 region、usertype 设置为标签。


创建插件类型


  • 在插件列表页面将创建好的插件与准备工作中创建的分组进行绑定


绑定分组


3. 配置服务治理规则


在这一步中,我们配置依据上一步已经转化的标签,配置服务治理规则。当前 TSF 标签可以与服务路由、服务鉴权、服务限流、调用链进行联动。本文中为您介绍路由、鉴权、以及调用链联动功能。


3.1 服务路由


登陆 TSF 控制台,点击服务治理,找到创建好的 provider - demo 微服务,点击详情至服务路由页面。请注意,路由规则始终是在被调用方进行配置的。


  • 新建服务路由规则。

  • 创建两条规则,当自定义标签 region 值为 guangzhou 时,100%的流量指向部署了 provider-demo-guangzhou.jar 的部署组,当自定义标签 region 值为 shanghai 时,100%的流量指向部署了 provider-demo-shanghai.jar 的部署组。规则配置可参考下图:


创建服务路由规则


  • 生效规则,效果验证:公网发送请求 :http://129.XX.XX.XX:8080/test-region/tj-test-1_default/provider-demo/test-region/12,携带 Header 参数 region = shanghai。验证后,发现请求的确路由到了返回值为 shanghai 的部署组中



同理,当请求 Header 参数 = guangzhou 时,请求也路由到了返回值为 guangzhou 的部署组中。


3.2 服务鉴权


  • 登陆 TSF 控制台,点击服务治理,找到创建好的 provider - demo 微服务,点击详情至服务鉴权页面。

  • 配置服务鉴权规则,我们希望实现的是,当请求参数 Header 中携带了参数 usertype = user 时,请求不通过。配置方式如下,选择自定义标签,usertype = user 生效。



  • 结果验证:同理发送请求,携带 Header 参数 usertype = user,region = shanghai。发现返回请求失败。


3.3 调用链查询


在 TSF 中,我们提供了基于请求标签过滤调用链的能力,你可以依据业务数据过滤对应请求的调用链。最为常见的场景是查询某个用户 id 的请求调用成功失败情况以及层级耗时。使用方法:


  • 访问 TSF 控制台,点击运维中心 - 调用链查询,选择对应的命名空间和微服务

  • 点击 “展开高级查询条件”输入查询标签,此处我们输入 userid:1000001,过滤 userid 为 1000001 的请求数据



如图所示,下面查询的数据即为携带对应标签的请求 trace 列表。


头图:Unsplash

作者:杨蕊

原文:https://mp.weixin.qq.com/s/i5jZdvEeQ6qds0xdyMeFTA

原文:服务治理最佳实践:如何快速依据请求参数值进行服务路由、鉴权、限流?

来源:腾讯云中间件 - 微信公众号 [ID:gh_6ea1bc2dd5fd]

转载:著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

2021-01-11 21:002260

评论

发布
暂无评论
发现更多内容

HTTP/3 初体验

运维研习社

nginx 运维 HTTP3.0 5月日更

看MindSpore加持下,如何「炼出」首个千亿参数中文预训练语言模型?

华为云开发者联盟

框架 mindspore 盘古 NLP 大模型 中文预训练模型

深入浅出分布式存储性能优化方案

焱融科技

云计算 分布式 高性能 云存储 超融合

java性能分析与问题定位 实战

try catch

Java 性能分析

JavaScript+TensorFlow.js让你在视频中瞬间消失

不脱发的程序猿

JavaScript 人工智能 开源 TensorFlow.js

基础设施设施即代码(IaC)平台 Pulumi | 混合云管理利器

郭旭东

基础设施即代码 IaC

私有云解决方案

anyRTC开发者

音视频 WebRTC RTC sdk

DEMO WORLD分论坛聊些啥?高端制造、未来出行、皮肤科技、未来产业……

创业邦

创新

多线程 VS 多进程(一)

若尘

多线程 多进程 Python编程 5月日更

支付中心设计

try catch

支付 支付中心

Serverless:这真的是未来吗?(二)

Serverless Devs

Serverless 运维 云原生 后端 无服务器

普通代码块 静态代码块 构造代码块......傻傻分不清

麦洛

Java

详解JQuery框架的五大选择器

华为云开发者联盟

jquery 选择器 层级选择器 属性选择器 过滤选择器

千万级学生管理系统考试试卷存储方案设计

Hesher

架构 Architecture 架构实战营 存储系统

架构实战营模块3课后作业-基于“自研集群+MySQL存储”的消息队列架构设计方案

吴建中

架构实战营

阿里分布式大神亲码“redis核心技术笔记”,没有废话,全是干货!

Java架构追梦

Java redis 阿里巴巴 架构 架构分布式

膜拜!Github访问量破百万,阿里内部首次公布的Java10W字面经有多强?

Java 程序员 架构 面试

智能视频云3.0全景图来了!深度融合视频应用共创行业新生态

百度大脑

云智一体 智能视频 云智技术

从酷睿双核到Tiger Lake-H,英特尔如何帮游戏笔记本完成蜕变

E科讯

前端实操案例丨如何实现JS向Vue传值

华为云开发者联盟

Vue 大前端 js Promise Vuex state

测试开发网络篇-网络协议简介

禅道项目管理

软件测试 自动化测试 测试开发

聊聊那些小而美的开源搜索引擎

代码先生

搜索引擎 elasticsearch meilisearch

kafka基本概念

杨四正

大数据 kafka 架构设计 消息队列 消息队列架构

让人工智能成为保险行业科技基因的一部分!

百度大脑

人工智能 保险

飞桨前沿升级、顶级开源项目、产教融合育人,WAVE SUMMIT论坛内容先睹为快!

百度大脑

深度学习 飞桨

测试开发专题-开篇

禅道项目管理

软件测试 自动化测试 测试开发

SparkStreaming知识点总结

五分钟学大数据

大数据 5月日更

2、kafka 2.8.0 源码环境搭建

杨四正

大数据 kafka 消息队列 kafka2.8

如何成为云原生技术高阶玩家?华为云最近做了这件事

华为云开发者联盟

容器 DevOps 微服务 云原生 华为云

iOS开发底层原理技术~RAC深度解析

ios cocoa 程序员 移动开发

Flume的负载均衡load balancer

大数据技术指南

flume 5月日更

服务治理最佳实践:如何快速依据请求参数值进行服务路由、鉴权、限流?_服务革新_腾讯云中间件_InfoQ精选文章