本文主要介绍微服务API网关的微服务设计,分为两个方面:
- 微服务API网关管理模块设计 - 时序图
- 微服务API网关核心模块设计 - 时序图
目录 Table of Contents
UML
- 时序图一般由角色、对象、生命线、控制焦点、消息和组合片段构成。
控制焦点
- 控制焦点是时序图中表示时间段的符号,在此时间段内对象将执行相应的操作。
消息
消息类型 | 说明 |
---|---|
同步消息 | 发送者同步调用接收者,两者顺序工作 |
异步消息 | 发送者异步调用接收者,两者并发工作 |
返回消息 | 从调用中返回结果 |
自联消息 | 调用对象自身方法 |
组合片段
组合类型 | 说明 |
---|---|
Alternative Fragment (alt) | 相当于 if-else |
Option Fragment (opt) | 相当于 switch-case |
Parallel Fragment (par) | 相当于 go |
Loop Fragment (loop) | 相当于 for |
微服务API网关管理模块设计
架构图
- 下图是微服务API网关管理模块的架构图,微服务API网关管理模块的内部逻辑是典型的MVC模式,由
UI
层、Router
层、Controller
层和Dao
层组成。
UI
层即前端可视化的管理平台界面,前端代码被编译打包后,将静态托管于管理模块中。Router
层对外暴露API接口,定义了API的请求方法和访问路径,编排了所应用的中间件的类型和顺序。Controller
层是具体实现业务逻辑的层次,在该层次进行用户登录、用户登出、管理用户、管理服务、管理应用和数据统计功能的编写。Dao
层作为数据库驱动层直接对接不同类型的数据库,管理模块支持对MySQL
和Redis
进行操作。UI
层和Router
层之间主要传输json
数据,统一了前后端的数据传输格式;Router
层和Controller
层之间主要传输程序定义的dto
(数据传输对象) 结构体;Controller
层和Dao
层之间主要传输程序定义的po
(持久化对象) 结构体。
时序图
- 下图是微服务API网关管理模块的时序图,来描述管理员用户如何通过管理模块进行登录登出和各项配置管理。
- 第1步到第2步,管理员用户需要输入用户名称和用户密码登录,此时登录生成的会话信息将保存到
Redis
,以便保持一定时间内的登录状态。 - 第3步到第5步,管理员用户添加、修改或删除配置,配置的变更将会分别存入到
MySQL
和Redis
中。 - 第6步到第12步,管理员用户查询配置,若缓存命中则直接从
Redis
中读取配置的缓存数据,若缓存未命中则会从MySQL
中读取配置的数据库数据,并将配置回写到Redis
缓存中,然后返回配置给管理员用户。 - 第13步到第14步,当管理员用户登出时,管理模块将删除
Redis
中对应的会话信息,此后该管理员用户的登录状态不再保持,可以选择重新登录或者切换账户登录。
微服务API网关核心模块设计
架构图
- 下图是微服务API网关核心模块的架构图,微服务API网关核心模块由多个中间件以洋葱模型的形式组织起来,并与
Redis
和Consul
结合使用,为不同形态的客户端提供多协议的后台服务统一入口。
App
应用或Web
应用发起请求,在核心模块中经过协议接入、权限认证、流量统计、流量控制、请求重写、负载均衡和反向代理中间件的处理,最终到达后台的HTTP
服务、HTTPS
服务或WebSocket
服务。- 其中,后台的服务应预先配置好服务和应用的配置,方便核心模块的协议接入中间件和权限认证中间件读取服务和应用的配置进而处理后续的业务逻辑。同时,后台的服务也应先在
Consul
中注册服务名称和地址,方便核心模块的负载均衡中间件发现服务地址,根据权重列表设置和负载均衡算法合理分发流量,最后交由反向代理中间件去访问实际的后台服务。 - 特别地,在核心模块中应该保持对服务地址变化的监听,
Consul
也有必要周期性对后台服务进行健康检查,保证服务的可用性。
时序图
- 下图是微服务API网关核心模块的时序图,来说明应用如何通过核心模块进行公共逻辑处理和请求代理转发。
- 第1步,应用发起请求。
- 第2步到第7步,核心模块先向
Redis
缓存查询服务配置进行协议接入,然后查询应用配置进行权限认证。 - 第8步到第11步,进行流量统计和流量控制,并回写入
Redis
。 - 第12步,根据规则进行请求重写。
- 第13步到第15步,根据服务发现获取的地址列表以及预先配置的权重列表应用指定的负载均衡算法选出访问地址。
- 第16步到第18步,核心模块使用负载均衡地址反向代理访问后台服务,并将响应返回给应用。
FAQs
Q:并行和异步如何用时序图来表示?
A:首先确定触发的时间点,接着判断是否并行,最后判断是否异步