目录
一、Ribbon负载均衡
1.1 什么是负载均衡
通俗的讲,负载均衡就是将负载(工作任务,访问请求)进行分摊到多个操作单元(服务器,组件)上进行执行。
1.2 自定义实现负载均衡
1.2.1 创建两个服务提供者provider
1.2.2 配置文件application.yml设置不同的端口号
#ribbon_provider_1
server:
port: 9090
spring:
cloud:
nacos:
discovery:
server-addr: 192.168.57.132 #nacos服务的地址
application:
name: ribbon-provider #向注册中心注册的名字
#ribbon_provider_2
server:
port: 9091
spring:
cloud:
nacos:
discovery:
server-addr: 192.168.57.132 #nacos服务的地址
application:
name: ribbon-provider #向注册中心注册的名字
1.2.3 创建服务消费者consumer
1.2.4 配置文件application.yml
server:
port: 80
spring:
cloud:
nacos:
discovery:
server-addr: 192.168.57.132 #nacos服务的地址
application:
name: ribbon-consumer #向注册中心注册的名字
1.2.5 controller
@RestController
@RequestMapping(value = "/consumer")
public class ConsumerController {
//发送Rest请求的工具类
@Autowired
private RestTemplate restTemplate;
//发现服务的工具类
@Autowired
private DiscoveryClient discoveryClient;
private int index;
@RequestMapping("/getService/{id}")
public User getServic(@PathVariable Integer id){
//获取所有服务
List<String> serviceList = discoveryClient.getServices();
//随机方式获得服务
//int currentIndex = new Random().nextInt(serviceList.size());
//轮询方式获得服务
index=index + 1;
int currentIndex = (index) % serviceList.size();
ServiceInstance serviceInstance = discoveryClient.getInstances("ribbon-provider").get(currentIndex);
String url = "http://"+serviceInstance.getHost()+":"+serviceInstance.getPort()+"/provider/getUserById/"+id;
return restTemplate.getForObject(url, User.class);
}
}
//RestTemplate工具类
@Configuration
public class ConfigBean {
@Bean
public RestTemplate restTemplate(){
return new RestTemplate();
}
}
1.2.6 测试: 分别使用轮询和随机策略调用服务提供者
1.3 Ribbon介绍
1.3.1 什么是Ribbon
Spring Cloud Ribbon是基于Netflix Ribbon实现的一套客户端负载均衡的工具。
我们不需要去引入ribbon的依赖,因为在nacos里面已经集成了ribbon的依赖
Ribbon默认提供 很多种负载均衡算法,例如轮询、随机 等等。
1.3.2 负载均衡策略
负载均衡接口:com.netflix.loadbalancer.IRule
1.3.2 随机策略
Ribbon的默认内置了7种负载均衡策略:
1、RoundRobinRule
轮询策略,Rabbon默认采用的策略,若经过一轮轮询没有找到可用的provider(提供者),其最多轮询10轮,若最终
没有找到,则返回NULL。
举例:当前有3个提供者A,B,C,先挨个轮询1遍,A,B,C都不访问(1轮),在A,B,C访问一遍(2轮次),一共试10轮
如果还不能访问,则返回NULL。
2、RandomRule
随机策略,从所有可用的provider(提供者)中选择一个。
3、RetryRule
重试策略,先按照RoundRobinRule策略获取pro