如何用代理平台解决微服务的一些痛点

本文涉及的产品
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
云原生网关 MSE Higress,422元/月
注册配置 MSE Nacos/ZooKeeper,118元/月
简介: 为什么要做代理平台 微服务架构越来越流行,在一个上百号人开发的项目中,使用微服务的方式,大量模块之间通过接口调用,随之也带来了许多问题: 接口不能及时提供造成阻塞:往往客户端需要等待后台接口进入测试阶段,才能开始进行开发。

为什么要做代理平台

微服务架构越来越流行,在一个上百号人开发的项目中,使用微服务的方式,大量模块之间通过接口调用,随之也带来了许多问题:

  • 接口不能及时提供造成阻塞:往往客户端需要等待后台接口进入测试阶段,才能开始进行开发。一些刚入门的客户端开发(如web前端开发),并没有自行伪造接口数据的能力。
  • 通信数据格式混乱:json、xml、protobuf等各种方式都有,方式相同而数据结构又不统一,主调和被调方都需要自行封装和解析不同格式的数据
  • 日志未收敛汇集 : 日志分散在各个模块,未跟请求链路绑定,异常发生时的故障现场不好还原
  • 各模块重复造轮子:各接口需要自己实现鉴权、限频、验证调用者等通用能力

为解决上述问题,我们约定一套调用规范,并将所有调用收归一处进行代理中转。因此,需要实现一套高可用的代理平台。

代理平台特性

先说一下几个角色

  • 第三方(服务) -- 接口提供方,被调方
  • 调用方(应用) -- 主调方 ,它可以是一个客户端如浏览器、手机APP,也可以是另一个接口提供方(第三方、服务)。
  • 代理平台 -- 请求转发平台。
  • 代理管理平台 -- 可视化配置及查询调用方、第三方、请求日志等数据,
  • 鉴权平台 -- 基于 cookie、token等方式的含登录、权限控制的用户中心

代理平台主要有以下特性

松耦合、消除客户端开发等待。

代理平台除可以正常转发请求外,还可以伪装响应,即代理平台直接按预定规则随机生成响应给调用方,并不请求第三方

统一输入输出格式

严格控制输入格式、标准化输出结构。第三方可以不按结构响应,但是需要在代理管理平台定义转换规则。如果很多事情按照约定来,可以少很多工作。这也是许多框架所倡导的约定优于配置。

规范CGI文档

通过统一的页面,统一录入接口说明、参数说明、响应头及字段说明等等。客户端开发甚至不需要跟后台开发沟通,即可完成开发任务。同时也提高接口的复用性。可以提供相应的注解和注释包,开发者在代码中引入注解或者注释,可以自动完成接口数据在平台上的录入、更新等操作。

输入初步验证

在代理平台定义好入参规则,代理平台在收到请求时,统一对输入参数进行格式验证、必填验证等等。对恶意输入请求进行拦截并记录。

频率控制

代理平台对每个接口提供基于分钟频次或者超频验证码的调用频率控制能力

接口性能统计

统计从平台向第三方发起请求,到平台完全收到第三方的响应的时间,做为第三方接口的性能。

请求日志

目标请求接口,来源ip、请求报文、响应报文、成功状态、耗时、所属的调用树等等整个请求完整的上下文数据,都记录在案。并且,请求到达接口提供方之后,如果第三方处理出现异常,可以将异常日志反向上报到代理平台,由代理平台来关联这次请求的日志

还原调用树(调用链路)

一个调用方请求到达第三方后,有可能级联发起更多的请求。如果这些请求全部经过代理平台。那么代理平台可以记录链路数据,后续在代理管理平台上可视化的还原、呈现整个调用链路,清楚标识每个被调节点的耗时、是否成功等数据,有助于排查故障、性能瓶颈等问题

统一鉴权

登录态检查和接口权限控制可以全部收归代理平台。如果请求转发到了第三方接口,说明用户已登录并对此接口有权限,第三方开发者只需要从头部取封装好的userkey,到统一鉴权中心换取用户信息即可.

协议头规范化及过滤

为防止后台响应一些不规范的头,或者一些危险的头进行过滤。并且平台可以统一处理OPTIONS请求,将预定的协商头响应给客户端,可以灵活配置跨域需求。

来源IP过滤

对接口可以提供IP白名单或者黑名单的功能,合法来源ip的请求才能被转发到后台

多协议支持

需要能够支持多种接口协议,如HTTP、FTP、SMTP等等应用层协议,也需要能直接支持TCP长连接、UDP数据报等协议。并能做到部分协议转换,调用方无感知的使用跟第三方接口不同的协议通信

关联测试用例

每个接口可以集成测试用例,类似于Advance REST Client或PostMan,定时以用例对接口进行输入输出调用测试。这可能需要接口提供方提供专门的测试接口。

服务存活检查,多server时提供负载均衡

第三方可以提供部署服务的多个server ip,由代理管理平台来进行存活检查,但server不可用时从缓存中踢掉此server,代理平台对多个server ip实现负载均衡。server故障时向真实接口方发出告警。

对第三方接口压测

代理平台本身需要具备较强的并发能力。但更重要的是接口本身支持高吞吐量访问。代理平台可以对第三方接口进行压测,以推进第三方优化接口性能及并发能力。

实现方式

nginx+lua+confd + etcd

confd + etcd 用来实现实时动态更新nginx配置,当有接口新增或修改时,动态生成server或者location配置。nginx来实现请求转发。lua脚本来实现一些诸如日志上报、鉴权检查、协议头检查等等逻辑。
这种方式在接口量较小时是个不错的选择。但是当接口数量达到成千上万的级别后,动态生成的nginx配置会非常大,不利于问题排查,且容易生成冲突、错误的nginx配置,致使nginx进程异常。并且上面提到的一些复杂的目标,如还原调用链路、输入参数验证、关联测试用例等,此方式也很难实现。

camel

apache camel是一个协议转换的框架,可以很方便实现协议转换、请求路由转发。下面是代理平台及代理管理平台的架构及请求处理过程示意。

 

其中

clinet 即为调用方,使用平台提供的各种语言(js、c、java、php、python等)的sdk,可以对调用方无感知的包装一些验证、标识头部。这也是还原调用链路的基础。如果不使用sdk,同样可以向代理平台发起请求。SDK主要做提供两个功能:1、透传标识头、来源路径头信息等等。2、向代理管理平台上报此次请求处理出现的异常日志。

cgi_proxy 即是基于camel开发的代理平台。主要实现验证请求合法性(appkey)、登录态验证与权限控制、协议转换、参数验证、请求转发、头部特殊字段处理、格式化响应、请求日志记录等等。日志由异步线程写入到消息队列。转发请求需要的数据从redis中获取,redis中存储了接口提供方真实接口地址、参数规则、合法appkey等信息。因为在client看来,请求的处理时间是平台处理时间+真实接口处理时间,只有平台处理足够快,才能减少性能损失,所以cgi_proxy 不从任何接口查询数据,也不直接操作db,只从redis查询数据,这样可以很好的减少性能损失

log_coll收集消息队列中的请求日志落地存储,并按时对全平台接口调用情况进行统计,生成运营数据。当每日的调用量达到百万、千万级别时,比db分表更好的手段是由此进程定时迁移旧的数据。

manager 即代理管理平台。定义一套接口模型,将各种后台接口按模型规范并存储至db。将核心的数据缓存到redis。在页面实现可视的接口编辑、日志查询等能力

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
相关文章
|
6月前
|
人工智能 监控 安全
java基于微服务架构的智慧工地监管平台源码带APP
劳务管理: 工种管理、分包商管理、信息采集、班组管理、花名册、零工采集、 现场统计、考勤管理、考勤明细、工资管理、零工签证
319 4
|
6月前
|
Java 关系型数据库 数据库
微服务设计|基于SpringCloud微服务技术的旅游信息平台的设计与实现
微服务设计|基于SpringCloud微服务技术的旅游信息平台的设计与实现
157 0
|
1月前
|
消息中间件 缓存 Java
亿级流量电商平台微服务架构详解
【10月更文挑战第2天】构建一个能够处理亿级流量的电商平台微服务架构是一个庞大且复杂的任务,这通常涉及到多个微服务、数据库分库分表、缓存策略、消息队列、负载均衡、熔断降级、分布式事务等一系列高级技术和架构模式。
91 3
|
4月前
|
消息中间件 负载均衡 数据管理
微服务架构在电商平台中的应用与实践
在现代电商平台的开发和运维中,微服务架构成为了提升系统灵活性和可扩展性的关键技术。本篇文章从实践出发,深入探讨了微服务架构在电商平台中的具体应用,包括服务拆分策略、通信机制、数据管理、以及常见的挑战和解决方案。通过真实的案例分析和代码示例,帮助读者全面了解微服务架构的优势和实施方法,提供在实际项目中的实践指导。
|
5月前
|
消息中间件 存储 网络协议
在微服务中使用代理
【6月更文挑战第16天】本文介绍了消息队列的原理,重点关注AMQP(5672端口)及其在分布式系统中的作用。消息代理执行错误检查、路由、分发任务,类比于邮政系统,确保可靠传输和系统性能提升,适应微服务架构的需求。
54 3
在微服务中使用代理
|
6月前
|
监控 负载均衡 Java
【阿里云云原生专栏】微服务架构在阿里云云原生平台上的应用实例与优化策略
【5月更文挑战第20天】本文介绍了在阿里云云原生平台实现微服务架构的步骤,包括基于Spring Cloud的Docker化部署、使用ACK部署微服务,以及优化策略:服务发现与负载均衡(借助Istio)和监控日志管理。通过这种方式,企业能提升应用的可扩展性、可维护性和敏捷性。
254 5
|
6月前
|
监控 数据可视化 安全
智慧工地SaaS可视化平台源码,PC端+APP端,支持二开,项目使用,微服务+Java++vue+mysql
环境实时数据、动态监测报警,实时监控施工环境状态,有针对性地预防施工过程中的环境污染问题,打造文明生态施工,创造绿色的生态环境。
62 0
智慧工地SaaS可视化平台源码,PC端+APP端,支持二开,项目使用,微服务+Java++vue+mysql
|
6月前
|
Serverless 云计算 Docker
SAE是全场景Serverless计算平台,深度融合微服务
【5月更文挑战第2天】SAE是全场景Serverless计算平台,深度融合微服务,提供SAE Job任务场景解决方案,具备便捷、节省、稳定、透明和省心的特点。而ECI是Serverless容器运行服务,结合云计算理念,仅需Docker镜像即可运行,支持细粒度资源计费,旨在降低成本和提升效率。SAE侧重应用管理和运营,ECI专注于优化容器资源使用。
73 0
|
6月前
|
存储 运维 监控
|
6月前
|
自然语言处理 运维 Cloud Native
云原生技术专题 | 探索云原生化的服务架构体系的技术风向,攻克云原生化微服务架构的痛点和特性
云原生技术专题 | 探索云原生化的服务架构体系的技术风向,攻克云原生化微服务架构的痛点和特性
138 0