1、Eureka的作用是什么?如何使用?
2、服务消费者如何得知服务提供者的实例地址?
- 服务提供者服务实例启动后,将自己的信息注册到eureka-server(Eureka服务端),这个叫服务注册。
- eureka-server保存服务名称到服务实例地址列表的映射关系。
- 服务消费者根据服务名称,拉取实例地址列表,这个叫服务发现或服务拉取。
3、服务消费者如何从多个服务提供者实例中选择具体的实例?
- 服务提供者从实例列表中利用负载均衡算法选中一个实例地址。
- 向该实例地址发起远程调用。
4、服务消费者如何得知某个服务提供者实例是否依然健康,是不是已经宕机?
- 服务消费者会每隔一段时间(默认30秒)向eureka-server发起请求,报告自己的状态,成为心跳。
- 当超过一定时间没有发送心跳时,eureka-server会认为微服务实例故障,将该实例从服务列表中剔除。
- 服务提供者拉取服务时,就能将该故障实例排除了。
5、@LoadBalanced
注解是怎么实现的负载均衡功能的?
- SpringCloud底层其实是利用了一个名为Ribbon的组件,来实现负载均衡功能的。具体流程如下:
- 底层采用了一个负载均衡拦截器,拦截我们的RestTemplate请求。
- RibbonLoadBalancerClient会从请求url中获取服务名称,也就是user-service。
- DynamicServerListLoadBalancer根据user-service到eureka拉取服务列表。
- eureka返回列表,localhost:8081、localhost:8082。
- IRule利用内置负载均衡规则,从列表中选择一个,例如localhost:8081。
- RibbonLoadBalancerClient修改请求地址,用localhost:8081替代user-service,得到http://localhost:8081/user/1, 发起真实请求。
探究:默认的负载均衡规则是什么?
ZoneAvoidanceRule:以区域可用的服务器为基础进行服务器的选择。使用Zone对服务器进行分类,这个Zone可以理解为一个机房、一个机架等。而后再对Zone内的多个服务做轮询。
探究:如何修改负载均衡规则?
-
设置bean:
@Bean public IRule randomRule(){ return new RandomRule(); }
-
配置文件方式(application.yml):
user-service: # 给某个微服务配置负载均衡规则,这里是user-service服务 ribbon: NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule # 负载均衡规则