我的编程空间,编程开发者的网络收藏夹
学习永远不晚

SpringCloudNetfilxRibbon负载均衡工具使用方法介绍

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

SpringCloudNetfilxRibbon负载均衡工具使用方法介绍

一、介绍

Spring Cloud Ribbon是一个基于HTTP和TCP的客户端负载均衡工具,它基于Netflix Ribbon实现。通过Spring Cloud的封装,可以让我们轻松地将面向服务的REST模版请求自动转换成客户端负载均衡的服务调用。Spring Cloud Ribbon虽然只是一个工具类框架,它不像服务注册中心、配置中心、API网关那样需要独立部署,但是它几乎存在于每一个Spring Cloud构建的微服务和基础设施中。因为微服务间的调用,API网关的请求转发等内容,实际上都是通过Ribbon来实现的,包括后续我们将要学习的OpenFeign,它也是基于Ribbon实现负载均衡的远程服务调用工具。所以,对Spring Cloud Ribbon的理解和使用,对于我们使用Spring Cloud来构建微服务非常重要.

二、使用

@Service
public class ApplicationClientServiceImpl implements ApplicationClientService {
    
    @Autowired
    private LoadBalancerClient loadBalancerClient;
    @Override
    public String client() {
        ServiceInstance si = loadBalancerClient.choose("application-service");
        // 获取Application Service IP。
        System.out.println(si.getHost());
        // 获取Ip及端口。
        System.out.println(si.getInstanceId());
        // 端口 
        System.out.println(si.getPort());
        // 应用程序名 application-service
        System.out.println(si.getServiceId());
        // URI http://Application Service IP:端口
        System.out.println(si.getUri().toString());
        return null;
    }
}

三、SpringWeb之RestTemplate基于Http协议的远程访问

要想使用RestRemplate必须自己配置

package com.bjsxt.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;
@Configuration
public class MyConfig {
    @Bean
    public RestTemplate restTemplate(){
        return new RestTemplate();
    }
}

(1)控制器

@RestController
public class ServerController {
    @Value("${server.port}")
    private int port;
    
    @RequestMapping("/returnUsers")
    public List<User> returnUsers(int nums){
        List<User> result = new ArrayList<>();
        for(int i = 0; i < nums; i++){
            result.add(new User(100 + i, "姓名-" + i, 20+i));
        }
        return result;
    }
    
    @RequestMapping("/returnList")
    public List<String> returnList(int nums){
        List<String> result = new ArrayList<>();
        for(int i = 0; i < nums; i++){
            result.add("返回结果 - " + i);
        }
        return result;
    }
    
    @RequestMapping("/restfulParams/{name}/{age}")
    public String restfulParams(@PathVariable("name") String name,
                                @PathVariable int age){
        System.out.println("端口号: " + port + ", 任意请求方式,restful参数, name = " +
                name + " ; age = " + age);
        return "restful参数, name = " + name + " ; age = " + age;
    }
    
    @PostMapping("/postBodyParams")
    public String postBodyParams(@RequestBody Map<String, String> params){
        System.out.println("端口号: " + port + " , post请求,有请求体参数, params = " +
                params);
        return "post请求,请求体参数, params = " + params;
    }
    
    @PostMapping("/postWithParams")
    public String postWithParams(String name, int age){
        System.out.println("端口号: " + port + " , post请求,有参数, name = " +
                name + " ; age = " + age);
        return "post请求有参数 : name = " +
                name + " ; age = " + age;
    }
    
    @PostMapping("/postNoParams")
    public String postNoParams(){
        System.out.println("端口号: " + port + " , post请求,没有参数");
        return "post请求,没有参数";
    }
    
    @GetMapping("/getWithParams")
    public String getWithParams(String name, int age){
        System.out.println("端口号: " + port + " 。 get请求,有参数, name = "
                    + name + " ; age = " + age);
        return "get请求,包含参数 : name = " + name + " ; age = " + age;
    }
    
    @GetMapping("/getNoParams")
    public String getNoParams(){
        System.out.println("端口号:" + port + "。 get请求,无参数。");
        return "get请求,无参数。";
    }
}

(2)无参数GET请求-getForObject

    
    @Test
    public void testGetNoParams(){
        // 定义要访问的地址是什么
        String url = baseUrl + "/getNoParams";
        // 发get请求。没有参数
        String result = restTemplate.getForObject(url, String.class);
        System.out.println("服务器返回:" + result);
    }

(3)有参数GET请求-getForObject

    
    @Test
    public void testGetWithParams(){
        String url = baseUrl + "/getWithParams?name={x}&age={y}";
        String result1 =
                restTemplate.getForObject(url, String.class,
                        "张三", "20");
        System.out.println("可变长数组传递参数,服务器返回:" + result1);
        System.out.println("==========================================");
        Map<String, Object> params = new HashMap<>();
        params.put("x", "李四");
        params.put("y", 25);
        String result2 =
                restTemplate.getForObject(url, String.class, params);
        System.out.println("Map集合传递参数,服务器返回:" + result2);
    }

(4)GET请求-getForEntity

    
    @Test
    public void testGetForEntity(){
        String url = baseUrl + "/getNoParams";
        ResponseEntity<String> entity =
                restTemplate.getForEntity(url, String.class);
        HttpHeaders headers = entity.getHeaders();
        for(String headerName : headers.keySet()){
            System.out.println("响应头: " + headerName + " = "
                    + headers.get(headerName));
        }
        System.out.println("响应状态码: " + entity.getStatusCodeValue());
        System.out.println("响应体数据: " + entity.getBody());
    }

(5)无参数POST请求

    
    @Test
    public void testPostNoParams(){
        String url = baseUrl + "/postNoParams";
        String result =
                restTemplate.postForObject(url, null, String.class);
        System.out.println("post请求,无参数,服务器返回:" + result);
    }

(6)post请求路径地址传递参数

    
    @Test
    public void testPostWithParamsPath(){
        String url = baseUrl + "/postWithParams?name={1}&age={2}";
        String result =
                restTemplate.postForObject(url, null, String.class,
                        "王五", 30);
        System.out.println(result);
    }

(7)post请求表单传递参数

    
    @Test
    public void testPostWithParamsForm(){
        String url = baseUrl + "/postWithParams";
        // 创建请求体信息。
        // 请求头, 表单请求。  application/x-www-form-urlencoded
        HttpHeaders headers = new HttpHeaders();
        headers.add("content-type", "application/x-www-form-urlencoded");
        // 表单
        MultiValueMap<String, Object> form =
                new LinkedMultiValueMap<>();
        // add 提供一个 请求参数 名 = 值。
        form.add("name", "尼古拉斯.赵四");
        form.add("age", 40);
        // put 提供 键值对
        //form.put("name", Arrays.asList("尼古拉斯.赵四"));
        //List<Object> ages = new ArrayList<>();
        //ages.add(40);
        //form.put("age", ages);
        HttpEntity<MultiValueMap<String, Object>> entity = new HttpEntity<>(form, headers);
        String result =
                restTemplate.postForObject(url, entity, String.class);
        System.out.println(result);
    }

(8)post请求请求体传递参数

    
    @Test
    public void testPostBodyParams(){
        String url = baseUrl + "/postBodyParams";
        // 创建请求参数, 使用JSON格式的字符串,描述一个Map集合。
        String params = "{\"key1\":\"value1\", \"key2\":\"value2\"}";
        // 创建请求时,使用的请求体描述
        HttpHeaders headers = new HttpHeaders();
        headers.add("content-type", "application/json;charset=utf-8");
        HttpEntity<String> entity = new HttpEntity<>(params, headers);
        String result = restTemplate.postForObject(url, entity, String.class);
        System.out.println("返回结果:" + result);
    }
    @Test
    public void testPostBodyParams2(){
        // 可以使用简单的处理方案,实现请求体传递JSON格式的数据
        // 使用postForObject(),第二个参数,直接传递一个Java对象,作为请求体中传递的参数。
        // 参数没有名字,由RestTemplate做数据转换,默认使用JSON格式字符串做转换结果。
        String url = baseUrl + "/postBodyParams";
        // 创建Map类型的参数对象
        Map<String, String> params = new HashMap<>();
        params.put("name", "测试");
        params.put("gender", "男");
        // 请求服务器。 直接传递java对象,默认请求头content-type=application/json;charset=utf-8
        String result = restTemplate.postForObject(url, params, String.class);
        System.out.println("返回结果:" + result);
    }

(9)RestFUL传递参数

    
    @Test
    public void testRestfulParams(){
        String url = baseUrl + "/restfulParams/{name}/{age}";
        // 访问
        String result = restTemplate.getForObject(url, String.class, "restful", "15");
        System.out.println(result);
    }

(10)Exchange通用处理方案(处理相对复杂的结果类型例如自定义类型数组)

    
    @Test
    public void testExchangeMethod(){
        String url = baseUrl + "/returnList?nums={1}";
        // 相对复杂的返回结果类型描述对象
        url = baseUrl + "/returnUsers?nums={1}";
        ParameterizedTypeReference<List<User>> type =
                new ParameterizedTypeReference<List<User>>() {};
        // 访问远程
        ResponseEntity<List<User>> entity =
                restTemplate.exchange(url, HttpMethod.GET, null, type, 3);
        List<User> body = entity.getBody();
        System.out.println(body);
    }

四、调用Application Service集群

基于RestTemplate和Ribbon实现Application Client调用Application Service集群

(1)编写配置类

@Configuration
public class AppClientConfiguration {
    
    @Bean
    @LoadBalanced
    public RestTemplate restTemplate(){
        return new RestTemplate();
    }
}

(2)发起远程调用

@Service
public class ApplicationClientServiceImpl implements ApplicationClientService {
    @Autowired
    private RestTemplate restTemplate;
    //http://服务名
    private final String baseUrl = "http://eureka-client-app-service";
    @Override
    public String getNoParams() {
        String url = baseUrl + "/getNoParams";
        // 访问
        String result = restTemplate.getForObject(url, String.class);
        System.out.println(result);
        return result;
    }
}

五、Ribbon负载均衡算法

Ribbon的负载均衡策略是通过不同的类型来实现的(都是IRule接口的实现),下表详细介绍一些常用负载均衡策略及对应的Ribbon策略类。

编号策略名称策略对应的类名实现原理
1轮询策略(默认)RoundRobinRule轮询策略表示每次都按照顺序取下一个application service,比如一共有5个application service,第1次取第1个,第2次取第2个,第3次取第3个,以此类推
2权重轮询策略(常用,中小型项目使用)WeightedResponseTimeRule1.根据每个application service的响应时间分配一个权重,响应时间越长,权重越小,被选中的可能性越低。 2.原理:一开始为轮询策略,并开启一个计时器,每30秒收集一次每个application service的平均响应时间,当信息足够时,给每个application service附上一个权重,并按权重随机选择application service,权重越高的application service会被高概率选中。
3随机策略(不推荐,测试使用,开发使用)RandomRule从application service列表中随机选择一个
4最少并发数策略(应用在硬件软件环境一致的情况下,中小型项目使用)BestAvailableRule选择正在请求中的并发数最小的application service,除非这个application service在熔断中。
5重试策略。在“选定的负载均衡策略”基础上进行重试机制RetryRule1.“选定的负载均衡策略”这个策略是轮询策略RoundRobinRule 2.该重试策略先设定一个阈值时间段,如果在这个阈值时间段内当选择application service不成功,则一直尝试采用“选定的负载均衡策略:轮询策略”最后选择一个可用的application service
6可用性敏感策略(一般在同区域内服务集群环境中使用)AvailabilityFilteringRule过滤性能差的application service,有2种: 第一种:过滤掉在eureka中处于一直连接失败application service 第二种:过滤掉高并发的application service
7区域敏感性策略(应用在大型的,物理隔离分布式环境中)ZoneAvoidanceRule1.以一个区域为单位考察可用性,对于不可用的区域整个丢弃,从剩下区域中选可用的application service 2.如果这个ip区域内有一个或多个实例不可达或响应变慢,都会降低该ip区域内其他ip被选中的权重。

指定负载均衡策略,新增Bean对象管理方法

    @Bean
    public IRule iRule(){
        return new RandomRule();
    }

到此这篇关于SpringCloud Netfilx Ribbon负载均衡工具使用方法介绍的文章就介绍到这了,更多相关SpringCloud Netfilx Ribbon内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

SpringCloudNetfilxRibbon负载均衡工具使用方法介绍

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

SpringCloudNetfilxRibbon负载均衡工具使用方法介绍

Ribbon是Netflix的组件之一,负责注册中心的负载均衡,有助于控制HTTP和TCP客户端行为。SpringCloudNetflixRibbon一般配合Ribbon进行使用,利用在Eureka中读取的服务信息,在调用服务节点时合理进行负载
2022-12-12

SpringCloudRibbon负载均衡工具使用

Ribbon是Netflix的组件之一,负责注册中心的负载均衡,有助于控制HTTP和TCP客户端行为。Spring Cloud Netflix Ribbon一般配合Ribbon进行使用,利用在Eureka中读取的服务信息,在调用服务节点时合理进行负载
2023-02-06

负载均衡的原理及使用方法是什么

负载均衡是一种用于分配网络请求负载的技术,它通过将网络请求分配给多个后端服务器来提高系统的性能、可靠性和可扩展性。负载均衡的原理是基于以下几个方面:1. 请求调度:负载均衡器接收到来自客户端的请求后,会根据一定的算法(如轮询、最小连接数、最
2023-09-01

HDFS Balancer负载均衡器及语法怎么使用

这篇文章主要介绍了HDFS Balancer负载均衡器及语法怎么使用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇HDFS Balancer负载均衡器及语法怎么使用文章都会有所收获,下面我们一起来看看吧。1、背
2023-07-05

LVS负载均衡(LVS简介、三种工作模式、十种调度算法)

LVS(Linux Virtual Server)是一个高性能、可扩展的负载均衡器,用于分发网络流量到多个服务器上,提高系统的可用性、可靠性和性能。LVS有三种工作模式:NAT模式、DR模式和TUN模式。1. NAT模式:在这种模式下,LV
2023-09-20

利用负载均衡提升PHP接口性能的方法(如何通过负载均衡优化PHP接口性能?)

利用负载均衡可提升PHP接口性能,解决单点故障、性能瓶颈和可伸缩性问题。有硬件、软件和云负载均衡器可供选择,使用轮询、最少连接等策略分配请求。实施负载均衡涉及选择、配置、部署、更新DNS记录和监控等步骤。最佳实践包括健康检查、权重调整、定期审查和考虑冗余。通过负载均衡,PHP接口可以实现更高的性能、可用性和可伸缩性。
利用负载均衡提升PHP接口性能的方法(如何通过负载均衡优化PHP接口性能?)
2024-04-02

怎么使用Java实现常见的负载均衡算法

负载均衡算法在Java中的实现负载均衡算法平衡服务器请求,提高性能和可用性。以下是Java实现的常见算法:轮询:顺序分配请求。随机:随机分配请求。加权轮询:根据服务器容量分配请求。最小连接:分配给连接数最少的服务器。哈希:基于请求键分配请求。基于权重的哈希:考虑服务器权重分配请求。代码示例提供了每个算法的Java实现。根据应用程序需求选择合适的算法,如简单应用程序使用轮询,并发请求使用加权轮询或哈希。
怎么使用Java实现常见的负载均衡算法
2024-04-13

怎么使用Java实现常见的负载均衡算法

在Java中实现常见的负载均衡算法,可以使用以下几种方法:轮询算法(Round Robin):实现一个列表来存储服务器节点,并使用一个计数器来记录当前选取的节点位置。每次请求到来时,通过计数器选择下一个节点,并更新计数器位置。这样可以实现简
怎么使用Java实现常见的负载均衡算法
2024-04-09

在 Linux 上用 DNS 实现简单的负载均衡的方法

DNS 轮询将多个服务器映射到同一个主机名,并没有为这里展示的魔法做更多的工作。 如果你的后端服务器是由多台服务器构成的,比如集群化或者镜像的 Web 或者文件服务器,通过负载均衡器提供了单一的入口点。业务繁忙的
2022-06-04

服务器租用实现负载均衡的方法是什么

实现负载均衡的方法有很多种,以下是一些常见的方法:软件负载均衡器:使用软件负载均衡器如Nginx、HAProxy等,通过配置负载均衡算法和策略,将请求分发给多台服务器。硬件负载均衡器:使用专门的硬件设备如F5、Citrix等进行负载均衡,这
服务器租用实现负载均衡的方法是什么
2024-04-24

PHP 应用程序性能优化中的负载均衡方法

负载均衡方法:轮询:将流量按顺序分配给服务器列表中的服务器。加权轮询:根据服务器处理能力分配权重,均衡流量分配。dns 轮询:利用 dns 将域名解析为多个 ip,客户端随机选择 ip 访问。硬件负载均衡器:专用设备提供高级负载均衡功能,性
PHP 应用程序性能优化中的负载均衡方法
2024-05-04

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录