使用redis和mq完成接口的统一管理进化过程
为了统一规范好系统与系统之间的接口调用关系,我们开发了“接口中心”这个服务。其主要作用是统一接口暴露,统一鉴权配置,统一日志记录,最后可以通过图形报表形成调用关系图。
那么我们在1.0版本的逻辑图如下:
接口中心搭建完毕后,基本解决了,服务与服务之间的接口统一管理等问题。
但是由于接口通讯太过于集中,导致请求高峰期接口中心可能宕机。这种集中化管理也违背了微服务的设计初衷。
待解决的问题:
1、如何让接口之间的调用与接口中心尽量解耦。
2、在微服务架构的前提下如何集中控制接口的鉴权问题,而做到尽量少的影响微服务的本身架构体系。
3、如何让调用方尽量不感知调用的鉴权过程。(因为接口能不能被访问是被调用方的事情,如我去张三家里串门,让不让我进门是张三的事情一样。)
我们尝试着通过下图解决这些问题,姑且叫2.0版本:
说明:
1、接口中心完成暴露和接口鉴权配置提交后统一放在redis上面。
2、由接口的发布方(服务B)完成鉴权和校验最后响应请求。
3、通过MQ异步的方式来实现日志记录,做到日志记录与接口请求解耦。
4、服务B 都引用接口中心的jar包来完成服务之间的调用。
另外一种处理方法类似dubbo的服务调度方式:
1、也是接口中心完成暴露和接口鉴权配置提交后统一放在redis上面。
2、由服务A来到redis拿到允许访问的接口地址,再向服务提供者发起请求。
3、任然通过MQ异步的方式来实现日志记录,做到日志记录与接口请求解耦。
最后是日志记录表:
CREATE TABLE `api_access_log` (
`log_id` int(11) NOT NULL AUTO_INCREMENT,
`request_id` varchar(32) NOT NULL COMMENT '请求id',
`api_no` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '接口编码',
`call_system_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '调用服务名称',
`public_system_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '被调用服务名称',
`api_call_link` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT 'API调用URI(含根路径)',
`api_public_link` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT 'API发布URI链接(含根路径)',
`http_req_type` varchar(10) DEFAULT NULL COMMENT 'http访问类型 get post ...',
`access_time` datetime DEFAULT NULL COMMENT '访问时间',
`access_duration` int(11) DEFAULT NULL COMMENT '访问时长(毫秒)',
`res_http_code` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '返回HTTP状态码',
`via_value` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '路由值'
PRIMARY KEY (`log_id`),
KEY `api_access_log_access_time_index` (`access_time`)
) ENGINE=InnoDB AUTO_INCREMENT=31741865 DEFAULT CHARSET=utf8mb4 COMMENT='访问日志表';
其中在微服务多层级调用中比较重要的是request_id,我们认为一个前端访问可能涉及到微服务中的多层逐级的请求,这种逐级的请求为了有可追溯性,我们定义request_id保持一致,通过日志表中的request_id和相关信息我们可以解析出一个请求过程。
注:如果我们将日志记录在es里面效率应该会更高!对于大量数据的处理es的优势比mysql高很多!
思考:接口中心对接口进行统一管理真的有意义吗?接口中心到底要达到的目的是什么?
事实上在长达一年半的接口中心使用过程中,我们并没有基于什么原因禁止或者限制某个服务不能访问某个接口,因为我们认为内部服务之间的访问是安全可信的,而整个集群服务对外的安全可以依赖于系统网关的鉴权,而不需要在接口中心来考虑。而真正需要鉴权、限流等操作的是来自外部系统的访问。而2.0版本虽然将鉴权的逻辑与接口中心解耦开了,但是被访问系统仍然需要耗时去判断访问接口的权限问题,这会导致每个接口都需要损耗一定的时间去判断访问权限,这是一定程度的对资源的浪费。如果如下图改一下会怎样?
我们可以增加的日志分析模块,我们认为接口访问的日志记录还是很有用处的。首先,通过日志记录可以找到一整串请求链,特别是微服务这种一个线程里面动辄几个到几十个对于其他服务的请求,在排查问题的时候必不可少。其次,日志记录还可以分析出每个接口的请求频率,这样就方便服务器资源的调配。
那么当服务越来越多,服务容量,服务资源的浪费等问题的逐步显现,对于信息化内部真正需要治理和关注的不是鉴权问题,而是资源的合理利用。此时需要一个对各个服务的使用情况进行分析和配置的“调度中心”来实施服务集群的管理,以提高集群的可用性和使用效率。而此时资源调度和服务治理的面向服务的架构逻辑“SOA”登场。
使用redis和mq完成接口的统一管理进化过程相关推荐
- axios封装,api接口封装统一管理
axios封装,api接口封装统一管理 一. axios说明 Axios 是一个基于 promise 的 HTTP 库,可以用在浏览器和 node.js 中. axios的封装和api接口的统一管理, ...
- Vue + webpack 项目配置化、接口请求统一管理
准备工作 需求由来: 当项目越来越大的时候提高项目运行编译速度.压缩代码体积.项目维护.bug修复......等等成为不得不考虑而且不得不做的问题. 又或者后面其他同事接手你的模块,或者改你的bug ...
- axios请求接口http_Vue实战038:api接口模块化统一管理
一开始使用Vue时,我们用axios发送请求时一般会将api接口直接写在对应的请求方法中,这样当我们项目需要修改请求时我们就需要先去找到当前的组件,然后再找到对应的事件方法,最后才能将api修改,这样 ...
- ibm linux mq 发送消息_RabbitMq、ActiveMq、Kafka和Redis做Mq对比
一.RabbitMq RabbitMQ是一个Advanced Message Queuing Protocol(AMQP)的开源实现,由以高性能.可伸缩性出名的Erlang写成.RabbitMQ Se ...
- redis之mq实现发布订阅模式
https://github.com/smltq/spring-boot-demo/blob/master/mq-redis 概述 Redis不仅可作为缓存服务器,还可用作消息队列,本示例演示如何使用 ...
- redis 判断存在性_实战 | springboot+redis+拦截器 实现接口幂等性校验
来源:https://www.jianshu.com/p/6189275403ed 一.概念 幂等性, 通俗的说就是一个接口, 多次发起同一个请求, 必须保证操作只能执行一次 比如: 订单接口, 不能 ...
- nginx lua连接mysql_OpenResty的安装和在nginx中使用lua直接访问mysql达到数据接口的统一...
OpenResty 它打包了标准的 Nginx 核心,很多的常用的第三方模块,以及它们的大多数依赖项. 如果需要nginx的第三方库的时候,可以考虑OpenResty,可以少掉很多安装的麻烦,Open ...
- android自定义dialog开源库,android-dialog: 此框架提供五种对话框的显示,并支持对话框的扩展,目的是为了提供对话框的统一管理,并提供对话框显示的公共接口。...
android-dialog 此框架提供七种对话框的显示,并支持对话框的扩展,目的是为了提供对话框的统一管理,并提供对话框显示的公共接口. LoadingDialog:正在加载对话框 MessageD ...
- prometheus监控redis(无metric接口)
1,部署一个测试环境 [root@\ k8s-m-01~]# mkdir redis [root@\ k8s-m-01~]# cd redis/[root@\ k8s-m-01~/redis]# vi ...
最新文章
- 原创 | 工业场景中的预测性维护
- 两个组件连线_如何正确的使用日志组件 Log4j、SLF4J、Logback
- VS2010/MFC编程入门之二十九(常用控件:列表视图控件List Control 下)
- python函数图像加标签_tkinter(py3)更改图像标签,函数内部,实时
- (三十一)java版spring cloud+spring boot+redis多租户社交电子商务平台-spring-cloud-config...
- mysql函数(二.数字函数)
- usb设备由生产到使用 java 114979888
- SpringBoot如何直接访问HTML页面
- python程序设计知识点汇总_Python入门知识点汇总
- mysql高效获取两张表共同字段的交集数据
- CART树算法的剪枝算法
- 美通企业日报 | 阿里收购网易考拉入股网易云音乐;宁德时代与博世达成战略合作...
- 鸿蒙轻量级数据存储Preferences
- 欧设传奇服务器修改充值记录,沙巴克传奇修改记录(包含详细修改路径)
- 'Project Name' was compiled with optimization - stepping may behave oddly
- 盒子模型--标准盒模型和怪异盒模型
- 【计算机基础】中英文常用名词对照
- PHP微信公众平台开发视频
- TCP连接建立三握手
- 袪除疾病的心法(十三)财运篇
热门文章
- 每次打开office2010都会出现正在配置,很烦?关掉它!
- c语言注入dll能实现什么功能,教大家写一个远程线程的DLL注入,其实还是蛮简单的……………………...
- 使用纳米孔测序数据进行16S-DNA条形码研究的计算方法[综述]
- 聊聊代理ip常见的三大协议。
- 波特率自适应的RS-485中继器设计
- 图像的变换——fft/ ifft、fftn、fft2、dct2、dict2、dctmtx
- UnityShader-素描铅笔画风格 实现详解
- PyTorch中BN层中新加的 num_batches_tracked 有什么用?
- C++游戏编程:创建3D游戏第一章习题
- 宇龙酷派2014夏令营软件类笔试题(JAVA)