摘要: Cloud Native 应用架构随着云技术的发展受到业界特别重视和关注,尤其是 CNCF(Cloud Native Computing Foundation)项目蓬勃发展之际。Dubbo 作为服务治理的标志性项目,自然紧跟业界的潮流,拥抱技术的变化
分享简介
Cloud Native 应用架构随着云技术的发展受到业界特别重视和关注,尤其是 CNCF(Cloud Native Computing Foundation)项目蓬勃发展之际。Dubbo 作为服务治理的标志性项目,自然紧跟业界的潮流,拥抱技术的变化。本次分享的议题包括介绍 Apache 孵化项目Dubbo Spring Boot Project 以及汇报 Dubbo 与 Cloud Native 整合过程中的一些实践与思考,如适配 Spring Cloud 、服务发现、服务网关、服务跟踪以及监控等。
注:为了读者的阅读方便和习惯,本文字稿将在演讲内容的基础上做出适当的调整。
自我介绍
马昕曦(小马哥),阿里巴巴中间件技术专家,十余年 Java EE 从业经验,Dubbo 维护者、架构师以及微服务布道师。目前主要负责阿里巴巴集团微服务技术实施、架构衍进、基础设施构建等。重点关注云计算、微服务以及软件架构等领域。通过 SUN Java(SCJP、SCWCD、SCBCD)以及 Oracle OCA 等的认证。
主要议程
今天我非常荣幸地与大家一起讨论关于 Dubbo Cloud Native 相关议题,本次议题紧扣“实践与思考“两个关键字,主要的议程包括:
- Cloud Native 基础设施
- Cloud Native 架构选型
- Dubbo Cloud Native 准备
Cloud Native 基础设施
关于 Cloud Native 的定义,不同的云平台可能给出的内容存在差异。此处,我向大家介绍目前最热门的 CNCF 的定义:
”CNCF Cloud Native Definition v1.0“ 中的描述:
Cloud native technologies empower organizations to build and run scalable applications in modern, dynamic environments such as public, private, and hybrid clouds. Containers, service meshes, microservices, immutable infrastructure, and declarative APIs exemplify this approach.
相对于其他学术流派,CNCF 的 Cloud Native 定义更为具体,偏向于软件技术。这一点我们从文中的一些关键字能够明显地体会到,如关键字 "Containers(容器)"、"service meshes"、”microservices(微服务)“等。通常,开发人员较为关注的 Cloud Native 基础设施为:“服务发现”、“负载均衡”、“服务网关”、“分布式配置”、“服务熔断”以及“跟踪监控”,如图所示:
由于 PPT 格式的限制,此处我将“链路跟踪”与“服务监控” 并陈为“跟踪监控”。接下来,我们进入“服务发现”的讨论。
服务发现(Service Discovery )
随着微服务架构(MSA)受到不同规模企业的青睐,服务治理的实施逐渐被提上基础设施改造的议程。尽管这些概念在 SOA 时代已经提出,然而引起业界广泛关注应归功于微服务。服务发现(Service Discovery )作为服务治理的核心特性,通常也将服务注册(Service Registration)一并讨论。无论是服务发现,还是服务注册,在具体落地实施时,它们必须面对技术选型的问题。在座的各位,包括我,大多数是 Java 程序员,自然关心 Java 的技术方案。目前,Java 社区最为津津乐道的方案莫过于 Spring Cloud,搭配 Netflix OSS 组件 Eureka,帮助 Spring Boot 应用快速搭建服务发现体系。其中,Eureka Server 作为注册中心服务器,Spring Boot 应用整合 Eureka Client 向 Eureka Server 注册。实际上,Spring Cloud 除了整合 Netflix Eureka 作为服务发现之外,还提供了 Apache Zookeeper 和 HachiCorp Consul 的实现,所以这三种方案出现在当前页面:
其中还包括 Redis 和 Apache Curator,前者是 Dubbo 的服务发现实现方案之一,然而小马哥并不建议使用 Redis 作为注册中心,还是保持它缓存中间件的单纯性较好。而 Curator 作为 Zookeeper Java 客户端类库,它不但可用在 Dubbo,而且其扩展项目 Curator Service Discovery 也是 Spring Cloud 整合 Zookeeper 作为服务发现的关键基础设施。或许大家思考以上方案应该如何选型的问题。
如何选择
Eureka
当服务发现选型时,Netflix Eureka 或许是在开发人员脑海中复现的首选方案。然而 Eureka 在阿里大规模实践时,它的表现并不理想,当 Eureka 客户端服务实例数量达到一定时,Eureka Server 时常会出现服务不可用的情况,主要的问题集中在更新(Update)机制、复制(Replication)机制以及内存型存储。由于时间的关系,此处我不加详细说明,部分答案在 Eureka Wiki Eureka 2.0 Motivations 中也有描述:
- Only support homogenous client views
- Only supports scheduled updates
- Replication algorithm limits scalability
注:以上具体内容在分享现场并没有具体提及,此处特意为读者补充。
以上问题 Netflix 早在 2015 年已意识到,然而 Eureka 2.0 的发布遥遥无期。后来,我托朋友联系上了 Netflix 的工程师,咨询他们关于 Eureka 1 在自身生产环境的使用情况。他们的回复是部分场景在使用。这样的答复值得玩味,再细问其覆盖比重,对方三缄其口。这不得不让我对 Eureka 的成熟度产生了质疑,所以我不建议大家在数以千计的应用实例场景中使用。
Consul
Consul 同样作为 Spring Cloud 服务中心,基于 GO 语言开发,其数据一致性采用 Raft 算法,低内存,集群支持。曾一度成为我理想的替换 Eureka 的方案,不过本人并不具备 Consul 的大规模运用,为此还特意请教永辉云创的架构师翟永超(《Spring Cloud 微服务实战》的作者)。他告知 Consul 表现不错,并在跨 DC(数据中心)方面也比较稳定:
他的答复让我增强了 Consul 的信心,稍显遗憾的是其 Consul 应用节点略少。后来,我听说 B 站的哥们自研服务发现中间件 discovery,他们应该也对 Consul 做过调研和评估,他们的看法是:
Github 开源地址:https://github.com/Bilibili/discovery/
discovery 在 B 站 K8S 上的使用情况:
综合两家公司的评估,尽管没有经过本人实际操作,并且两者没有提供具体的数据指标,然而在一定程度上说明 Consul 作为注册中心的实例节点规模大概在 2k 以内。换言之,它比较适合中小型企业。
Zookeeper
Zookeeper 即可是 Spring Cloud 注册中心,又能作为 Dubbo 注册中心,与 Eureka 不同,它属于 CP 分布式策略,而后者属于 AP。两者的共同点在于均属于内存型注册中心,在大规模集群场景,也会遇到 Eureka 类似的问题。不过从运维的角度,相较于 Eureka 而言,熟悉 Zookeeper 运维朋友更多。在生态性方面,Zookeeper 周边的生态更丰富,如 Zookeeper C API,尽管 Eureka 提供了语言无关性的 REST 接口。同时,Zookeeper 还从当配置服务器的角色,降低了学习的成本。综上结论,我推荐使用 Zookeeper 作为服务发现基础设施,无论您选择 Dubbo 方案,还是使用 Spring Cloud。尽管它在大规模集群时也出现 Zookeeper 间歇性卡顿等问题。
负载均衡
负载均衡是第二个重要 Cloud Native 基础设施,熟悉 Spring Cloud 的朋友一定对右侧的蝴蝶结有印象,它就是 Netflix OSS 负载均衡组件 Ribbon,框架层面提供了多种负载均衡规则,如:
- 随机 -
RandomRule
- 轮循 -
RoundRobinRule
- 权重响应时间 -
WeightedResponseTimeRule
WeightedResponseTimeRule
之外,其他的 Ribbon 负载均衡实现均没有提供权重因子,而权重因子对于蓝绿发布、服务预热等方面的帮助是至关重要的。因此,权重因子在 Dubbo “随机“、”轮询“ 以及 ”最少活跃调用数“ 负载均衡算法中均体现。
以上讨论的两种框架均属于 Java 实现,而中间的 Kong 则是更为通用的实现,通常它作为 API 服务网关,后面我们将继续讨论。可简单地认为它是 Nginx + Lua 的扩展,负载均衡自然成为不可或缺的特性。其默认的负载均衡算法为具备权重的轮询(weighted-round-robin),同时一致性 Hash 算法作为可选方案。
服务网关
谈及服务网关,Java 工程师最容易想到的是 Spring Cloud Zuul。Zuul 是 Netflix 基于 Servlet API 开发的 Web 服务代理组件,在 Spring Cloud 使用场景中,它与 Eureka 和 Ribbon 整合,打造具备服务动态更新和负载均衡能力的服务网关。
最近,随着 Spring Cloud Finchley 的发布,Spring Cloud Zuul 的替代方案 Spring Cloud Gateway 孕育而生,不过官方的描述还是比较谦虚谨慎,并没有一刀切地引导开发人员从 Zuul 迁移到 Gateway 上来:
API Gateway built on top of the Spring Ecosystem, including: Spring 5, Spring Boot 2 and Project Reactor. Spring Cloud Gateway aims to provide a simple, yet effective way to route to APIs and provide cross cutting concerns to them such as: security, monitoring/metrics, and resiliency.
两者不同点在于,Zuul 运行在 Servlet 容器中,而 Gateway 并不像 Spring WebFlux 能够兼容 Servlet 3.1 运行时,而是必须依赖 Netty 的运行时,以及整合 Reactive 框架 Reactor,实现异步非阻塞网关。由于近期对于 Spring 5 WebFlux 能够大幅提升应用性能的观点甚嚣尘上,实际上,没有任何直接性能基准测试证明 WebFlux 能够加快程序执行速度,或许大家认为我的观点与主流格格不入,可是我要告诉大家的是,这个问题我在同事间验证过很多次,大多数情况,Reactive 并不没有提升性能。就连 Spring 官方也承认这个观点:
Performance has many characteristics and meanings. Reactive and non-blocking generally do not make applications run faster. They can, in some cases, for example if using the
WebClient
to execute remote calls in parallel. On the whole it requires more work to do things the non-blocking way and that can increase slightly the required processing time.
同时,这里提供一篇 Spring 5 WebFlux: Performance tests 的文章,在结尾部分给出了结论,作者坦言在速度上没有明显的提升,甚至从结果来看,速度稍微更糟糕:
- No improvement in speed was observed with our reactive apps (the Gatling results are even slightly worse).
以上测试工程和结论是由开源项目 JHipster 的工程师给出,具备一定的客观性和可信度。
资源地址:https://blog.ippon.tech/spring-5-webflux-performance-tests/
换言之,基于 Reactor 开发的 Gateway 在性能可能并没有明显的提升。因此,Zuul 和 Gateway 的性能对比则演变为 Servlet 容器和 Netty Web 容器的比较,感兴趣的朋友可以去网上寻找一些比较数据,两者的性能在伯仲间。
当然,我和在座的各位一样,对 Java 的实现方案自然是情有独钟。然而我想说的是,身为 Java 工程师,眼中难免有 Java,但是眼中不要只有 Java。Nginx 作为当年著名 “C10K” 问题的解决方案,无论从连接数量,还是资源消耗方面均优于 Java 实现。作为技术人,应该具有更为宽广的胸怀,接纳非我族类的气魄,该放手的时候就放手。Nginx 作为服务网关不失为一种好的方案,然而它的动态性略为不足,需要结合 Lua 脚本辅助完成,因此,OpenResty 和 Kong 这类方案脱颖而出。如果就 HTTP API 网关而言,个人认为 Kong 的方案更佳,因为它提供完整的解决方案,包括前面讨论的负载均衡(权重)、服务熔断以及服务发现等特性。类似的特性在 CNCF 项目 Envoy 也有体现,它是另一种高性能代理的方案,提供服务发现、健康和负载均衡。在协议上,天然支持 HTTP 和 HTTP/2,而通讯协议支持 gRPC,建议大家予以高度关注。
值得一提的是,HTTP API 网关通常需要支持 sidecar,换言之,支撑网关服务的基础设施必须提供服务发现的能力,就功能性而言,Zuul 和 Gateway 自身并不具备这样的特性,需要搭配 Eureka 这样组件,它们更像服务路由器的角色。
分布式配置
左边和中间的四种技术均为 Spring Cloud 分布式配置的底层存储,其中 Git 为版本式配置,而 JDBC 是从 Spring Cloud Edgware 版本开始支持,提供更为通用和动态的配置源。这里我们又见到 Zookeeper 的声影,从简化运维的角度,可以利用 Zookeeper 即承担服务发现,也作为分布式配置的基础设施。而最右边的 etcd 是最近非常火的 Kubernetes 分布式配置的 key-value 存储,提供快速、简单、安全和可高的解决方案。
服务熔断
服务熔断也非常让开发人员联想到 Spring Cloud Hystrix 技术,不过 Hystrix 并非与 Spring Cloud 强耦合,当然 Dubbo 也能结合 Netflix Hystrix 框架提供服务熔断的能力,后面部分将介绍 Dubbo 与 Hystrix 整合,提升 Dubbo 服务熔断的能力。确切地说,Dubbo 所提供的能力是集群容错,包括 Failover 等模式。 Kong 也天然地支持服务熔断的能力,所以它作为 API 网关的特性是全面的。
链路跟踪
以上链路跟踪的基础设施从左至右,分别为 Zipkin、OpenTracing 以及 Jaeger,三者的灵感均来自于 Google 论文 Dapper。相对而言,Java 程序员可能更为熟悉 Zipkin,因为它是 Spring Cloud Sleuth 首选方案,提供客户端上报以及服务端聚合和 Dashboard 等功能。而 OpenTracing 和 Jaeger 是 CNCF 孵化项目,前者属于开放的标准,提供多语言的适配实现,后者则由 Uber(优步)公司开发并开源的链路跟踪项目,功能上与 Zipkin 类似,不过它基于 GO 语言开发,同时也提供 Java 客户端。
相关推荐
《Dubbo Cloud Native之路的实践与思考》 随着云计算的发展,Cloud Native已成为现代应用程序构建的主流方式。Cloud Native技术使得企业能够在公有云、私有云以及混合云环境中构建和运行可扩展的应用程序。其中,...
- **Spring Cloud整合**:为了更好地与Spring Cloud生态集成,Dubbo 2.7 进行了以下整合工作: - Spring MVC REST整合:允许开发者使用Spring MVC的方式编写RESTful API。 - 网关整合:支持中心化REST网关和分布式...
此外,Dubbo 3.0还加强了与Spring Cloud、gRPC等其他框架的互通性,支持多语言环境,提升了协议的开放性和多端支持。它还内置了流控机制,如反压,以及使用protobuf作为序列化工具,提高了性能和兼容性。 面对云...
Dubbo 在此之上提供了高效的序列化、网络通信库 Netty 和异步 I/O 模型 (BIO、NIO、AIO) 的选择,以优化性能。 **4. Dubbo框架 (2.7 版本)** Dubbo 2.7 版本增强了服务治理和运维能力,例如节点角色的定义、调用...
5. **云原生支持**:随着Cloud Native理念的普及,Dubbo Admin 2.6.0也顺应趋势,增强了对容器化、微服务架构的适应性,更好地融入Kubernetes等云平台。 6. **API文档**:自动生成服务的API文档,方便开发者理解和...
dubbo视频教程更新版dubbo视频教程更新版 真实有效,不真实可投诉,失效私信
KubeCon 2020 阿里巴巴云原生专场PPT汇总...FaaS & Cloud Native 函数计算的云原生之旅 Infrastructure As Code 在阿里巴巴的初步实践 Serverless 场景下 Pod 创建效率优化 Serverless Kubernetes - 理想,现实和未来
dubbo视频教程进阶版本 基础篇 高级篇 高可用架构 源码 ppt 简易支付源代码
09 从Paxos到Zookeeper 分布式一致性原理与实践.pdf 10 马昕曦-Dubbo 的过去、现在以及未来.pdf 11 毛剑-B站微服务链路监控实践.pdf 12 吴疆-Microservice 在 Cloud Foundry 的应用.pdf 13 邢海涛-微服务和K8s集成...
Achieve the maximum availability based on cloud native technologies Connecting, Controlling and Observing Dubbo Microservices with Flomesh Jutopia One-Stop ML Platform 07-深圳 KubeVela多云交付的云...
dubbo视频教程终极版47课时 讲的非常细致,每节课基本都是一个半小时左右,不真实可投诉,失效找我
20. **混合云方案**:携程在公有云和私有云的“混合云”方案实践中,可能探讨了如何取得用户体验和成本之间的平衡,以及系统架构CloudNative化过程中的经验教训。 这些知识点涵盖了移动应用开发、后端技术、大数据...
SkyWalking项目的核心目标,是针对微服务、Cloud Native、容器化架构,提供应用性能监控和分布式调用链追踪能力。 目前已加入Apache孵化器。目前支持链路追踪和监控应用组件如下,基本涵盖主流框架和容器,如国产PRC...
随着技术的快速发展,微服务领域出现了许多新的技术和工具,如容器化、PaaS、Cloud Native、gRPC、ServiceMesh以及Serverless等。以下将详细讨论微服务架构的选型准则和关键模块。 首先,选择生产级的技术栈至关...
微服务架构是随着云计算的发展应运而生的软 件设计风格,与之对立的是传统的单体架构技术视角。微服务架构具有自包含性,可作为独立的进程存在,通过轻量级交互机制来通信,通常是 HTTP 型的 API。 微服务架构的...
它是一种RPC框架,与Spring Boot/Cloud相比,Dubbo的服务调用更高效,但跨语言支持不如RESTful方案。 在选择服务框架时,除了考虑上述因素,还需要关注服务注册与发现、负载均衡、熔断和降级策略、安全控制等方面。...
春云阿里巴巴 阿里巴巴维护的一个项目。 有关中文自述文件,请参见。 Spring Cloud Alibaba为分布式应用程序开发提供了一站式解决方案。 它包含开发分布式应用程序所需的... 事件驱动:支持构建与共享消息系统连接的
首先,微服务架构的发展历程从2014年的1.0时代到现在的2.0时代,经历了容器化、PaaS、Cloud Native、gRPC、Service Mesh和Serverless等新技术的迭代。生产级的、由一线互联网公司落地并开源的技术是首选,因为它们...
3. **Spring Cloud与Dubbo对比**: - 调用方式:Dubbo使用RPC,Spring Cloud采用RESTful API。 - 注册中心:Dubbo通常使用Zookeeper,Spring Cloud可选更多,如Eureka。 - 服务网关:Spring Cloud有Zuul,提供...
阿里巴巴在2017年可能分享了如何利用Dubbo、Spring Cloud等实现微服务化,提升系统可扩展性和稳定性。 4. 安全技术:网络安全是任何互联网公司不可忽视的部分。合集中可能涵盖了阿里巴巴在数据安全、网络安全、反...