Ribbon介绍 (配置文件配置篇)

目录

一.负载均衡的两种方式

二.手写随机负载均衡算法

三.使用Ribbon实现负载均衡

四.整合Ribbon

五.重构代码(使用Ribbon实现负载均衡)

六.Ribbin内置的负载均衡规则

七.细粒度配置负载均衡算法(配置文件配置)

1.Ribbon细粒度配置某个微服务使用指定负载均衡算法

2.Ribbon其他配置

3.Ribbon默认是懒加载

八.扩展Ribbon-同集群优先调用

九.扩展Ribbon-基于元数据的版本控制


其他内容:Ribbon介绍 (Java代码配置篇)

一.负载均衡的两种方式

# 服务器端负载均衡:Nginx(相关文章链接)

# 客户端负载均衡:Ribbon等...

区别主要在于:服务器端负载均衡在服务器端拦截请求,然后转发给不同的服务器。二客户端测负载均衡则先确定需要访问的服务,在本地已经通过负载均衡算法实现调用目标服务器。客户端侧负载均衡依赖于服务发现和服务注册组件。

二.手写随机负载均衡算法

参考文章:Nacos学习笔记

文中第三章第5小点的代码14——19行就是一个实现负载均衡的办法。

三.使用Ribbon实现负载均衡

Ribbon会自动获取Nacos Server的服务列表,在微服务需要访问时,会调用经过Ribbon计算过的地址。

四.整合Ribbon

# 加依赖 (继承了Nacos后不需要添加任何依赖,已经内置了:Nacos集成笔记)

# 写注解 (在restTemplate方法上添加@LoadBalanced注解即可)

package com.shixin.contentcenter;

/**
 * @MapperScan 扫描Mybatis哪些包里面的接口
 *
 */
@MapperScan("com.shixin")
@SpringBootApplication
public class ContentCenterApplication {

    public static void main(String[] args) {
        SpringApplication.run(ContentCenterApplication.class, args);
    }

    //在spring容器中创建一个对象 类型为:RestTemplate,对象名是方法名:restTemplate
    //此处将RestTemplate注入容器是为了方便使用。
    @Bean
    @LoadBalanced
    public RestTemplate restTemplate(){
        return new RestTemplate();
    }

}

# 写配置(无需配置)

五.重构代码(使用Ribbon实现负载均衡)

@Slf4j
@Service
@RequiredArgsConstructor(onConstructor = @__(@Autowired))
public class ShareService {    
    private final ShareMapper shareMapper;
    private final RestTemplate restTemplate;
 
    public ShareDTO findById(Integer id){
        Share share = shareMapper.selectByPrimaryKey(id);
        Integer userId = share.getUserId();

        //在内容中心发起请求时,Ribbon会自动将user-center解析成Nacos服务列表中已注册的服务地址(通过负载均衡算法)
        UserDTO userDTO = restTemplate.getForObject(
                "http://user-center/users/{userId}",
                UserDTO.class,
                userId);
        ShareDTO shareDTO = new ShareDTO();
        BeanUtils.copyProperties(share,shareDTO);
        shareDTO.setWxNickName(userDTO.getWxNickname());
        return shareDTO;
    }
}

六.Ribbin内置的负载均衡规则

(配置文件中使用规则名称进行配置,默认使用轮询算法ZoneAvoidanceRule)

规则名称 特点
BestAvailableRule 选择一个最小的并发请求的Server,逐个考察Server,如果Server被
RandomRule 随机选择一个Server
ResponseTimeWeightedRule 已废弃,作用同WeightedResponseTimeRule
RetryRule 对选定的负载均衡策略机上重试机制,在一个配置时间段内当选择Server不成功,则一直尝试使用subRule的方式选择一个可用的server
RoundRobinRule  轮询选择,轮询index,选择index对应位置的Server
WeightedResponseTimeRule 根据响应时间加权,响应时间越长,权重越小,被选中的可能性越低
ZoneAvoidanceRule 复合判断Server所zone的性能和Server的可用性选择Server,在没有Zone的环境下,类似于轮询(RoundRobinRule)
AvailabilityFilteringRule 过滤掉一直连接失败的被标记为circuit tripped的后端Server,并过滤掉那些高并发的后端Server或者使用一个AvailabilityPredicate来包含过滤server的逻辑,其实就就是检查status里记录的各个Server的运行状态

七.细粒度配置负载均衡算法(配置文件配置)

(基本都使用这种方式,没有代码配置的坑,也可以实现线上修改和发布,且配置文件的配置优先级比Java代码更高,即配置文件和Java代码同时配置,配置文件优先生效)

1.Ribbon细粒度配置某个微服务使用指定负载均衡算法

为调用微服务user-center时指定负载均衡算法。

user-center:
  ribbon:
    #Ribbon实现负载均衡算法配置,前面的key是固定写法,后面是负载均衡算法的全路径
    NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule

2.Ribbon其他配置

可配置项:

Ribbon介绍 (配置文件配置篇)_第1张图片

配置文件配置方式:

Ribbon介绍 (配置文件配置篇)_第2张图片

配置解读:

Ribbon介绍 (配置文件配置篇)_第3张图片

3.Ribbon默认是懒加载

当下面代码调用的时候,才会创建名为user-center的Ribbon Client,就会导致首次请求过慢的问题。

        UserDTO userDTO = restTemplate.getForObject(
            "http://user-center/user/{userId}",
            UserDTO.class,
            userId)

解决方案:配置文件配置

ribbon:
    eager-load:
        enabled:true
        clients:user-center,xxx,xxx

八.扩展Ribbon-同集群优先调用

此种扩展需要代码配置搭配配置文件一起使用,因代码篇幅较长。内容移至Java代码配置篇。

文章第二章:扩展Ribbon-同集群优先调用

九.扩展Ribbon-基于元数据的版本控制

链接:扩展Ribbon支持基于元数据的版本管理

 

 

 

 

你可能感兴趣的:(Ribbon,SpringCloud,分布式)