目录
1.什么是Ribbon
1.1 客户端的负载均衡
1.2 服务端的负载均衡
1.3 常见负载均衡算法
2. Nacos使用Ribbon
3. Ribbon负载均衡策略
4.修改默认负载均衡策略
方式1:通过自定义配置类来实现
方式2:通过修改配置文件实现(推荐)
5.自定义负载均衡策略
6. 饥饿加载

修改controller
@AutowiredRestTemplate restTemplate;@GetMapping("/pay")public String pay(){String msg = restTemplate.getForObject("http://stock-nacos/stock/reduct", String.class);return "success" + " " + msg;}

1)新建配置类:
package com.ribbon;import com.alibaba.cloud.nacos.ribbon.NacosRule;
import com.netflix.loadbalancer.IRule;import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;/*** @BelongsProject: SpringCloudAlibabaLearn* @BelongsPackage: com.ribbon* @Author: wang fei* @CreateTime: 2023-01-19 16:41* @Description: TODO* @Version: 1.0*/
@Configuration
public class RibbonConfig {/*** @description: 全局配置 指定负载均衡策略* 注意:此处有坑。不能写在@SpringbootApplication注解的@CompentScan扫描得到的地方,否则自定义的配置类就会被所有的RibbonClients共享。不建议这么使用,推荐yml方式* 方法名一定和IRule接口中关于负载均衡策略的名称一致* @method: iRule* @author: wang fei* @date: 2023/1/19 16:43:00* @param: []* @return: com.netflix.loadbalancer.IRule**/@Beanpublic IRule iRule(){//指定使用Nacos提供的负载均衡策略(优先调用同一集群的实例,基于随机权重)return new NacosRule();}
}
注意:此处有坑。不能写在@SpringbootApplication注解的@CompentScan扫描得到的地方,否则自定义的配置类就会被所有的
RibbonClients共享。 不建议这么使用,推荐yml方式
2)在启动类上利用@RibbonClient指定微服务及其负载均衡策略。
package com.wang;import com.ribbon.RibbonConfig;
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.cloud.netflix.ribbon.RibbonClient;
import org.springframework.cloud.netflix.ribbon.RibbonClients;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;/*** @BelongsProject: SpringCloudAlibabaLearn @RibbonClient指定微服务及其负载均衡策略。* @BelongsPackage: com.wang.controller* @Author: wang fei* @CreateTime: 2023-01-16 16:54* @Description: TODO* @Version: 1.0*/@SpringBootApplication
@RibbonClients(value = {//在SpringBoot主程序扫描的包外定义配置类@RibbonClient(name="order-nacos",configuration = RibbonConfig.class)
})
public class OrderApplication {public static void main(String[] args) {SpringApplication.run(OrderApplication.class, args);}@Bean@LoadBalanced //负载均衡public RestTemplate restTemplate(RestTemplateBuilder builder){RestTemplate restTemplate = builder.build();return restTemplate;}
}
#被调用的微服务名,指定使用Nacos提供的负载均衡策略(优先调用同一集群的实例,基于随机&权重)stock-nacos:ribbon:NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon
package com.ribbon.rule;import com.netflix.client.config.IClientConfig;
import com.netflix.loadbalancer.AbstractLoadBalancerRule;
import com.netflix.loadbalancer.ILoadBalancer;
import com.netflix.loadbalancer.Server;import java.util.List;
import java.util.concurrent.ThreadLocalRandom;/*** @BelongsProject: SpringCloudAlibabaLearn* @BelongsPackage: com.ribbon.rule* @Author: wang fei* @CreateTime: 2023-01-19 17:26* @Description: TODO 自定义规则,设置限流规则,自定义负载均衡策略* @Version: 1.0*/
public class CustomRule extends AbstractLoadBalancerRule {@Overridepublic void initWithNiwsConfig(IClientConfig iClientConfig) {}@Overridepublic Server choose(Object o) {//随机负载均衡策略ILoadBalancer loadBalancer = this.getLoadBalancer();//获取当前请求的服务实例List reachableServers = loadBalancer.getReachableServers();int random = ThreadLocalRandom.current().nextInt(reachableServers.size());Server server = reachableServers.get(random);if (server.isAlive()) {return null;}return server;}
}
2)配置自定义的策略
修改application.yml
stock-nacos:ribbon:
# NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon##自定义规则,设置限流规则,自定义负载均衡策略NFLoadBalancerRuleClassName: com.ribbon.rule.CustomRule ribbon:eager-load:# 开启ribbon饥饿加载enabled: true# 配置mall-user使用ribbon饥饿加载,多个使用逗号分隔clients: stock-nacos 实例工程:https://gitee.com/here-comes-brother-fei/ribbondemon.git
上一篇:Udev设备管理器