接上一篇:3.将服务注册到nacos中
什么是负载均衡
通常来说,负载均衡就是将负载平衡到多个节点上
百度百科-负载均衡
根据负载均衡发生的位置可以分为: 服务器端负载均衡 和 客户端负载均衡
两种负载均衡的解释
基于 Ribbon 实现负载均衡
1. Ribbon 简介
Rabbon 是 Netflix 发布的一个负载均衡器,有助于控制 HTTP 和 TCP客户端行为。在 SpringCloud 中, nacos一般配合Ribbon进行使用,Ribbon提供了客户端负载均衡的功能,Ribbon利用从nacos中读 取到的服务信息,在调用服务节点提供的服务时,会根据策略进行负载。 在SpringCloud中可以将注册中心和Ribbon配合使用,Ribbon自动的从注册中心中获取服务提供者的 列表信息,并基于内置的负载均衡算法,请求服务。
2. Ribbon 的主要作用
-
服务调用
基于Ribbon实现服务调用, 是通过拉取到的所有服务列表组成(服务名-请求路径的)映射关系。借助 RestTemplate 最终进行调用
-
负载均衡
当有多个服务提供者时,Ribbon可以根据负载均衡的算法自动的选择需要调用的服务地址
3. 使用
1. 在RestTemplate 的生成方法上添加 @LoadBalanced 注解
@Bean
@LoadBalanced
public RestTemplate getRestTemplate() {
return new RestTemplate();
}
2. 修改服务的调用方法
原本使用的是 http://ip地址:端口号/服务器地址
的方式进行调用远程方法
现在改为: http://服务名/服务器地址
的方式进行访问
例如:
Product product = restTemplate.getForObject("http://springboot-cloud-product/product/selectOne/1", Product.class);
说明:Product 等实体类在公共模块中存放,子项目引用公共模块,相当于每个模块中都有一份相同的实体类。
远程调用代码:
@RestController
@RequestMapping("order")
public class OrderController {
/**
* 服务对象
*/
@Resource
private OrderService orderService;
@Autowired
private RestTemplate restTemplate;
@Autowired
private DiscoveryClient discoveryClient;
@GetMapping("addOne/{pid}")
public Order addOne(@PathVariable("pid") Integer pid) {
Product pro = restTemplate.getForObject("http://springboot-cloud-product/product/selectOne/1", Product.class);
Order order = new Order();
order.setPid(pid);
order.setNumber(1);
order.setPprice(pro.getPprice());
order.setPname(pro.getPname());
// TODO 用户信息需要登陆后获取
order.setUid(1);
order.setUsername("法外狂徒张三");
return this.orderService.insert(order);
}
}
4. 负载均衡策略
Ribbon 默认使用的负载均衡策略是轮询策略。
Ribbon 内置了许多的负载均衡策略。内部负载均衡的顶级接口为:com.netflix.loadbalancer.IRule
具体策略如图所示:
可以通过配置修改Ribbon的负载均衡策略,
在请求方 或者叫做 调用方的 application 的配置文件中修改,这里使用yml格式
代码:
springboot-cloud-product:
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule
写这部分代码的时候,没有提示,防止写错,建议前边的复制,后边的进入到对应的规则类中,复制路径加类名