spring cloud核心组件

Spring Cloud全家桶开箱即用,中小型公司用得比较多,包含了很多组件(网关,配置中心,熔断,降级。。)。本文介绍最核心的Eureka、Ribbon、Feign、Hystrix、Zuul这几个组件。

1.Eureka(服务发现)

Eureka中每台机器都是peer-to-peer的,集群中的机器地位平等,各个服务可以向任何一个Eureka实例注册和发现。集群中的任何一个Eureka接收到写请求后,会自动同步给所有的Eureka实例。与Dubbo使用的一致性同步机制CP不同,Eureka使用的是AP。使用默认的配置服务上下线服务感知的时效性是非常糟糕的,可能需要几十秒,甚至是分钟级别的。

服务注册中心原理入下图所示:

其中 服务A,服务B,服务C都有Eureka Client组件,这些组件负责将服务的注册信息注册到 Eureka服务中。

Eureka是一个注册中心,里面保存了一个注册表,用于记录各个服务所在的机器信息,端口号。

2.Feign

订单服务注册中心确实知道服务A、服务B、服务C在哪里了,同时也监听着哪些端口号了。

但是当他们要之间需要进行通信的时候,难道要手动写一大堆代码,让他们建立网络连接,封装他们需要传递的参数,发送请求,并对相应的数据进行处理?

如果你是基于SpringCloud对外发布一个接口,实际上是基于http协议的,对外发布的就是一个最最普通的SpringMVC接口。

Feign,通过对一个接口打上注解,他会基于这个注解标注的接口生成动态代理,然后针对Feign的动态代理去调用他的方法时,会在底层生成http协议格式的请求,

IP:端口号/order/create?productId=1

最后针对这个地址,发起请求、解析响应。

3.Ribbon(客服端负载均衡)

如果A服务部署在两台机器上面,Feign如何知道请求哪台机器呢? Ribbon就派上用场了

Feign底层使用的是HttpClient,先得使用Ribbon从本地的Eureka注册表的缓存里获取出对方的机器列表

然后再进行Ribbon根据 负载均衡算法 选择一台机器出来

Feign就会针对这台机器发送Http请求

4.Hystrix(断路器)

Hystrix是一个隔离,熔断,降级的框架。

隔离:当服务A请求调用服务B,C时,请求服务B时一个线程池,请求服务C是一个线程池。相互之间互不影响

熔断:当服务A完成一项逻辑业务,需要调用服务B, 如果服务B挂掉了,每次调用到会被卡住几秒钟,会影响用户的操作体验,我们一般直接对服务B熔断,不走网络请求的那几秒钟,这个过程,就是熔断。

降级:服务B熔断了,此时服务B不能啥都不干啊,此时,就来个降级,此时需要往数据库表或日志文件中记录一条消息,说某个用户因为服务B挂掉,进行的操作没成功,并且带上参数,等到 服务B服务再次回复,你可以根据这些记录手动补上记录。

5.Zuul(服务网关)

这个组件主要负责 网络路由, 当你部署的Spring Cloud集群达到了几百个的时候,每个服务实例都有自己的名字,当你需要调用的时候,不可能基于每个服务实例的名字,一个个去调用,此时就需要一个集中的网关。

有了网关,如果前端、移动端要调用后端系统,不用管后台有多少服务实例,所有的请求只需直接走网关,网关会将请求转发给后台的所有微服务。

注册发现时间调整

eureka server:

复制代码
eureka:
server:
#关闭自我保护
enable-self-preservation: false
#ReadWrite缓存同步到ReadOnly缓存,注册表信息
response-cache-update-interval-ms: 2000
#专门的线程定期检查注册表信息的间隔时间
eviction-interval-timer-in-ms: 4000
instance:
hostname: server
#超过5秒无心跳将client干掉
lease-expiration-duration-in-seconds: 5
#服务挂掉,发送心跳的时间
lease-renewal-interval-in-seconds: 2
client:
#服务实例,每隔2秒拉取一下注册表信息
registry-fetch-interval-seconds: 2
fetch-registry: true
register-with-eureka: true
serviceUrl:
defaultZone: http://localhost:8081/eureka
复制代码

eureka client:

复制代码

注册中心

eureka:
client:
# 服务发现每隔2秒拉取一下注册表信息
registry-fetch-interval-seconds: 2
serviceUrl:
defaultZone: http://localhost:8081/eureka/
instance:
instance-id: s p r i n g . a p p l i c a t i o n . n a m e : {spring.application.name}: spring.application.name:{spring.cloud.client.ipAddress}😒{server.port}
#超过5秒无心跳将client干掉
lease-expiration-duration-in-seconds: 5
#服务挂掉,发送心跳的时间
lease-renewal-interval-in-seconds: 2
复制代码

总结:

Eureka: 服务启动时,Eureka Client都会将服务注册到Eureka Server

            同时Eureka Client还可以反过来从Eureka Server拉取注册表,从而知道其他服务在哪里

Ribbon: 服务间发起请求时,基于Ribbon做负载均衡,从一个服务的多台机器中选择一台

Feign: 基于动态代理机制,根据注解,拼接请求URL地址,选择机器,发起请求

Hystrix: 服务间的请求走不同的Hystrix线程池,避免了服务雪崩

Zuul: 提供统一的请求入口,Zuul会将这些请求转发给相对应的服务

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值