微服务项目之乐优--3.eureka集群搭建及eureka客户端详述及负载均衡Ribbon的使用和底层源码分析

目录

 

一、高可用的eureka server

 二、eureka集群

模拟在创建一个eureka-server项目

 修改服务提供者和消费者项目配置文件

三、eureka客户端

续约时间

 服务时效时间

 失效剔除时间

 自我保护

负载均衡问题

 四、负载均衡Ribbon

1、实现服务提供者集群

 2、实现消费方的调用负载均衡

1)RibbonLoadBalanceClient实现负载均衡

2)@LoadBalanced方式负载均衡

3)@LoadBalanced底层拦截器源码分析

负载均衡底层源码实现


一、高可用的eureka server

eureka server 即服务的注册中心,在刚才的案例中,我们只有一个eurekaServer,事实上eurekaServer也可以是一个集群,形成高可用的eureka中心

服务同步

多个eureka server之间互相注册服务,当服务提供者注册到eureka server集群中的某个节点时,该节点会把服务的信息同步给集群中的每个节点,从而实现数据同步。因此,无论客户端访问到eureka server集群中的任意一个节点,都可以获取到完整的服务列表信息。

而作为客户端需要把信息注册到每一个eureka中。

微服务项目之乐优--3.eureka集群搭建及eureka客户端详述及负载均衡Ribbon的使用和底层源码分析

 二、eureka集群

模拟在创建一个eureka-server项目

微服务项目之乐优--3.eureka集群搭建及eureka客户端详述及负载均衡Ribbon的使用和底层源码分析

 微服务项目之乐优--3.eureka集群搭建及eureka客户端详述及负载均衡Ribbon的使用和底层源码分析

 启动

微服务项目之乐优--3.eureka集群搭建及eureka客户端详述及负载均衡Ribbon的使用和底层源码分析

微服务项目之乐优--3.eureka集群搭建及eureka客户端详述及负载均衡Ribbon的使用和底层源码分析

 微服务项目之乐优--3.eureka集群搭建及eureka客户端详述及负载均衡Ribbon的使用和底层源码分析

 修改服务提供者和消费者项目配置文件

微服务项目之乐优--3.eureka集群搭建及eureka客户端详述及负载均衡Ribbon的使用和底层源码分析

 微服务项目之乐优--3.eureka集群搭建及eureka客户端详述及负载均衡Ribbon的使用和底层源码分析

这样就实现了eureka的集群

三、eureka客户端

服务提供者要想eurekaServer注册服务,并且完成服务续约等工作。

服务注册

服务提供者在启动时,会检测配置属性中的:eureka.client.register-with-erueka-true参数是否正确,事实上默认就是true。如果值确实为true,则会想eurekaServer发起一个Rest请求,并携带自己的元数据信息,eureka server会把这些信息保存到一个双层Map结构中。

第一层Map的key就是服务id,一般是配置中的spring.application.name属性

底层Map的key是服务的实例id.一般host+serviceId+port,例如:locahost:user-service:8081

值则是服务的实例对象,也就是说一个服务,可以同时启动多个不同实例,形成集群。

服务续约

在注册服务完成以后,服务提供者会维持一个心跳(定时向eurekaServer发送)rest请求。告诉eurekaServer:“我还活着”。这个我们称为服务的续约(renew);

续约时间

每隔30秒续约一次(可设置)

微服务项目之乐优--3.eureka集群搭建及eureka客户端详述及负载均衡Ribbon的使用和底层源码分析

 

 服务时效时间

每个30秒发一次心跳,但是如果90秒还没有发,说明该服务挂了(可设置)

微服务项目之乐优--3.eureka集群搭建及eureka客户端详述及负载均衡Ribbon的使用和底层源码分析

 失效剔除时间

在失效之后,并不是马上执行剔除操作,需要等待30秒时间(可设置)

微服务项目之乐优--3.eureka集群搭建及eureka客户端详述及负载均衡Ribbon的使用和底层源码分析

 自我保护

我们关停一个服务,就会在eureka面板看到一条警告:

微服务项目之乐优--3.eureka集群搭建及eureka客户端详述及负载均衡Ribbon的使用和底层源码分析

这是触发了eureka的自我保护机制。当服务未按时进行心跳续约时,eureka会统计服务实例最近15分钟心跳续约的比例是否低于了85%。在生产环境下,因为网络延迟等原因,心跳失败实例的比例很有可能超标,但是此时就把服务剔除列表并不妥当,因为服务可能没有宕机。eureka在这段时间内不会剔除任何服务实例,直到网络恢复正常。生产环境下这很有效,保证了大多数服务依然可用,不过也有可能获取到失败的服务实例,因此服务调用者必须做好服务的失败容错。

我们也可以通过以下配置来关闭自我保护 

微服务项目之乐优--3.eureka集群搭建及eureka客户端详述及负载均衡Ribbon的使用和底层源码分析

 

负载均衡问题

在之前取出ip地址其实没有实现负载均衡

微服务项目之乐优--3.eureka集群搭建及eureka客户端详述及负载均衡Ribbon的使用和底层源码分析

 四、负载均衡Ribbon

在刚才的案例中,我们启动了一个user-service,然后通过discoveryClient来获取服务实例信息,然后获取ip和端口来访问。

但是实际环境中,我们往往会开启很多个user-service的集群,此时我们获取的服务列表中就会有很多个,到底该访问哪一个呢?

一般情况下我们需要编写负载均衡算法,在多个实例列表中进行选择。

不过eureka中已经帮我们集成了负载均衡组件:ribbon,简单修改即可使用。

什么是ribbon:

ribbon是Netflix发布的负载均衡器,它有助于控制HTTP和TCP客户端的行为。为ribbon配置服务提供者地址列表后,ribbon就可基于某种负载均衡算法,自动地帮助服务消费者去请求。ribbon默认为我们提供了很多的负载均衡算法,例如轮询、随机等。当然,我们也可以为ribbon实现自定义的负载均衡算法。

1、实现服务提供者集群

微服务项目之乐优--3.eureka集群搭建及eureka客户端详述及负载均衡Ribbon的使用和底层源码分析

 启动

微服务项目之乐优--3.eureka集群搭建及eureka客户端详述及负载均衡Ribbon的使用和底层源码分析

 微服务项目之乐优--3.eureka集群搭建及eureka客户端详述及负载均衡Ribbon的使用和底层源码分析

 2、实现消费方的调用负载均衡

引入ribbon的jar

微服务项目之乐优--3.eureka集群搭建及eureka客户端详述及负载均衡Ribbon的使用和底层源码分析

1)RibbonLoadBalanceClient实现负载均衡

 使用RibbonLoadBalanceClient类,它本身就已经实现了负载均衡算法(默认是轮询),所有返回的值就只有一个实例

微服务项目之乐优--3.eureka集群搭建及eureka客户端详述及负载均衡Ribbon的使用和底层源码分析

2)@LoadBalanced方式负载均衡

微服务项目之乐优--3.eureka集群搭建及eureka客户端详述及负载均衡Ribbon的使用和底层源码分析

@LoadBalanced其底层使用的是拦截器,将我们发过去的请求拦截下来,再在内部实现负载均衡算法

微服务项目之乐优--3.eureka集群搭建及eureka客户端详述及负载均衡Ribbon的使用和底层源码分析

3)@LoadBalanced底层拦截器源码分析

微服务项目之乐优--3.eureka集群搭建及eureka客户端详述及负载均衡Ribbon的使用和底层源码分析

 该类目的就是拦截所有客户端HTTP请求

微服务项目之乐优--3.eureka集群搭建及eureka客户端详述及负载均衡Ribbon的使用和底层源码分析

 debug跟踪

微服务项目之乐优--3.eureka集群搭建及eureka客户端详述及负载均衡Ribbon的使用和底层源码分析

 微服务项目之乐优--3.eureka集群搭建及eureka客户端详述及负载均衡Ribbon的使用和底层源码分析

 微服务项目之乐优--3.eureka集群搭建及eureka客户端详述及负载均衡Ribbon的使用和底层源码分析

 微服务项目之乐优--3.eureka集群搭建及eureka客户端详述及负载均衡Ribbon的使用和底层源码分析

负载均衡底层源码实现

那么它底层是怎么选择负载均衡算法的呢 

微服务项目之乐优--3.eureka集群搭建及eureka客户端详述及负载均衡Ribbon的使用和底层源码分析

微服务项目之乐优--3.eureka集群搭建及eureka客户端详述及负载均衡Ribbon的使用和底层源码分析 

 微服务项目之乐优--3.eureka集群搭建及eureka客户端详述及负载均衡Ribbon的使用和底层源码分析

 微服务项目之乐优--3.eureka集群搭建及eureka客户端详述及负载均衡Ribbon的使用和底层源码分析

 微服务项目之乐优--3.eureka集群搭建及eureka客户端详述及负载均衡Ribbon的使用和底层源码分析

在IRule 里面有一堆的负载均衡规则

 微服务项目之乐优--3.eureka集群搭建及eureka客户端详述及负载均衡Ribbon的使用和底层源码分析

微服务项目之乐优--3.eureka集群搭建及eureka客户端详述及负载均衡Ribbon的使用和底层源码分析

获取所有服务列表(进行轮询)

微服务项目之乐优--3.eureka集群搭建及eureka客户端详述及负载均衡Ribbon的使用和底层源码分析

 微服务项目之乐优--3.eureka集群搭建及eureka客户端详述及负载均衡Ribbon的使用和底层源码分析

 微服务项目之乐优--3.eureka集群搭建及eureka客户端详述及负载均衡Ribbon的使用和底层源码分析

 在配置文件中配置相关负载均衡策略(建议工作中使用轮询,没必要采用随机策略)

微服务项目之乐优--3.eureka集群搭建及eureka客户端详述及负载均衡Ribbon的使用和底层源码分析