SpringCloud整合Ribbon负载均衡器

news2024/11/20 20:29:47

目录

一、模块一:提供数据

1.1 首先将第一个实例打包

1.2 使用命令行设置不同权重

1.3 打开图形化界面看看权重是否配置成功。

二、模块二:调用模块一

 三、修改默认负载均衡策略

 四、自定义规则

​编辑 五、完整代码

5.1 目录结构

5.2 配置文件

5.3 RestTemplateConfig.java

5.4 MyRule.java

5.5 RibbonConfig.java

5.6 GetStudentController.java

六、完整代码


一、模块一:提供数据

1.1 首先将第一个实例打包

1.2 使用命令行设置不同权重

先设置权重,再设置-jar,另外模块一的配置文件不要填权重配置,配了再用命令行不生效。

java -Dspring.cloud.nacos.discovery.weight=5 -jar --server.port=8081
Unrecognized option: --server.port=8081

同理 再开一个设置权重为2

java -Dspring.cloud.nacos.discovery.weight=2 -jar nacos-nacos-discovery1-0.0.1-SNAPSHOT.jar --server.port=8082

1.3 打开图形化界面看看权重是否配置成功。

二、模块二:调用模块一

其中为了方便,我用的上次代码 age代表权重。

 再次点击

可以看出默认采用轮播的形式

 三、修改默认负载均衡策略

/**
 * 修改默认负载均衡策略
 */

@Configuration
public class RibbonConfig {

    @Bean
    public IRule rule(){
        /** 生成随机策略**/
        return new RandomRule();
    }

}

 再次访问模块一后 随机访问

采用nacos策略,会根据权重占比,来负载均衡

 四、自定义规则

1.1 MyRule.java

package com.beiyou.config;

import com.alibaba.cloud.nacos.NacosDiscoveryProperties;
import com.alibaba.nacos.api.naming.NamingService;
import com.alibaba.nacos.api.naming.pojo.Instance;
import com.netflix.client.config.IClientConfig;
import com.netflix.loadbalancer.AbstractLoadBalancerRule;
import com.netflix.loadbalancer.BaseLoadBalancer;
import com.netflix.loadbalancer.Server;
import lombok.SneakyThrows;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;

import java.util.Comparator;
import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;

public class MyRule extends AbstractLoadBalancerRule {

    @Autowired
    private NacosDiscoveryProperties nacosDiscoveryProperties;

    //JUC包下,线程安装的Integer
    private static AtomicInteger count = new AtomicInteger(0);
    private Server server = null;
    @Override
    @SneakyThrows
    public Server choose(Object key) {
        BaseLoadBalancer loadBalancer = (BaseLoadBalancer) this.getLoadBalancer();
        //获取服务名称
        String serverName = loadBalancer.getName();
        NamingService namingService = nacosDiscoveryProperties.namingServiceInstance();
        List<Instance> allInstances = namingService.getAllInstances(serverName, true);

        //6062
        Instance maxInstance = allInstances.stream().max(Comparator.comparing(Instance::getWeight)).get();
        //6061
        Instance minInstance = allInstances.stream().min(Comparator.comparing(Instance::getWeight)).get();

        int count2 = count.addAndGet(1);
        System.out.println(count2);
        int mod = count2 % 5; //取模运算  5,10,15,20,25 ...
        if(mod == 0){  //当次数是5的倍数的时候,mod就是0,
            server = new Server(minInstance.getIp(),minInstance.getPort());
        } else  {
            //mod 是 1,2,3,4 的时候打到权重高的这个机器上
            server = new Server(maxInstance.getIp(),maxInstance.getPort());
        }
        return server;
    }


    @Override
    public void initWithNiwsConfig(IClientConfig iClientConfig) {

    }
}

返回自定义的规则

我们自定义的规则是含能除尽5就负载到权重为2的机器,否则负载到权重为5的机器。

① 使用自己的规则(两种配置方式)

 使用注解配置

@Configuration

@RibbonClients(defaultConfiguration = MyRule.class) //全局设置负载规则,默认是轮询的
@RibbonClient(name = "nacos-a", configuration = MyRule.class) //针对某个服务,特殊配置
public class RibbonConfig {

    /**
     * 全局配置
     * 指定负载均衡策略

     */
    @Bean
    public IRule iRule() {        //使用自己的规则        return  new MyRule();
    }}

Java

 基于配置文件配置,调用指定微服务提供的服务时,使用对应的负载均衡算法


#配置具体某一个服务个性化规则
nacos-b.ribbon.NFLoadBalancerRuleClassName=com.beiyou.config.MyRule

##配置全局的负载均衡规则 (不生效)
default.ribbon.NFLoadBalancerRuleClassName=com.netflix.loadbalancer.RoundRobinRule

Erlang

如果同时应用了以上两种方式去配置负载均衡,注解的优先级更高,则以注解为准.

因为配置文件的加载顺序在注解之前,后加载的配置会覆盖先前配置。

推荐使用配置文件,可以放进nacos,比较灵活。

 五、完整代码

5.1 目录结构

5.2 配置文件


spring.application.name = d3
server.port = 8085


spring.cloud.nacos.discovery.server-addr = 192.168.11.82:8848


logging.level.root = error
logging.level.com.beiyou = debug

5.3 RestTemplateConfig.java


package com.beiyou.config;


import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;

/**
 *  使用RestTemplate进行服务调用
 */

@Configuration
public class RestTemplateConfig {

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

}

5.4 MyRule.java

package com.beiyou.config;

import com.alibaba.cloud.nacos.NacosDiscoveryProperties;
import com.alibaba.nacos.api.naming.NamingService;
import com.alibaba.nacos.api.naming.pojo.Instance;
import com.netflix.client.config.IClientConfig;
import com.netflix.loadbalancer.AbstractLoadBalancerRule;
import com.netflix.loadbalancer.BaseLoadBalancer;
import com.netflix.loadbalancer.Server;
import lombok.SneakyThrows;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;

import java.util.Comparator;
import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;

public class MyRule extends AbstractLoadBalancerRule {

    @Autowired
    private NacosDiscoveryProperties nacosDiscoveryProperties;

    //JUC包下,线程安装的Integer
    private static AtomicInteger count = new AtomicInteger(0);
    private Server server = null;
    @Override
    @SneakyThrows
    public Server choose(Object key) {
        BaseLoadBalancer loadBalancer = (BaseLoadBalancer) this.getLoadBalancer();
        //获取服务名称
        String serverName = loadBalancer.getName();
        NamingService namingService = nacosDiscoveryProperties.namingServiceInstance();
        List<Instance> allInstances = namingService.getAllInstances(serverName, true);

        //6062
        Instance maxInstance = allInstances.stream().max(Comparator.comparing(Instance::getWeight)).get();
        //6061
        Instance minInstance = allInstances.stream().min(Comparator.comparing(Instance::getWeight)).get();

        int count2 = count.addAndGet(1);
        System.out.println(count2);
        int mod = count2 % 5; //取模运算  5,10,15,20,25 ...
        if(mod == 0){  //当次数是5的倍数的时候,mod就是0,
            server = new Server(minInstance.getIp(),minInstance.getPort());
        } else  {
            //mod 是 1,2,3,4 的时候打到权重高的这个机器上
            server = new Server(maxInstance.getIp(),maxInstance.getPort());
        }
        return server;
    }


    @Override
    public void initWithNiwsConfig(IClientConfig iClientConfig) {

    }
}

5.5 RibbonConfig.java


package com.beiyou.config;

import com.alibaba.cloud.nacos.ribbon.NacosRule;
import com.netflix.loadbalancer.IRule;
import com.netflix.loadbalancer.RandomRule;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * 修改默认负载均衡策略
 */

@Configuration
public class RibbonConfig {

    @Bean
    public IRule rule(){
        /** 生成随机策略**/
        return new MyRule();
    }

}

5.6 GetStudentController.java


package com.beiyou.controller;


import com.beiyou.model.Student;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

import java.util.List;


@RestController
@RefreshScope
public class GetStudentController {
    /**
     * 用B应用调用A应用
     */
    @Autowired
    RestTemplate restTemplate;

    @GetMapping("/api/b")
    public List<Student> getAllStudents() {

        List listStudents = restTemplate.getForObject("http://d1/api/d1", List.class);

        return listStudents;
    }

}

六、完整代码

云效完整代码

https://codeup.aliyun.com/62858d45487c500c27f5aab5/spring-cloud-alibaba-root.git

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1628944.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Pytorch】(十三)模型部署: TorchScript

文章目录 &#xff08;十三&#xff09;模型部署: TorchScriptPytorch动态图的优缺点TorchScriptPytorch模型转换为TorchScripttorch.jit.tracetorch.jit.scripttrace和script的区别总结trace 和script 混合使用保存和加载模型 &#xff08;十三&#xff09;模型部署: TorchScr…

Ubuntu解密:Root账户登录问题一网打尽

欢迎来到我的博客&#xff0c;代码的世界里&#xff0c;每一行都是一个故事 Ubuntu解密&#xff1a;Root账户登录问题一网打尽 前言Root用户简介Root账户无法登录的原因重设Root账户密码解决ssh不能root登录问题安全性考虑 前言 Ubuntu作为广受欢迎的Linux发行版&#xff0c;对…

[Android]引导页

使用Kotlin Jetpack Compose创建一个左右滑动的引导页, 效果如图. 1.添加依赖项 androidx.compose.ui最新版本查询:https://maven.google.com/web/index.html com.google.accompanist:accompanist-pager最新版本查询:https://central.sonatype.com/ 确保在 build.gradle (M…

C++|继承(菱形+虚拟)

目录 一、继承的概念及定义 1.1概念 1.2定义 1.2.1定义格式 1.2.2继承关系和访问限定符 1.2.3继承基类成员访问方式的变化 二、基类和派生类对象赋值转换 三、继承中的作用域 四、派生类的默认成员函数 五、继承与友元、静态成员 六、菱形继承与虚拟继承 6.1单继承与…

Redis - Set 集合

目录 前言 命令 SADD 将一个或者多个元素添加到 set 中 语法 SMEMBERS 获取一个 set 中的所有元素 语法 SISMEMBER 判断⼀个元素在不在 set 中 语法 SCARD 获取 set 中的元素个数 语法 SPOP 从 set 中随机删除并返回⼀个或者多个元素 语法 SMOME 将⼀个元素从源 se…

电脑教程1

一、介绍几个桌面上面的软件 1、火绒&#xff1a;主要用于电脑的安全防护和广告拦截 1.1 广告拦截 1.打开火绒软件点击安全工具 点击弹窗拦截 点击截图拦截 拦截具体的小广告 2、向日葵远程控制&#xff1a;可以通过这个软件进行远程协助 可以自己去了解下 这个软件不要…

每日算法之两两交换链表中的节点

题目描述 给你一个链表&#xff0c;两两交换其中相邻的节点&#xff0c;并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题&#xff08;即&#xff0c;只能进行节点交换&#xff09;。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4] 输出&…

Apollo 7周年大会自动驾驶生态利剑出鞘

前言 4月22日&#xff0c;百度Apollo在北京车展前夕举办了以“破晓•拥抱智变时刻”为主题的智能汽车产品发布会&#xff0c;围绕汽车智能化&#xff0c;发布了智驾、智舱、智图等全新升级的“驾舱图”系列产品。 1、7周年大会 自2013年百度开始布局自动驾驶&#xff0c;201…

Kotlin基础​​

数据类型 定义变量 var表示定义变量&#xff0c;可以自动推导变量类型&#xff0c;所以Int可以不用写。 定义常量 条件语句 if表达式可以返回值&#xff0c;该值一般写在if里的最后一行 类似switch的用法 区间 循环 a是标签&#xff0c;可以直接break到标签的位置&#xf…

Docker 的数据管理 端口映射 容器互联 镜像创建

一 Docker 的数据管理 1 管理 Docker 容器中数据主要有两种方式&#xff1a; 数据卷&#xff08;Data Volumes&#xff09; 数据卷容器&#xff08;DataVolumes Containers&#xff09;。 1.1 数据卷 数据卷是一个供容器使用的特殊目录&#xff0c;位于容器中。可将宿主机…

【PLC学习十四】TIA.V18无法启动仿真的问题

【PLC学习十四】TIA.V18无法启动仿真的问题 文章目录 【PLC学习十四】TIA.V18无法启动仿真的问题前言一、程序仿真出现的问题二、解决方法1.无法仿真的问题2.因安全问题&#xff0c;无法编译的问题3、在TIA V18内部设置完成PG/PC接口后&#xff0c;下一次打开仍然不能仿真&…

【Vue3+Tres 三维开发】01-HelloWord

预览 什么是TRESJS 简单的说,就是基于THREEJS封装的能在vue3中使用的一个组件,可以像使用组件的方式去创建场景和模型。优势就是可以快速创建场景和要素的添加,并且能很明确知道创景中的要素构成和结构。 项目创建 npx create-vite@latest # 选择 vue typescript安装依赖…

【Linux 进程间通信】管道

文章目录 1.为什么操作系统需要向用户提供进程间通信方式&#xff1f;2.进程间通信的种类3.管道3.1管道的作用3.2管道的本质3.3管道的通信原理3.4管道的分类 1.为什么操作系统需要向用户提供进程间通信方式&#xff1f; ①&#x1f34e;资源共享&#xff1a;有的时候两个进程需…

QT——简易计算器(从0开始)

目录 一、题目描述&#xff1a; 二、创建工程&#xff1a; 1. ​编辑 2. 3. 4. 默认 5. 6. 7. 8. 默认 9. 创建完成 三、UI界面设计&#xff1a; 1. 添加按钮 1. 2. 按钮界面 3. 按钮绑定快捷键 2. 文本框添加 1. 文本框字体 2. 默认文本 3. 文本对齐方式…

英智数字孪生机器人解决方案,赋能仓库物流模式全面升级

工业机械臂、仓储机器人、物流机器人等模式的机器人系统在现代产业中扮演着愈发重要的角色&#xff0c;他们的发展推动了自动化和智能化水平的提高&#xff0c;有助于为制造业、物流业、医疗保健业和服务业等行业创造新效率并提升人们的生活质量。 行业面临的挑战 机器人开发、…

为何要与云产商进行云端防护合作,上云企业如何保障云端安全

随着大数据、云计算等信息技术的迅猛发展&#xff0c;企业为了降低成本、提高效率&#xff0c;纷纷将业务迁移至云端。 随着大数据、云计算等信息技术的迅猛发展&#xff0c;企业为了降低成本、提高效率&#xff0c;纷纷将业务迁移至云端。这一全面的上云浪潮对传统的安全企业格…

YOLOv8+PyQt5野外火焰检测系统(可以从图像、视频和摄像头三种路径检测)

1.效果视频&#xff1a;https://www.bilibili.com/video/BV1Tm421s7te/?spm_id_from333.999.0.0 2.资源包含可视化的野外火焰检测系统&#xff0c;可用于火灾预警或火灾救援&#xff0c;该系统可自动检测和识别图片或视频当中出现的火焰&#xff0c;以及自动开启摄像头&#…

使用Windows GDI进行绘图

使用Windows GDI绘图&#xff0c;可以使用MFC&#xff0c;也可以直接使用Windows API绘图&#xff0c;两者其实都一样。MFC也是封装了Windows API。 下面以MFC为例&#xff0c;进行说明。因为MFC帮我们做好了一些底层&#xff0c;可以直接使用Windows GDI的函数。 在MFC中使用…

如此建立网络根文件系统 Mount NFS RootFS

安静NFS系统服务 sudo apt-get install nfs-kernel-server 创建目录 sudo mkdir /rootfsLee 将buildroot编译的根文件系统解压缩到 sudo tar xvf rootfs.tar -C /rootfsLee/ 添加文件NFS访问路径 sudo vi /etc/exports sudo /etc/exports文件&#xff0c;添加如下一行 …

SecureCRT中添加命令显示为空如何处理?(原因添加了空行)

相关背景信息 配置相关路径:~/Library/Application\ Support/VanDyke/SecureCRT/Config包括的配置信息 按钮、命令、全局配置、色彩、以及license都在$ ls ButtonBarV4.ini Commands Global.ini SSH2.ini Button…