图片中可以看到总体架构分为了两个角色:Eureka Client 和 Eureka Server。而其中Eureka Client 又分为了Application Service 和 Application Client即服务提供者和服务消费者。可以简单的理解为,服务提供者卖家、消费者是买家、Eureka Server就是中间商。
Eureka的基础概念
Register,服务注册。
Eureka客户端向Eureka服务端注册时,会将客户端的元数据(IP、端口、主页等)一并传输给服务端。
Renew,服务续约。
Eureka客户端会每隔30秒向服务端发送一次心跳,以此告知当前的Eureka客户没有问题。正常情况下,如果Eureka服务端在90秒内没有收到Eureka客户的心跳, 就会将该客户实例从注册列表中删除。
Cancel,服务下线。
Eureka客户端在程序关闭时会想服务端发送取消请求,以此从服务端的注册表中删除该实例。该步骤不会自动执行,需要调用以下代码:
DiscoveryManager.getInstance().shutdownComponent();
Eviction,服务剔除。
正常情况下,如果服务端在90秒内没有接收到客户端的心跳,则会判定改客户端已经死亡,就会将该客户端的实例从注册表中删除。
参考自:深入理解Eureka
二、Hystrix(熔断、降级)详情点击查看GitHub
在分布式环境中,许多服务依赖项中的一些不可避免地会失败。Hystrix 是一个库,它通过添加延迟容错和容错逻辑来帮助您控制这些分布式服务之间的交互。Hystrix 通过隔离服务之间的访问点、停止它们之间的级联故障并提供回退选项来做到这一点,所有这些都可以提高系统的整体弹性。
之前有听到过服务雪崩这个名词,那时候看得脑壳疼,鬼知道什么意思啊!喂!
服务雪崩:
假设有三个服务A、B、C,其中A调用B,B调用C。但是此时C由于访问用户量太大,导致了阻塞。那么B调用C的时候由于迟迟接收不到C的消息,也导致了B崩了。而A也接收不到B的消息,则A也崩了。
所有服务全崩了,这就是服务雪崩。
而熔断、降级就是为了防止服务雪崩的有效处理方式。
先说说熔断:
熔断就是给某个方法添加一个断路器。然后增加了断路器的方法,如果调用时间超过了指定的阈值,就会中断对当前方法的调用,如此就不会影响到上一级调用的服务。
这边说的熔断其实就是Hystrix的断路器模式,我们可以使用注解@HystrixCommand标注某个方法,那么该方法就会被断路器所包装。当调用该方法的时间超过了指定时间(默认1000ms)就会中断该方法的调用。
@HystrixCommand( commandProperties = {@HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds",value = "1200")})public void c(){...代码省略}
再说说降级:
降级和熔断是不一样的,熔断是直接将服务B调用服务C方法之间的链路熔断。而降级则是当调用时间超过阈值后,则会调用备用方法,如此就可以增加用户体验。
@HystrixCommand( fallbackMethod="getBackC")public void c(){...代码省略}public String getBackC(){return "当前服务繁忙,请稍后重试。";}