近几年,微服务技术得以迅猛普及,而以 Spring Cloud、Dubbo 为代表较为成熟的微服务开发框架,占据着市场的主流地位,它们甚至一度成为微服务的代名词。
成都创新互联公司是一家专业提供凤城企业网站建设,专注与成都网站设计、成都做网站、html5、小程序制作等业务。10年已为凤城众多企业、政府机构等服务。创新互联专业网站制作公司优惠进行中。
什么是微服务
首先微服务并没有一个官方的定义,想要直接描述微服务比较困难,我们可以通过对比传统 Web 应用,来理解什么是微服务。
传统的 Web 应用核心分为业务逻辑、适配器以及 API 或通过 UI 访问的 Web 界面。业务逻辑定义业务流程、业务规则以及领域实体。适配器包括数据库访问组件、消息组件以及访问接口等。
一个打车软件的架构图如下:
尽管也是遵循模块化开发,但最终它们会打包并部署为单体式应用。例如 Java 应用程序会被打包成 WAR,部署在 Tomcat 或者 Jetty 上。
这种单体应用比较适合于小项目,优点是:
当然它的缺点也十分明显,特别对于互联网公司来说:
所以,现在主流的设计一般会采用微服务架构。其思路不是开发一个巨大的单体式应用,而是将应用分解为小的、互相连接的微服务。
一个微服务完成某个特定功能,比如乘客管理和下单管理等。每个微服务都有自己的业务逻辑和适配器。一些微服务还会提供 API 接口给其他微服务和应用客户端使用。
比如,前面描述的系统可被分解为:
每个业务逻辑都被分解为一个微服务,微服务之间通过 REST API 通信。一些微服务也会向终端用户或客户端开发 API 接口。
但通常情况下,这些客户端并不能直接访问后台微服务,而是通过 API Gateway 来传递请求。API Gateway 一般负责服务路由、负载均衡、缓存、访问控制和鉴权等任务。
微服务架构的优点
微服务架构有很多重要的优点。首先,它解决了复杂性问题。它将单体应用分解为一组服务。
虽然功能总量不变,但应用程序已被分解为可管理的模块或服务。这些服务定义了明确的 RPC 或消息驱动的 API 边界。
微服务架构强化了应用模块化的水平,而这通过单体代码库很难实现。因此,微服务开发的速度要快很多,更容易理解和维护。
其次,这种体系结构使得每个服务都可以由专注于此服务的团队独立开发。只要符合服务 API 契约,开发人员可以自由选择开发技术。
这就意味着开发人员可以采用新技术编写或重构服务,由于服务相对较小,所以这并不会对整体应用造成太大影响。
第三,微服务架构可以使每个微服务独立部署。开发人员无需协调对服务升级或更改的部署。这些更改可以在测试通过后立即部署。所以微服务架构也使得 CI/CD 成为可能。
最后,微服务架构使得每个服务都可独立扩展。我们只需定义满足服务部署要求的配置、容量、实例数量等约束条件即可。
比如我们可以在 EC2 计算优化实例上部署 CPU 密集型服务,在 EC2 内存优化实例上部署内存数据库服务。
微服务架构的缺点和挑战
实际上并不存在 silver bullets,微服务架构也会给我们带来新的问题和挑战。其中一个就和它的名字类似,微服务强调了服务大小,但实际上这并没有一个统一的标准。
业务逻辑应该按照什么规则划分为微服务,这本身就是一个经验工程。有些开发者主张 10-100 行代码就应该建立一个微服务。
虽然建立小型服务是微服务架构崇尚的,但要记住,微服务是达到目的的手段,而不是目标。微服务的目标是充分分解应用程序,以促进敏捷开发和持续集成部署。
微服务的另一个主要缺点是微服务的分布式特点带来的复杂性。开发人员需要基于 RPC 或者消息实现微服务之间的调用和通信,而这就使得服务之间的发现、服务调用链的跟踪和质量问题变得的相当棘手。
微服务的另一个挑战是分区的数据库体系和分布式事务。更新多个业务实体的业务交易相当普遍。这些类型的事务在单体应用中实现非常简单,因为单体应用往往只存在一个数据库。
但在微服务架构下,不同服务可能拥有不同的数据库。CAP 原理的约束,使得我们不得不放弃传统的强一致性,而转而追求最终一致性,这个对开发人员来说是一个挑战。
微服务架构对测试也带来了很大的挑战。传统的单体 Web 应用只需测试单一的 REST API 即可,而对微服务进行测试,需要启动它依赖的所有其他服务。这种复杂性不可低估。
微服务的另一大挑战是跨多个服务的更改。比如在传统单体应用中,若有 A、B、C 三个服务需要更改,A 依赖 B,B 依赖 C。我们只需更改相应的模块,然后一次性部署即可。
但是在微服务架构中,我们需要仔细规划和协调每个服务的变更部署。我们需要先更新 C,然后更新 B,最后更新 A。
部署基于微服务的应用也要复杂得多。单体应用可以简单的部署在一组相同的服务器上,然后前端使用负载均衡即可。
每个应用都有相同的基础服务地址,例如数据库和消息队列。而微服务由不同的大量服务构成。每种服务可能拥有自己的配置、应用实例数量以及基础服务地址。这里就需要不同的配置、部署、扩展和监控组件。
此外,我们还需要服务发现机制,以便服务可以发现与其通信的其他服务的地址。因此,成功部署微服务应用需要开发人员有更好地部署策略和高度自动化的水平。
以上问题和挑战可大体概括为:
幸运的是,出现了很多微服务框架,可以解决以上问题。
第一代微服务框架
Spring Cloud
Spring Cloud 为开发者提供了快速构建分布式系统的通用模型的工具(包括配置管理、服务发现、熔断器、智能路由、微代理、控制总线、一次性令牌、全局锁、领导选举、分布式会话、集群状态等)。
主要项目包括:
Dubbo
Dubbo 是一个阿里巴巴开源出来的一个分布式服务框架,致力于提供高性能和透明化的 RPC 远程服务调用方案,以及 SOA 服务治理方案。
其核心部分包含:
但是显而易见,无论是 Dubbo 还是 Spring Cloud 都只适用于特定的应用场景和开发环境,它们的设计目的并不是为了支持通用性和多语言性。
并且它们只是 Dev 层的框架,缺少 DevOps 的整体解决方案(这正是微服务架构需要关注的)。而随之而来的便是 Service Mesh 的兴起。
下一代微服务:Service Mesh?
Service Mesh
Service Mesh 又译作“服务网格”,作为服务间通信的基础设施层。如果用一句话来解释什么是 Service Mesh,可以将它比作是应用程序或者说微服务间的 TCP/IP,负责服务之间的网络调用、限流、熔断和监控。
对于编写应用程序来说一般无须关心 TCP/IP 这一层(比如通过 HTTP 协议的 RESTful 应用)。
同样使用 Service Mesh 也就无须关系服务之间的那些原来是通过应用程序或者其他框架实现的事情,比如 Spring Cloud、OSS,现在只要交给 Service Mesh 就可以了。
Service Mesh 有如下几个特点:
Service Mesh 的架构如下图所示:
Service Mesh 作为 Sidebar 运行,对应用程序来说是透明,所有应用程序间的流量都会通过它,所以对应用程序流量的控制都可以在 Service Mesh 中实现。
目前流行的 Service Mesh 开源软件有 Linkerd、Envoy 和 Istio,而最近 Buoyant(开源 Linkerd 的公司)又发布了基于 Kubernetes 的 Service Mesh 开源项目 Conduit。
Linkerd
Linkerd 是开源网络代理,设计为以服务网格部署:用于管理,控制和监控应用程序内的服务与服务间通讯的专用层。
Linkerd 旨在解决 Twitter、Yahoo、Google 和 Microsoft 等公司运营大型生产系统时发现的问题。
根据经验,最复杂,令人惊奇和紧急行为的来源通常不是服务本身,而是服务之间的通讯。Linkerd 解决了这些问题,不仅仅是控制通讯机制,而是在其上提供一个抽象层。
它的主要特性有:
Envoy
Envoy 是一个面向服务架构的 L7 代理和通信总线而设计的,这个项目诞生是出于以下目标:
对于应用程序而言,网络应该是透明的,当发生网络和应用程序故障时,能够很容易定位出问题的根源。
Envoy 可提供以下特性:
Istio
Istio 是一个用来连接、管理和保护微服务的开放平台。Istio 提供一种简单的方式来建立已部署服务网络,具备负载均衡、服务间认证、监控等功能,而不需要改动任何服务代码。
想要为服务增加对 Istio 的支持,您只需要在环境中部署一个特殊的边车(sidecar),使用 Istio 控制面板功能配置和管理代理,拦截微服务之间的所有网络通信。
Istio 目前仅支持在 Kubernetes 上的服务部署,但未来版本中将支持其他环境。
Istio 提供了一个完整的解决方案,通过为整个服务网格提供行为洞察和操作控制来满足微服务应用程序的多样化需求。
它在服务网络中统一提供了许多关键功能:
Istio 服务网格逻辑上分为数据面板和控制面板:
下图显示了构成每个面板的不同组件:
Conduit
Conduit 是为 Kubernetes 设计的一个超轻型服务网格服务,它可透明地管理在 Kubernetes 上运行的服务的运行时通信,使得它们更安全可靠。Conduit 提供了可见性、可靠性和安全性的功能,而无需更改代码。
Conduit service mesh 也是由数据面板和控制面板组成。数据面板承载应用实际的网络流量。控制面板驱动数据面板,并对外提供北向接口。
对比
Linkerd 和 Envoy 比较相似,都是一种面向服务通信的网络代理,均可实现诸如服务发现、请求路由、负载均衡等功能。
它们的设计目标就是为了解决服务之间的通信问题,使得应用对服务通信无感知,这也是 Service Mesh 的核心理念。
Linkerd 和 Envoy 像是分布式的 Sidebar,多个类似 Linkerd 和 Envoy 的 proxy 互相连接,就组成了 Service Mesh。
而 Istio 则是站在了一个更高的角度,它将 Service Mesh 分为了 Data Plane 和 Control Plane。
Data Plane 负责微服务间的所有网络通信,而 Control Plane 负责管理 Data Plane Proxy:
并且 Istio 天生的支持 Kubernetes,这也弥合了应用调度框架与 Service Mesh 之间的空隙。
关于 Conduit 的资料较少,从官方介绍看它的定位和功能与 Istio 类似。
Kubernetes + Service Mesh = 完整的微服务框架
Kubernetes 已经成为了容器调度编排的事实标准,而容器正好可以作为微服务的最小工作单元,从而发挥微服务架构的最大优势。
所以我认为未来微服务架构会围绕 Kubernetes 展开。而 Istio 和 Conduit 这类 Service Mesh 天生就是为了 Kubernetes 设计,它们的出现补足了 Kubernetes 在微服务间服务通讯上的短板。
虽然 Dubbo、Spring Cloud 等都是成熟的微服务框架,但是它们或多或少都会和具体语言或应用场景绑定,并只解决了微服务 Dev 层面的问题。
若想解决 Ops 问题,它们还需和诸如 Cloud Foundry、Mesos、Docker Swarm 或 Kubernetes 这类资源调度框架做结合:
但是这种结合又由于初始设计和生态,有很多适用性问题需要解决。
Kubernetes 则不同,它本身就是一个和开发语言无关的、通用的容器管理平台,它可以支持运行云原生和传统的容器化应用。
并且它覆盖了微服务的 Dev 和 Ops 阶段,结合 Service Mesh,它可以为用户提供完整端到端的微服务体验。
所以我认为,未来的微服务架构和技术栈可能是如下形式:
多云平台为微服务提供了资源能力(计算、存储和网络等),容器作为最小工作单元被 Kubernetes 调度和编排,Service Mesh 管理微服务的服务通信,最后通过 API Gateway 向外暴露微服务的业务接口。
我相信未来随着以 Kubernetes 和 Service Mesh 为标准的微服务框架的盛行,将大大降低微服务实施的成本,最终为微服务落地以及大规模使用提供坚实的基础和保障。
文章名称:微服务并非SpringCloud和Dubbo,下一代微服务是什么?
分享地址:http://www.mswzjz.cn/qtweb/news40/303790.html
攀枝花网站建设、攀枝花网站运维推广公司-贝锐智能,是专注品牌与效果的网络营销公司;服务项目有等
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 贝锐智能