解剖nginx服务器架构

解剖nginx服务器架构,第1张

模块化结构的思想是一个很久的概念,但也正是成熟的思想造就了Nginx的巨大优越性。

我们知道Nginx从总体上来讲是有许多个模块构成的。习惯将Nginx分为5大模块分别为:核心模块,标准HTTP模块,可选HTTP模块,邮件服务模块和第三方模块。

这5个模块由上到下重要性一次递减。

(1)核心模块;

核心模块是Nginx服务器正常运行必不可少的模块,如同操作系统的内核。它提供了Nginx最基本的核心服务。像进程管理、权限控制、错误日志记录等;

(2)标准HTTP模块;

标准HTTP模块支持标准的HTTP的功能;

(3)可选HTTP模块;

可选HTTP模块主要用于扩展标准的HTTP功能,让Nginx能处理一些特殊的服务;

(4)邮件服务模块;

邮件服务模块主要用于支持Nginx的邮件服务;

(5)第三方模块;

第三方模块是为了扩展Nginx服务器应用,完成开发者想要的功能;

*******Nginx中的模块命名有自己的习惯*********

一般以Ngx_作为前缀,——module作为后缀,中间使用一个或者多个英文单词描述模块的工能,例如Ngx_core_module表示该模块提供Nginx的核心功能等;

具体各个模块中包含哪些模块可以自己去源码中查询,这里略过;

架构设计上说,Nginx服务器是与众不同的。其一在于它的模块化设计;其二也是更重要的一点在于它对与客户端请求的处理机制上;

web服务器和客户端是一对多的关系,Web服务器必须有能力同时为多个客户端提供服务。一般来说完成并行处理请求工作有三种方式:

1.多进程方式;

2.多线程方式;

3.异步方式;

这里简单说明一下这三种方式:

(1)多进程方式

多进程方式指,服务器每当收到一个客户端时。就有服务器主进程生成一个子进程出来和客户端建立连接进行交互。指导连接断开。该子进程就结束了。

多进程方式的优点是设计简单,各个子进程相对独立,处理客户端请求时彼此不受干扰;缺点是操作系统生成一个子进程需要进行内存复制等操作,在资源和时间上会产生一定的开销;当有大量请求时,会导致系统性能下降;

(2)多线程方式

多线程方式指每当服务器接收到一个请求后,会由服务器主进程派生出一个线程出来和客户端进行交互。由于操作系统产生出一个线程的开销远远小于一个进程的开销。故多线程方式在很大程度上减轻了Web服务器对系统资源的要求。但同时由于多个线程位于一个进程内,可以访问同样的内存空间。所以需要开发者自己对内存进程管理,增大了难度。

(3)异步方式

异步方式适合多进程和多线程完全不同的一种处理客户端请求的方式。这里有几个概念我们需要熟悉一下: 同步,异步,阻塞,非阻塞

在网络通信中同步和异步是描述通信模式的概念。

同步:发送方发送完请求后,需要等待接收到接收方发回的响应,才能发送下一个请求;所有请求在服务端得到同步,发送方和接收方的步调是一致的;

异步 :和同步机制相反,在异步机制中,发送方发出一个请求后,不等接收方响应这个请求,就继续发送下一个请求;所有来自发送方的请求形成一个队列,接收方处理完成后通知发送方;

在进程处理调度方式上用阻塞与非阻塞。在网络通信中主要指套接字socket的阻塞和非阻塞,而socket的实质就是IO操作。

阻塞 :调用结果返回之前,当前线程从运行状态被挂起,一直等到调用结果返回之后,才进入就绪状态,获取CPU后继续执行。

非阻塞 :和阻塞方式正好相反,如果调用结果不能马上返回,当前线程也不会马上返回,而是立即返回执行下一个调用。

因此就衍生出4中方式:同步阻塞,同步非阻塞,异步阻塞,异步非阻塞

这里简单解释一下异步非阻塞:发送方向接收方发送请求后,不用等待响应,可以继续其他工作;接收方处理请求时进行的IO操作如果不能马上得到结果,也不必等待,而是马上返回去去做其他事情。当IO操作完成以后,将完成状态和结果通知接收方,接收方再响应发送方。

与此同时Nginx服务器处理请求是怎样的呢???

Nginx服务器的一个显著的优势就是能够同时处理大量的并发请求。它结合多进程机制和异步机制。异步机制使用的是异步非阻塞方式。(Master-Worker)。

每个工作进程使用异步非阻塞方式,可以处理多个客户端请求。当某个工作进程接收到客户端的请求以后,调用IO进行处理,如果不能立即得到结果,就去处理其他的请求;而客户端在此期间也无需等待响应,可以去处理其他事情;当IO返回时,就会通知此工作进程;该进程得到通知,暂时挂起当前处理的失误去响应客户端请求。

也就是:

Nginx采用异步非阻塞方式来处理请求,处理请求具体到系统底层就是读写事件(所谓阻塞调用方式即请求事件还没准备好,线程只能一直去等,等事件准备好了再处理;而非阻塞即事件没准备好,马上返回ENGAIN,告诉你事件还没准准备好,而在这期间可以先去做其他事,再回头看看事件准备好了吗,时不时会看,需要的开销也是不小的)

异步可以理解为循环处理多个准备好的事件,不会导致无谓的资源浪费,当有更多的并发数只会占用更多的内存而已

从上面我们可以知道,Nginx服务器的工作进程调用IO后,就取进行其他工作了;当IO调用返回后,会通知工作进程。 但IO调用时如何把自己的状态通知给工作进程的呢??

一般解决这个问题有两种方法:

(1)让工作进程在进行其他工作的过程中间隔一段时间就去检查一下IO的状态,如果完成就响应客户端,如果未完成,继续工作。

(2)IO调用在完成后能主动通知工作进程。

当然最好的就是用第二种方法了;像select/poll/epoll等这样的系统调用就是用来支持第二种解决方案的。这些系统调用也常被称为事件驱动模型。他们提供了一种机制就只让进程同时处理多个并发请求,不用关心IO调用的具体状态。IO调用完全由事件驱动模型来管理。

Nginx中的事件驱动模型

就是用事件驱动处理库(多路IO复用),最常用的就是select模型,poll模型,epoll模型。

关于这三个模型的详解在这里可以看到:https://segmentfault.com/a/1190000003063859

通过这个上面的简单讲解,再加上服务器的架构的了解,可以对Nginx有一个简单的了解,希望对之后的源码剖析有帮助。

大致上Nginx的架构就是这样:

1.Nginx启动后,会产生一个主进程,主进程执行一系列的工作后会产生一个或者多个工作进程;

2.在客户端请求动态站点的过程中,Nginx服务器还涉及和后端服务器的通信。Nginx将接收到的Web请求通过代理转发到后端服务器,由后端服务器进行数据处理和组织;

3.Nginx为了提高对请求的响应效率,降低网络压力,采用了缓存机制,将 历史 应答数据缓存到本地。保障对缓存文件的快速访问;

##工作进程##

工作进程的主要工作有以下几项:

接收客户端请求;

将请求一次送入各个功能模块进行过滤处理;

IO调用,获取响应数据;

与后端服务器通信,接收后端服务器处理结果;

数据缓存

响应客户端请求;

##进程交互##

Nginx服务器在使用Master-Worker模型时,会涉及到主进程和工作进程的交互和工作进程之间的交互。这两类交互都依赖于管道机制。

1.Master-Worker交互

这条管道与普通的管道不同,它是由主进程指向工作进程的单向管道,包含主进程向工作进程发出的指令,工作进程ID等;同时主进程与外界通过信号通信;

2.worker-worker交互

这种交互是和Master-Worker交互是基本一致的。但是会通过主进程。工作进程之间是相互隔离的,所以当工作进程W1需要向工作进程W2发指令时,首先找到W2的进程ID,然后将正确的指令写入指向W2的通道。W2收到信号采取相应的措施。

按服务器的处理器架构(也就是服务器CPU所采用的指令系统)划分把服务器分为CISC架构服务器、RISC架构服务器和VLIW架构服务器三种。 CISC的英文全称为“Complex Instruction Set Computer”,即“复杂指令系统计算机”,从计算机诞生以来,人们一直沿用CISC指令集方式。早期的桌面软件是按CISC设计的,所以,微处理器(CPU)厂商一直在走CISC的发展道路,包括Intel、AMD,还有其他一些已经更名的厂商,如TI(德州仪器)、Cyrix以及VIA(威盛)等。在CISC微处理器中,程序的各条指令是按顺序串行执行的,每条指令中的各个操作也是按顺序串行执行的。顺序执行的优点是控制简单,但计算机各部分的利用率不高,执行速度慢。CISC架构的服务器主要以IA-32架构(Intel Architecture,英特尔架构)为主,而且多数为中低档服务器所采用。

如果企业的应用都是基于NT平台的应用,那么服务器的选择基本上就定位于IA架构(CISC架构)的服务器。如果企业的应用主要是基于Linux操作系统,那么服务器的选择也是基于IA结构的服务器。如果应用必须是基于Solaris的,那么服务器只能选择SUN服务器。如果应用基于AIX(IBM的Unix操作系统)的,那么只能选择IBM Unix服务器(RISC架构服务器)。 台式服务器也称为“塔式服务器”。有的台式服务器采用大小与普通立式计算机大致相当的机箱,有的采用大容量的机箱,像个硕大的柜子。低档服务器由于功能较弱,整个服务器的内部结构比较简单,所以机箱不大,都采用台式机箱结构。这里所介绍的台式不是平时普通计算机中的台式,立式机箱也属于台式机范围,这类服务器在整个服务器市场中占有相当大的份额。

优点:塔式服务器它的外形以及结构都跟我们平时使用的立式PC差不多,由于服务器的主板扩展性较强、插槽也多出一堆,所以个头比普通主板大一些,因此塔式服务器的主机机箱也比标准的ATX机箱要大,一般都会预留足够的内部空间以便日后进行硬盘和电源的冗余扩展。

由于塔式服务器的机箱比较大,服务器的配置也可以很高,冗余扩展更可以很齐备,所以它的应用范围非常广,应该说目前使用率最高的一种服务器就是塔式服务器。

缺点:目前常见的入门级和工作组级服务器基本上都采用这一服务器结构类型,不过由于只有一台主机,即使进行升级扩张也有个限度,所以在一些应用需求较高的企业中,单机服务器就无法满足要求了,需要多机协同工作,而塔式服务器个头太大,独立性太强,协同工作在空间占用和系统管理上都不方便,这也是塔式服务器的局限性。不过,总的来说,这类服务器的功能、性能基本上能满足大部分企业用户的要求,其成本通常也比较低,因此这类服务器还是拥有非常广泛的应用支持。 机架式服务器的外形看来不像计算机,而像交换机,有1U(1U=1.75英寸)、2U、4U等规格。机架式服务器安装在标准的19英寸机柜里面。这种结构的多为功能型服务器。

优点:作为为互联网设计的服务器模式,机架服务器是一种外观按照统一标准设计的服务器,配合机柜统一使用。可以说机架式是一种优化结构的塔式服务器,它的设计宗旨主要是为了尽可能减少服务器空间的占用,而减少空间的直接好处就是在机房托管的时候价格会便宜很多。

很多专业网络设备都是采用机架式的结构(多为扁平式,就像个抽屉),如交换机、路由器、硬件防火墙这些。机架服务器的宽度为19英寸,高度以U为单位(1U=1.75英寸=44.45毫米),通常有1U,2U,3U,4U,5U,7U)几种标准的服务器。机柜的尺寸也是采用通用的工业标准,通常从22U到42U不等;机柜内按U的高度有可拆卸的滑动拖架,用户可以根据自己服务器的标高灵活调节高度,以存放服务器、集线器、磁盘阵列柜等网络设备。服务器摆放好后,它的所有I/O线全部从机柜的后方引出(机架服务器的所有接口也在后方),统一安置在机柜的线槽中,一般贴有标号,便于管理。

缺点:机架式服务器因为空间比塔式服务器大大缩小,所以这类服务器在扩展性和散热问题上受到一定的限制,配件也要经过一定的筛选,一般都无法实现太完整的设备扩张,所以单机性能就比较有限,应用范围也比较有限,只能专注于某一方面的应用,如远程存储和Web服务的提供等 在一些高档企业服务器中由于内部结构复杂,内部设备较多,有的还具有许多不同的设备单元或几个服务器都放在一个机柜中,这种服务器就是机柜式服务器。

对于证券、银行、邮电等重要企业,则应采用具有完备的故障自修复能力的系统,关键部件应采用冗余措施,对于关键业务使用的服务器也可以采用双机热备份高可用系统或者是高性能计算机,这样的系统可用性就可以得到很好的保证。 刀片式服务器是一种HAHD(High Availability High Density,高可用高密度)的低成本服务器平台,是专门为特殊应用行业和高密度计算机环境设计的,其中每一块“刀片”实际上就是一块系统母板,类似于一个个独立的服务器。在这种模式下,每一个母板运行自己的系统,服务于指定的不同用户群,相互之间没有关联。不过可以使用系统软件将这些母板集合成一个服务器集群。在集群模式下,所有的母板可以连接起来提供高速的网络环境,可以共享资源,为相同的用户群服务。当前市场上的刀片式服务器有两大类:一类主要为电信行业设计,接口标准和尺寸规格符合PICMG(PCI Industrial Computer Manufacturer's Group)1.x或2.x,未来还将推出符合PICMG 3.x 的产品,采用相同标准的不同厂商的刀片和机柜在理论上可以互相兼容;另一类为通用计算设计,接口上可能采用了上述标准或厂商标准,但 尺寸规格是厂商自定,注重性能价格比,属于这一类的产品居多。刀片式服务器目前最适合群集计算和IxP提供互联网服务。

优点:刀片服务器适用于数码媒体、医学、航天、军事、通讯等多种领域。其中每一块“刀片”实际上就是一块系统主板。它们可以通过本地硬盘启动自己的操作系统,如Windows NT/2000、Linux、Solaris等等,类似于一个个独立的服务器。

在这种模式下,每一个主板运行自己的系统,服务于指定的不同用户群,相互之间没有关联。不过可以用系统软件将这些主板集合成一个集群服务器。在集群模式下,所有的主板可以连接起来提供高速的网络环境,可以共享资源,为相同的用户群服务。在集群中插入新的“刀片”,就可以提高整体性能。而由于每块“刀片”都是热插拔的,所以,系统可以轻松地进行替换,并且将维护时间减少到最小。值得一提的是,系统配置可以通过一套智能KVM和9个或10个带硬盘的CPU板来实现。CPU可以配置成为不同的子系统。一个机架中的服务器可以通过新型的智能KVM转换板共享一套光驱、软驱、键盘、显示器和鼠标,以访问多台服务器,从而便于进行升级、维护和访问服务器上的文件。

基于微服务架构和Docker容器技术的PaaS云平台建设目标是给我们的开发人员提供一套服务快速开发、部署、运维管理、持续开发持续集成的流程。平台提供基础设施、中间件、数据服务、云服务器等资源,开发人员只需要开发业务代码并提交到平台代码库,做一些必要的配置,系统会自动构建、部署,实现应用的敏捷开发、快速迭代。在系统架构上,PaaS云平台主要分为微服务架构、Docker容器技术、DveOps三部分,这篇文章重点介绍微服务架构的实施。

如果想学习Java工程化、高性能及分布式、深入浅出。微服务、Spring,MyBatis,Netty源码分析的朋友可以加我的Java高级交流:854630135,群里有阿里大牛直播讲解技术,以及Java大型互联网技术的视频免费分享给大家。

实施微服务需要投入大量的技术力量来开发基础设施,这对很多公司来说显然是不现实的,别担心,业界已经有非常优秀的开源框架供我们参考使用。目前业界比较成熟的微服务框架有Netflix、Spring Cloud和阿里的Dubbo等。Spring Cloud是基于Spring Boot的一整套实现微服务的框架,它提供了开发微服务所需的组件,跟Spring Boot一起使用的话开发微服务架构的云服务会变的很方便。Spring Cloud包含很多子框架,其中Spring Cloud Netflix是其中的一套框架,在我们的微服务架构设计中,就使用了很多Spring Cloud Netflix框架的组件。Spring Cloud Netflix项目的时间还不长,相关的文档资料很少,博主当时研究这套框架啃了很多英文文档,简直痛苦不堪。对于刚开始接触这套框架的同学,要搭建一套微服务应用架构,可能会不知道如何下手,接下来介绍我们的微服务架构搭建过程以及 需要那些 框架或组件来支持微服务架构。

为了直接明了的展示微服务架构的组成及原理,画了一张系统架构图,如下:

从上图可以看出,微服务访问大致路径为:外部请求 → 负载均衡 → 服务网关(GateWay)→ 微服务 → 数据服务/消息服务。服务网关和微服务都会用到服务注册和发现来调用依赖的其他服务,各服务集群都能通过配置中心服务来获得配置信息。

服务网关(GateWay)

网关是外界系统(如:客户端浏览器、移动设备等)和企业内部系统之间的一道门,所有的客户端请求通过网关访问后台服务。为了应对高并发访问,服务网关以集群形式部署,这就意味着需要做负载均衡,我们采用了亚马逊EC2作为虚拟云服务器,采用ELB(Elastic Load Balancing)做负载均衡。EC2具有自动配置容量功能,当用户流量达到尖峰,EC2可以自动增加更多的容量以维持虚拟主机的性能。ELB弹性负载均衡,在多个实例间自动分配应用的传入流量。为了保证安全性,客户端请求需要使用https加密保护,这就需要我们进行SSL卸载,使用Nginx对加密请求进行卸载处理。外部请求经过ELB负载均衡后路由到GateWay集群中的某个GateWay服务,由GateWay服务转发到微服务。服务网关作为内部系统的边界,它有以下基本能力:

1、动态路由:动态的将请求路由到所需要的后端服务集群。虽然内部是复杂的分布式微服务网状结构,但是外部系统从网关看就像是一个整体服务,网关屏蔽了后端服务的复杂性。

2、限流和容错:为每种类型的请求分配容量,当请求数量超过阀值时抛掉外部请求,限制流量,保护后台服务不被大流量冲垮;党内部服务出现故障时直接在边界创建一些响应,集中做容错处理,而不是将请求转发到内部集群,保证用户良好的体验。

3、身份认证和安全性控制:对每个外部请求进行用户认证,拒绝没有通过认证的请求,还能通过访问模式分析,实现反爬虫功能。

4、监控:网关可以收集有意义的数据和统计,为后台服务优化提供数据支持。

5、访问日志:网关可以收集访问日志信息,比如访问的是哪个服务?处理过程(出现什么异常)和结果?花费多少时间?通过分析日志内容,对后台系统做进一步优化。

我们采用Spring Cloud Netflix框架的开源组件Zuul来实现网关服务。Zuul使用一系列不同类型的过滤器(Filter),通过重写过滤器,使我们能够灵活的实现网关(GateWay)的各种功能。

如果想学习Java工程化、高性能及分布式、深入浅出。微服务、Spring,MyBatis,Netty源码分析的朋友可以加我的Java高级交流:854630135,群里有阿里大牛直播讲解技术,以及Java大型互联网技术的视频免费分享给大家。

服务注册与发现

由于微服务架构是由一系列职责单一的细粒度服务构成的网状结构,服务之间通过轻量机制进行通信,这就引入了服务注册与发现的问题,服务的提供方要注册报告服务地址,服务调用放要能发现目标服务。我们的微服务架构中使用了Eureka组件来实现服务的注册与发现。所有的微服务(通过配置Eureka服务信息)到Eureka服务器中进行注册,并定时发送心跳进行 健康 检查,Eureka默认配置是30秒发送一次心跳,表明服务仍然处于存活状态,发送心跳的时间间隔可以通过Eureka的配置参数自行配置,Eureka服务器在接收到服务实例的最后一次心跳后,需要等待90秒(默认配置90秒,可以通过配置参数进行修改)后,才认定服务已经死亡(即连续3次没有接收到心跳),在Eureka自我保护模式关闭的情况下会清除该服务的注册信息。所谓的自我保护模式是指,出现网络分区、Eureka在短时间内丢失过多的服务时,会进入自我保护模式,即一个服务长时间没有发送心跳,Eureka也不会将其删除。自我保护模式默认为开启,可以通过配置参数将其设置为关闭状态。

Eureka服务以集群的方式部署(在博主的另一篇文章中详细介绍了Eureka集群的部署方式),集群内的所有Eureka节点会定时自动同步微服务的注册信息,这样就能保证所有的Eureka服务注册信息保持一致。那么在Eureka集群里,Eureka节点是如何发现其他节点的呢?我们通过DNS服务器来建立所有Eureka节点的关联,在部署Eureka集群之外还需要搭建DNS服务器。

当网关服务转发外部请求或者是后台微服务之间相互调用时,会去Eureka服务器上查找目标服务的注册信息,发现目标服务并进行调用,这样就形成了服务注册与发现的整个流程。Eureka的配置参数数量很多,多达上百个,博主会在另外的文章里详细说明。

微服务部署

微服务是一系列职责单一、细粒度的服务,是将我们的业务进行拆分为独立的服务单元,伸缩性好,耦合度低,不同的微服务可以用不同的语言开发,每一个服务处理的单一的业务。微服务可以划分为前端服务(也叫边缘服务)和后端服务(也叫中间服务),前端服务是对后端服务做必要的聚合和剪裁后暴露给外部不同的设备(PC、Phone等),所有的服务启动时都会到Eureka服务器进行注册,服务之间会有错综复杂的依赖关系。当网关服务转发外部请求调用前端服务时,通过查询服务注册表就可以发现目标服务进行调用,前端服务调用后端服务时也是同样的道理,一次请求可能涉及到多个服务之间的相互调用。由于每个微服务都是以集群的形式部署,服务之间相互调用的时候需要做负载均衡,因此每个服务中都有一个LB组件用来实现负载均衡。

微服务以镜像的形式,运行在Docker容器中。Docker容器技术让我们的服务部署变得简单、高效。传统的部署方式,需要在每台服务器上安装运行环境,如果我们的服务器数量庞大,在每台服务器上安装运行环境将是一项无比繁重的工作,一旦运行环境发生改变,就不得不重新安装,这简直是灾难性的。而使用Docker容器技术,我们只需要将所需的基础镜像(jdk等)和微服务生成一个新的镜像,将这个最终的镜像部署在Docker容器中运行,这种方式简单、高效,能够快速部署服务。每个Docker容器中可以运行多个微服务,Docker容器以集群的方式部署,使用Docker Swarm对这些容器进行管理。我们创建一个镜像仓库用来存放所有的基础镜像以及生成的最终交付镜像,在镜像仓库中对所有镜像进行管理。

服务容错

微服务之间存在错综复杂的依赖关系,一次请求可能会依赖多个后端服务,在实际生产中这些服务可能会产生故障或者延迟,在一个高流量的系统中,一旦某个服务产生延迟,可能会在短时间内耗尽系统资源,将整个系统拖垮,因此一个服务如果不能对其故障进行隔离和容错,这本身就是灾难性的。我们的微服务架构中使用了Hystrix组件来进行容错处理。Hystrix是Netflix的一款开源组件,它通过熔断模式、隔离模式、回退(fallback)和限流等机制对服务进行弹性容错保护,保证系统的稳定性。

1、熔断模式:熔断模式原理类似于电路熔断器,当电路发生短路时,熔断器熔断,保护电路避免遭受灾难性损失。当服务异常或者大量延时,满足熔断条件时服务调用方会主动启动熔断,执行fallback逻辑直接返回,不会继续调用服务进一步拖垮系统。熔断器默认配置服务调用错误率阀值为50%,超过阀值将自动启动熔断模式。服务隔离一段时间以后,熔断器会进入半熔断状态,即允许少量请求进行尝试,如果仍然调用失败,则回到熔断状态,如果调用成功,则关闭熔断模式。

2、隔离模式:Hystrix默认采用线程隔离,不同的服务使用不同的线程池,彼此之间不受影响,当一个服务出现故障耗尽它的线程池资源,其他的服务正常运行不受影响,达到隔离的效果。例如我们通过andThreadPoolKey配置某个服务使用命名为TestThreadPool的线程池,实现与其他命名的线程池隔离。

3、回退(fallback):fallback机制其实是一种服务故障时的容错方式,原理类似Java中的异常处理。只需要继承HystixCommand并重写getFallBack()方法,在此方法中编写处理逻辑,比如可以直接抛异常(快速失败),可以返回空值或缺省值,也可以返回备份数据等。当服务调用出现异常时,会转向执行getFallBack()。有以下几种情况会触发fallback:

1)程序抛出非HystrixBadRequestExcepption异常,当抛出HystrixBadRequestExcepption异常时,调用程序可以捕获异常,没有触发fallback,当抛出其他异常时,会触发fallback;

2)程序运行超时;

3)熔断启动;

4)线程池已满。

4、限流: 限流是指对服务的并发访问量进行限制,设置单位时间内的并发数,超出限制的请求拒绝并fallback,防止后台服务被冲垮。

Hystix使用命令模式HystrixCommand包装依赖调用逻辑,这样相关的调用就自动处于Hystrix的弹性容错保护之下。调用程序需要继承HystrixCommand并将调用逻辑写在run()中,使用execute()(同步阻塞)或queue()(异步非阻塞)来触发执行run()。

动态配置中心

微服务有很多依赖配置,某些配置参数在服务运行期间可能还要动态修改,比如:根据访问流量动态调整熔断阀值。传统的实现信息配置的方法,比如放在xml、yml等配置文件中,和应用一起打包,每次修改都要重新提交代码、打包构建、生成新的镜像、重新启动服务,效率太低,这样显然是不合理的,因此我们需要搭建一个动态配置中心服务支持微服务动态配置。我们使用Spring Cloud的configserver服务帮我们实现动态配置中心的搭建。我们开发的微服务代码都存放在git服务器私有仓库里面,所有需要动态配置的配置文件存放在git服务器下的configserver(配置中心,也是一个微服务)服务中,部署到Docker容器中的微服务从git服务器动态读取配置文件的信息。当本地git仓库修改代码后push到git服务器仓库,git服务端hooks(post-receive,在服务端完成代码更新后会自动调用)自动检测是否有配置文件更新,如果有,git服务端通过消息队列给配置中心(configserver,一个部署在容器中的微服务)发消息,通知配置中心刷新对应的配置文件。这样微服务就能获取到最新的配置文件信息,实现动态配置。

以上这些框架或组件是支撑实施微服务架构的核心,在实际生产中,我们还会用到很多其他的组件,比如日志服务组件、消息服务组件等等,根据业务需要自行选择使用。在我们的微服务架构实施案例中,参考使用了很多Spring Cloud Netflix框架的开源组件,主要包括Zuul(服务网关)、Eureka(服务注册与发现)、Hystrix(服务容错)、Ribbon(客户端负载均衡)等。这些优秀的开源组件,为我们实施微服务架构提供了捷径。

如果想学习Java工程化、高性能及分布式、深入浅出。微服务、Spring,MyBatis,Netty源码分析的朋友可以加我的Java高级交流:854630135,群里有阿里大牛直播讲解技术,以及Java大型互联网技术的视频免费分享给大家。


欢迎分享,转载请注明来源:夏雨云

原文地址:https://www.xiayuyun.com/zonghe/190473.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-03-30
下一篇2023-03-30

发表评论

登录后才能评论

评论列表(0条)

    保存