一文看懂微服务背后的技术演进与应用实践

本文涉及的产品
任务调度 XXL-JOB 版免费试用,400 元额度,开发版规格
云原生网关 MSE Higress,422元/月
注册配置 MSE Nacos/ZooKeeper,118元/月
简介: 2021年7月2日,阿里云用户组(AUG)第一次线下活动在济南召开。阿里云云原生资深专家李国强结合自身微服务领域经验,现场跟数十家山东企业分享了云原生的代表技术之一“微服务”的演进和应用实践。本文根据作者的现场演讲整理而成。


2021年7月2日,阿里云用户组(AUG)第一次线下活动在济南召开。阿里云云原生资深专家李国强结合自身微服务领域经验,现场跟数十家山东企业分享了云原生的代表技术之一“微服务”的演进和应用实践。本文根据作者的现场演讲整理而成。



背景

在企业内部分为运维或开发,但最终所有做的事情都是为了解决业务的问题。如果你做一件事情,只有技术目标而没有业务目标,失败是很常见的。


什么样的业务诉求会驱动一个企业去考虑微服务呢?


随着架构的演进,当你的业务越来越复杂,组件越来越多,对于每个业务组件的独立性要求或者技术栈的异构成本越来越高的时候,就会需要去考虑微服务。换言之,如果这个业务是一个比较平稳、没有什么大的挑战,其实不需要去做微服务的改造。




各企业需要结合自己的业务去进行分析是否真的需求微服务。很多企业可能为了沟通,或者架构师、CTO有自己的诉求,想要这个技术领先去做微服务,最终惨淡收场,其实这种案例是非常多的。微服务的适用性一定是从一个业务驱动的这个角度考虑的,需要考虑的是业务的复杂程度。


比较单体和微服务之间的一个区别,什么情况下需要它,和复杂程度是非常相关的。当你的一个业务的复杂程度比较低,处于单体时代的时候,前端后端数据库都是一体的,需要进行变更时,一个数据包上去,所有的这个业务都上去了。并且,当你的业务足够简单的时候,单体效率一定是最高的。


业务不断往前演进,复杂度越来越高的时候,单方面的发布可能会影响到别人。比如我有一个数据包,里边对应一个模块,在这个模块上线的时候,需要去考虑别的模块怎么上线。业务流量进行扩缩容的时候,需要对整个业务进行沟通,而不是对单个模块进行沟通,你会发现资源浪费会很高。这个时候就会到一些拐点,不管是你的发版或者是你的资源利用率都会出现一些问题,生产效率开始降低。单体应用架构的效率出现的拐点就是客户考虑是否需要微服务架构的一个时间点。



微服务的应用架构


1、应用架构的演进历程


微服务最早的时候其实还是单品为主。现在的微服务对主流的一些技术框架,像 Java 体系的四分之二的 Double 类,其他语言都没有放置。但实际上其他语言都有非常多的微服务框架可以选择,像 PDP 等都会有一些。


之前云栖大会做过一次统计,账号体系在整个后端开发中的地位,50%的投票是 Java 后端开发。但现在企业越来越多元化,之前 Java 占统治的地位已经发生了变化。规模略大的公司基本上都是多元体系,里面有很多种,不同业务线的诉求不一样,可能有的业务线是 Java;有些业务偏前端框架,会用 PAP、PYTHON;还有就是企业的并购,也会带来很多元的体系。


多元数据的解法就是用一个多种的维度方案或是用新的技术形式,再往后就是容器化,微服务带来的很多问题是通过容器来解决的。包括微服务器,有些人可能直接放弃不用了。负责人看到 Double 这个体系,直接用 K8sS Service 去做它的这个运行的暴露单元,好处是和语言无关,什么样的体系里面都可以是一个 K8s Service。但在用了微服务后暴露出来的问题会比较多,我们需要对这么多的业务组件进行治理。


K8s 本身是不强的,就是为了要进一步解决这个问题,引入了更多的网格技术。去年开始越来越多的企业开始做网格网络,这里面就包括用 Service Mesh 这个服务网解决跨语言的调研和服务治理。还有一个更新的叫做 Dapr 的技术解决供应链依赖问题。


可以发现,应用架构的演进是一个业务不断地提出问题,然后产出新框架,新的框架又可能会引入新的问题,不断推动着技术的运行过程。


阿里应用架构演进


整个阿里巴巴内部是完全走过一遍上述流程的,因为业务的快速增长,对技术团队也在不断地进行挑战。PHP 是世界上最好最早的语言,淘宝商城其实就是用的 PHP。但是后来业务发展,淘宝的体量越来越快后,不但不能够支撑这个业务,PHP 本身的扩展能力也撑不住了。


2009 年,阿里先做了分布式业务。阿里正式地从单体变成了分布式业务,那时候体量已经比较大,还没有双十一,但已经促成了阿里内部去做自己的分布式框架。除了会有分布式的服务框架,还有一些分布式的数据库和分布式的相应规定,在内部称为三辆马车,这也是从单体变成分布式框架时,必须要解决的三件事。


到 2011 年时,阿里开始探索容器化,先做了 T4 项目,是对于容器化的技术实现,最后变成 Pouch 的容器化的实现,它也是符合容器标准的容器化的实现。这体现出针对微服务后带来的运维挑战,容器是一个非常好的解决方案。


再往后到 2013 年,整个 Oracle 包括小型机在阿里下线,全部变成自己的开源的技术栈。2015 年开始,阿里全面拥抱云原生技术,包括容器技术的对外开放等业务,整个体系逐步深化。2016 年到 2019 年间,阿里做了云原生上云,包含已经全面拥抱的 K8s 体系,以及微服务的改造、治理等。


到现在这段时间,我们做的事情是图上画的最后一个阶段:基于网格进一步对服务点的支持,多语言越来越常见。阿里有很多业务是从外部合并进来的,阿里原来的整套技术战略全部都是 Java,对外部合并进来的用户非常不友好,因为他们不可能全部配好重启,不得不去适配 Java。所以,近来我们在做的事情就是基于网格的新一代微服务架构做演进,会有一些技术让微服务的框架本身对于多元的支持变得更好,包括治理也可以去解耦,这也是成本较高的一个原因。


2、Apache Dubbo 3.0


Dubbo 3.0 在 6 月底已经发布了最新版,这其实是一个很坎坷的项目。2008 年的时候Dubbo 在内部正式发布,2011 年正式开源。以前,Dubbo 和 HMPK 在阿里内部都有,但阿里希望技术上是统一的,不希望有两套技术,两边不互通。这是两个技术栈,所以进行了一次 PK,Apache Dubbo 胜出,所以阿里内部目前全是 Apache Dubbo。现在这也是国内最火的 Apache 框架。中间有段时间,阿里内部投入比较少。到 2017 年时,我们中间件团队再次去做商业化,重启整个 Dubbo 开源,才让 Apache 从完整的一个项目到前几天时完成了发布。


这个项目是非常活跃的,现在的贡献和使用率都非常高。Dubbo 3.0 里其实做了很多事去拥抱最新的一些理念,比如对 Service Mesh 的支持,它的协议也和 GRP 做了更好的兼容,做了一系列全新的服务发现模式。现在国内用得比较多的还是 2.7、2.6 的版本,3.0 发布之后,很多企业一旦用起来都比较喜欢。当时还没发布时,社区里就有一个用户在拿 3.0 开始测试了。


3、Spring Cloud Alibaba


另一个不得不夸奖的是 Cloud 体系,它和 Java 的微服务这两个体系目前还是最流行的。Spring Cloud 体系的优点是组件非常丰富。Dubbo 这两年在从 IPC 框架往主流服务器去引擎,而 Spring Cloud 诞生之初就是要把微服务数据相关部门支持起来。


随后,阿里巴巴做了 Spring Cloud Alibaba,阿里开源一系列的中间件,包括 Double 注册中心、配置中心、限流交易规律以及事务,去帮助用户解决刚才讲到的微服体系中各种各样的问题。


微服务是一整个体系,而不仅仅是简单的调用框架。微服务在大家使用的落地过程中碰到的问题,阿里非常重视。它把其中一些重要的点进行开源,同时通过与阿里云结合做 SDK 的分装,把这两部分合在一起。主要目的之一是帮助用户去使用 Spring Cloud 体系,另一个目的是帮助用户在阿里云上更好地运行 Spring Cloud。所以,这是阿里巴巴的 Cloud。


大部分的用户知道的 Nacos、Sentinel 等中间件,实际上和云的一些产品间有非常好的基础。我们也会和其他公司去联合开发,不断地演进项目。因为在阿里,我们会认为开源和商业化是同样重要的,一个团队既需要承担开源项目,也需要承担商业化的服务。



微服务不是免费的午餐



1、微服务会带来复杂度的提升


微服务不是免费的,它会带来很大的复杂度提升,包括服务框架的选型、注册中心的稳定性等。当一个客户足够大的时候,他会面临一个很大的问题,就是注册中心的稳定性可能会成为一个业务的瓶颈,包括应用的监控、统一的配置管理、任务调度等一系列的东西都会成微服务落地过程中需要考虑的问题。


在这个过程中,对整个企业挑战还是比较大的,不是每个企业都有能力去把整个微服务的开发组件全部自己运维起来。这一大堆组件如果全部靠自己运维起来,要求还是比较高的。所以,在里面更多地是希望企业更关注业务的一些相对偏运维的事情,云厂商才可能通过用其他方式进行解决,或者是如果企业足够强大,也可以去通过开源自建的方式去解决。


2、软件架构诉求与基础设施能力间存在“步调差 ”


刚才讲到 Spring Cloud、 Dubbo 挺好用,但实际上也存在问题,即 SDK 的升级会变得非常困难,因为这个升级对业务没有任何价值,业务方不愿意去配合。很多时候都是系统来说 2.6 有 bug,需要升一下 2.7 版本。这个时候就需要推动业务方去做,因为他把 SDK 引用进去了,引了之后如果有 bug 或者做一个增强,都需要在 SDK 做,这时业务方往往是不愿意的。在阿里内部这个问题也同样存在。


实际上这涉及到一个比较大的话题,即业务开发人员和基础设施的运维人员的边界在哪。SDK 这件事情到底属于业务人员还是属于基础知识,这个问题问起来很抽象,是大家的一个责任边界的问题。业务开发人员认为 SDK 是运维测试的,因为我只要接口,剩下更新、治理、工程上和业务开发没关系。运维人员又不得不让研发人员去配合业务研发,这是模糊的边界,必然会发生冲突。


所以从云的角度或从计算的角度出发,我们在探讨所谓的软件架构速度和基础设施能力丰富度的问题时,能不能把业务和完成业务没有那么相关的所有能力都下降到基础设施的运维团队,这是一直在思考的一个问题。在演练中经历过几代:


  • 第一代是云计算。它把基础设施的这个东西从业务侧翻下来,业务人员就不需要再去关心基础资源。


  • 第二个是容器和推广安全。运维这件事情变得更简单后,开发人员就不会关心这一层了,但是 SDK 侵入这件事对于业务开发员来讲,就是一个侵略。


  • 剥离的问题也是在 Service Mesh 这个技术上来做的。它把所有运行态的治理能力、流量管理能力全部从用户侧、开发测的 SDK 过滤出来,而不再需要去做 SDK 的生产。这个也就意味着用了 Service Mesh 之后,用户是不需要做语言绑定,也就解决了刚才说的那个模糊地带很难解决的问题。这个可能对于现在在用 Spring Cloud 的企业都可以考虑,这个东西会不会成为替代掉现在任何一个单语言的微服务框架技术。


  • 再往后讲其实还有一种依赖。比如当你需要一个中间件时,你一定要去做选型,这需要业务开发人员的配合。单独的一个理念就是我能让你把这个中间件下沉到基础设施。到这时所有的业务开发人员真的只需要关心业务代码,所有的这些基础设施就全部下载下来,是不断地去让基础设施能力更加丰富,来满足上层业务这样一个自主发展趋势。



3、Service Mesh的剥离了服务和流量治理能力


Service Mesh 就是服务治理、流量治理框架。在原有的设计里,它属于业务的一部分,上面是业务代码,下面是这些能力。Service Mesh 能做的最重要的一件事,就是把这些能力剥离到 Istio 里来,业务带中就是纯业务功能,边界很清晰,服务治理、流量治理框架由运维团队来服务。



上层所有的语言和下层所有的基础设施,通过一层层统一的接口进行抽象。不管用 Rock MQ 还是 Rabbit MQ,对上层业务是无感的,它会给上层业务一个统一抽象的 API ,而且是 HTTP 或者 gRPC 这样的一个企业的 API 。开发人员不再关心底下到底是什么,进一步地让开发人员和下面进行解耦。


目标理想架构


最后真正理想的框架是什么样的呢?开发人员和业务人员边界到底在哪呢?我们画了一个理想的框架。


  • 对上层来讲的话,我们会期望不同的业务单元可以选择不同的语言和框架。比如说有的是单体,有的是 Spring Cloud 或者 Dubbo,从调用层面来讲,完全是互通的,可以接入 Service Mesh 的技术,或者现有的这个框架
  • 对于中间的容器服务,会让业务不再感知具体的中间件。
  • 再往下是容器服务,作为整个位置的一个支撑。
  • 右边是它的支撑体系,如微服务会带来一些复杂性,需要通过可观测性监控你的 Devops 的流程 CICD 或者安全性支撑。


这时候就可以让你的业务开发人员用他喜欢的语言去开发他想的业务,而不再关心这些所有的基础设施团队需要去解决的问题,这其实也是从应用框架或微服务上来讲的最终目标。



微服务化实践案例



1、微服务引擎(MSE)


我们去做微服务时会碰到一些问题,有一种解决方式是进行全国自建,这对于一些企业来说工作量比较大。阿里云会把其中一些共性的东西变成产品来提供。比如说你去搭建一个微服务,你需要配置功能、网关、治理能力,阿里云会用一个产品的形态直接给到你,不用自己建了。就好像我原来是自建的,现在是影响他启动的数据不一样,那对于你原来是自建的 Nacos,现在就是一个云产品的提供。





2、畅捷通


另外有一个案例,畅捷通是用友的一个全资子公司,这个客户专门做小微企业的财务系统。它全面上到阿里云,把自己的财务系统全部变成 SaaS 化的模式交付。大家都知道传统的财务系统 ERP 等都是偏单体的架构,畅捷通的整个财务系统也经历了从虚机到 K8s 的转变。一开始,是从虚机跑了微服务,后来从虚机转到了 K8s。整体来看,在云上的规模非常大,也服务了非常多的客户。


从容器化到微服务这样一个过程,它基本上也是这个难题,希望提升系统微服务治理能力和监控能力,在新业务快速上线、频繁的版本迭代中确保系统的稳定健壮。它一开始用了阿里云的一些项目,后来想把它变成 Spring Cloud,现在是两个结合在一起使用。



3、阿里云服务网格ASM


服务网格这个产品技术大概是在去年发布用于生产,但实际上真正在生产上落地的企业还在不断地去尝试。阿里云也一样,通过一个产品去降低用户使用 Service Mesh,因为 Mesh 这件事情对于很多企业来讲只是个技术概念,企业要的是一种多元微服务的能力,而 ASM 服务网的产品会帮助用户去做服务网的一个落地。


4、商米科技通过 Service Mesh 完成微服务化


上海的商品科技是做各种物联网设备的,它碰到的问题是内部技术框架和语言体系比较复杂,各种各样的语言和服务都遇到了困难。它希望对这些业务能够进行一个统一的流量管理,包括发布时的流量管理,所以它最终选择用 Service Mesh 这个技术去解决多元微服务。从这些业务价值的数据可以看出,比如更新迭代、异常排查、控制面资源成本都有了较大的优化。



以上就是关于微服务的演进和实践分享,希望有带给大家一些微服务的体系的梳理。


相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
1月前
|
Kubernetes Cloud Native 微服务
探索云原生技术:容器化与微服务架构的融合之旅
本文将带领读者深入了解云原生技术的核心概念,特别是容器化和微服务架构如何相辅相成,共同构建现代软件系统。我们将通过实际代码示例,探讨如何在云平台上部署和管理微服务,以及如何使用容器编排工具来自动化这一过程。文章旨在为开发者和技术决策者提供实用的指导,帮助他们在云原生时代中更好地设计、部署和维护应用。
|
2月前
|
运维 持续交付 云计算
深入解析云计算中的微服务架构:原理、优势与实践
深入解析云计算中的微服务架构:原理、优势与实践
106 3
|
14天前
|
搜索推荐 NoSQL Java
微服务架构设计与实践:用Spring Cloud实现抖音的推荐系统
本文基于Spring Cloud实现了一个简化的抖音推荐系统,涵盖用户行为管理、视频资源管理、个性化推荐和实时数据处理四大核心功能。通过Eureka进行服务注册与发现,使用Feign实现服务间调用,并借助Redis缓存用户画像,Kafka传递用户行为数据。文章详细介绍了项目搭建、服务创建及配置过程,包括用户服务、视频服务、推荐服务和数据处理服务的开发步骤。最后,通过业务测试验证了系统的功能,并引入Resilience4j实现服务降级,确保系统在部分服务故障时仍能正常运行。此示例旨在帮助读者理解微服务架构的设计思路与实践方法。
65 16
|
17天前
|
监控 JavaScript 数据可视化
建筑施工一体化信息管理平台源码,支持微服务架构,采用Java、Spring Cloud、Vue等技术开发。
智慧工地云平台是专为建筑施工领域打造的一体化信息管理平台,利用大数据、云计算、物联网等技术,实现施工区域各系统数据汇总与可视化管理。平台涵盖人员、设备、物料、环境等关键因素的实时监控与数据分析,提供远程指挥、决策支持等功能,提升工作效率,促进产业信息化发展。系统由PC端、APP移动端及项目、监管、数据屏三大平台组成,支持微服务架构,采用Java、Spring Cloud、Vue等技术开发。
|
2月前
|
Cloud Native 安全 持续交付
深入理解微服务架构及其在现代软件开发中的应用
深入理解微服务架构及其在现代软件开发中的应用
95 32
|
2月前
|
弹性计算 持续交付 API
构建高效后端服务:微服务架构的深度解析与实践
在当今快速发展的软件行业中,构建高效、可扩展且易于维护的后端服务是每个技术团队的追求。本文将深入探讨微服务架构的核心概念、设计原则及其在实际项目中的应用,通过具体案例分析,展示如何利用微服务架构解决传统单体应用面临的挑战,提升系统的灵活性和响应速度。我们将从微服务的拆分策略、通信机制、服务发现、配置管理、以及持续集成/持续部署(CI/CD)等方面进行全面剖析,旨在为读者提供一套实用的微服务实施指南。
|
1月前
|
运维 监控 Java
后端开发中的微服务架构实践与挑战####
在数字化转型加速的今天,微服务架构凭借其高度的灵活性、可扩展性和可维护性,成为众多企业后端系统构建的首选方案。本文深入探讨了微服务架构的核心概念、实施步骤、关键技术考量以及面临的主要挑战,旨在为开发者提供一份实用的实践指南。通过案例分析,揭示微服务在实际项目中的应用效果,并针对常见问题提出解决策略,帮助读者更好地理解和应对微服务架构带来的复杂性与机遇。 ####
|
1月前
|
算法 NoSQL Java
微服务架构下的接口限流策略与实践#### 一、
本文旨在探讨微服务架构下,面对高并发请求时如何有效实施接口限流策略,以保障系统稳定性和服务质量。不同于传统的摘要概述,本文将从实际应用场景出发,深入剖析几种主流的限流算法(如令牌桶、漏桶及固定窗口计数器等),通过对比分析它们的优缺点,并结合具体案例,展示如何在Spring Cloud Gateway中集成自定义限流方案,实现动态限流规则调整,为读者提供一套可落地的实践指南。 #### 二、
73 3
|
1月前
|
负载均衡 Java 开发者
深入探索Spring Cloud与Spring Boot:构建微服务架构的实践经验
深入探索Spring Cloud与Spring Boot:构建微服务架构的实践经验
179 5
|
1月前
|
消息中间件 运维 安全
后端开发中的微服务架构实践与挑战####
在数字化转型的浪潮中,微服务架构凭借其高度的灵活性和可扩展性,成为众多企业重构后端系统的首选方案。本文将深入探讨微服务的核心概念、设计原则、关键技术选型及在实际项目实施过程中面临的挑战与解决方案,旨在为开发者提供一套实用的微服务架构落地指南。我们将从理论框架出发,逐步深入至技术细节,最终通过案例分析,揭示如何在复杂业务场景下有效应用微服务,提升系统的整体性能与稳定性。 ####
53 1