当前位置: 首页 > 科技观察

微服务不是SpringCloud和Dubbo,下一代微服务是什么?

时间:2023-03-21 15:22:37 科技观察

近年来,微服务技术迅速普及,以SpringCloud、Dubbo为代表的相对成熟的微服务开发框架占据了市场的主流地位,甚至一度成为微服务的代名词。什么是微服务?首先,微服务并没有官方的定义。很难直接描述微服务。我们可以通过对比传统的Web应用来理解什么是微服务。传统的Web应用程序核心分为业务逻辑、适配器以及通过UI访问的API或Web界面。业务逻辑定义业务流程、业务规则和域实体。适配器包括数据库访问组件、消息组件和访问接口。一个打车软件的架构图如下:虽然也是模块化开发,但最终还是会被打包部署为一个应用。例如,Java应用程序被打包为WAR并部署在Tomcat或Jetty上。这种单体应用比较适合小项目。优点是:开发简单直接,集中管理基本不重复开发功能都在本地,没有分布式管理开销和调用开销。当然,它的缺点也很明显,尤其是对于互联网公司:开发效率低:所有开发者在一个项目中改代码,提交代码互相等待,代码冲突不断。代码维护难:代码功能耦合在一起,新手无从下手。部署不灵活:构建时间长,任何一个小的修改都必须重新构建整个项目,这往往是一个漫长的过程。低稳定性:一个微不足道的问题可能会导致整个应用程序挂起。可扩展性不足:无法满足高并发情况下的业务需求。因此,目前的主流设计普遍采用微服务架构。这个想法不是开发一个巨大的单体应用程序,而是将应用程序分解为相互关联的小微服务。一个微服务完成一个特定的功能,比如乘客管理、订单管理等。每个微服务都有自己的业务逻辑和适配器。一些微服务还提供API接口供其他微服务和应用客户端使用。比如上面描述的系统可以分解:每个业务逻辑分解成一个微服务,微服务之间通过RESTAPI进行通信。一些微服务还为最终用户或客户端开发API接口。但通常情况下,这些客户端不能直接访问后台微服务,而是通过API网关传递请求。APIGateway一般负责服务路由、负载均衡、缓存、访问控制、认证等任务。微服务架构的优势微服务架构有很多重要的优势。首先,它解决了复杂性问题。它将单体应用程序分解为一组服务。虽然功能总量保持不变,但应用程序已分解为可管理的模块或服务。这些服务定义了明确的RPC或消息驱动的API边界。微服务架构强制执行一定程度的应用程序模块化,这是单体代码库难以实现的。因此,微服务的开发速度要快得多,也更容易理解和维护。其次,这种架构使每项服务都可以由专门负责该服务的团队独立开发。只要符合服务API契约,开发者可以自由选择开发技术。这意味着开发人员可以编写或重构服务以采用新技术,而且由于服务相对较小,因此不会对整体应用造成太大影响。第三,微服务架构使得每个微服务都可以独立部署。开发人员无需协调部署服务升级或变更。一旦测试通过,就可以部署这些更改。所以微服务架构也让CI/CD成为可能。最后,微服务架构使每个服务都可以独立扩展。我们只需要定义满足服务部署要求的配置、容量、实例数等约束即可。例如,我们可以在EC2计算优化实例上部署CPU密集型服务,在EC2内存优化实例上部署内存数据库服务。微服务架构的缺点和挑战其实并不存在,微服务架构也会给我们带来新的问题和挑战。其中之一与其名称相似。微服务强调服务的规模,但实际上并没有统一的标准。业务逻辑按照什么规则划分到微服务中,这本身就是一个实证项目。一些开发人员认为10-100行代码应该足以构建微服务。虽然构建小型服务是微服务架构所提倡的,但请记住,微服务是达到目的的手段,而不是目的。微服务的目标是将一个应用充分分解,便于敏捷开发和持续集成部署。微服务的另一个主要缺点是微服务的分布式特性带来的复杂性。开发者需要基于RPC或者消息来实现微服务之间的调用和通信,这使得服务之间的发现、服务调用链的跟踪、质量问题变得相当困难。微服务的另一个挑战是分区数据库架构和分布式事务。更新多个业务实体的业务事务相当普遍。这些类型的事务在单体应用程序中实现起来非常简单,因为单体应用程序通常只存在于一个数据库中。但是在微服务架构下,不同的服务可能有不同的数据库。CAP原则的约束迫使我们放弃传统的强一致性,转而追求最终一致性,这对开发者来说是一个挑战。微服务架构也给测试带来了很大的挑战。传统的单体Web应用程序只需要测试单个RESTAPI,而测试微服务需要启动它所依赖的所有其他服务。不能低估这种复杂性。微服务的另一大挑战是跨多个服务的变化。比如在传统的单体应用中,如果有A、B、C三个服务需要改动,A依赖B,B依赖C,我们只需要改动对应的模块,一次性部署即可.但在微服务架构中,我们需要仔细规划和协调每个服务的变更部署。我们需要先更新C,然后更新B,最后更新A。部署基于微服务的应用程序也复杂得多。单体应用可以简单地部署在一组相同的服务器上,然后在前端使用负载均衡。每个应用程序都有相同的基本服务地址,例如数据库和消息队列。另一方面,微服务由大量不??同的服务组成。每个服务可能有自己的配置、应用程序实例的数量和基本服务地址。这里需要不同的配置、部署、扩展和监控组件。此外,我们需要一种服务发现机制,以便服务可以发现与之通信的其他服务的地址。因此,微服务应用的成功部署需要开发者有更好的部署策略和高度的自动化。以上问题和挑战大致可以概括为:API网关服务间调用服务发现服务容错服务部署数据调用幸运的是,有很多微服务框架可以解决以上问题。第一代微服务框架SpringCloud为开发者提供快速构建分布式系统通用模型的工具(包括配置管理、服务发现、熔断器、智能路由、微代理、控制总线、一次性令牌、全局锁、领导者选举、分布式会话、集群状态等)。主要项目包括:SpringCloudConfig:由Git存储库支持的集中式外部配置管理。配置资源直接映射到Spring环境,但如果需要,可以由非Spring应用程序使用。SpringCloudNetflix:与各种NetflixOSS组件(Eureka、Hystrix、Zuul、Archaius等)集成。SpringCloudBus:一种事件总线,用于通过分布式消息传递连接服务和服务实例。用于在集群中传播状态更改(例如配置更改事件)。SpringCloudforCloudfoundry:将您的应用程序与PivotalCloudfoundry集成。提供服务发现实现,还可以轻松地使用SSO和OAuth2保护资源,还可以创建Cloudfoundry服务代理。SpringCloud-CloudFoundryServiceBroker:为构建在CloudFoundry中管理服务的服务代理提供起点。SpringCloudCluster:领导者选举和公共状态模型(ZooKeeper、Redis、Hazelcast、基于Consul的抽象和实现)。SpringCloudConsul:与HashicorpConsul相结合的服务发现和配置管理。SpringCloudSecurity:为Zuul代理中的负载平衡OAuth2休眠客户端和身份验证标头中继提供支持。SpringCloudSleuth:SpringCloud应用程序的分布式跟踪,兼容Zipkin、HTrace和基于日志(例如ELK)的跟踪。SpringCloudDataFlow:一种云原生编排服务,用于具有现代运行时的可组合微服务应用程序。易于使用的DSL、拖放式GUI和REST-API共同简化了基于微服务的数据管道的整体编排。SpringCloudStream:一个轻量级的事件驱动的微服务框架,用于快速构建可以连接到外部系统的应用程序。使用ApacheKafka或RabbitMQ在SpringBoot应用程序之间发送和接收消息的简单声明模型。SpringCloudStreamApplicationStarters:SpringCloudTaskApplicationStarters是SpringBoot应用程序,它可以是任何进程,包括不会永远运行的SpringBatch作业,它们会在有限时间的数据处理后结束/停止。SpringCloudZooKeeper:ZooKeeper的服务发现和配置管理。SpringCloudforAmazonWebServices:轻松集成托管的AmazonWebServices服务。它通过使用Spring的习惯用法和API促进与AWS服务的集成,例如缓存或消息传递API。开发人员可以围绕托管服务构建应用程序,而不必担心基础架构。SpringCloudConnectors:使PaaS应用程序能够轻松连接到各种平台上的数据库和消息代理等后端服务(该项目以前称为“SpringCloud”)。SpringCloudStarters:作为一个基于SpringBoot的启动项目,减少了依赖管理(Angel.SR2之后,不再是独立项目)。SpringCloudCLI:该插件支持基于Groovyoracles快速创建SpringCloud组件应用。DubboDubbo是阿里巴巴开源的分布式服务框架,致力于提供高性能透明的RPC远程服务调用解决方案和SOA服务治理解决方案。其核心部分包括:远程通信:提供对各种基于长连接的NIO框架的抽象封装,包括多线程模型、序列化、“请求-响应”模式下的信息交换方式。集群容错:提供基于接口方法的透明远程过程调用,包括多协议支持,以及软负载均衡、容错、地址路由、动态配置等集群支持。自动发现:基于注册中心的目录服务,服务消费者可以动态找到服务提供者,地址透明化,方便服务提供者平滑增减机器。但显然,Dubbo和SpringCloud都只适用于特定的应用场景和开发环境,并不是为了支持通用性和多语言而设计的。而且它们只是Dev层的框架,缺乏DevOps的整体解决方案(这是微服务架构需要注意的)。然后是服务网格的兴起。下一代微服务:服务网格?ServiceMeshServiceMesh又译为“服务网格”,作为服务间通信的基础设施层。如果用一句话来解释什么是ServiceMesh,可以类比为应用程序或微服务之间的TCP/IP,负责服务之间的网络调用、限流、熔断和监控。对于编写应用程序,一般不需要关心TCP/IP层(比如通过HTTP协议的RESTful应用程序)。使用ServiceMesh也省去了服务之间的那些东西,原来是通过应用或者其他框架实现的,比如SpringCloud和OSS,现在只需要交给ServiceMesh就行了。ServiceMesh具有以下特点:应用间通信的中间层轻量级网络代理应用无感知解耦应用重试/超时、监控、跟踪和服务发现ServiceMesh的架构如下图所示:ServiceMesh运行为侧边栏,对应用程序透明,应用程序之间的所有流量都经过它,因此可以在ServiceMesh中实现对应用程序流量的控制。目前流行的ServiceMesh开源软件包括Linkerd、Envoy和Istio。近日,Buoyant(Linkerd开源公司)发布了基于Kubernetes的ServiceMesh开源项目Conduit。LinkerdLinkerd是一种开源网络代理,旨在作为服务网格进行部署:一个用于管理、控制和监视服务以及应用程序内服务间通信的专用层。Linkerd旨在解决Twitter、雅虎、谷歌和微软等公司在运行大型生产系统时发现的问题。根据经验,最复杂、最令人惊讶和突发的行为的来源通常不是服务本身,而是服务之间的通信。Linkerd解决了这些问题,不仅仅是控制通信机制,而是在其之上提供了一个抽象层。它的主要特性是:负载平衡:Linkerd提供了多种负载平衡算法,这些算法使用实时性能指标来分配负载并减少应用程序的尾部延迟。断路器:Linkerd包含自动断路器,可以停止向被认为不健康的实例发送流量,让它们有机会恢复并避免连锁反应失败。服务发现:Linkerd与各种服务发现后端集成,通过删除临时服务发现实现来帮助您降低代码的复杂性。动态请求路由:Linkerd支持动态请求路由和重新路由,允许您以最少的配置切换和暗流量设置暂存服务、金丝雀、蓝绿部署、跨DC故障。重试次数和截止日期:Linkerd可以在某些失败时自动重试请求,并且可以在指定的时间段后使请求超时。TLS:Linkerd可以配置为使用TLS发送和接收请求,您可以使用它来加密跨主机边界的通信,而无需修改现有的应用程序代码。HTTP代理集成:Linkerd可以充当HTTP代理,并得到几乎所有现代HTTP客户端的广泛支持,可以轻松集成到现有应用程序中。透明代理:您可以在主机上使用iptables规则通过Linkerd设置透明代理。gRPC:Linkerd支持HTTP/2和TLS,允许它路由gRPC请求,支持高级RPC机制,例如双向流、流量控制和结构化数据负载。分布式跟踪:Linkerd支持分布式跟踪和指标检测,提供跨所有服务的统一可观察性。Instrumentation:Linkerd支持分布式跟踪和指标检测,可跨所有服务提供统一的可观察性。EnvoyEnvoy是为面向服务的架构设计的L7代理和通信总线。这个项目诞生于以下目标:对于应用程序,网络应该是透明的,当网络和应用程序发生故障时,可以轻松定位。问题的根源。Envoy可以提供以下功能:外部流程架构:可以与任何语言开发的应用程序一起工作;可以快速升级。基于新的C++11编码:可以提供高效的性能。L3/L4过滤器:核心是一个L3/L4网络代理,可以作为一个可编程的过滤器来实现不同的TCP代理任务,插入到主服务中。编写过滤器以支持各种任务,例如原始TCP代理、HTTP代理、TLS客户端证书身份验证等。HTTPL7过滤器:支持额外的HTTPL7过滤层。HTTP过滤器充当插件,插入HTTP连接管理子系统以执行不同的任务,例如缓冲、速率限制、路由/转发、嗅探亚马逊的DynamoDB等。支持HTTP/2:在HTTP模式下,支持HTTP/1.1、HTTP/2,支持HTTP/1.1、HTTP/2双向代理。这意味着HTTP/1.1和HTTP/2,客户端和目标服务器的任意组合都可以被桥接。HTTPL7路由:在HTTP模式下运行时,它支持基于内容类型、运行时值等的基于路径的路由和重定向。可用于服务的前端/边缘代理。支持gRPC:gRPC是Google的一个RPC框架,它使用HTTP/2作为底层多路复用。HTTP/2承载的gRPC请求和响应都可以使用Envoy的路由和LB能力。支持MongoDBL7:支持获取统计信息、连接记录等信息。支持DynamoDBL7:支持获取统计、连接等信息。服务发现:支持多种服务发现方式,包括异步DNS解析和通过REST请求的服务发现。健康检查:包含健康检查子系统,可以主动检查上游服务集群的健康状况。还支持被动健康检查。AdvancedLB:包括自动重试、断路器、全局限速、区块请求、异常检测。未来还计划支持请求速率控制。前端代理:可以作为前端代理,包括TLS、HTTP/1.1、HTTP/2、HTTPL7路由。出色的可观察性:为所有子系统提供可靠的统计数据。目前支持statsd和兼容的统计库。也可以通过管理端口查看统计信息,也支持第三方分布式跟踪机制。动态配置:提供分层的动态配置API,用户可以使用这些API来构建复杂的集中管理部署。IstioIstio是一个用于连接、管理和保护微服务的开放平台。Istio提供了一种简单的方法来构建已部署服务的网络,具有负载均衡、服务间身份验证、监控等功能,而无需更改任何服务代码。为服务添加对Istio的支持,只需要在环境中部署一个特殊的边车(sidecar),使用Istio控制平面功能配置和管理代理,拦截微服务之间的所有网络通信。Istio目前仅支持在Kubernetes上部署服务,但在未来的版本中将支持其他环境。Istio通过提供对整个服务网格的行为洞察和操作控制,提供了一个完整的解决方案来满足微服务应用的多样化需求。它统一了服务网络中的许多关键功能:流量管理:控制服务之间的流量和API调用的流动,使调用更可靠,使网络在恶劣情况下更健壮。可观察性:了解服务之间的依赖关系,以及它们之间流量的性质和方向,提供快速识别问题的能力。策略执行:将组织策略应用于服务之间的交互可确保执行访问策略并在消费者之间合理分配资源。策略更改是通过配置网格而不是通过修改应用程序代码来完成的。服务身份和安全:为网格中的服务提供可验证的身份,并提供保护服务流量的能力,使其可以在不同可信度的网络上流动。Istio服务网格在逻辑上分为数据平面和控制平面:数据平面由一组智能代理(Envoy)组成,它们被部署为sidecar来调解和控制微服务之间的所有网络通信。控制平面负责管理和配置代理以在运行时路由流量和执行策略。下图显示了构成每个面板的不同组件:ConduitConduit是一种专为Kubernetes设计的超轻型服务网格服务,它透明地管理运行在Kubernetes上的服务的运行时通信,使它们更加安全可靠。Conduit无需更改代码即可提供可见性、可靠性和安全性功能。管道服务网格也由数据平面和控制平面组成。数据平面承载应用程序的实际网络流量。控制面板驱动数据面板,提供北向接口。与Linkerd和Envoy相比,它们是相似的。它们都是面向服务通信的网络代理,都可以实现服务发现、请求路由、负载均衡等功能。他们的设计目标是解决服务之间的通信问题,让应用程序感知不到服务通信,这也是ServiceMesh的核心理念。Linkerd和Envoy就像分布式的Sidebars,类似Linkerd和Envoy的多个代理相互连接,形成一个ServiceMesh。而Istio则站在更高的角度,将ServiceMesh分为DataPlane和ControlPlane。DataPlane负责微服务之间的所有网络通信,而ControlPlane负责管理DataPlaneProxy:而Istio原生支持Kubernetes,这也弥合了应用程序调度框架和ServiceMesh之间的差距。关于Conduit的信息很少。从官方介绍来看,其定位和功能与Istio类似。Kubernetes+ServiceMesh=完整的微服务框架Kubernetes已经成为容器调度编排的事实标准,容器可以作为微服务的最小工作单元,从而发挥微服务架构的最大优势。所以我认为未来的微服务架构会围绕Kubernetes展开。Istio、Conduit等ServiceMesh本质上是为Kubernetes设计的,它们的出现弥补了Kubernetes在微服务间服务通信方面的不足。Dubbo、SpringCloud等虽然都是成熟的微服务框架,但或多或??少都与特定的语言或应用场景绑定,只解决微服务Dev层面的问题。如果要解决Ops问题,需要结合CloudFoundry、Mesos、DockerSwarm或Kubernetes等资源调度框架:但由于这种结合的初始设计和生态,有很多适用性问题需要解决待解决。库伯内特是不同的。它是一个与开发语言无关的通用容器管理平台。它可以支持运行云原生和传统容器化应用程序。它涵盖了微服务的开发和运维阶段。结合ServiceMesh,可以为用户提供完整的端到端的微服务体验。所以我认为未来的微服务架构和技术栈可能是这样的形式:多云平台提供资源能力(计算、存储、网络等)服务的服务通信,最后暴露业务接口通过API网关将微服务对外发布。相信在未来,随着基于Kubernetes和ServiceMesh标准的微服务框架的盛行,微服务实现的成本会大大降低,最终为微服务的落地和规模化使用提供坚实的基础和保障。