细粒度
配置一个 基于JAVA代码的 随机策略的 Ribbon
一、创建目录及类
注意 RibbonConfiguration 不能被启动类的@ComponentScan 注解扫描到。
@ComponentScan 扫描的是当前类的文件夹以及子文件夹的@Component,如果RibbonConfiguration的@Component 在ComponentScan 扫描范围内就会出现 父子上下文错乱的问题,会导致此Ribbon的配置会被共享,成为一个全局的负载均衡配置,影响的范围也是当前服务的所有调用策略,而不是细粒度的配置策略。所以RibbonConfiguration的目录 在启动类的同级目录。
import org.springframework.cloud.netflix.ribbon.RibbonClient;
import ribbonconfiguration.RibbonConfiguration;
@RibbonClient(name = "user-center" ,configuration = RibbonConfiguration.class)
//name表明这个Ribbon是给user-center用的,configuration指定一个类
public class UserCenterRibbonConfiguration {
}
import com.netflix.loadbalancer.IRule;
import com.netflix.loadbalancer.RandomRule;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class RibbonConfiguration {
@Bean
public IRule ribbonRule(){
return new RandomRule();//选一个IRule 的实现类
}
}
二、使用
1.启动类
@MapperScan("com.itmuch")
@SpringBootApplication
public class ContentCenterApplication {
public static void main(String[] args) {
SpringApplication.run(ContentCenterApplication.class, args);
}
@Bean
@LoadBalanced //加Ribbon注解
public RestTemplate restTemplate(){
return new RestTemplate();
}
}
- 业务逻辑类
private final RestTemplate restTemplate;
public ShareDTO findById(Integer id) {
// 获取分享详情
Share share = this.shareMapper.selectByPrimaryKey(id);
//share里没有用户的信息,所以要调用user服务来获取
Integer userId = share.getUserId();
//"http://user-center/users/{userId}" Ribbon 会将 "user-center" 转化为 user-center 在Nacos上的地址,并实现负载均衡
UserDTO userDTO = restTemplate.getForObject("http://user-center/users/{userId}",UserDTO.class,userId);
ShareDTO shareDTO = new ShareDTO();
BeanUtils.copyProperties(share,userDTO);
shareDTO.setWxNickname(userDTO.getWxNickname());
return shareDTO;
}
配置一个 基于yml 配置的 随机策略的 Ribbon
一. 添加yml配置
改yml文件:
NFLoadBalancerRuleClassName 后面写上RandomRule的全名
user-center:
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule
二.使用
启动类,业务逻辑类同 上面的 ”基于JAVA代码“
全局
把细粒度的UserCenterRibbonConfiguration 修改一下
@RibbonClient(name = "user-center" ,configuration = RibbonConfiguration.class)
//name表明这个Ribbon是给user-center用的,configuration指定一个类
public class UserCenterRibbonConfiguration {
}
@RibbonClient----->@RibbonClients
configuration ---->defaultConfiguration
@RibbonClients(defaultConfiguration = RibbonConfiguration.class)
public class UserCenterRibbonConfiguration {
}
自定义Ribbon 配置项
接口列都可以进行自定义配置,
如果想配置负载均衡:
采用JAVA代码的方式可以仿照:配置一个 基于JAVA代码的 随机策略的 Ribbon 的 一。
采用yml配置的方式可以仿照:配置一个 基于yml 配置的 随机策略的 Ribbon 的 一。 注意冒号后面写全名,可以用control+shift+r 搜 IRule 、IPing 等 去粘贴全名。