Ribbon是Netflix发布的负载均衡器。Eureka一般配合Ribbon进行使用,Ribbon利用从Eureka中读取到服务信息,在调用服务提供者提供的服务时,会根据一定的算 法进行负载。
Ribbon高级应用
不需要引入额外的Jar坐标,因为在服务消费者中我们引用过的eureka-client,它会引用Ribbon相关Jar
1、引入轮询的注解
// 使用RestTemplate模板对象进行远程调用
@Bean
@LoadBalanced
public RestTemplate getRestTemplate() {
return new RestTemplate();
}
然后所有对外提供的接口服务都使用注入进来,然后进行远程调用
@Autowired
private RestTemplate restTemplate;
2、服务提供者
其服务的路径是/resume/openstate/{userId}
@RestController
@RequestMapping("/resume")
public class ResumeController {
@Autowired
private ResumeService resumeService;
@Value("${server.port}")
private Integer port;
//"/resume/openstate/1545132"
@GetMapping("/openstate/{userId}")
public Integer findDefaultResumeState(@PathVariable Long userId) throws Exception {
//return resumeService.findDefaultResumeByUserId(userId).getIsOpenResume();
System.out.println("====>>>>>>>>>>>>>>我是8081,访问到我这里了......");
return port;
}
}
3、消费端
也是根据这个路径去请求的,先将restTemplate注入
@Autowired
private RestTemplate restTemplate;
@Test
public void testRibbon() {
// 客户端面对的其实是服务了----lagou-service-resume,具体访问到哪个实例是由ribbon决定的
String url = "http://lagou-service-resume/resume/openstate/1545132";
// 调用远程服务—> 简历微服务接口 RestTemplate -> JdbcTempate
// httpclient封装好多内容进行远程调用
Integer forObject = restTemplate.getForObject(url, Integer.class);
System.out.println("=====》》》使用ribbon负载均衡访问,访问的服务实例的端口号:" + forObject);
}
Ribbon负载均衡策略
在yml的配置文件中,修改负载均衡策略
#针对的被调用方的微服务名称,不加就是全局失效
lagou-service-resume: #如果是全局生效就把这个具体的服务名取消即可,其他往前移动
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule #负载策略调整
Ribbon的工作原理
思考:Ribbon在做什么: 当我们访问http://lagou-service-resume/resume/openstate/的时候,ribbon应该 根据服务名lagou-service-resume获取到该服务的实例列表并按照⼀定的负载均衡 策略从实例列表中获取一个实例Server,并最终通过RestTemplate进行请求访问
Ribbon细节结构图
(涉及到底层的一些组件/类的描述) 1)获取服务实例列表 2)从列表中选择一个server
图中核心是负载均衡管理器LoadBalancer(总的协调者,相当于大脑,为了做事 情,协调四肢),围绕它周围的多有IRule、IPing等
IRule:是在选择实例的时候的负载均衡策略对象
IPing:是用来向服务发起心跳检测的,通过心跳检测来判断该服务是否可用
ServerListFilter:根据一些规则过滤传入的服务实例列表
ServerListUpdater:定义了一系列的对服务列表的更新操作