五、Netflix Ribbon 负载均衡

5.1 Ribbon 简介

5.2 Ribbon 快速入门

5.2.1 Ribbon 服务负载均衡

5.2.2 自定义服务列表 5.3 Ribbon的配置

5.3.1 Ribbon 的属性配置

5.3.2 Ribbon常用配置

5.3.2.1 连接配置

5.3.2.2 懒加载配置5.3.2.3 并发调整 5.3.3 Ribbon 配置策略 5.4 Ribbon的负载均衡策略

5.4.1 Ribbon负载均衡策略

5.4.1 修改Ribbon负载均衡策略

五、Netflix Ribbon 负载均衡

5.1 Ribbon 简介

Netflix Ribbon是一个基于HTTP和TCP的客户端负载均衡工具,通过Spring Cloud的封装,可以让我们轻松地将面向服务的REST请求自动转换成客户端负载均衡的服务调用。微服务间的调用,API网关的请求转发等内容,实际上都是通过Ribbon来实现的;

Ribbon的主要作用就是两个:

1)服务之间调用

2)服务调用时的负载均衡

5.2 Ribbon 快速入门

5.2.1 Ribbon 服务负载均衡

Ribbon已经被被集成到Eureka中,我们之前在学习Eureka时就已经用过了Ribbon了;

在RestTemplate上添加@LoadBalanced注解之后,调用接口便自动继承了负载均衡的能力;

ItemApplication:

package com.cloud.item;

import org.springframework.boot.SpringApplication;

import org.springframework.boot.autoconfigure.SpringBootApplication;

import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

import org.springframework.cloud.client.loadbalancer.LoadBalanced;

import org.springframework.cloud.netflix.eureka.EnableEurekaClient;

import org.springframework.context.annotation.Bean;

import org.springframework.web.client.RestTemplate;

/\*\*

\* @author lscl

\* @version 1.0

\* @intro:

\*/

@SpringBootApplication

@EnableDiscoveryClient // 开启服务发现功能

@EnableEurekaClient // 开启Eureka客户端

public class ItemApplication {

public static void main(String[] args) {

SpringApplication.run(ItemApplication.class);

}

@Bean

@LoadBalanced // 负载均衡

public RestTemplate restTemplate() {

return new RestTemplate();

}

}

ItemController:

package com.cloud.item.controller;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.web.bind.annotation.GetMapping;

import org.springframework.web.bind.annotation.PathVariable;

import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.web.bind.annotation.RestController;

import org.springframework.web.client.RestTemplate;

import java.util.Map;

/\*\*

\* @author lscl

\* @version 1.0

\* @intro:

\*/

@RestController

@RequestMapping("/item")

public class ItemController {

@Autowired

private RestTemplate restTemplate;

@GetMapping("/findOrderById/{orderId}")

public Map findOrderById(@PathVariable Integer orderId){

// 使用RestTemplate进行远程调用

Map resultMap = restTemplate.getForObject("http://order-service/order/" + orderId, Map.class);

return resultMap;

}

}

OrderController:

/\*\*

\* @author lscl

\* @version 1.0

\* @intro:

\*/

@RestController

@RequestMapping("/order")

public class OrderController {

@Value("${spring.cloud.client.ip-address}")

private String ip;

@Value("${server.port}")

private String port;

@GetMapping("{id}")

public Map findById(@PathVariable Integer id){

return new HashMap(){{

put("flag",true);

put("message","查询成功"+ip+":"+port);

put("statusCode","200");

put("id",id);

}};

}

}

启动两个Order服务,访问:http://localhost:9001/item/findOrderById/1

多次访问,查看是否有轮询效果;

5.2.2 自定义服务列表

当我们在 RestTemplate上添加 @LoadBalanced 注解后,就可以用服务名称来调用接口了,当有多个服务的时候,还能做负载均衡。这是因为 Eureka 中的服务信息已经被拉取到了客户端本地,关系如下:

有的时候我们希望Ribbon可以跳过Eureka,直接使用IP+端口的方式调用服务,这样的我们就不需要借助Eureka提供的服务名来远程调用了(测试环境用),我们可以自定义服务列表来实现负载均衡;

关闭Ribbon与Eureka的集成:

ribbon:

eureka:

enabled: false # 关闭与Eureka的集成

ribbon-order-service: # 自定义服务名称

ribbon:

listOfServers: localhost:9001,localhost:9002 # 服务的主机列表

注意:默认情况下Ribbon与Eureka的集成为开启状态,在开启状态下,只能使用服务名调用;而在关闭状态下,只能使用IP+端口来调用,如果指定IP+端口的方式来调用,那么必定不能提供负载均衡的功能;如果想使用负载均衡功能,那么必须自定义服务名称,并为该服务配置主机列表;

ItemController:

@GetMapping("/findOrderById/{orderId}")

public Map findOrderById(@PathVariable Integer orderId){

// 使用自定义的服务名称

Map resultMap = restTemplate.getForObject("http://ribbon-order-service/order/" + orderId, Map.class);

return resultMap;

}

OrderController:

package com.cloud.order.controller;

import com.cloud.order.entity.Order;

import org.springframework.beans.factory.annotation.Value;

import org.springframework.web.bind.annotation.\*;

import java.util.HashMap;

import java.util.Map;

/\*\*

\* @author lscl

\* @version 1.0

\* @intro:

\*/

@RestController

@RequestMapping("/order")

public class OrderController {

@Value("${spring.cloud.client.ip-address}")

private String ip;

@Value("${server.port}")

private String port;

@GetMapping("{id}")

public Map findById(@PathVariable Integer id) {

return new HashMap() {{

put("flag", true);

put("message", "查询成功" + ip + ":" + port);

put("statusCode", "200");

put("id", id);

}};

}

}

5.3 Ribbon的配置

5.3.1 Ribbon 的属性配置

Ribbon的所有的默认配置可以去com.netflix.client.config.DefaultClientConfigImpl类下找:

关于Ribbon的所有配置在com.netflix.client.config.CommonClientConfigKey中定义:

5.3.2 Ribbon常用配置

5.3.2.1 连接配置

最后

58fb76d1f.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA57eR5rC06ZW35rWBKno=,size_20,color_FFFFFF,t_70,g_se,x_16)

5.3.2 Ribbon常用配置

5.3.2.1 连接配置

最后

[外链图片转存中…(img-BTVNNqAJ-1714150329807)]

[外链图片转存中…(img-Gf2luBAw-1714150329808)]

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

参考文章

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: