微服务应用开发入门③微服务组件eureka、ribbon、feign和hystrix初识

注册中心--Eureka

相信通过微服务应用开发入门①web端架构演进童鞋已经大概知道注册中心的概念和它是做什么的;

Eureka是Netflix开源的一款提供服务注册和发现的产品,它提供了完整的Service Registry和Service Discovery实现。

那我们还必须搞明白一些概念(当然其他概念还有很多很多)

Register: 服务注册

服务的提供者,将自身注册到注册中心,服务提供者也是一个 Eureka Client。当 Eureka Client 向 Eureka Server 注册时,它提供自身的元数据,比如 IP 地址、端口,运行状况指示符 URL,主页等。

Renew: 服务续约

Eureka Client 会每隔 30 秒发送一次心跳来续约。 通过续约来告知 Eureka Server 该 Eureka Client 运行正常,没有出现问题。 默认情况下,如果 Eureka Server 在 90 秒内没有收到 Eureka Client 的续约,Server 端会将实例从其注册表中删除,此时间可配置,一般情况不建议更改

负载均衡 

负载均衡是我们处理高并发、缓解网络压力和进服务端扩容的重要手段之一。 一般情况下我们所说的负载均衡通常都是指服务端负载均衡。 服务端负载均衡又分为两种,一种是硬件负载均衡,还有一种是软件负载均衡。

客户端负载均衡

指客户端可以选择调用的服务。 客户端负载均衡和服务端负载均衡最大的区别在于服务清单所存储的位置 

那我们服务和服务之间调用的时候,使用的就是Eureka + Ribbon提供的客户端负载均衡;

负载均衡器Ribbon

Ribbon是Netflix发布的开源负载均衡项目

Ribbon是一个基于HTTP和TCP客户端的负载均衡器。

当我们将Ribbon和Eureka一起使用时,Ribbon会从Eureka注册中心去获取服务端列表,然后进行轮询访问以到达负载均衡的作用,客户端负载均衡中也需要心跳机制去维护服务端清单的有效性,当然这个过程需要配合服务注册中心一起完成

Feign中也使用Ribbon 

Feign是一个声明式的web service客户端,它可以方便的和Ribbon集成,使用它我们可以快速进行服务之间的调用

Eureka+Ribbon+Feign简单应用

源码 https://github.com/zhouxiaohei/cloud-start-demo/tree/master/cloud-eureka-demo  先启动eureka

https://github.com/zhouxiaohei/cloud-start-demo/tree/master/cloud-service-a  启动服务A

https://github.com/zhouxiaohei/cloud-start-demo/tree/master/cloud-service-b 启动服务B

使用服务A调用服务B;

使用@EnableDiscoveryClient、@EnableFeignClients两个注解启用注册中心和feign;在yml文件配置注册中心的地址和策略;

篇幅所限,不讲太多细节;其他可以自行百度内容已经非常丰富不过多赘述。

 再此按照以下方式启动一个eureka和是三个serviceA,分别给serviceA的变量self.server.mark赋值为V1 V2 V3

  因为我在本机启动是三个实例,所以后面两个需要修改端口

java -jar cloud-eureka-demo-1.0.0-SNAPSHOT.jar
java -jar cloud-service-a-1.0.0-SNAPSHOT.jar --self.server.mark=testV1
java -jar cloud-service-a-1.0.0-SNAPSHOT.jar --server.port=11012 --self.server.mark=testV2
java -jar cloud-service-a-1.0.0-SNAPSHOT.jar --server.port=11013 --self.server.mark=testV3

然后我们启动服务B,通过swagger调用如下接口,会发现轮流出现testV1、testV3、testV2;

顺序不一定有序,这和服务列表的排序有关,但是一定是轮询的。

简单探究 

  我们可以看下ribbon的jar包里的RibbonClientConfiguration默认情况下会加载ZoneAwareLoadBalancer;

    @Bean
    @ConditionalOnMissingBean
    public ILoadBalancer ribbonLoadBalancer(IClientConfig config, ServerList<Server> serverList, ServerListFilter<Server> serverListFilter, IRule rule, IPing ping, ServerListUpdater serverListUpdater) {
        return (ILoadBalancer)(this.propertiesFactory.isSet(ILoadBalancer.class, this.name) ? (ILoadBalancer)this.propertiesFactory.get(ILoadBalancer.class, config, this.name) : new ZoneAwareLoadBalancer(config, rule, ping, serverList, serverListFilter, serverListUpdater));
    }

可以看到ZoneAwareLoadBalancerd的chooseServer方法,在可用zone不为多个情况下,会调用BaseLoadBalancer的choose方法;(zone的概率类似多机房或者多地机房;在高并发高可用场景中有概念本地优先;比如有上海、北京两地的服务;上海的优先访问上海的可用服务---搞不懂的不必太过关注,一般情况你也用不到)

而BaseLoadBalancer默认是选择轮询的负载均衡策略器RoundRobinRule;

所以回答ribbon的默认负载均衡是随机,只能对一半,实际上是ZoneAwareLoadBalancer

咱有篇ribbon查看源码的思路,有兴趣的可以参考,很早写的,写的比较渣SpringCloud Ribbon源码个人笔记

实践一下;

项目serviceb的配置类ServicebConfig,添加以下代码;再此启动服务b,会发现获取服务A的serverMark的V1~V3变成随机了;

赶紧去试验一下吧~

    @Bean
    public IRule getRandom(){
       return new RandomRule();
    }

Hystrix断路器

  • 断路器模式源于Martin Fowler的Circuit Breaker一文。“断路器”本身是一种开关装置,用于在电路上保护线路过载,当线路中有电器发生短路时,“断路器”能够及时的切断故障电路,防止发生过载、发热、甚至起火等严重后果。
  • 在分布式架构中,断路器模式的作用也是类似的,当某个服务单元发生故障(类似用电器发生短路)之后,通过断路器的故障监控(类似熔断保险丝),向调用方返回一个错误响应,而不是长时间的等待。这样就不会使得线程因调用故障服务被长时间占用不释放,避免了故障在分布式系统中的蔓延。
  • 熔断器也可以使应用程序能够诊断错误是否已经修正,如果已经修正,应用程序会再次尝试调用操作。
  • Hystrix具备拥有回退机制和断路器功能的线程和信号隔离,请求缓存和请求打包,以及监控和配置等功能。

 

服务的健康状况 = 请求失败数 / 请求总数. 

熔断器开关由关闭到打开的状态转换是通过当前服务健康状况和设定阈值比较决定的.

熔断器开关关闭

请求被允许通过熔断器. 如果当前健康状况高于设定阈值, 开关继续保持关闭.

熔断器开关打开

如果当前健康状况低于设定阈值, 开关则切换为打开状态. 当熔断器开关打开时, 请求被禁止通过。

熔断器开关半开

当熔断器开关处于打开状态, 经过一段时间后, 熔断器会自动进入半开状态, 这时熔断器只允许一个请求通过. 当该请求调用成功时, 熔断器恢复到关闭状态. 若该请求失败, 熔断器继续保持打开状态, 接下来的请求被禁止通过.

总结: 熔断器的开关能保证服务调用者在调用异常服务时, 快速返回结果, 避免大量的同步等待. 并且熔断器能在一段时间后继续侦测请求执行结果, 提供恢复服务调用的可能.

Hystrix简单应用

简单应用如图,大家还是要实际跑代码验证一下;

通过servicea:调用HystrixController了解简单服务降级的使用--->如下图左1的HystrixService;

通过serviceb:调用FeignHystrixDemoController和HystrixControlle来体验feign如何使用hystrix;

之前说到的注解@EnableCircuitBreaker就是用来启用hystrix的(当然要引入对应的jar包)

通过feign来使用hystrix还需要再配置文件配置:feign.hystrix.enabled: true

注意一下:

@FeignClient的value值不能重复,所以我在ServiceaFallbackService将value值(对应的serviceA的applicationName)写成了

service-a1,测试feign结合hystrix代码的时候请注释掉ServiceaService,修改ServiceaFallbackService的value值;

 关于hystrix的熔断场景、测试起来比较麻烦、大家理解完定义自己动手吧,有问题可以找我;

对hystrix的实现原理有兴趣的朋友可以看我的博客SpringCloud--浅出Hystrix

欢迎点赞和关注~  谢谢,后面还有持续的更新

此系列帮助大家快速入门SpringCloud,但是修行在个人,加油~

  • 15
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 10
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值