概念:
- ribbon是springcloud的通讯组件,作为服务消费者的负载均衡器
- ribbon以http的形式调用rest接口,封装了okhttp
- ribbon实现负载均衡算法
ribbon调用流程
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YLcyrZzF-1649644758903)(CD9746A4689A451B8F5A966905BFCAC4)]](https://img-blog.csdnimg.cn/422d704d9f9a44fa8d8fa28a96c50b03.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAcGFsbSBkb3du,size_20,color_FFFFFF,t_70,g_se,x_16)
ribbon配置
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</dependency>
- ribbon默认的负载均衡算法是轮训
- 自定义负载均衡算法
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NB8pmfpF-1649644758904)(EF27A09D679B4CFAA17D1E713CF911F1)]](https://img-blog.csdnimg.cn/f05d133c1b2147a1850cea85a9963773.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAcGFsbSBkb3du,size_20,color_FFFFFF,t_70,g_se,x_16)
- restTemplate配置ribbon
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NAwYvB75-1649644758904)(546840DB451D4F34A83B13BCC25F8449)]](https://img-blog.csdnimg.cn/8540c50cad964e5987e03e869bf47dc1.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAcGFsbSBkb3du,size_20,color_FFFFFF,t_70,g_se,x_16)
- webclient配置
- webclient需要添加
webflux
依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webflux</artifactId>
</dependency>
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-El6cRoGc-1649644758905)(DBC155BAC1F0445FB2277571562BFC42)]](https://img-blog.csdnimg.cn/335ad302c37743cc8d084c00078525a3.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAcGFsbSBkb3du,size_20,color_FFFFFF,t_70,g_se,x_16)
- 配置ribbon连接和超时
application.yml
ribbon:
# 默认是1000毫秒,1分钟
ReadTimeout: 10000
# 最大重试次数
MaxAutoRetries: 1
# 刷新ribbonServerList缓存的时间 默认是30秒
ServerListRefreshInterval: 2000
ribbon使用
/**
* @author liouwb
*/
@RestController
@RequestMapping("consumer")
public class ConsumerController {
@Autowired
private RestTemplate restTemplate;
@Autowired
private WebClient.Builder clientBuilder;
/**
* restTemplate使用ribbon实现负载均衡
* @return
*/
@GetMapping("getProvider")
public String getProvider() {
// return restTemplate.getForObject("http://localhost:8001/provider/getProvider", String.class);
// 使用ribbin做负载均衡,ip采用yml里面配置的application名称
return restTemplate.getForObject("http://privider-server/provider/getProvider", String.class);
}
/**
* webclient使用ribbon实现负载均衡
*
* @return
*/
@GetMapping("webClientLoad")
public String webClientLoad() {
return clientBuilder
.baseUrl("http://privider-server/provider/getProvider")
.build()
.method(HttpMethod.GET)
.retrieve()
.bodyToMono(String.class)
.block();
}
}