微服务框架一定程度上为使用者屏蔽了底层网络的复杂性及分布式场景下的不确定性。通过API/SDK的方式提供服务注册发现、服务RPC通信、服务配置管理、服务负载均衡、路由限流、容错、服务监控及治理、服务发布及升级等通用能力。
介绍微服务框架的文章数不胜数,但是都没有一篇完整的从架构选型角度去看微服务。这里将从多维度去看微服务架构的技术选型。
一. 服务框架选型
dubbo
-
Tars
TARS腾讯内部使用且开源的框架,主要是支持多语言的高性能RPC开发框架和配套一体化的服务治理平台。
https://github.com/TarsCloud/Tars/
系统主要交互流程如下
:
- 服务发布流程:
- 管理命令流程:
- 心跳上报流程:
- 信息上报流程:
- Client访问Server流程:
负载均衡:
集群容错:
名字服务排除和Client主动屏蔽
-
gRPC
- 中文文档 http://doc.oschina.net/grpc?t=58008
- gRPC 也是基于以下理念:定义一个服务,指定其能够被远程调用的方法(包含参数和返回类型)。在服务端实现这个接口,并运行一个 gRPC 服务器来处理客户端调用。在客户端拥有一个存根能够像服务端一样的方法。
特性:
- 基于HTTP/2
- IDL使用ProtoBuf
- 多语言支持
Motan (新浪微博),业界使用比较少。
springcloud
-
路由网关 Spring Cloud Zuul
zuul的核心是一系列的filters, 其作用可以类比Servlet框架的Filter
Zuul的主要功能是路由和过滤器。是各种服务的统一入口,同时还会用来提供监控、授权、安全、调度等等;可以通过扩展ZuulFilter,在执行方法之前,做各种检查工作。 -
服务注册和发现 Eureka
Eureka 是作为微服务系统的服务注册与发现组件,提供服务注册和发现功能。
-
负载均衡 Ribbon
Ribbon 是一个负载均衡组件,Ribbon作为服务消费者的负载均衡器,一种是和 RestTemplae结合,一种是和 Feign 相结合,Feign 默认集成了 Ribbon 。
-
声明式调用 Feign
简单方便的调用 Spring Cloud 服务的工具,让 Java Http 客户端调用过程变的简单。
-
配置中心 Config
将配置文件进行统一管理,可以从 Config Server 服务或 Git 仓库读取。
-
熔断器 Hystrix
Hystrix 提供了熔断器的功能,能够阻止分布式系统中出现联动故障。
-
服务链路追踪 Sleuth
Sleuth 是 Spring Cloud 中的一个组件,主要功能是在分布式系统中提供服务链路追踪的解决方案。
-
消息总线 Bus
Spring Cloud Bus 将 Spring 的事件处理机制和消息中间件消息的发送和接收整合起来,可以轻松的将分布式应用中连接有消息中间件的多个服务节点连接起来,实现消息互通。
二、运行时支撑服务
运行时支撑服务主要包括服务注册中心,服务路由网关和集中式配置中心三个产品。
服务注册中心:
-
Eureka
Eureka由多个instance(服务实例)组成,这些服务实例可以分为两种:Eureka Server和Eureka Client
Eureka Server 提供服务注册和发现
Service Provider 服务提供方,将自身服务注册到Eureka,从而使服务消费方能够找到
Service Consumer服务消费方,从Eureka获取注册服务列表,从而能够消费服务
-
zookeeper
- ZAB 协议
-
Nacos (阿里)
官方文档:https://nacos.io/zh-cn/docs/what-is-nacos.html
Nacos 的关键特性包括:
- 服务发现和服务健康监测
- 动态配置服务
- 动态 DNS 服务
- 服务及其元数据管理
vintage (微博),业界使用较少。
服务路由网关
-
Zuul
一般配合springcloud使用
zuul 高可用
- 自研
配置中心
Spring Cloud Config: Spring Cloud 生态组件,可以和Spring Cloud体系无缝整合。
Apollo: 携程开源的配置管理中心,具备规范的权限、流程治理等特性。
-
Nacos: 阿里开源的配置中心,也可以做DNS和RPC的服务发现。
三、服务监控选型
主要包括日志监控,调用链监控, 监控告警通知等产品。
-
日志监控 ELK
ElasticSearch、Logstash和Kiabana
调用链监控 CAT 、Twitter 之前开源现在由 OpenZipkin 社区维护的 Zipkin、 Pinpoint。
-- | CAT | Zipkin | Pinpoint |
---|---|---|---|
调用链可视化 | 有 | 有 | 有 |
报表 | 非常丰富 | 少 | 中 |
埋点方式 | 侵入 | 侵入 | 不侵入(字节码增强) |
心跳 | 有 | 无 | 有 |
Metric | |||
DashBoard中文支持 | 好 | \ | \ |
国内案例 | 携程、点评、陆金所 | 京东、阿里 (都不开源) | 无 |
- 监控告警
Prometheus + Prometheus
四、服务容错选型
-
Hystrix
把熔断、隔离、限流和降级等能力封装成组件。Hystrix 一般需要在应用端或者框架内埋点,有一定的使用门槛。对于采用集中式反向代理(边界和内部)做服务路由的公司,则可以集中在反向代理上做熔断限流,例如采用 Nginx[附录 12.25](GitHub 5.1k stars)或者 Kong[附录 12.7](GitHub 11.4k stars)这类反向代理,它们都插件支持灵活的限流容错配置。Zuul 网关也可以集成 Hystrix 实现网关层集中式限流容错。集中式反向代理需要有一定的研发和运维能力,但是可以对限流容错进行集中治理,可以简化客户端。
-
阿里 Sentinel
Sentinel 是面向分布式服务架构的高可用流量防护组件,主要以流量为切入点,从限流、流量整形、熔断降级、系统负载保护、热点防护等多个维度来帮助开发者保障微服务的稳定性。
Sentinel具有以下功能:
丰富的适用场景:Sentinel已在阿里巴巴中广泛使用,并且在过去10年中涵盖了Double-11(11.11)购物节中几乎所有的核心场景,例如“ Second Kill”需要将突发流量限制为满足系统容量,消息峰值裁剪和谷底填充,不可靠下游服务的断路,集群流量控制等。
实时监控:Sentinel还提供了实时监控功能。您可以实时查看单台计算机的运行时信息,以及少于500个节点的群集的汇总运行时信息。
广泛的开源生态系统:Sentinel提供了与常用框架和库(如Spring Cloud,Dubbo和gRPC)的现成集成。您只需将适配器依赖项添加到服务中即可轻松使用Sentinel。
多种语言支持:Sentinel已为Java,Go和C ++提供了本机支持。
各种SPI扩展:Sentinel提供易于使用的SPI扩展接口,使您可以快速自定义逻辑,例如,自定义规则管理,调整数据源等。
五、后台服务选型
后台服务主要包括消息系统,分布式数据访问层和任务调度系统。后台服务是一个相对比较成熟的领域,很多开源产品基本可以开箱即用。
1. 消息系统
-
kafka
-
RabbitMQ
-
pulsar
Pulsar由Yahoo在2013年创建,并于2016年捐赠给Apache基金会。Pulsar现在是Apache的顶级项目。Pulsar 由 3 个主要组件组成:broker、Apache BookKeeper 和 Apache ZooKeeper。Broker 是无状态服务,客户端需要连接到 broker 进行核心消息传递。而 BookKeeper 和 ZooKeeper 是有状态服务。BookKeeper 节点(bookie)存储消息与游标,ZooKeeper 则只用于为 broker 和 bookie 存储元数据。另外,BookKeeper 使用 RocksDB 作为内嵌数据库,用于存储内部索引,但 RocksDB 的管理不独立于 BookKeeper。
Pulsar的特性
- 由于内置了多租户,因此不同的团队可以使用相同的集群并将其隔离。这解决了许多管理难题。它支持隔离,身份验证,授权和配额。
- 多层体系结构:Pulsar将所有主题数据存储在由Apache BookKeeper支持的专业数据层中,作为数据分类帐。 存储和消息传递的分离解决了扩展,重新平衡和维护集群的许多问题。 它还提高了可靠性,几乎不可能丢失数据。 另外,在读取数据时,可以直接连接到Bookeeper,而不会影响实时摄取。
- 虚拟主题。由于采用n层体系结构,因此对主题的数量没有限制,主题及其存储是分离的。还可以创建非持久性主题。
- N层存储。 Kafka的一个问题是,存储可能变得昂贵。 因此,它很少用于存储"冷"数据,并且消息经常被删除。 并且仍然向客户展示透明视图; 客户端可以从时间开始读取,就像所有消息都存在于日志中一样。
- 安全性:它具有内置的代理,多租户安全性,可插入身份验证等等。
- 地理复制和内置发现。 将群集复制到多个区域非常容易。
- 集成的负载均衡器和Prometheus指标。
- 多重集成:Kafka,RabbitMQ等。
- 支持许多编程语言,例如GoLang,Java,Scala,Node,Python…
- 客户端不需要知道分片和数据分区,这是在服务器端透明进行的
- 运维简单
- 学习文档不够多
- 大公司的支持
- 生态集成
- 性能可用性都优于kafka
2. 分布式数据访问层
- shardingjdbc
- MyCAT
六、服务部署平台
-
集群资源调度系统
k8s 提供云平台基础设施层强大容器编排与调度能力
K8s 的主要组件架构
-
k8s的主要功能
- 个进程协同工作(pod)
- 存储系统的挂载
- 应用的健康监测以及自动部署和扩展服务
- 负载均衡和滚动更新
- 资源监控和日志访问
- 提供认证授权和访问控制
-
镜像治理
- 基于 Docker Registry,封装一些轻量级的治理功能。VMware 开源的harbor,是一个比较成熟的产品,还增加权限、审计、镜像同步,管理界面。
-
发布平台
目前企业级开源的比较少,都是自研较多
七、存储
分布式缓存:redis
-
HBase、HDFS
通常在实时项目中用来存储实时的(k,v)数据。列式数据库,字典查询,稀疏性存储,用于存储海量数据,底层基于HDFS,无法做关系数据库的主外键。
-
MongoDB
MongoDB 是一个跨平台的,面向文档的数据库;面向集合存储,易于存储对象类型的数据;
-
Elasticsearch
ES是一个分布式的免费开源搜索和分析引擎,适用于包括文本、数字、地理空间、结构化和非结构化数据等在内的所有类型的数据。
-
Elasticsearch 应用场景
大型分布式日志分析系统 ELK elasticsearch(存储日志)+logstash(收集日志)+kibana(展示数据)大型电商商品搜索系统、网盘搜索引擎等,主要用于大数据收集。
-
Elasticsearch存储结构
Elasticsearch是文件存储,Elasticsearch是面向文档型数据库,一条数据在这里就是一个文档,用JSON作为文档序列化的格式,比如下面这条用户数据:
-
{
"name":"yushengjun",
"sex":0,
"age":24
}
总结:
从服务框架选型、运行时支撑服务的选型、服务监控选型、服务容错选型、后台服务选型、服务部署平台选型、存储选型 去看我们整体的微服务的架构,或许会让读者更清晰一些。