《Spring Cloud架构的各个组件的原理分析.docx》由会员分享,可在线阅读,更多相关《Spring Cloud架构的各个组件的原理分析.docx(14页珍藏版)》请在课桌文档上搜索。
1、我们先认识一下SpringCloud的各个组件,然后知其所以然。SPringCloud(一)ConfigspringSpringCloudBusSpringCk)udConfigSPnnOEVW9Afi.UfKBjuemaHiMtBftB.BCVV*e,RXm*M.0UASub*r*0A.SpringCloudBusSpmg件.用于(伪n.肥宝化件)WMM*.N与SPrtOeGouOConMI台实SMBV.EurekaNMxCMIftXS,一个于RESTM.RTrtt三M.UmnVH务双。Qm”.HystrixFtetftxE9WV9XA口遢注机第EM三万ImY或Mn为adIaaM供更修大WN
2、ETF1.IXo三三ZuulZuulNetnaZtM任云翠8上仅秋NM&.务住.安全边身的ZmU于0IONvmXH用的V0RMMWflnM11.4ArchaiusjCONSU1.PtvotelCloudFoundryArchaiusMttmxEVVVAR包含一事别配APi.供aan梨化n住.tt三wEian.险AMW、SflnnvwConsulHMhCorpNMTConutfH.COniUI一个ftXBEVXII.与OOCMr司U无鼻皮.SpringCloudforCloudFoundryPMHalAilQauth21frA三rflRQoudFAndry.GoudFcMy*VMEM出的开普PM
3、S五E原理讲解前,先看一个最经典的业务场景,如开发一个电商网站,要实现支付订单的功能,流程如下:创建一个订单之后,如果用户立刻支付了这个订单,我们需要将订单状态更新为“已支付”扣减相应的商品库存通知仓储中心,进行发货给用户的这次购物增加相应的积分如上,微服务的应用场景和核心竞争力:降低耦合:每一个微服务专注于单一功能,并通过定义良好的接口清晰表述服务边界。由于体积小、复杂度低,每个微服务可由一个小规模开发团队完全掌控,易于保持高可维护性和开发效率。独立部署:由于微服务具备独立的运行进程,所以每个微服务也可以独立部署。当某个微服务发生变更时无需编译、部署整个应用。由微服务组成的应用相当于具备一系
4、列可并行的发布流程,使得发布更加高效,同时降低对生产环境所造成的风险,最终缩短应用交付周期。选型灵活:微服务架构下,技术选型是去中心化的。每个团队可以根据自身服务的需求和行业发展的现状,自由选择最适合的技术栈。由于每个微服务相对简单,故需要对技术栈进行升级时所面临的风险就较低,甚至完全重构一个微服务也是可行的。容错机制:当某一组建发生故障时,在单一进程的传统架构下,故障很有可能在进程内扩散,形成应用全局性的不可用。在微服务架构下,故障会被隔离在单个服务中。若设计良好,其他服务可通过重试、平稳退化等机制实现应用层面的容错。sefvicbreaker-De一C)JJS1.(MyaMitea8HMM
5、WMvm三*三xo*r*HcHhikMMIU,iM三tt*AJM010.SpriHQOoudBm.FHHt3MW.UkorA-wwwuvfwrt11imiM!K深入理解SpringCloud核心组件与底层原理一,SPringCIoUd核心组件:EurekaNetflix尤里卡1, EUreka服务端:也称服务注册中心,同其他服务注册中心一样,支持高可用配置。如果Eureka以分配模式部署,当发生中有分片出现故障时,那么Eureka就转入自我保护模式。它允许在分片故障期间继续提供服务的发现和注册,当故障分片恢复运行时,可用中其他分片会把它们的状态再次同步回来;2, EUreka客户端:主要处理服
6、务的注册与发现。客户端服务通过注解和参数配置的方式,嵌入在客户端应用程序的代码中,在应用程序运行时,Eureka客户端想注册中心注册自身提供同时,它也能从服务端查询当前注册的服务信息并把它们缓存到本地并替换地刷新服务状态。3, EurekaSerVer的高可用实际上就是将自己作为服务向其他注册中心注册自己,这样就可以形成各个相互注册的服务注册中心,以实现服务清单的相互同步,达到高可用效果尤里卡详解1,服务提供者A.服务注册服务提供者在启动的时候会通过发送REST请求的方式将自己注册到EurekaServer上,同时带上了自己的服务的一些元数据信息。EurekaServer接收到这个REST请求
7、之后,将元数据信息存储在一个双层结构地图中,其中第一层的键是服务名,第二层的键是具体服务的实例名;B.服务同步两个服务提供者分别注册到了两个不同的服务注册中心上,然后,它们的信息分别被两个服务注册中心所维护。此时,由于服务注册中心之间因互相注册为服务,当服务提供者发送注册请求到一个服务注册中心时,它会调用请求转发给转化中相连的其他注册中心,从而实现注册中心之间的服务同步。通过服务同步,两个服务提供者的服务信息就可以通过两个台服务注册中心中的任意一台获取到;C.服务续约在注册完服务之后,服务提供者会维护一个心跳到持续告诉EurekaServer:“我还活着“,以防止EurekaServer的剔除
8、任务转到服务实例从服务列表中排除出来,我们称该操作为服务续约定义服务续约任务的调用间隔时间,默认30秒eureka.instance.lease-renewal-interval-in-seconds=30#定义服务失效的时间,默认90秒eureka.instance.lease-expiration-duration-in-seconds=902,服务消费者A.获取服务当我们启动服务消费者的时候,它会发送一个REST请求给服务注册中心,来获取上面注册的服务清单。为了性能考虑,EUrekaSerVer会维护一份替代的服务清单来给给客户端,同时该缓存清单会每隔30秒更新一次;缓存清单的更新时间,
9、默认30秒eureka.client.registry-fetch-interval-seconds=30B.服务调用服务消费者在获取服务清单后,通过服务名获得更多具体提供的服务的实例名称和该实例的元数据信息。在ribbon中会交替采用交替的方式进行调用,从而实现客户端的负载均衡对于访问实例的选择,Eureka中有Region和Zone的概念,一个Region中可以包含多个ZOne,每个服务客户端需要被注册到一个ZOne中,所以每个客户端对应一个Region和一个Zone。在进行服务调用的时候,优先访问同处一个一个Zone中的服务提供方,若访问不到,就访问其他的ZOneC.服务下线当服务实例进
10、行正常的关闭操作时,它会触发一个服务下线的REST请求给EurekaServer,告诉服务注册中心:“我要下线了服务端在接收到请求之后,进入服务状态置为下线(DOWN),并把该下线事件传播出去3,服务注册中心无效剔除EurekaServer在启动的时候会创建一个定时任务,每隔一次间隔(更改为60秒)将当前清单中超时(至少为90秒)没有续约的服务剔除出去B.自我保护在服务注册中心的信息面板中出现红色警告信息:该警告就是触发了EurekaSerVer的自我保护机制。EUrekaSerVer在运行期间,会统计心跳失败的比例在15分钟之内是否超过85%,如果出现低于的情况,EurekaServer可能
11、会导致当前的实例注册信息保护起来,让这些实例不会过期,恢复保护这些注册信息。但是,在此之后,内部实例若出现问题,那么客户端很容易拿到实际已经不存在的服务实例,会出现调用失败的情况,所以客户端必须要有容错机制,某些可以使用请求重试,断路器等机制关闭保护机制,以确保注册中心可以将不用的实例正确剔除(本地调试可以使用,线上不推荐)eureka.server.enable-self-preservation=false二,SPringCloUd核心组件:RibbonRibbon是一个基于HTTP和TCP的客户端负载均衡器,它可以在通过客户端中配置的ribbonServer1.ist服务端列表去进行访问
12、以达到服务均衡的作用。当Ribbon和Eureka联合使用时,Ribbon的服务实例清单RibbOnSerVer1.iSt会被DiscoveryEnabledNIWSServer1.ist改写,扩展成从Eureka注册中心中获取服务端列表。同时它也会用NlWSDiSCOVeryPing来取代IPing,并强制委托给EUreka来去定服务端是否已经启动在客户端负载均衡中,所有客户端上游都维护着自己要访问的服务端清单,而这些服务端的清单来自于服务注册中心(称为EUreka)。在客户端负载均衡中也需要心跳去维护服务端清单的健康性,只是这个步骤需要与服务注册中心配合完成。通过SpringCloudRi
13、bbon的封装,我们在微服务架构中使用客户端负载均衡初始化只需要如下两步:1,服务提供者只需要启动多个服务实例和注册到一个注册中心或多个相关联的服务注册中心2,服务消费者直接通过调用被1.OadBakmCed注解修饰过的RestTemplate来实现面向服务的接口调用三,SPringCIOUd核心组件:假装Feign的关键机制是使用了动态代理1,首先,对某个接口定义了FeignClient注解,Feign就会针对这个接口创建一个动态代理2,接着调用接口的时候,本质就是调用Feign创建的动态代理3,Feign的动态代理会根据在接口上的ReqUeStMaPPing等注解,来动态构造要请求的服务的
14、地址4,针对这个地址,发起请求,解析响应Feign是和丝带以及EUreka紧密协作的1,首先RibbOn会从EUrekaCliem里获取到对应的服务记录,也就知道了所有的服务都部署在了其中机器上,在监听到的端口上2,然后丝带就可以使用交替的R。UndRObin算法,从中选择一台机器3,Feign就会针对这台机器,构造并发起请求四,SPringCIoUd核心组件:Hystrix在微服务架构中,存在着那么多的服务单元,如果一个单元出现故障,就很容易因依赖关系而引发故障的蔓延,最终导致整个系统的崩溃,这样的架构相较传统架构更加复杂。这样的问题,产生了断路器等类别的服务保护机制。在分布式架构中,当某个
15、服务单元发生故障之后,通过断路器的故障监控,向调用方返回一个错误响应,而不是连续的等待。占用不释放,避免了故障在分布式系统中的蔓延。Hystrix具有服务降级,服务熔断,线程和信号隔离,请求缓存,请求合并以及服务监控等强大功能。Hystrix使用舱壁模式实现线程池的隔离,它会为每一个依赖服务创建一个独立的线程池,这样就算是某个依赖服务出现重复过高的情况,也只是该依赖服务的调用会产生影响,而不会拖慢其他的依赖服务五,SPringCloUd核心组件:ZuulSpringCloudZuul通过与SpringCloudEureka进行整合,将自身注册为Eureka服务治理下的应用,同时从Eureka中
16、获得了所有其他微服务的实例信息。对于路由规则的维护,Zuul替代通过以服务名作为COnteXtPath的方式来创建路由映射。Zuul提供了一套过滤器机制,可以支持在API网关无附上进行统一调用来对微服务接口做初始过滤,已实现对微服务接口的拦截和校正。六,总结Eureka:各个服务启动时,EurekaClient都会将服务注册到EurekaServer,并且EUrekaClient还可以反过来从EUrekaSerVer拉取到,从而知道其他服务在哪里;功能区:服务间发起请求的时候,基于丝带做负载均衡,从一个服务的多台机器中选择一台;Feign:基于Feign的动态代理机制,根据注解和选择的机器,分割请求UR1.地址,发起请求;Hystrix:发起请求是通过HyStriX的线程池来走的,不同的服务走不同的线程池,实现了不同服务调用的隔离,避免了服务雪崩的问题;Zuul:如果前端,移动端要调用约会系统,统一从ZUUl网关进入,由ZUUI网关转发请求给对应的服务。