不错的文章:https://www.jianshu.com/p/cba6b0da0541
**负载均衡器ribbon和LoadBalancer:**https://blog.csdn.net/qq_40182873/article/details/128210251
Spring Cloud Ribbon 是基于 Netflix Ribbon 实现的一套客户端负载均衡工具,Ribbon 客户端组件提供一系列完善的配置,如超时、重试等。通过 Load Balancer 获取到服务提供的所有实例,Ribbon 会自动基于某种规则(轮询,随机)去调用这些服务。Ribbon 也可以实现我们自己的负载均衡算法。
随机,通过随机选择服务进行执行,一般这种方式使用较少;
轮询,负载均衡默认实现方式,请求来之后排队处理;
加权轮询,通过对服务器性能的分型,给高配置,低负载的服务器分配更高的权重,均衡各个服务器的压力;
地址Hash,通过客户端请求的地址的 HASH 值取模映射进行服务器调度。 ip —>hash
最小连接数,即使请求均衡了,压力不一定会均衡,最小连接数法就是根据服务器的情况,比如请求积压数等参数,将请求分
配到当前压力最小的服务器上。
低版本默认集成了,高本版需要添加依赖!
注意:因为Netflix的组件从2020年开始停止维护,因此spring cloud会逐渐弃用他家的组件,Ribbon就在其中,你可以搜一个github里面spring-cloud-alibaba的issues,有人有这部分的回答,解决方案有两种:
1.使用spring-cloud-loadbalancer代替ribbon,在项目中引用
<dependency> <groupId>org.springframework.cloudgroupId> <artifactId>spring-cloud-starter-loadbalancerartifactId> dependency>
- 降级,参照spring-cloud-alibaba的版本对应关系,不要使用2021.1,尽可能使用红框中版本,这些版本是包含ribbon的
https://img.mukewang.com/szimg/6107ff3409267b7815601086.jpg
来源:https://coding.imooc.com/learn/questiondetail/Ggzqw6j5J1zXDxW0.html
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-netflix-ribbonartifactId>
<version>2.2.10.RELEASEversion>
<exclusions>
<exclusion>
<groupId>com.google.guavagroupId>
<artifactId>guavaartifactId>
exclusion>
exclusions>
dependency>
@Configuration
public class RibbonConfig {
/**
* 全局配置
* 指定负载均衡策略
* @return
*/
@Bean
public IRule iRule() {
// 指定使用Nacos提供的负载均衡策略(优先调用同一集群的实例,基于随机权重)
return new NacosRule();
}
}
前面使用过:【Spring Cloud Alibaba】003-Nacos 概述与单机搭建
Spring Cloud LoadBalancer 是Spring Cloud 官方自己提供的客户端负载均衡器,用来替代 Ribbon。
Spring官方提供了两种负载均衡的客户端:
RestTemplate
RestTemplate 是 Spring 提供的用于访问 Rest 服务的客户端,RestTemplate 提供了多种便捷访问
远程 Http 服务的方法,能够大大提高客户端的编写效率。默认情况下,RestTemplate默认依赖
jdk 的 HTTP 连接工具。
WebClient
WebClient是从Spring WebFlux 5.0版本开始提供的一个非阻塞的基于响应式编程的进行Http请
求的客户端工具。它的响应式编程的基于Reactor的。WebClient中提供了标准Http请求方式对
应的get、post、put、delete等方法,可以用来发起相应的请求。
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-loadbalancerartifactId>
dependency>
package com.zibo.alibaba.order;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.client.RestTemplateBuilder;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;
@SpringBootApplication
public class OrderApplication {
public static void main(String[] args) {
SpringApplication.run(OrderApplication.class, args);
}
@Bean
@LoadBalanced
public RestTemplate restTemplate(RestTemplateBuilder builder){
return builder.build();
}
}
package com.zibo.alibaba.order.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
@RestController
@RequestMapping("/order")
public class OrderController {
@Autowired
private RestTemplate restTemplate;
@RequestMapping("/add")
public String add() {
System.out.println("下单成功!");
// 远程调用库存服务,ip 和端口改成服务名(如stock-service)
String forObject = restTemplate.getForObject("http://stock-service/stock/reduce", String.class);
return "hello world 下单成功!" + forObject;
}
}