Springcloud笔记(4)-客户端负载均衡Ribbon

Ribbon是一个基于HTTP和TCP的客户端负载均衡工具,不需要独立部署,几乎存在于每一个springcloud构建的微服务和基础设施中。

微服务间调用,API网关的请求转发都通过Ribbon实现。

负载均衡

通常所说的负载均衡都是指的服务端负载均衡,包括硬件和软件,如软件的nginx。而ribbon是一个客户端负载均衡,客户端负载均衡中,所有客户端节点维护自己要访问的服务端清单,与服务注册中心配合完成。springcloud的服务治理框架,默认会整合ribbon,如Eureka。

在微服务架构中使用客户端负载均衡调用两步:

服务提供者只需要启动多个服务实例并注册到一个注册中心或是多个相关联的服务注册中心。

服务消费者直接通过调用被@LoadBalanced注解修饰过的RestTemplate来实现面服务的接口调用。

服务消费者的两个目标:发现服务和消费服务,发现服务由Eureka的客户端完成(通过@EnableDiscoveryClient注解让应用注册为Eureka客户端应用,获得服务发现能力),服务消费任务由ribbon完成(应用主类中创建RestTemplate的SpringBean实例,通过@LoadBalanced注解开启客户端负载均衡)

Eureka包含了ribbon,当ribbon与Eureka联合使用时,ribbon的服务实例清单会被扩展为从Eureka注册中心获取服务端列表。

还使用文章中的例子 Springcloud笔记(2)-Eureka服务注册中心-CSDN博客

服务消费

在 j-cloud-sonsumer的 HelloController.java代码

java 复制代码
@RestController
public class HelloController {

    @Bean
    @LoadBalanced
    public RestTemplate getResttemplate(){
        return new RestTemplate();
    }
    @Autowired
    private RestTemplate resttemplate;

    @RequestMapping("/hello")
    public String hello(){
        //指出服务地址   http://{服务提供者应用名名称}/{具体的controller}
        String url="http://provider-user/user/sayHello";

        //返回值类型和我们的业务返回值一致
        return resttemplate.getForObject(url, String.class);

    }
  
}

1、创建RestTemplate的Spring Bean实例,并通过@LoadBalanced注解开启客户端

负载均衡。

2、在接口实现中,调用RestTemplate创建的实例,使用getForObject方法实现对服务提供的/user/sayHello接口进行调用,可以看到这里的服务名为provider-user。

启动消费者访问查看控制台,Ribbon输出了当前客户端维护的provider-user的服务列表情况。其

中包含了各个实例的位置,Ribbo就是按照此信息进行轮询访问,以实现基于客户

端的负载均衡。另外还输出了一些其他非常有用的信息,如对各个实例的请求总数

量、第一次连接信息、上一次连接信息、总的请求失败数量等。

(使用ribbon来实现服务消费,ribbon对服务列表进行轮询,实现负载均衡)

RestTemplate

RestTemplate ,该对象会使用Ribbon的自动化配置,通过配置@LoadBanlanced开启客户端负载均衡。

在RestTemplate 中,对GET请求通过如下两个方法进行调用实现。

1)getForEntity

  1. getForObject

POST请求三个方法进行调用实现

1)postForEntity

  1. postForObject

  2. postForLocation

Ribbon支持的负载均衡策略

Ribbon内置了多种负载均衡策略,内部负载均衡的顶级接口为

com.netflix.loadbalancer.IRule

可以通过修改配置来调整Ribbon的负载均衡策略,具体代码如下

service-product: # 调用的提供者的名称

ribbon:

NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule

相关推荐
丶Darling.37 分钟前
代码随想录 | Day26 | 二叉树:二叉搜索树中的插入操作&&删除二叉搜索树中的节点&&修剪二叉搜索树
开发语言·数据结构·c++·笔记·学习·算法
结衣结衣.2 小时前
python中的函数介绍
java·c语言·开发语言·前端·笔记·python·学习
LN-ZMOI2 小时前
c++学习笔记1
c++·笔记·学习
qq_421833673 小时前
计算机网络——应用层
笔记·计算机网络
杨荧3 小时前
【JAVA开源】基于Vue和SpringBoot的水果购物网站
java·开发语言·vue.js·spring boot·spring cloud·开源
@qike4 小时前
【C++】—— 日期类的实现
c语言·c++·笔记·算法·学习方法
IG工程师4 小时前
关于 S7 - 1200 通过存储卡进行程序更新
经验分享·笔记·自动化
霸王蟹4 小时前
Vue3 项目中为啥不需要根标签了?
前端·javascript·vue.js·笔记·学习
向上的车轮4 小时前
Django学习笔记八:发布RESTful API
笔记·学习·django
向上的车轮5 小时前
Django学习笔记九:RESTAPI添加用户认证和授权
笔记·学习·django