多次尝试学习,终于搞懂了微服务架构

2023-05-27 0 840

微服务项目的基本概念最先在 2012 年明确提出,在 Martin Fowler 的力推下,微服务项目在 2014 年后获得了大力推进。那时他们透过几组手绘图来剖析下微服务项目的核心理念构架。

多次尝试学习,终于搞懂了微服务架构

相片源自 Pexels

甚么是微服务项目?

微服务项目 Microservices 之父,弗兰克.库珀,对微服务项目约莫的简述如下表所示:

就现阶段来说,对微服务项目业内并没两个国际标准化的、国际标准的表述(While there is no precise definition of this architectural style ) 。

但一般来说在其来说,微服务项目构架是一类构架商业模式换句话说是一类构架艺术风格,它倡导将单个插件分割成几组小的服务项目,每一服务项目运转分立的自己的民主化中,服务项目间相互协同、相互配合,为使用者提供更多最后商业价值。

服务项目间选用轻量的通讯监督机制相互沟通交流(一般来说是如前所述 HTTP 的 RESTful API ) 。每一服务项目都紧紧围绕着具体内容销售业务展开构筑,因此能被独立地布署到制造自然环境、类制造自然环境等。

除此之外,应尽量减少国际标准化的、封闭式的服务项目管理工作商业模式,对具体内容的两个服务项目来说,应依照销售业务语句,优先选择最合适的词汇、辅助工具对其展开构筑,能有两个十分轻量的封闭式管理工作来协同那些服务项目。能选用相同的词汇来撰写服务项目,也能选用相同的统计数据储存。

依照弗兰克.库珀的叙述,我归纳了几点:

多次尝试学习,终于搞懂了微服务架构

①小服务项目

小服务项目,没特定的国际标准或者规范,但他在总体规范上一定是小的。

②民主化分立

每几组服务项目都是分立运转的,可能我这个服务项目运转在 Tomcat 容器,而另两个服务项目运转在 Jetty 上。能透过民主化方式,不断的横向扩展整个服务项目。

③通讯

过去的协议都是很重的,就像 ESB,就像 SOAP,轻通讯,这意味着相比过去更智能更轻量的服务项目相互调用,就所谓 smart endpoints and dumb pipes。

那些 Endpoint 都是解耦的,完成两个销售业务通讯调用串起那些 Micro Service 就像是 Linux 系统中透过管道串起一系列命令销售业务。

过去的销售业务,他们一般来说会考虑各种各样的依赖关系,考虑系统耦合带来的问题。微服务项目,能让开发者更专注于销售业务的逻辑开发。

④布署

不止销售业务要分立,布署也要分立。不过这也意味着,传统的开发流程会出现一定程度的改变,开发的适合也要有一定的运维职责。

⑤管理工作

传统的企业级 SOA 服务项目往往很大,不易于管理工作,耦合性高,团队开发成本比较大。

微服务项目,能让团队各思其政的优先选择技术实现,相同的 Service 能依照各自的需要优先选择相同的技术栈来实现其销售业务逻辑。

微服务项目的利与弊

为甚么用微服务项目呢?因为好玩?不是的。下面是我从网络上找到说的比较全的优点:

优点是每一服务项目足够内聚,足够小,代码容易理解这样能聚焦两个指定的销售业务功能或销售业务需求。开发简单、开发效率提高,两个服务项目可能就是专一的只干一件事。微服务项目能被小团队单独开发,这个小团队是 2 到 5 人的开发人员组成。微服务项目是松耦合的,是有功能意义的服务项目,无论是在开发阶段或布署阶段都是分立的。微服务项目能选用相同的词汇开发。易于和第三方集成,微服务项目允许容易且灵活的方式集成自动布署,透过持续集成辅助工具,如 Jenkins,Hudson 或其他界面组件混合。每一微服务项目都有他们的储存能力,能有他们的统计数据库,也能有国际标准化统计数据库。

总的来说,微服务项目的优势,就是在于,面对大的系统,能有效的减少复杂程度,使服务项目构架的逻辑更清晰明了。

但是这样也会带来很多问题,就譬如分布式自然环境下的统计数据一致性,测试的复杂性,运维的复杂性。

甚么组织适合选用微服务项目?

微服务项目带了种种优点,种种弊端,那么甚么组织适合选用微服务项目?

①墨菲定律(设计系统)和康威定律(系统划分)

康威定律,是两个五十多年前就被明确提出来的微服务项目基本概念。在康威的这篇文章中,最有名的一句话就是:

Organizations which design systems are constrained to produce designs which are copies of the communication structures of these organizations.

-Melvin Conway(1967)

中文直译约莫的意思就是:设计系统的组织,其产生的设计等同于组织之内、组织间的沟通交流结构。

看看下面的相片,再想想 Apple 的产品、微软的产品设计,就能形象生动的理解这句话。

多次尝试学习,终于搞懂了微服务架构

感兴趣的各位能研究一下!

②构架演化

构架是不断演化出来的,微服务项目也是这样,当从各大科技公司,规模大到一定程度,完全需要演化成更进一步管理工作的技术构架体系。

多次尝试学习,终于搞懂了微服务架构

传统的团队,都是面向过程化的,产品想完了去找策划,策划完了找开发,接着顺着一步一步找。

他们做技术都是为了产品的,一旦过程出来了甚么问题,回溯寻找问题会十分耗时。

多次尝试学习,终于搞懂了微服务架构

选用了微服务项目构架体系,团队组织方式需要转变成跨职能团队,即每一团队都有产品专家,策划专家,开发专家,运维专家,他们选用 API 方式发布他们的功能,而平台选用他们的功能发布产品。

多次尝试学习,终于搞懂了微服务架构
多次尝试学习,终于搞懂了微服务架构

微服务项目技术构架体系

下面我分享一下大部分公司都选用的微服务项目技术构架体系:

多次尝试学习,终于搞懂了微服务架构

服务项目发现

主流的服务项目发现,分为三种:

多次尝试学习,终于搞懂了微服务架构

第一类,开发人员开发了程序以后,会找运维配两个域名,服务项目的话透过 DNS 就能找到他们对应的服务项目。

缺点是,由于服务项目没负载均衡功能,对负载均衡服务项目,可能会有相当大的性能问题。

多次尝试学习,终于搞懂了微服务架构

第二种,是现阶段普遍的做法。能参考 Zuul 网关,每两个服务项目都透过服务项目端内置的功能注册到注册中心,服务项目消费者不断轮询注册中心发现对应的服务项目,选用内置负载均衡调用服务项目。

缺点是,对多词汇自然环境不是很好,你需要单独给消费者的客户端开发服务项目发现和负载均衡功能。当然了,这个方法一般来说都是用在 Spring Cloud 上的。

多次尝试学习,终于搞懂了微服务架构

第三种,是将客户端和负载均衡放在同两个主机,而不是同两个民主化内。

这种方法相对第一类第二种方法来说,改善了他们的缺点,但是会极大增加运维成本。

网关

微服务项目的网关是甚么?他们能联系生活实际想一下。每两个大的公司,都会有一偏属于他们的建筑区,而这建筑区内,都有不少的门卫。如果有外来人员进入公司,会先和门卫打好招呼,才能进去。

将生活实际联系到微服务项目上,就不难理解网关的意思了:

多次尝试学习,终于搞懂了微服务架构

网关的作用如下表所示:

反向路由:很多时候,公司不想让外部人员看到他们公司的内部,就需要网关来展开反向路由。即将外部请求转换成内部具体内容服务项目调用。安全认证:网络中会有很多恶意访问,譬如爬虫,譬如黑客攻击,网关维护安全功能。限流熔断:当请求很多服务项目不堪重负,会让他们的服务项目自动关闭,导致不能用服务项目。限流熔断能有效的避免这类问题。日志监控:所有的外面的请求都会经过网关,这样他们就能选用网关来记录日志信息。灰度发布,蓝绿布署。是指能平滑过渡的一类发布方式。在其上能展开 A/B testing。

即让一部分使用者继续用产品特性 A,一部分使用者开始用产品特性 B,如果使用者对 B 没甚么反对意见,那么逐步扩大范围,把所有使用者都迁移到 B 上面来。

开源网关 Zuul 构架:

多次尝试学习,终于搞懂了微服务架构

Zuul 网关核心理念其实是两个 Servlet,所有请求都会经过 Zuul Servlet 传到 ZuulFilter Runner,然后分发到三种过滤器。

先说说构架图左半部分,分别是选用 Groovy 实现的前置路由过滤器,路由过滤器,后置路由过滤器。

一般请求都会先经过前置路由过滤器处理,一般的自表述 Java 封装逻辑也会在这里实现。

路由过滤器,实现的是找到对应的微服务项目展开调用。调用完了,响应回来,会经过后置路由过滤器,透过后置路由过滤器他们能封装日志审计的处理。

能说 Zuul 网关最大的特色就是它的三层过滤器。构架图右半部分,是 Zuul 网关设计的自表述过滤器加载监督机制。

网关内部会有制造者消费者模型,自动的将过滤器脚本发布到 Zuul 网关读取加载运转。

配置中心

以前,开发人员把配置文件放在开发文件里面,这样会有很多隐患。譬如,配置规范相同,无法追溯配置人员。

一旦需要大规模改动配置,改动时间会很长,无法追溯配置人员,从而影响整个产品,后果是他们承担不起的。

因此就有配置中心这个喽!现在的开源中心有百度配置中心 Disconf,Spring Cloud Config,Apollo。

那时重点说说现在应用质量不错的配置中心,携程开源的阿波罗(Apollo):

多次尝试学习,终于搞懂了微服务架构

Apollo 的配置中心规模比较大,本地应用会有响应的配置中心客户端,能定时同步配置中心里的配置。如果配置中心怠机,会选用缓存来展开配置。

通讯方式

关于通讯方式,一般市面也就是两种远程调用方式,我整理了两个表格:

多次尝试学习,终于搞懂了微服务架构

监控预警

监控预警对微服务项目很重要,两个可靠的监控预警体系对微服务项目运转至关重要。

一般监控分为如下表所示层次:

多次尝试学习,终于搞懂了微服务架构

从基础设施到使用者端,层层有监控,全方位,多角度,每两个层面都很重要。

总体来说,微服务项目可分为 5 个监控点:

日志监控Metrics 监控健康检查调用链检查告警系统

①监控构架

下面的图是大部分公司的一类监控构架图。每两个服务项目都有两个 Agent,Agent 收集到关键信息,会传到一些 MQ 中,为了解耦。

同时将日志传入 ELK,将 Metrics 传入 InfluxDB 时间序列库。而像 Nagios,能定期向 Agent 发起信息检查微服务项目。

多次尝试学习,终于搞懂了微服务架构

②调用链监控 APM

很多公司都有调用链监控,就譬如阿里有鹰眼监控,点评的 Cat,大部分调用链监控(没错,我指的 Zipkin)构架是这样的:

多次尝试学习,终于搞懂了微服务架构

当请求进入 Web 容器的时候,会经过创建 Tracer,连接 Spans(模拟潜在的分布式工作的延迟,该模块还包含在系统网络间传递跟踪语句信息的辅助工具包,如透过 HTTP Headers)。

Spans 有两个语句,其中包含 Tracer 标识符,将其放在表示分布式操作的树的正确位置。

当他们把图中的各种 Span 放到后端的时候,他们的服务项目调用链会动态的生成调用链。

下面是一些市场上用的比较多的调用链监控对比:

多次尝试学习,终于搞懂了微服务架构

熔断、隔离、限流、降级

面对巨大的突发流量下,大型公司一般会选用一系列的熔断(系统自动将服务项目关闭防止让出现的问题最大化)、隔离(将服务项目和服务项目隔离,防止两个服务项目挂了其他服务项目不能访问)、限流(单位时间内之允许一定数量使用者访问)、降级(当整个微服务项目构架整体的负载超出了预设的上限阈值或即将到来的流量预计将会超过预设的阈值时,为了保证重要或基本的服务项目能正常运转,他们能将一些不重要或不紧急的服务项目或任务展开服务项目的延迟选用或暂停选用)措施。

下面介绍一下 Hystrix 的运转流程:

多次尝试学习,终于搞懂了微服务架构

每两个微服务项目调用时,都会选用 Hystrix 的 Command 方式(上图的左上角那个),然后选用 Command 同步的,或者是响应式的,或者是异步的,判断电路是否熔断(顺着图从左往右看),如果断路则走降级 Fallback。

如果这个线闭合着,但是线程资源没了,队列满了,则走限流措施(看图的第 5 步)。

同时,看图最上面有两个后缀是 Health 的,这是两个计算整个链路是否健康的组件,每一步操作都被它记录着。

容器与服务项目编排引擎

从物理机到虚拟机,从虚拟机到容器;从物理集群到 OpenStack,OpenStack 到 Kubernetes;科技不断的变化,他们的认知也没刷新。

他们从容器开始说起,它首先是两个相对分立的运转自然环境,在这一点有点类似于虚拟机,但是不像虚拟机那样彻底。

虚拟机会将虚拟硬件、内核(即操作系统)以及使用者空间打包在新虚拟机当中,虚拟机能利用“虚拟机管理工作程序”运转在物理设备之上。

虚拟机依赖于 Hypervisor,其一般来说被安装在“裸金属”系统硬件之上,这导致 Hypervisor 在某些方面被认为是一类操作系统。

一旦 Hypervisor 安装完成, 就能从系统可用计算资源当中分配虚拟机实例了,每台虚拟机都能获得唯一的操作系统和负载(插件)。

简言之,虚拟机先需要虚拟一个物理自然环境,然后构筑两个完整的操作系统,再搭建一层 Runtime,然后供插件运转。

对容器自然环境来说,不需要安装主机操作系统,直接将容器层(比如 LXC 或 Libcontainer)安装在主机操作系统(一般来说是 Linux 变种)之上。

在安装完容器层之后,就能从系统可用计算资源当中分配容器实例了,因此企业应用能被布署在容器当中。

但是,每一容器化应用都会共享相同的操作系统(单个主机操作系统)。容器能看成两个装好了几组特定应用的虚拟机,它直接利用了宿主机的内核,抽象层比虚拟机更少,更加轻量化,启动速度极快。

相比于虚拟机,容器拥有更高的资源选用效率,因为它并不需要为每一应用分配单独的操作系统——实例规模更小、创建和迁移速度也更快。这意味着相比于虚拟机,单个操作系统能承载更多的容器。

云提供更多商十分热衷于容器技术,因为在相同的硬件设备当中,能布署数量更多的容器实例。

此外,容器易于迁移,但是只能被迁移到具有兼容操作系统内核的其他服务项目器当中,这样就会给迁移优先选择带来限制。

因为容器不像虚拟机那样同样对内核或者虚拟硬件展开打包,所以每套容器都拥有他们的隔离化使用者空间,从而使得多套容器能运转在同一主机系统之上。

他们能看到全部操作系统层级的构架都可实现跨容器共享,惟一需要分立构筑的就是二进制文件与库。

正因为如此,容器才拥有极为出色的轻量化特性。他们最常用的容器是 Docker。

①容器编排

过去虚拟机能透过云平台 OpenStack 管理工作虚拟化,容器时代如何管理工作容器呢?这就要看看容器编排引擎了。

Apache Mesos:Mesos 是如前所述 Master,Slave 构架,框架决定如何利用资源,Master 负责管理工作机器,Slave 会定期的将机器情况报告给 Master,Master 再将信息给框架。Master 是高可用的,因为 ZK,也有 Leader 的存在。

下面是构架图:

多次尝试学习,终于搞懂了微服务架构

Kubernetes:Kubernetes 是最近十分火热的开源容器编排引擎,具体内容能参考前几天分享的一篇文章《我花了10个小时,写出了这篇K8S构架解析》:

多次尝试学习,终于搞懂了微服务架构

Kubernetes 设计理念和功能其实就是一个类似 Linux 的分层构架,先说说每两个 Kubernetes 节点内部,kubelet 管理工作全局全局 pod,而每两个 pod 承载着两个或多个容器,kube-proxy 负责网络代理和负载均衡。

Kubernetes 节点外部,则是对应的控制管理工作服务项目器,负责国际标准化管理工作各个节点调度分配与运转。

②服务项目网格化

关于服务项目网络化,后面会更加深入的为大家展开讲解。

资料与文献:

弗兰克.库珀对微服务项目的叙述微服务项目架构的理论基础 – 康威定律调用链选型之Zipkin,Pinpoint,SkyWalking,CAT

相关文章

发表评论
暂无评论
官方客服团队

为您解决烦忧 - 24小时在线 专业服务