微服务简介

1.后端整体服务

服务简介

整体服务分层

  1. 前端页面渲染
  2. 业务逻辑层
  3. 服务层

我们使用的技术包括:

开发:配置管理,服务发现,远程调用,网关,日志追踪

监控:prometheus监控,apm性能管理

部署:docker,k8s, ansible

基础组件:mysql,redis,mqtt,rabbitmq

2. 服务管理

  1. 配置管理
  • 代码配置分离

    我们通过git集中化进行配置管理,配置和程序代码分离,即做到一份程序,多份配置,多处部署

    配置管理

2. 服务注册发现

  • 传统服务管理问题

    传统服务通过域名管理,通过nginx代理服务域名,需要管理nginx和后端服务关系,在微服务时代,服务量级会不断增加,通过传统的nginx管理服务十分不便。比如新增节点,减少节点,都需要对nginx进行重新配置。通过获取服务信息也十分困难不便

  • 服务发现好处

    服务发现的好处在于,可以零编码的对所以服务进行动态管理,获取服务信息,如服务ip,端口,监控状态等。我们使用的是eureka进行服务发现管理。

    WX20170901-152000@2x

  • 服务发现模型

    服务发现本身需要保证服务的分布式高可用,所以服务发现本身相对比较复杂。在分布式CAP理论基础上,eureka服务发现使用了AP模型,在网络出现问题时,保证了服务的可用性,牺牲了一致性

  • eureka高可用

    我们部署了三台eureka服务,三个节点两两相互备份,保证服务的高可用性,任意一个节点挂了都不会影响服务的可用性

    WX20170901-154026@2x

  • 统一管理各自语言服务:包括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
    8
    ribbon:
    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
2
3
4
5
2017-09-01 16:09:56.828  INFO [zuul-server,e3459faf4e4115d8,e3459faf4e4115d8,false] 9 
--- [nio-8041-exec-1] c.y.f.base.filter.RequestLoggingFilter :
After request [method=POST,After request [uri=/api/user-center/device/save;payload={"deviceToken":"dd6f96fb3a9c10e6f9087d5ab5291e37",
"deviceId":"CC2165D8-BADC-476F-8ED8-B71A04CC2E41","userId":9,"os":"IOS","appVersion":"1.5.0"}],
time=12(ms),code=200]

traceid=e3459faf4e4115d8,同时我们记录了每次请求的耗时和httpcode,方便排查问题

  • zipkins

    zipkins是一个tracing可视化工具,通过zipkins,我们将所有服务调用链串联起来。

zipkins

3. 部署

  • 服务Docker化

所有服务使用docker打包集成,提高部署的持续集成、版本控制、可移植性、隔离性和安全性。

开发测试环境所有部署使用自动化,通过gitlab pipeline完成。单测,sonar检查,build,docker镜像部署,上传docker仓库,部署到k8s环境,全部自动化。线上环境部署通过ansible进行自动化

pipeline

4. 监控

  • 基于网关的统一监控

    微服务架构由于服务较为分散,造成监控不便,我们通过统一的网关收率监控对象,将所有数据存储到prometheus中,通过grafana进行图表绘制以及报警。有任何错误可以在10s内进行报警

zuul-prometheus

zuul-prometheus

  • springboot 服务监控

我们所有的微服务使用springboot框架开发,集成了actuator模块,自动暴露了/health,/metrics等接口,通过springboot-admin模块,我们集成了eureka获取了所有模块的列表,通过每个模块的/health,/metrics接口获取模块信息。
springboot-admin模块页面如下:
springboot-admin
通过springboot-admin,我们可以实时观察到每个模块是否存活,健康状态

每个模块的内容包括:模块信息,调用情况,环境变量,调用情况
springboot-admin
比较有用的是模块信息,比如启动时间,内存占用等。

  • docker 监控

使用cadvisor+prometheus监控docker容器状态,可以获取所有机器和服务的的cpu,内存,磁盘等使用信息

docker cadvisor