业务准备
一个传统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 | 密码重置 |
架构设计
技术选型
- 注册中心: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)
,从而完成整个请求响应的闭环。至于上图中出现的服务治理,服务监控,链路追踪等细节,我们后续在执行到相关知识时再详细了解。