依照Spring Boot和Spring Cloud实现微服务架构学习(四)-Spring Cloud总括

Spring Cloud微服务架构集大成者,云计算最佳业务实践。

简单来说,服务化的核心就是将传统的一站式应用根据业务拆分成一个一个的服务,而微服务在这个基础上要更彻底地去耦合(不再共享DB、KV,去掉重量级ESB),并且强调DevOps和快速演化。这就要求我们必须采用与一站式时代、泛SOA时代不同的技术栈,而Spring
Cloud就是其中的佼佼者。

PK1648-Spring Cloud微服务实战视频

Spring Cloud介绍

Spring Cloud是一个基于Spring
Boot实现的云应用开发工具,它为基于JVM的云应用开发中的配置管理、服务发现、断路器、智能路由、微代理、控制总线、全局锁、决策竞选、分布式会话和集群状态管理等操作提供了一种简单的开发方式。

Microservices is a variant of the service-oriented
architecture(SOA)
architectural style that structures an application as a collection
of loosely
coupled) services.
                             

维基百科(1)

澳门威斯尼人平台登录 1image.png

DevOps是英文Development和Operations的合体,他要求开发、测试、运维进行一体化的合作,进行更小、更频繁、更自动化的应用发布,以及围绕应用架构来构建基础设施的架构。这就要求应用充分的内聚,也方便运维和管理。这个理念与微服务理念不谋而合。

对接真实数据 从0开发前后端分离企业级上线项目

Spring Cloud与Dubbo对比

提到Dubbo,我想顺便提下ESB,目前央视新华社也在用ESB来做任务编排,这里先比较下Dubbo和ESB:

  • ESB(企业数据总线),一般采用集中式转发请求,适合大量异构系统集成,侧重任务的编排,性能问题可通过异构的方式来进行规避,无法支持特别大的并发。
  • Dubbo(服务注册管理),采用的是分布式调用,注册中心只记录地址信息,然后直连调用,适合并发及压力比较大的情况;其侧重服务的治理,将各个服务颗粒化,各个子业务系统在程序逻辑上完成业务的编排。

回归主题,Spring
Cloud和Dubbo又有什么不同那,首先,我们看下有什么相同之处,它们两都具备分布式服务治理相关的功能,都能够提供服务注册、发现、路由、负载均衡等。说到这,Dubbo的功能好像也就这么多了,但是Spring
Cloud是提供了一整套企业级分布式云应用的完美解决方案,能够结合Spring
Boot,Docker实现快速开发的目的,所以说Dubbo只有Spring
Cloud的一部分RPC功能,而且也谈不上谁好谁坏。不过,Dubbo项目现已停止了更新,淘宝内部由hsf替代dubbo,我想这会有更多人倾向Spring
Cloud了。

从开发角度上说,Dubbo常与Spring、zookeeper结合,而且实现只是通过xml来配置服务地址、名称、端口,代码的侵入性是很小的,相对Spring
Cloud,它的实现需要类注解等,多少具有一定侵入性。

微服务是一种面向服务架构(SOA),是一种松耦合的服务架构。

Spring配置管理工具包,让你可以把配置放到远程服务器,集中化管理集群配置,目前支持本地存储、Git以及Subversion。

接下来我们从服务化架构演进的角度来看看为什么Spring
Cloud更适应微服务架构。

新年伊始,学习要趁早,点滴记录,学习就是进步!

Spring Cloud子项目

Spring
Cloud包含了多个子项目(针对分布式系统中涉及的多个不同开源产品),之前在第一章节也介绍这些,比如:Spring
Cloud Config、Spring Cloud Netflix、Spring Cloud CloudFoundry、Spring
Cloud AWS、Spring Cloud Security、Spring Cloud Commons、Spring Cloud
Zookeeper、Spring Cloud CLI等项目,可以跳至(一)看下。

我理解的微服务是每个服务具有单一的功能(单一功能原则),许多这样的“单一功能”服务共同组成了一个架构就叫微服务架构。

Spring事件、消息总线,用于在集群(例如,配置变化事件)中传播状态变化,可与Spring
Cloud Config联合实现热部署。

最初的服务化解决方案是给提供相同服务提供一个统一的域名,然后服务调用者向这个域名发送HTTP请求,由Nginx负责请求的分发和跳转。

随笔背景:在很多时候,很多入门不久的朋友都会问我:我是从其他语言转到程序开发的,有没有一些基础性的资料给我们学习学习呢,你的框架感觉一下太大了,希望有个循序渐进的教程或者视频来学习就好了。对于学习有困难不知道如何提升自己可以加扣:1225462853
 获取资料.

配置服务

Spring Cloud提供了Config
Server,它有在分布式系统开发中做外部配置的功能,通过Config
Server我们可以集中存储所有应用的配置文件。Config
Server支持Git或者在文件系统中放置配置文件(GitLab),通常我们使用不同格式来区分不同应用的不同配置文件。云计算环境下,习惯上使用YAML配置,而且一般配置文件的位置都放在类路径下的config目录下,配置文件规则:应用名+profile.yml:

/{application}/{profile}[/{label}]
/{application}-{profile}.yml
/{label}/{application}-{profile}.yml
/{application}-{profile}.properties
/{label}/{application}-{profile}.properties

Spring Cloud提供了注解@EnableConfigServer来启动配置服务。

能做微服务架构的不止Spring Cloud,但是据我了解Spring
Cloud是目前做得最全的。本人将持续更新一系列文章记录我在学习微服务过程中的一些心得体会,不足之处欢迎指出。

Netflix云端服务发现,一个基于 REST
的服务,用于定位服务,以实现云端中间层服务发现和故障转移。

澳门威斯尼人平台登录 2NginxArch.png

PK1648-Spring Cloud微服务实战视频

服务发现

Spring Cloud通过Netflix
OSS的Eureka来实现服务发现,服务发现的主要目的是为了让每个服务之间可以互相通信。Eureka
Server为微服务的注册中心。谈到Spring Cloud Netflix,它是Spring
Cloud的子项目之一,主要提供的模块包括:服务发现(Eureka),断路器(Hystrix),智能路有(Zuul),客户端负载均衡(Ribbon)等。
Spring
Cloud使用注解的方式提供了Eureka服务端(@EnableEurekaServer)和客户端(@EnableEurekaClient)。


Eureka Server会提供服务注册服务,各个服务节点启动后,会在Eureka
Server中进行注册,这样Eureka
Server中就有了所有服务节点的信息,并且Eureka有监控页面,可以在页面中直观的看到所有注册的服务的情况。Eureka有心跳机制,当某个节点服务在规定时间内没有发送心跳信号时,Eureka会从服务注册表中把这个服务节点移除。Eureka还提供了客户端缓存的机制,即使所有的Eureka
Server都挂掉,客户端仍可以利用缓存中的信息调用服务节点的服务。Eureka一般配合Ribbon进行使用,Ribbon提供了客户端负载均衡的功能,Ribbon利用从Eureka中读取到的服务信息,在调用服务节点提供的服务时,会合理的进行负载。Eureka通过心跳检测、健康检查、客户端缓存等机制,保证了系统具有高可用和灵活性。

这种架构存在很多问题:

澳门威斯尼人平台登录,下载地址:

路由网关

路由网关的主要目的是为了让所有的微服务对外只有一个接口,我们只需访问一个网关地址,即可由网关将所有的请求代理到不同的服务中。Spring
Cloud是通过Zuul来实现的,支持自动路由映射到在Eureka
Server上注册的服务。Spring
Cloud提供了注解@EnableZuulProxy来启用路由代理。

澳门威斯尼人平台登录 3

Netflix熔断器,容错管理工具,旨在通过熔断机制控制服务和第三方库的节点,从而对延迟和故障提供更强大的容错能力。

  • Nginx作为中间层,在配置文件中耦合了服务调用的逻辑,这削弱了微服务的完整性,也使得Nginx在一定程度上变成了一个重量级的ESB。
  • 服务的信息分散在各个系统,无法统一管理和维护。每一次的服务调用都是一次尝试,服务消费者并不知道有哪些实例在给他们提供服务。这不符合DevOps的理念。
  • 无法直观的看到服务提供者和服务消费者当前的运行状况和通信频率。这也不符合DevOps的理念。
  • 消费者的失败重发,负载均衡等都没有统一策略,这加大了开发每个服务的难度,不利于快速演化。

课程目标

负载均衡

Spring Cloud提供了Ribbon和Feign作为客户端的负载均衡。在Spring
Cloud下,使用Ribbon直接注入一个RestTemplate对象即可,此RestTemplate已做好负载均衡的配置;而使用Feign只需定义个注解,有@FeignClient注解的接口,然后使用@RequestMapping注解在方法上映射远程的REST服务,此方法也是做好了负载均衡配置。

“巨石”框架和微服务对比

使用Hystrix实现自动降级与依赖隔离-微服务

为了解决上面的问题,我们需要一个现成的中心组件对服务进行整合,将每个服务的信息汇总,包括服务的组件名称、地址、数量等。服务的调用方在请求某项服务时首先通过中心组件获取提供这项服务的实例的信息,再通过默认或自定义的策略选择该服务的某一提供者直接进行访问。所以,我们引入了Dubbo。

Spring Cloud实战微服务。国内第一个Spring Cloud视频教程!

断路器

断路器(Circuit
Breaker)主要是为了解决当某个方法调用失败的时候,调用后备方法来替代失败的方法,已达到容错/阻止级联错误的功能。Spring
Cloud使用@EnableCircuitBreaker来启用断路器支持,使用@HystrixCommand的fallbackMethod来指定后备方法。(@HystrixCommand(fallbackMethod=”fallbackOper”))
Spring
Cloud还提供了一个控制台来监控断路器的运行情况,通过@EnableHystrixDashboard注解开启。

相比于传统“巨石”应用,微服务有以下优点:

1.
每个服务独立存在,所以可以单独部署,不用每次发布某个功能都经历一次全服务发布。

  1. 遵循单一功能原则,服务之间可以通过RESTFUL或者RPC调用,功能解藕

  2. “细粒度”的高可扩展性,每个服务都可以单独扩展,单独负载均衡

  3. 去中心化,尽可能地实现“自服务”

  4. 有利于简化开发测试以及部署,DevOps友好

NetflixZuul
是在云平台上提供动态路由,监控,弹性,安全等边缘服务的框架。Zuul
相当于是设备和 Netflix 流应用的 Web 网站后端所有请求的前门。

Dubbo是阿里开源的一个SOA服务治理解决方案,文档丰富,在国内的使用度非常高。

适用人群

Spring Cloud依赖库

这里我会罗列下常用的一些依赖包,为了更好理解每个依赖所负责的区域,我还是用一张和之前类似的图来展示各块的功能:

澳门威斯尼人平台登录 4

常用依赖包如下:

spring-cloud-starter-parent 具备spring-boot-starter-parent同样功能并附加Spring Cloud的依赖
spring-cloud-starter-config 默认的配置服务依赖,快速自动引入服务的方式,端口8888
spring-cloud-config-server/client 用户自定义配置服务的服务端/客户端依赖
spring-cloud-starter-eureka-server 服务发现的Eureka Server依赖
spring-cloud-starter-eureka 服务发现的Eureka客户端依赖
spring-cloud-starter-hystrix/zuul/feign/ribbon 断路器(Hystrix),智能路有(Zuul),客户端负载均衡(Ribbon)的依赖
angular-ui-router 页面分发路由依赖

有利必有弊,微服务有以下缺点:

  1. 服务的可用性和维护性高度依赖于服务治理,如果治理得不好将会是灾难

  2. 某些服务可能造成性能瓶颈,某些服务的宕机可能导致很多服务受影响

  3. 服务配置繁琐

下一篇:SpringCloud 微服务(二)
创建一个简单的服务

引用参考:

(1)

Netflix Zuul与Nginx 性能对比

使用Dubbo构建的微服务,已经可以比较好地解决上面提到的问题:

对分布式系统有一定了解的Java开发人员、想要了解并实战微服务架构的人群

总结

这里所有的总结只是停留在对Spring
Cloud的理解上,我推荐去

如果你对Spring Cloud感兴趣,想了解Spring
Boot快速开发,以及使用JHipster生成构建Spring Boot +
AngularJS的应用代码,欢迎加QQ群:58612944,里面有很多大牛指导,我也在学习中。另外,群里我们在组织翻译GitHub上JHipster的官方文档,如果感兴趣,可以进来一块为开源做贡献。

Netflix配置管理API,包含一系列配置管理API,提供动态类型化属性、线程安全配置操作、轮询框架、回调机制等功能。

澳门威斯尼人平台登录 5DubboArch.png

课程简介

关于JHipster扩展

JHipster -> 关于SpringBoot,AngularJS及Spring生态融合的技术栈,
是SpringBoot的最佳实践,是SpringCloud对Netflix技术栈的最佳实践,是J2EE-Cloud微服务的最佳实践,是Docker,Kubernetes和AngularJS1/2的最佳实践,是全栈式开发,敏捷开发最理想的工具。

archaius是Netflix公司开源项目之一,基于java的配置管理类库,主要用于多配置存储的动态获取。主要功能是对apache
common
configuration类库的扩展。在云平台开发中可以将其用作分布式配置管理依赖构件。《Netflix
Archaius 分布式配置管理依赖构件》

  • 调用中间层变成了可选组件,消费者可以直接访问服务提供者。

  • 服务信息被集中到Registry中,形成了服务治理的中心组件。

  • 通过Monitor监控系统,可以直观地展示服务调用的统计信息。

  • Consumer可以进行负载均衡、服务降级的选择。

随着互联网的迅速发展,传统架构已经无法满足我们持续集成、持续交付的需求。在这种现状下,诞生了微服务。

HashiCorp封装了Consul操作,consul是一个服务发现与配置工具,与Docker容器可以无缝集成。

但是对于微服务架构而言,Dubbo也并不是十全十美的:

微服务是当前架构领域的热门话题。笔者有幸参与了全球微服务架构高峰论坛。Spring
Cloud是一个微服务架构的工具集,它为我们实现了微服务架构中的各种通用模式,让微服务的开发更加方便、快捷,让微服务应用更加稳定、可用。

Pivotal通过Oauth2协议绑定服务到CloudFoundry,CloudFoundry是VMware推出的开源PaaS云平台。

  • Registry严重依赖第三方组件(zookeeper或者redis),当这些组件出现问题时,服务调用很快就会中断。

  • DUBBO只支持RPC调用。使得服务提供方与调用方在代码上产生了强依赖,服务提供者需要不断将包含公共代码的jar包打包出来供消费者使用。一旦打包出现问题,就会导致服务调用出错。

  • 最为重要的是,DUBBO现在已经停止维护了,对于技术发展的新需求,需要由开发者自行拓展升级。这对于很多想要采用微服务架构的中小软件组织,显然是不太合适的。

本课程主要专注于:

Spring日志收集工具包,封装了Dapper和log-based追踪以及Zipkin和HTrace操作,为SpringCloud应用实现了一种分布式追踪解决方案。

目前Github社区上有一个DUBBO的升级版,叫DUBBOX,提供了更高效的RPC序列化方式和REST调用方式。但是该项目也基本停止维护了。

微服务是什么?

Pivotal大数据操作工具,作为Spring
XD的替代产品,它是一个混合计算模型,结合了流数据与批量数据的处理方式。

作为新一代的服务框架,Spring
Cloud提出的口号是开发“面向云环境的应用程序”,它为微服务架构提供了更加全面的技术支持。结合我们一开始提到的微服务的诉求,我们把Spring
Cloud与DUBBO进行一番对比:

围绕微服务的通用模式,讲解Spring Cloud的常见用法及原理。

Spring基于spring security的安全工具包,为你的应用程序添加安全控制。

微服务需要的功能 Dubbo Spring Cloud
服务注册和发现 Zookeeper Eureka
服务调用方式 RPC RESTful API
断路器
负载均衡
服务路由和过滤
分布式配置
分布式锁 计划开发
集群选主
分布式消息

使用最新的Spring Cloud Camden SR1与Spring Boot
1.4.1进行讲解,各种新特性一览无余。讲到中途,Spring
Cloud发布SR2了,改用Spring Cloud Camden SR2和Spring Boot 1.4.2讲解。

Spring操作Zookeeper的工具包,用于使用zookeeper方式的服务发现和配置管理。

Spring
Cloud抛弃了Dubbo的RPC通信,采用的是基于HTTP的REST方式。严格来说,这两种方式各有优劣。虽然从一定程度上来说,后者牺牲了服务调用的性能,但也避免了上面提到的原生RPC带来的问题。而且REST相比RPC更为灵活,服务提供方和调用方的依赖只依靠一纸契约,不存在代码级别的强依赖,这在强调快速演化的微服务环境下,显得更加合适。

部分目录:

Spring数据流操作开发包,封装了与Redis,Rabbit、Kafka等发送接收消息。

很明显,Spring
Cloud的功能比DUBBO更加强大,涵盖面更广,而且作为Spring的拳头项目,它也能够与Spring
Framework、Spring Boot、Spring Data、Spring
Batch等其他Spring项目完美融合,这些对于微服务而言是至关重要的。前面提到,微服务背后一个重要的理念就是持续集成、快速交付,而在服务内部使用一个统一的技术框架,显然比把分散的技术组合到一起更有效率。更重要的是,相比于Dubbo,它是一个正在持续维护的、社区更加火热的开源项目,这就保证使用它构建的系统,可以持续地得到开源力量的支持。

 

Spring基于 Spring Boot CLI,可以让你以命令行方式快速建立云组件。

Netflix和Spring
Cloud是什么关系呢?Netflix是一家成功实践微服务架构的互联网公司,几年前,Netflix就把它的几乎整个微服务框架栈开源贡献给了社区。Spring背后的Pivotal在2015年推出的Spring
Cloud开源产品,主要对Netflix开源组件的进一步封装,方便Spring开发人员构建微服务基础框架。对于微服务的治理而言,核心就是服务的注册和发现。所以选择哪个组件,很大程度上要看它对于服务注册与发现的解决方案。在这个领域,开源架构很多,最常见的是Zookeeper,但这并不是一个最佳选择。

澳门威斯尼人平台登录 6

Netflix提供云端负载均衡,有多种负载均衡策略可供选择,可配合服务发现和断路器使用。

在分布式系统领域有个著名的CAP定理:C——数据一致性,A——服务可用性,P——服务对网络分区故障的容错性。这三个特性在任何分布式系统中不能同时满足,最多同时满足两个。

谢谢大家的支持,我会努力给大家分享高质量教程

Ribbon 是 Netflix
发布的云中间层服务开源项目,其主要功能是提供客户侧软件负载均衡算法,将
Netflix 的中间层服务连接在一起。

特性:

  • Multiple and pluggable load balancing rules
  • Integration with service discovery
  • Built-in failure resiliency
  • Cloud enabled
  • Clients integrated with load balancers
  • Archaius configuration driven client factory

Zookeeper是著名Hadoop的一个子项目,很多场景下Zookeeper也作为Service发现服务解决方案。Zookeeper保证的是CP,即任何时刻对Zookeeper的访问请求能得到一致的数据结果,同时系统对网络分割具备容错性,但是它不能保证每次服务请求的可用性。从实际情况来分析,在使用Zookeeper获取服务列表时,如果zookeeper正在选主,或者Zookeeper集群中半数以上机器不可用,那么将就无法获得数据了。所以说,Zookeeper不能保证服务可用性。

NetflixTurbine是聚合服务器发送事件流数据的一个工具,用来监控集群下hystrix的metrics情况。

诚然,对于大多数分布式环境,尤其是涉及到数据存储的场景,数据一致性应该是首先被保证的,这也是zookeeper设计成CP的原因。但是对于服务发现场景来说,情况就不太一样了:针对同一个服务,即使注册中心的不同节点保存的服务提供者信息不尽相同,也并不会造成灾难性的后果。因为对于服务消费者来说,能消费才是最重要的——拿到可能不正确的服务实例信息后尝试消费一下,也好过因为无法获取实例信息而不去消费。所以,对于服务发现而言,可用性比数据一致性更加重要——AP胜过CP。而Spring
Cloud Netflix在设计Eureka时遵守的就是AP原则。

OpenFeignFeign是一种声明式、模板化的HTTP客户端。

Eureka本身是Netflix开源的一款提供服务注册和发现的产品,并且提供了相应的Java封装。在它的实现中,节点之间是相互平等的,部分注册中心的节点挂掉也不会对集群造成影响,即使集群只剩一个节点存活,也可以正常提供发现服务。哪怕是所有的服务注册节点都挂了,Eureka
Clients上也会缓存服务调用的信息。这就保证了我们微服务之间的互相调用是足够健壮的。

通过Feign,
我们能把HTTP远程调用对开发者完全透明,得到与调用本地方法一致的编码体验。这一点与阿里Dubbo中暴露远程服务的方式类似,区别在于Dubbo是基于私有二进制协议,而Feign本质上还是个HTTP客户端。如果是在用Spring
Cloud Netflix搭建微服务,那么Feign无疑是最佳选择。

除此之外,Spring Cloud Netflix背后强大的开源力量,也促使我们选择了Spring
Cloud Netflix:

Spring提供云端计划任务管理、任务调度。

  • 前文提到过,Spring
    Cloud的社区十分活跃,其在业界的应用也十分广泛,而且整个框架也经受住了Netflix严酷生产环境的考验。
  • 除了服务注册和发现,Spring Cloud
    Netflix的其他功能也十分强大,包括Ribbon,hystrix,Feign,Zuul等组件,结合到一起,让服务的调用、路由也变得异常容易。
  • Spring Cloud
    Netflix作为Spring的重量级整合框架,使用它也意味着我们能从Spring获取到巨大的便利。Spring
    Cloud的其他子项目,比如Spring Cloud Stream、Spring Cloud
    Config等等,都为微服务的各种需求提供了一站式的解决方案。

Spring便于云端应用程序在各种PaaS平台连接到后端,如:数据库和消息代理服务。

Spring Cloud
Netflix的核心是用于服务注册与发现的Eureka,接下来我们将以Eureka为线索,介绍Eureka、Ribbon、Hystrix、Feign这些Spring
Cloud Netflix主要组件。

Spring提供Leadership选举,如:Zookeeper, Redis, Hazelcast,
Consul等常见状态模式的抽象和实现。

Eureka这个词来源于古希腊语,意为“我找到了!我发现了!”,据传,阿基米德在洗澡时发现浮力原理,高兴得来不及穿上裤子,跑到街上大喊:“Eureka!”。

PivotalSpring Boot式的启动项目,为Spring Cloud提供开箱即用的依赖管理。

Eureka由多个instance组成,这些服务实例可以分为两种:Eureka
Server和Eureka Client。为了便于理解,我们将Eureka client再分为Service
Provider和Service Consumer。如下图所示:

个人介绍:

高广超:多年一线互联网研发与架构设计经验,擅长设计与落地高可用、高性能互联网架构。

澳门威斯尼人平台登录 7EurekaRole.png

本文首发在 高广超的简书博客 转载请注明!

  • Eureka Server:服务的注册中心,负责维护注册的服务列表。
  • Service Provider:服务提供方,作为一个Eureka Client,向Eureka
    Server做服务注册、续约和下线等操作,注册的主要数据包括服务名、机器ip、端口号、域名等等。
  • Service Consumer:服务消费方,作为一个Eureka Client,向Eureka
    Server获取Service Provider的注册信息,并通过远程调用与Service
    Provider进行通信。

澳门威斯尼人平台登录 8image.png

Service Provider和Service Consumer不是严格的概念,Service
Consumer也可以随时向Eureka Server注册,来让自己变成一个Service
Provider。

Spring
Cloud针对服务注册与发现,进行了一层抽象,并提供了三种实现:Eureka、Consul、Zookeeper。目前支持得最好的就是Eureka,其次是Consul,最后是Zookeeper。

3.1.1 Eureka Server

Eureka Server作为一个独立的部署单元,以REST
API的形式为服务实例提供了注册、管理和查询等操作。同时,Eureka
Server也为我们提供了可视化的监控页面,可以直观地看到各个Eureka
Server当前的运行状态和所有已注册服务的情况。

Eureka
Server可以运行多个实例来构建集群,解决单点问题,但不同于ZooKeeper的选举leader的过程,Eureka
Server采用的是Peer to
Peer对等通信。这是一种去中心化的架构,无master/slave区分,每一个Peer都是对等的。在这种架构中,节点通过彼此互相注册来提高可用性,每个节点需要添加一个或多个有效的serviceUrl指向其他节点。每个节点都可被视为其他节点的副本。

如果某台Eureka Server宕机,Eureka Client的请求会自动切换到新的Eureka
Server节点,当宕机的服务器重新恢复后,Eureka会再次将其纳入到服务器集群管理之中。当节点开始接受客户端请求时,所有的操作都会进行replicateToPeer操作,将请求复制到其他Eureka
Server当前所知的所有节点中。

一个新的Eureka
Server节点启动后,会首先尝试从邻近节点获取所有实例注册表信息,完成初始化。Eureka
Server通过getEurekaServiceUrls()方法获取所有的节点,并且会通过心跳续约的方式定期更新。默认配置下,如果Eureka
Server在一定时间内没有接收到某个服务实例的心跳,Eureka
Server将会注销该实例(默认为90秒,通过eureka.instance.lease-expiration-duration-in-seconds配置)。当Eureka
Server节点在短时间内丢失过多的心跳时(比如发生了网络分区故障),那么这个节点就会进入自我保护模式。下图为Eureka官网的架构图

什么是自我保护模式?默认配置下,如果Eureka
Server每分钟收到心跳续约的数量低于一个阈值(instance的数量*(60/每个instance的心跳间隔秒数)*自我保护系数),就会触发自我保护。在自我保护模式中,Eureka
Server会保护服务注册表中的信息,不再注销任何服务实例。当它收到的心跳数重新恢复到阈值以上时,该Eureka

Server节点就会自动退出自我保护模式。它的设计哲学前面提到过,那就是宁可保留错误的服务注册信息,也不盲目注销任何可能健康的服务实例。该模式可以通过eureka.server.enable-self-preservation

false来禁用,同时eureka.instance.lease-renewal-interval-in-seconds可以用来更改心跳间隔,eureka.server.renewal-percent-threshold可以用来修改自我保护系数。

澳门威斯尼人平台登录 9EurekaArchitecture.png

Eureka的官方文档对Regin、Zone几乎没有提及,由于概念抽象,新手很难理解。因此,我们先来了解一下Region、Zone、Eureka集群三者的关系,如下图所示:

澳门威斯尼人平台登录 10RegionZone.png

region和zone(或者Availability
Zone)均是AWS的概念。在非AWS环境下,我们可以先简单地将region理解为Eureka集群,zone理解成机房。上图就可以理解为一个Eureka集群被部署在了zone1机房和zone2机房中。

3.1.2 Service Provider

Service Provider本质上是一个Eureka
Client。它启动时,会调用服务注册方法,向Eureka
Server注册自己的信息。Eureka
Server会维护一个已注册服务的列表,这个列表为一个嵌套的hash map:

  • 第一层,application name和对应的服务实例。
  • 第二层,服务实例及其对应的注册信息,包括IP,端口号等。

当实例状态发生变化时(如自身检测认为Down的时候),也会向Eureka
Server更新自己的服务状态,同时用replicateToPeers()向其它Eureka
Server节点做状态同步。

澳门威斯尼人平台登录 11![Uploading
EurekaServerEvict_655129.png . . .]

前面提到过,服务实例启动后,会周期性地向Eureka
Server发送心跳以续约自己的信息,避免自己的注册信息被剔除。续约的方式与服务注册基本一致:首先更新自身状态,再同步到其它Peer。

如果Eureka Server在一段时间内没有接收到某个微服务节点的心跳,Eureka
Server将会注销该微服务节点。

澳门威斯尼人平台登录 12EurekaServerRegister.png

3.1.3 Service Consumer

Service Consumer本质上也是一个Eureka Client(它也会向Eureka
Server注册,只是这个注册信息无关紧要罢了)。它启动后,会从Eureka
Server上获取所有实例的注册信息,包括IP地址、端口等,并缓存到本地。这些信息默认每30秒更新一次。前文提到过,如果与Eureka
Server通信中断,Service Consumer仍然可以通过本地缓存与Service
Provider通信。

实际开发Eureka的过程中,有时会遇见Service Consumer获取到Server
Provider的信息有延迟,在Eureka Wiki中有这么一段话:

All operations from Eureka client may take some time to reflect in the
Eureka servers and subsequently in other Eureka clients. This is
because of the caching of the payload on the eureka server which is
refreshed periodically to reflect new information. Eureka clients also
fetch deltas periodically. Hence, it may take up to 2 mins for changes
to propagate to all Eureka clients.

最后一句话提到,服务端的更改可能需要2分钟才能传播到所有客户端,至于原因并没有介绍。这是因为Eureka有三处缓存和一处延迟造成的。

  • Eureka Server对注册列表进行缓存,默认时间为30s。
  • Eureka Client对获取到的注册信息进行缓存,默认时间为30s。
  • Ribbon会从上面提到的Eureka
    Client获取服务列表,将负载均衡后的结果缓存30s。
  • 如果不是在Spring Cloud环境下使用这些组件(Eureka,
    Ribbon),服务启动后并不会马上向Eureka注册,而是需要等到第一次发送心跳请求时才会注册。心跳请求的发送间隔默认是30s。Spring
    Cloud对此做了修改,服务启动后会马上注册。

基于Service
Consumer获取到的服务实例信息,我们就可以进行服务调用了。而Spring
Cloud也为Service Consumer提供了丰富的服务调用工具:

  • Ribbon,实现客户端的负载均衡。
  • Hystrix,断路器。
  • Feign,RESTful Web Service客户端,整合了Ribbon和Hystrix。

接下来我们就一一介绍。

Ribbon是Netflix发布的开源项目,主要功能是为REST客户端实现负载均衡。它主要包括六个组件:

  • ServerList,负载均衡使用的服务器列表。这个列表会缓存在负载均衡器中,并定期更新。当Ribbon与Eureka结合使用时,ServerList的实现类就是DiscoveryEnabledNIWSServerList,它会保存Eureka
    Server中注册的服务实例表。
  • ServerListFilter,服务器列表过滤器。这是一个接口,主要用于对Service
    Consumer获取到的服务器列表进行预过滤,过滤的结果也是ServerList。Ribbon提供了多种过滤器的实现。
  • IPing,探测服务实例是否存活的策略。
  • IRule,负载均衡策略,其实现类表述的策略包括:轮询、随机、根据响应时间加权等。

我们也可以自己定义负载均衡策略,比如我们就利用自己实现的策略,实现了服务的版本控制和直连配置。实现好之后,将实现类重新注入到Ribbon中即可。

  • ILoadBalancer,负载均衡器。这也是一个接口,Ribbon为其提供了多个实现,比如ZoneAwareLoadBalancer。而上层代码通过调用其API进行服务调用的负载均衡选择。一般ILoadBalancer的实现类中会引用一个IRule。
  • RestClient,服务调用器。顾名思义,这就是负载均衡后,Ribbon向Service
    Provider发起REST请求的工具。

Ribbon工作时会做四件事情:

  1. 优先选择在同一个Zone且负载较少的Eureka Server;
  2. 定期从Eureka更新并过滤服务实例列表;
  3. 根据用户指定的策略,在从Server取到的服务注册列表中选择一个实例的地址;
  4. 通过RestClient进行服务调用。

Netflix创建了一个名为Hystrix的库,实现了断路器的模式。“断路器”本身是一种开关装置,当某个服务单元发生故障之后,通过断路器的故障监控,向调用方返回一个符合预期的、可处理的备选响应,而不是长时间的等待或者抛出调用方无法处理的异常,这样就保证了服务调用方的线程不会被长时间、不必要地占用,从而避免了故障在分布式系统中的蔓延,乃至雪崩。

澳门威斯尼人平台登录 13Hystrix.png

当然,在请求失败频率较低的情况下,Hystrix还是会直接把故障返回给客户端。只有当失败次数达到阈值(默认在20秒内失败5次)时,断路器打开并且不进行后续通信,而是直接返回备选响应。当然,Hystrix的备选响应也是可以由开发者定制的。

澳门威斯尼人平台登录 14HystrixFallback.png

除了隔离依赖服务的调用以外,Hystrix还提供了准实时的调用监控(Hystrix
Dashboard
),Hystrix会持续地记录所有通过Hystrix发起的请求的执行信息,并以统计报表和图形的形式展示给用户,包括每秒执行多少请求多少成功,多少失败等。Netflix通过hystrix-metrics-event-stream项目实现了对以上指标的监控。Spring
Cloud也提供了Hystrix
Dashboard的整合,对监控内容转化成可视化界面,Hystrix Dashboard
Wiki上详细说明了图上每个指标的含义。

澳门威斯尼人平台登录 15HystrixDashboard.png

Feign是一个声明式的Web Service客户端,它的目的就是让Web
Service调用更加简单。它整合了Ribbon和Hystrix,从而让我们不再需要显式地使用这两个组件。Feign还提供了HTTP请求的模板,通过编写简单的接口和插入注解,我们就可以定义好HTTP请求的参数、格式、地址等信息。接下来,Feign会完全代理HTTP的请求,我们只需要像调用方法一样调用它就可以完成服务请求。

Feign具有如下特性:

  • 可插拔的注解支持,包括Feign注解和JAX-RS注解
  • 支持可插拔的HTTP编码器和解码器
  • 支持Hystrix和它的Fallback
  • 支持Ribbon的负载均衡
  • 支持HTTP请求和响应的压缩

以下是一个Feign的简单示例:

@SpringBootApplication@EnableDiscoveryClient //启用Feign@EnableFeignClientspublic class Application{ public static void main(String[] args) { SpringApplication.run(Application.class, args); }}@FeignClient(name = "elements", fallback = ElementsFallback.class) //指定feign调用的服务和Hystrix Fallback(name即eureka的application name)public interface Elements{ @RequestMapping(value = "/index") String index();}//Hystrix Fallback @Componentpublic class ElementsFallback implements Elements{ @Override public String index() { return "**************"; }}//测试类@Component public class TestController { @Autowired Elements elements; @RequestMapping(value = "/testEureka", method = RequestMethod.GET) public String testeureka() { return elements.index(); }}

发表评论

电子邮件地址不会被公开。 必填项已用*标注