1.后端整体服务
整体服务分层
- 前端页面渲染
- 业务逻辑层
- 服务层
我们使用的技术包括:
开发:配置管理,服务发现,远程调用,网关,日志追踪
监控:prometheus监控,apm性能管理
部署:docker,k8s, ansible
基础组件:mysql,redis,mqtt,rabbitmq
2. 服务管理
- 配置管理
代码配置分离
我们通过git集中化进行配置管理,配置和程序代码分离,即做到一份程序,多份配置,多处部署
实时刷新配置
通过springcloud-bus项目,我们可以实时动态热更新运行中的程序配置,避免修改配置需要重新打包发布
配置获取
通过域名conf.jinyi999.cn/{项目名称}/{环境} 获取应用相应环境的配置,比如http://conf.jinyi999.cn/ytx-sso/k8s或者sso项目k8s环境的配置
2. 服务注册发现
传统服务管理问题
传统服务通过域名管理,通过nginx代理服务域名,需要管理nginx和后端服务关系,在微服务时代,服务量级会不断增加,通过传统的nginx管理服务十分不便。比如新增节点,减少节点,都需要对nginx进行重新配置。通过获取服务信息也十分困难不便
服务发现好处
服务发现的好处在于,可以零编码的对所以服务进行动态管理,获取服务信息,如服务ip,端口,监控状态等。我们使用的是eureka进行服务发现管理。
服务发现模型
服务发现本身需要保证服务的分布式高可用,所以服务发现本身相对比较复杂。在分布式CAP理论基础上,eureka服务发现使用了AP模型,在网络出现问题时,保证了服务的可用性,牺牲了一致性
eureka高可用
我们部署了三台eureka服务,三个节点两两相互备份,保证服务的高可用性,任意一个节点挂了都不会影响服务的可用性
统一管理各自语言服务:包括java服务,nodejs服务,go服务,并且可以不断扩张
3.远程调用
- 远程调用简称RPC,在我们微服务体系中,我们选用了http作为远程调用协议(后续可以升级为gRpc等方式)。在springcloud体系中,我们使用了feign通过ribbon来进行远程调用。ribbon封装了httpclient或者okhttp,通过eureka获取服务地址并做负载均衡。我们使用了okhttp进行访问,提高http访问效率
重试机制
远程调用需要考虑重试,比如由于网络超时、服务不稳定等原因造成访问失败。ribbon提供的重试机制为:对于所有GET幂等请求进行重试,重试方式是本机重试或者重新选取一个节点重试。相关配置为:
1
2
3
4
5
6
7
8ribbon:
MaxAutoRetries: 1 #本机重试一次
MaxAutoRetriesNextServer: 1 #重新选举一台重试
okhttp:
enabled: true #使用okhttp
eureka:
registry-fetch-interval-seconds: 5 #5s从注册中心获取一次服务信息
4.网关
在微服务时间,服务数量相对传统单体应用会增加许多。我们通过统一的网关服务zuul代理访问所有的服务。
网关好处
统一服务入口,避免客户端调用不同服务
统一日志管理
统一监控
统一权限控制
统一流量控制
通过网关,我们可以做很多工作,后续如蓝绿发布,a/b test等
5.日志追踪
在单体应用时代,所有服务日志在一个应用中,而在微服务时代,一次请求涉及多个服务,日志追踪就变的十分重要。我们使用springcloud-sleuth组件进行日志追踪管理,所有日志都会有一个traceid,当进行远程调用时,该traceid会被传递到下游服务。我们的日志样例如下:
1 | 2017-09-01 16:09:56.828 INFO [zuul-server,e3459faf4e4115d8,e3459faf4e4115d8,false] 9 |
traceid=e3459faf4e4115d8,同时我们记录了每次请求的耗时和httpcode,方便排查问题
zipkins
zipkins是一个tracing可视化工具,通过zipkins,我们将所有服务调用链串联起来。
3. 部署
- 服务Docker化
所有服务使用docker打包集成,提高部署的持续集成、版本控制、可移植性、隔离性和安全性。
开发测试环境所有部署使用自动化,通过gitlab pipeline完成。单测,sonar检查,build,docker镜像部署,上传docker仓库,部署到k8s环境,全部自动化。线上环境部署通过ansible进行自动化
4. 监控
基于网关的统一监控
微服务架构由于服务较为分散,造成监控不便,我们通过统一的网关收率监控对象,将所有数据存储到prometheus中,通过grafana进行图表绘制以及报警。有任何错误可以在10s内进行报警
- springboot 服务监控
我们所有的微服务使用springboot框架开发,集成了actuator模块,自动暴露了/health,/metrics等接口,通过springboot-admin模块,我们集成了eureka获取了所有模块的列表,通过每个模块的/health,/metrics接口获取模块信息。
springboot-admin模块页面如下:
通过springboot-admin,我们可以实时观察到每个模块是否存活,健康状态
每个模块的内容包括:模块信息,调用情况,环境变量,调用情况
比较有用的是模块信息,比如启动时间,内存占用等。
- docker 监控
使用cadvisor+prometheus监控docker容器状态,可以获取所有机器和服务的的cpu,内存,磁盘等使用信息