ribbon是什么?
Spring Cloud Ribbon是基于Netflix Ribbon实现的一套客户端负载均衡的工具。
简单的说,Ribbon是Netflix发布的开源项目,主要功能是提供客户端的软件负载均衡算法,将Netflix的中间层服务连接在一起。Ribbon客户端组件提供一系列完善的配置项如连接超时,重试等。简单的说,就是在配置文件中列出Load Balancer(简称LB)后面所有的机器,Ribbon会自动的帮助你基于某种规则(如简单轮询,随机连接等)去连接这些机器。我们也很容易使用Ribbon实现自定义的负载均衡算法。
客户端负载均衡?? 服务端负载均衡??
我们用一张图来描述一下这两者的区别
服务端的负载均衡是一个url先经过一个代理服务器(这里是nginx),然后通过这个代理服务器通过算法(轮询,随机,权重等等..)反向代理你的服务,l来完成负载均衡
而客户端的负载均衡则是一个请求在客户端的时候已经声明了要调用哪个服务,然后通过具体的负载均衡算法来完成负载均衡
如何使用:
首先,我们还是要引入依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</dependency>
但是,eureka已经把ribbon集成到他的依赖里面去了,所以这里不需要再引用ribbon的依赖
在配置类上加@RibbinClient或者@RibbonClients
@Configuration
@ComponentScan("com")
@RibbonClients({
@RibbonClient(name="server-user",configuration = UserConfig.class),
@RibbonClient(name="server-order",configuration = OrderConfig.class)
})
public class AppConfig {
@Bean
@LoadBalanced
public RestTemplate restTemplate(){
return new RestTemplate();
}
}
根据官网上到说明UserConfig必须加上@Configuration,且不能在@ComponentScan扫描包路径下
@Configuration
public class UserConfig {
@Bean
public IRule iRule(){
return new RoundRobinRule();
}
}
controller
@RestController
public class TestController {
@Autowired
RestTemplate restTemplate;
@RequestMapping("/getUser")
public Map getUser(){
return (Map)restTemplate.getForObject("http://server-user/hello",Object.class);
}
}
因为ribbon默认使用轮询作为负载均衡策略,所以会重复出现
核心组件:IRule
IRule是什么? 它是Ribbon对于负载均衡策略实现的接口, 怎么理解这句话? 说白了就是你实现这个接口,就能自定义负载均衡策略, 自定义我们待会儿来讲, 我们先来看看他有哪些默认的实现
上面是通过javaconfig方式,再看看配置文件的方式
官网上说通过配置文件的方式优先于javaconfig方式,但是我测试的结果却不是这样的,只要用一种方式配置就没影响
<clientName>.ribbon.NFLoadBalancerClassName: Should implement ILoadBalancer
<clientName>.ribbon.NFLoadBalancerRuleClassName: Should implement IRule
<clientName>.ribbon.NFLoadBalancerPingClassName: Should implement IPing
<clientName>.ribbon.NIWSServerListClassName: Should implement ServerList
<clientName>.ribbon.NIWSServerListFilterClassName: Should implement ServerListFilter