一、微服务基础架构关键点
主要由下面七个模块组成:
微服务技术体系,粉红色标注的模块是和微服务关系最密切的模块:
二、服务框架选型
1.基于 Spring 的框架本质上可以认为是一种 RESTful 框架,序列化协议主要采用基于文本的 JSON,通讯协议一般基于 HTTP,RESTful 框架天然支持跨语言,任何语言只要有 HTTP 客户端都可以接入调用,但是客户端一般需要自己解析 payload。Swagger 自动生成API文档
feign
2.服务间调用RPC框架
- dubbo 本质上是一套基于Java的RPC框架,协议thrift/dubbo
- dobbox,是当当扩展了dubbo,支持了RESTful接口暴露能力
- thrift, 基于thrift协议跨语言RPC框架
- TChannel,基于thrift协议跨语言RPC框架,对比thrift,实现了调用链追踪,集群监控
- Finagle
- Hassian
三、运行时支撑服务选型
运行时支撑服务主要包括服务注册中心,服务路由网关和集中式配置中心三个产品。
1.服务注册中心
- 如果采用 Spring Cloud 体系,选择Eureka是最佳搭配,Eureka在Netflix经过大规模生产验证,支持跨数据中心,客户端配合Ribbon可以实现灵活的客户端软负载,但Eureka2.0已闭源,使用时,需考虑版本问题
- Consul,基础架构中的一款服务发现和配置的工具
- 服务发现:Consul client 可以提供服务,例如api或mysql,也可以使用Consul client来发现指定服务的提供者。 使用DNS或HTTP,应用程序可以轻松找到他们所依赖的服务。
- 健康检查:Consul client 可以提供任何数量的健康检查,或者与给定的服务(“Web服务器是否返回200 OK”),或与本地节点(“内存利用率是否低于90%”)相关联。 可以使用此信息来监控集群运行状况,服务发现组件使用此信息将流量从有问题的主机中移除出去。
- KV Store:应用程序可以使用Consul的分层键/值存储,包括动态配置,功能标记,协调,leader选举等等。 简单的HTTP API使其易于使用。
- 多数据中心:Consul支持多个数据中心。 这意味着Consul的用户不必担心构建额外的抽象层以扩展到多个区域。
2.服务网关
- zuul,Spring Cloud体系,1.X
- Kong,基于Nginx/OpenResty,采用nginx内核,异步性能较强
- Spring-Cloud-Gateway,性能比zuul好,完美兼容spring cloud体系
3.配置中心
- Spring-Cloud-Config,配合git使用,需要spring-cloud-bus可实现配置事时生效
- disconf,蚂蚁金服技术专家发起,但与spring boot和spring cloud相关性弱
- apollo,携程开发,配置实时生效,携程经过生产级验证,且完美支持spring cloud
四、服务监控选型
主要包括日志监控,调用链监控,Metrics 监控,健康检查和告警通知等产品。
ELK 目前可以认为是日志监控的标配,功能完善开箱即用。Elastalert是 Yelp 开源的针对 ELK 的告警通知模块。
调用链监控目前社区主流是点评 CAT,Twitter 之前开源现在由 OpenZipkin 社区维护的 Zipkin和Naver 开源的 Pinpoint。个人比较推荐点评开源的CAT,在点评和国内多家互联网公司有落地案例,生产级特性和治理能力较完善,另外 CAT 自带告警模块。
Metrics 监控主要依赖于时间序列数据库 (TSDB),目前较成熟的产品是 StumbleUpon 公司开源的基于 HBase 的 OpenTSDB(基于 Cassandra 的 KariosDB也是一个选择,它基本上是 OpenTSDB 针对 Cassandra 的一个改造版),OpenTSDB 具有分布式能力可以横向扩展,但是相对较重,适用于中大规模企业。
OpenTSDB 本身不提供告警模块,Argus是 Salesforce 开源的基于 OpenTSDB 的统一监控告警平台,支持丰富的告警函数和灵活的告警配置,可以作为 OpenTSDB 的告警补充。近年也出现一些轻量级的 TSDB,如 InfluxDB和 Prometheus,这些产品函数报表能力丰富,自带告警模块,但是分布式能力不足,适用于中小规模企业。Grafana是 Metrics 报表展示的社区标配。
五、服务容错选型
针对 Java 技术栈,Netflix 的 Hystrix把熔断、隔离、限流和降级等能力封装成组件,任何依赖调用(数据库,服务,缓存)都可以封装在 Hystrix Command 之内,封装后自动具备容错能力。Hystrix 起源于 Netflix 的弹性工程项目,经过 Netflix 大规模生产验证,目前是容错组件的社区标准。其它语言栈也有类似 Hystrix 的简化版本组件。
Hystrix 一般需要在应用端或者框架内埋点,有一定的使用门槛。对于采用集中式反向代理(边界和内部)做服务路由的公司,则可以集中在反向代理上做熔断限流,例如采用 Nginx或者 Kong这类反向代理,它们都插件支持灵活的限流容错配置。Zuul 网关也可以集成 Hystrix 实现网关层集中式限流容错。集中式反向代理需要有一定的研发和运维能力,但是可以对限流容错进行集中治理,可以简化客户端。
Spring-Cloud-Gateway内部已经集成hystrix
六、后台服务选型
后台服务主要包括消息系统,分布式缓存,分布式数据访问层和任务调度系统。后台服务是一个相对比较成熟的领域,很多开源产品基本可以开箱即用。
1.消息系统
- kafka 分布式架构
- RocketMQ 分布式架构
- RabbitMQ 主从架构
- ActiveMQ 主从架构
2.分布式缓存
- Redis,有搜狐开源的cachecloud,统一管理
- Memcached
3.分布式数据访问层
- sharding-jdbc,当当开源,分库分表逻辑做在客户端jdbc driver中,客户端直连数据库比较简单轻量
- MyCAT,mycat是从阿里Cobar演化出来的社区开源分库分表中间件
4.任务调度系统
- xxl-job,许雪里开源,部署简单轻量
- elastic-job,当当开源
七、服务安全选型
对于微服务安全认证授权机制一块,目前业界虽然有 OAuth 和 OpenID connect 等标准协议,但是各家具体实现的做法都不太一样,企业一般有很多特殊的定制需求,整个社区还没有形成通用生产级开箱即用的产品。
大部分公司的做法都是基于 OAuth 和 OpenID connect 标准,在参考一些开源产品的基础上(例如 Mitre 开源的 OpenID-Connect-Java-Spring-Server),定制自研轻量级授权服务器。
Wso2 提出了一种微服务安全的参考方案,建议参考,该方案的关键步骤如下:
- 使用支持 OAuth 2.0 和 OpenID Connect 标准协议的授权服务器(个人建议定制自研);
- 使用 API 网关作为单一访问入口,统一实现安全治理;
- 客户在访问微服务之前,先通过授权服务器登录获取 access token,然后将 access token 和请求一起发送到网关;
- 网关获取 access token,通过授权服务器校验 token,同时做 token 转换获取 JWT token。
- 网关将 JWT Token 和请求一起转发到后台微服务;
- JWT 中可以存储用户会话信息,该信息可以传递给后台的微服务,也可以在微服务之间传递,用作认证授权等用途;
- 每个微服务包含 JWT 客户端,能够解密 JWT 并获取其中的用户会话信息。
- 整个方案中,access token 是一种 by reference token,不包含用户信息可以直接暴露在公网上;JWT token 是一种 by value token,可以包含用户信息但不暴露在公网上。
八、服务部署平台选型
容器已经被社区接受为交付微服务的一种理想手段,可以实现不可变(immutable)发布模式。一个轻量级的基于容器的服务部署平台主要包括容器资源调度,发布系统,镜像治理,资源治理和 IAM 等模块。
集群资源调度系统:屏蔽容器细节,将整个集群抽象成容器资源池,支持按需申请和释放容器资源,物理机发生故障时能够实现自动故障迁移 (fail over)。目前 Google 开源的 Kubernetes,在 Google 背书和社区的强力推动下,基本已经形成市场领导者地位,社区的活跃度已经远远超过了 mesos和 swarm 等竞争产品,所以容器资源调度建议首选 K8s。当然如果你的团队有足够定制自研能力,想深度把控底层调度算法,也可以基于 Mesos 做定制自研。
镜像治理:基于 Docker Registry,封装一些轻量级的治理功能。VMware 开源的 harbor 是目前社区比较成熟的企业级产品,在 Docker Registry 基础上扩展了权限控制,审计,镜像同步,管理界面等治理能力,可以考虑采用。
资源治理:类似于 CMDB 思路,在容器云环境中,企业仍然需要对应用 app,组织 org,容器配额和数量等相关信息进行轻量级的治理。目前这块还没有生产级的开源产品,一般企业需要根据自己的场景定制自研。
发布平台:面向用户的发布管理控制台,支持发布流程编排。它和其它子系统对接交互,实现基本的应用发布能力,也实现如蓝绿,金丝雀和灰度等高级发布机制。目前这块生产级的开源产品很少,Netflix 开源的 spinnaker是一个,但是这个产品比较复杂重量(因为它既要支持适配对接各种 CI 系统,同时还要适配对接各种公有云和容器云,使得整个系统异常复杂),一般企业建议根据自己的场景定制自研轻量级的解决方案。
IAM:是 identity & access management 的简称,对发布平台各个组件进行身份认证和安全访问控制。社区有不少开源的 IAM 产品,比较知名的有 Apereo CAS,JBoss 开源的 keycloak等。但是这些产品一般都比较复杂重量,很多企业考虑到内部各种系统灵活对接的需求,都会考虑定制自研轻量级的解决方案。
考虑到服务部署平台目前还没有端到端生产级解决方案,企业一般需要定制集成,下面给出一个可以参考的具备轻量级治理能力的发布体系:
简化发布流程如下:
- 应用通过 CI 集成后生成镜像,用户将镜像推到镜像治理中心;
- 用户在资产治理中心申请发布,填报应用,发布和配额相关信息,然后等待审批通过;
- 发布审批通过,开发人员通过发布控制台发布应用;
- 发布系统通过查询资产治理中心获取发布规格信息;
- 发布系统向容器云发出启动容器实例指令;
- 容器云从镜像治理中心拉取镜像并启动容器;
- 容器内服务启动后自注册到服务注册中心,并保持定期心跳;
- 用户通过发布系统调用服务注册中心调拨流量,实现蓝绿,金丝雀或灰度发布等机制;
- 网关和内部微服务客户端定期同步服务注册中心上的服务路由表,将流量按负载均衡策略分发到新的服务实例上。
另外,持续交付流水线(CD Pipeline)也是微服务发布重要环节,这块主要和研发流程相关,一般需要企业定制,下面是一个可供参考的流水线模型,在镜像治理中心上封装一些轻量级的治理流程,例如只有通过测试环境测试的镜像才能升级发布到 UAT 环境,只有通过 UAT 环境测试的镜像才能升级发布到生产环境,通过在流水线上设置一些质量门,保障应用高质量交付到生产。
附录链接
- Spring Boot
- Alibaba Dubbo
- Thrift
- Tchannel
- NetflixOSS Eureka
- Hashicorp Consul
- NetflixOSS Zuul
- Kong
- Spring Cloud Gateway
- Spring Cloud Config
- CTrip Apollo
- Disconf
- ElasticSearch
- Yelp Elastalert
- Dianping CAT
- Zipkin
- Naver Pinpoint
- OpenTSDB
- KairosDB
- Argus
- InfluxDB
- Prometheus
- Grafana
- Sensu
- Esty 411
- Zalando ZMon
- NetflixOSS Hystrix
- Nginx
- Apache Kafka
- Allegro Hermes
- Apache Rocketmq
- Rabbitmq
- Sohutv CacheCloud
- Twitter twemproxy
- CodisLab codis
- Dangdang Sharding-jdbc
- MyCAT
- Xxl-job
- Dangdang elastic-job
- Apereo CAS
- JBoss keycloak
- Spring cloud security
- OpenID-Connect-Java-Spring-Server
- Google Kubernetes
- Apache Mesos
- Vmware Harbor
- Netflix Spinnaker
- Microservices in Practice – Key Architecture Concepts of an MSA
-- 整理自杨波老师的微服务架构核心20讲