Spring Cloud是微服务化得综合性解决框架,提供服务治理Eureka,容错Hystrix,客户端负载均衡Ribbon,配置中心Config,基于Ribbon和Hystrix的声明式服务调用组件Feign,网关Zuul,消息总线Bus等。对于第一次接触微服务架构的团队或者架构人员不足的团队能够快速搭建起整个微服务架构。
服务注册中心一般需要搭建多台,多台服务注册中心分别向其他服务注册中心注册自己,实现服务清单互相同步,去掉单点故障,达到高可用的效果。
Ribbon是Netflix发布的开源项目,主要功能是提供客户端的软件负载均衡算法,将Netflix的中间层服务连接在一起。
服务间调用的时候回出现调用超时(网络问题),调用失败等问题。如果没有容错保护机制,整个微服务体系可能会因为某一个服务不可用而不可用,hystrix就是来保证微服务体系高可用性的组件。
线程池隔离和信号量隔离,限制调用分布式服务的资源使用,某一个调用的服务出现问题不会影响其他服务调用。
Hystrix会将服务调用结果(成功,失败,拒绝,超时)等信息报告给断路器,断路器会根据这些数据来更改断路器的状态。
断路器状态
断路器开启关闭条件:
服务调用失败后Hystrix提供降级方案,有下面两种方案:
hystrix提供缓存功能,同样服务请求调用,根据cacheKey来判断是否从缓存中读取
Feign是一个声明式的Web Service客户端,它整合了Ribbon和hystrix。Feign提供了HTTP请求的模板,通过编写简单的接口和插入注解,就可以定义好HTTP请求的参数、格式、地址等信息。我们在实际微服务开发过程中就是使用Feign,不会xianshi
Feign特性
在微服务架构中,我们通过Feign来实现服务间调用,但有些服务需要提供对外访问接口,Zuul就是来提供这个功能的。Zuul主要提供两个功能,路由配置和请求过滤,Zuul和feign一样整合了Ribbon和Hystrix包,提供负载均衡和熔断等功能。由于所有的外部访问都会首先通过网关,所以网关还可以很方便的提供统一鉴权和监控的功能。
下面的单实例和多实例配置可以帮忙转发请求到对应IP和端口。但由于eureka保存了服务名和对应服务访问的端口和IP,我们也可以配置路由规则和服务名对应起来,而且zuul默认添加了路由规则和服务名对应的路由。zuul还提供各种路由匹配规则,像通配符匹配,忽略表达式,路由前缀等等。
单实例配置
如下,符合/user-services/**规则的路由转发到http://localhost:8080/
zuul.routes.user-service.path=/user-services/**
zuul.routes.user-service.url=http://localhost:8080/
多实例配置
符合/user-services/**规则的路由转发到http://localhost:8080/,http://localhost:8081/,同时依赖ribbon实现了负载均衡。
zuul.routes.user-service.path=/user-services/**
zuul.routes.user-service.serviceId=user-service
ribbon,eureka.enabled=false
user-service.ribbon.listOfServers=http://localhost:8080/,http://localhost:8081/
服务路由默认规则
如果每一个服务都要定义服务路由规则也实在太麻烦了,所以Eureka上的服务默认都会被Zuul自动创建路由规则。默认路由规则如下,符合/user-services/**规则的路由访问user-service服务。
zuul.routes.user-service.path=/user-services/**
zuul.routes.user-service.url=user-service
过滤器类似于Spring filter功能,zuul过滤器负责对请求的处理过程进行干预,实现请求的校验,监控等功能。
filter type
以下提供四种标准的Filter类型及其在请求生命周期中所处的位置:
filter特征
Zuul请求生命周期
在分布式系统中,由于服务数量巨多,为了方便服务配置文件统一管理,实时更新,所以需要分布式配置中心组件。Spring Cloud Config就是Spring Cloud微服务架构提供的配置中心。它包含了Client和Server两个部分,server提供配置文件的存储、以接口的形式将配置文件的内容提供出去,client通过接口获取数据、并依据此数据初始化自己的应用。Spring cloud使用git或svn存放配置文件,默认情况下使用git。spring-boot-starter-actuator监控模块,提供/refresh接口实现客户端应用配置信息的重新获取与刷新。
客户端启动获取流程:
我们如果要去更新所有微服务的配置,如何避免向一个个服务发送Post请求来通知更新。这时候我们就不要忘记消息队列的发布订阅模型。这时Bus消息总线就能解决,你只需要在springcloud Config Server端发出refresh,就可以触发所有微服务更新了。Spring Cloud Bus需要配合RabbitMQ或者Kafka来实现。Bus提供微服务架构中的发布订阅功能,利于配置更新或者其他的一些需要让所有客户端知道的管理操作。
客户端下面的架构图,我们来简单整理一下整个客户端配置更新的流程
架构图: