【SpringCloud】10 Ribbon 服务负载均衡与调用

基于Netfilx Ribbon实现的客户端,负载均衡工具

提供客户端软件负载均衡算法和服务调用

 

在之前的Eureka谈及负载均衡时就已经使用过了这个技术

就是对RestTemplate引用注解的@LoadBalanced

我们可以翻看Maven的依赖:

spring-cloud-starter-eureka-client

或者也可以单独拉出来导入使用:

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</dependency>

回顾RestTemplate:

 之前一直调用的是Object方法,其作用是返回Json

如果调用的是Enitity方法,那么将包含响应的重要信息,例如:响应头,响应状态码,响应体

设置响应状态已经提供了基本的规范匹配:

 

IRule自定义负载规则:

就是自定义声明一个类实现Ribbon的接口或者抽象类,重写负载方法即可

但是特别要注意的问题是,我们Ribbon的这个自定义类,不允许@ComponentScan被SpringBoot扫描到

也就是@ComponentScan的当前包及其后代包目录都不能存放,

否则该配置会变成全局配置,所有的Ribbon客户端均能被配置生效

失去了单独配置的意义了

 

那么。。。SpringBoot启动类的注解就会表示当前目录下的所有包。

也就是Ribbon的配置必须在启动类所在的目录的上一级才可以配置

package cn.dzz.custom;

import com.netflix.loadbalancer.IRule;
import com.netflix.loadbalancer.RandomRule;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * @author DaiZhiZhou
 * @file SpringCloud-ATGG-2020
 * @create 2020-08-26 22:04
 */
@Configuration
public class CustomizeRibbonLoadRule {
    
    @Bean
    public IRule customizeRule(){
        return new RandomRule();
    }
}

回到主启动类,因为脱离SpringBoot启动注解的扫描,我们需要自己来手动注册成为Bean容器

开启之前的Eureka集群和单机服务中心 7001 + 7002 ,启动原始的8001服务 + 8002服务,再启动80服务

访问接口查看:

http://localhost/order/consumer/payment/get/1
{"code":200,"message":"查询数据成功  端口:8001","data":{"id":1,"serial":"aaabbb111"}}

服务访问正常,多刷新几次就会发现,每次请求的端口都将不会一样

 

轮询算法原理:

服务集群即一个服务的实例的集合,被Ribbon封装在一个封装服务实例的List中

这样的每一个服务实例元素就有对应的索引编号

需要的变量要素:

1、接口的总的请求次数 == RequestCount

2、服务集群总数 == ClusterCount

3、服务实例索引 == Available-Instance-Index

 Available-Instance-Index = RequestCount % ClusterCount 

得到我们的取余数,余数即为我们服务实例索引

 

posted @ 2020-08-26 22:37  emdzz  阅读(219)  评论(0)    收藏  举报