业务准备

一个传统web系统,用户模块永远是不可或缺的一环,也作为一个系统的基石。下列的教程中将使用go-micro来编写一个用户服务,以此作为开发的基础。下面是一个用户服务中暴露的api以及内部调用rpc方法规划。

api

/user POST 注册
/user/:id GET 获取用户信息
/user/token POST 认证获取token
/user GET 获取用户列表
/user/:id PUT 更新用户
/user/:id DELETE 删除用户
/user/password POST 发起密码重置
/user/password PUT 重置密码

rpc

Get 根据ID获取用户信息
Pagination 获取分页数据
Create 创建用户
Update 更新用户
Delete 删除用户
Auth 认证获取token
Validate 验证token
CreatePasswordReset 创建密码重置记录
ResetPassword 密码重置

架构设计

用户服务架构图-第 2 页.drawio.png

技术选型

  • 注册中心:etcd
  • api网关:micro-api v2
  • api服务:gin
  • 微服务:go-micro v2
  • 数据库:mysql
  • 服务追踪:opentracing/jaeger
  • 服务监控:prometheus + grafana
  • 消息队列:rabbit-mq
  • 缓存系统:redis
  • 搜索服务:elasticsearch
  • 日志系统:ELK

上述中所有描述的组件,在单机阶段我们都使用docker-compose来进行实践。后续我完成编码以及单机部署后再基于k8s进行部署

总结一下上图中用户请求到响应的整个流程,用户在前端发起请求,请求到达服务器后通过nginx或其他的负载均衡器中,通过反向代理把请求转发到micro-api统一网关。关于micro-api网关,你同样可以把他理解为一个分发路由,micro-api启动后会通过服务发现找到所有已经注册的api服务,然后解析路由规则将请求分发到到我们指定的api服务。而api服务会通过grpc向service请求,实际中api服务并不参与过多的密集计算或IO处理,最终处理压力交由service来承担。service处理完成将响应返回给api服务,api再返回响应给到接入层(nginx),从而完成整个请求响应的闭环。至于上图中出现的服务治理,服务监控,链路追踪等细节,我们后续在执行到相关知识时再详细了解。