1.配置类
@Configurationpublic class RibbonConfig {/*** 全局配置* 指定负载均衡策略* @return*/@Beanpublic IRule iRule() {// 指定使用Nacos提供的负载均衡策略(优先调用同一集群的实例,基于随机权重)return new NacosRule();}}
注意:此处有坑。不能写在@SpringbootApplication注解的@CompentScan扫描得到的地方,否则自定义的配置类就会被所有的 RibbonClients共享。 不建议这么使用,推荐yml方式

利用@RibbonClient指定微服务及其负载均衡策略。
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class,DruidDataSourceAutoConfigure.class})//@RibbonClient(name = "mall-order",configuration = RibbonConfig.class)//配置多个 RibbonConfig不能被@SpringbootApplication的@CompentScan扫描到,否则就是全局配置的效果@RibbonClients(value = {// 在SpringBoot主程序扫描的包外定义配置类@RibbonClient(name = "mall-order",configuration = RibbonConfig.class),@RibbonClient(name = "mall-account",configuration = RibbonConfig.class)})public class MallUserRibbonDemoApplication {public static void main(String[] args) {SpringApplication.run(MallUserRibbonDemoApplication.class, args);}}
配置文件:调用指定微服务提供的服务时,使用对应的负载均衡算法
修改application.yml
# 被调用的微服务名mall-order:ribbon:# 指定使用Nacos提供的负载均衡策略(优先调用同一集群的实例,基于随机&权重)NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule
3.2.2 自定义负载均衡策略
通过实现 IRule 接口可以自定义负载策略,主要的选择服务逻辑在 choose 方法中。
1)实现基于Nacos权重的负载均衡策略
@Slf4jpublic class NacosRandomWithWeightRule extends AbstractLoadBalancerRule {@Autowiredprivate NacosDiscoveryProperties nacosDiscoveryProperties;@Overridepublic Server choose(Object key) {DynamicServerListLoadBalancer loadBalancer = (DynamicServerListLoadBalancer) getLoadBalancer();String serviceName = loadBalancer.getName();NamingService namingService = nacosDiscoveryProperties.namingServiceInstance();try {//nacos基于权重的算法Instance instance = namingService.selectOneHealthyInstance(serviceName);return new NacosServer(instance);} catch (NacosException e) {log.error("获取服务实例异常:{}", e.getMessage());e.printStackTrace();}return null;}@Overridepublic void initWithNiwsConfig(IClientConfig clientConfig) {}
2) 配置自定义的策略
2.1)配置文件:
修改application.yml
# 被调用的微服务名mall-order:ribbon:# 自定义的负载均衡策略(基于随机&权重)NFLoadBalancerRuleClassName: com.tuling.mall.ribbondemo.rule.NacosRandomWithWeightRule
3.3 饥饿加载
在进行服务调用的时候,如果网络情况不好,第一次调用会超时。
Ribbon默认懒加载,意味着只有在发起调用的时候才会创建客户端。
开启饥饿加载,解决第一次调用慢的问题
ribbon:eager-load:# 开启ribbon饥饿加载enabled: true# 配置mall-user使用ribbon饥饿加载,多个使用逗号分隔clients: mall-order
源码对应属性配置类:RibbonEagerLoadProperties
测试:
3. Ribbon内核原理
3.1 Ribbon原理
