负载均衡的意义是什么?
微服务是将业务代码拆分为很多小的服务单元,服务之间的相互调用通过HTTP协议来调用,为了保证服务的高可用,服务单元往往都是集群化部署的,那么消费者该调用那个服务提供者的实例呢?
同步通信:dubbo通过 RPC 远程过程调用、springcloud通过 REST接口json调用(ribbon
feign)等 。
异步:消息队列,如:RabbitMq、ActiveMq、Kafka 等。
1.服务发布时,指定对应的服务名,将服务注册到 注册中心(eureka zookeeper)
https://baike.baidu.com/item/CAP%E5%8E%9F%E5%88%99/5712863?fr=aladdin
1.Eureka取CAP的AP,注重可用性,Zookeeper取CAP的CP注重
2.Zookeeper在选举期间注册服务瘫痪,虽然服务最终会恢复,但选举期间不可用。
3.eureka的自我保护机制,会导致一个结果就是不会再从注册列表移除因长时间没收到心跳而过期的服务。依然能接受新服务的注册和查询请求,但不会被同步到其他节点。不会服务瘫痪。
4.Zookeeper有Leader和Follower角色,Eureka各个节点平等。
5.Zookeeper采用过半数存活原则,Eureka采用自我保护机制解决分区问题。
6.eureka本质是一个工程,Zookeeper只是一个进程。
当Eureka Server 节点在短时间内丢失了过多实例的连接时(比如网络故障或频繁启动关闭客户端)节点会进入自我保护模式,保护注册信息,不再删除注册数据,故障恢复时,自动退出自我保护模式。
自我保护阀值 = 服务总数 * 每分钟续约数 * 自我保护续约百分比阀值因子(0.85)。
每分钟续约数 =(60S/客户端续约间隔(默认30秒可以自己配置))
自我保护阀值 = 服务总数 * (60S/客户端续约间隔) * 自我保护续约百分比阀值因子。
服务降级,一般是从整体负荷考虑。就是当某个服务熔断之后,服务器将不再被调用,此时客户端可以自己准备一个本地的fallback回调,返回一个缺省值。这样做,虽然水平下降,但好歹可用,比直接挂掉强。
https://baike.baidu.com/item/%E5%A3%B0%E6%98%8E%E5%BC%8F%E7%BC%96%E7%A8%8B/9939512?fr=aladdin
3.定义一个接口@FeignClient(name=“xxx”)指定调用哪个服务
ribbon是一个负载均衡客户端,可以很好的控制http和tcp的一些行为。feign默认集成了ribbon。
1.Ribbon和feign都是调用其他服务的,但方式不同。
3.服务指定的位置不同,Ribbon是在@RibbonClient注解上声明,Feign则是在定义抽象方法的接口中使用@FeignClient声明。
4.调用方式不同,Ribbon需要自己构建http请求,模拟http请求然后使用RestTemplate发送给其他服务,步骤相当繁琐。Feign需要将调用的方法定义成抽象方法即可。
当一个服务调用另一个服务由于网络原因或自身原因出现问题,调用者就会等待被调用者的响应
当更多的服务请求到这些资源导致更多的请求等待,发生连锁效应(雪崩效应)
一段时间内 达到一定的次数无法调用 并且多次监测没有恢复的迹象 断路器完全打开 那么下次请求就不会请求到该服务
半开: 短时间内 有恢复迹象 断路器会将部分请求发给该服务,正常调用时
断路器关闭
Hystrix 能使你的系统在出现依赖服务失效的时候,通过隔离系统所依赖的服务,防止服务级联失败,同时提供失败回退机制,更优雅地应对失效,并使你的系统能更快地从异常中恢复
防雪崩利器,具备服务降级,服务熔断,依赖隔离,监控(Hystrix Dashboard)
双十一 提示 哎哟喂,被挤爆了。 app秒杀 网络开小差了,请稍后再试。
通过HystrixCommand注解指定。fallbackMethod(回退函数)中具体实现降级逻辑。