SpringCloud整合Ribbon负载均衡器

目录

一、模块一:提供数据

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Stable Diffusion学习线路,提示词及资源分享

1. 提示词的基础概念 提示词分为正面提示词&#xff08;Prompts&#xff09;和反面提示词&#xff08;Negative Prompts&#xff09;。正面提示词代表你希望画面中出现的内容&#xff0c;而反面提示词代表你不希望画面中出现的内容。提示词通常是以英文书写&#xff0c;最小单…

新版本Qt Creator安装配置

新版本Qt Creator安装配置 文章目录 新版本Qt Creator安装配置1、前言2、环境3、安装配置4、总结 更多精彩内容&#x1f449;个人内容分类汇总 &#x1f448;&#x1f449;Qt开发经验 &#x1f448; 1、前言 Qt是一个跨平台的C应用程序开发框架&#xff0c;而Qt Creator是专为Q…

树,二叉树的基本概念介绍,二叉树的性质

目录 树 树的定义 树的相关概念 树的存储结构 树在实际中的运用&#xff08;表示文件系统的目录树结构 &#xff09; 二叉树 二叉树的定义 现实中的二叉树 二叉树的特点 特殊的二叉树 1.斜树 2.满二叉树 3.完全二叉树 二叉树的性质 性质1&#xff1a;二叉树的第…

数字旅游引领智慧化浪潮:科技创新重塑旅游体验,智慧服务打造旅游新高度

在科技飞速发展的今天&#xff0c;数字旅游正以其独特的魅力引领着智慧化浪潮&#xff0c;深刻改变着旅游行业的面貌。数字技术的广泛应用&#xff0c;不仅为旅游行业注入了新的活力&#xff0c;也极大地提升了旅游体验的品质。科技创新与智慧服务的融合&#xff0c;正推动着旅…

大厂面试题:两道来自京东的关于MyBatis执行器的面试题

大家好&#xff0c;我是王有志。 今天给大家带来两道来自于京东关于的 MyBatis 面试题&#xff1a; MyBatis 提供了哪些执行器&#xff08;Executor&#xff09;&#xff1f;它们有什么区别&#xff1f;Mybatis 中如何指定 Executor 的类型&#xff1f; MyBatis 提供了哪些执…

【VBA】获取指定目录下的Excel文件,并合并所有excel中的内容。

1.新建一个excel表格。并创建两个Sheet&#xff0c;名字分别命名为FileList 和 All information。 2.按ALTF11进入 VBA编程模块&#xff0c;插入模块。 3.将如下 第五部分代码复制到模块中。 点击运行即可&#xff0c;然后就能提取指定目录下的所有excel文件信息并合并到一起…

plsql 新建sql窗口 初始化慢的问题

问题描述&#xff1a; 新建sql窗口当sql语句多的情况下初始化很慢。 解决方法&#xff1a; 采用导入表的方式。 具体方式 工具->导入表->sql插入。 使用命令窗口 导入文件&#xff0c;然后点击导入按钮。

2024第十五届蓝桥杯网络安全赛项WriteUp

欢迎关注公众号【Real返璞归真】回复【蓝桥杯2024】获取完整题目附件。 排名 安全知识 错1个选择题&#xff0c;题目说的不清楚&#xff0c;没搞懂题意。肯定不能用eval。错了理论题有点遗憾。 没想到这题前端是要解析json数据&#xff0c;排除CD选了A&#xff0c;结果发现正…

【Hadoop】-HDFS的存储原理[4]

目录 前言 一、fsck命令 1、HDFS副本块数量的配置 2、fsck命令查看文件的副本数 3、block配置 二、NameNode元数据 1、edits文件 2、fsigame文件 3、NameNode元数据管理维护 4、元数据合并控制参数 5、SecondaryNameNode的作用 三、HDFS数据的读写流程 1、数据写入…

软考之零碎片段记录(二十六)+复习巩固(十一、十二)

学习 1. 有向图邻接表中有奇数个表节点。无向图邻接表有偶数个 2. OSI模型 物理层->数据链路->网络->应用… 3. 无痕浏览 会被保存。下载的文件不会保存。浏览记录。Cookie和网站数据。表单中填写的信息。 4. 邮件收发协议 FTP不属于邮件收发协议 SMTP。简单邮…

python中如何用matplotlib写饼图

#代码 import matplotlib.pyplot as plt# 设置绘图的主题风格 plt.style.use(ggplot) # 中文乱码和坐标轴负号的处理 plt.rcParams[font.sans-serif][SimHei] plt.rcParams[axes.unicode_minus]False plt.rcParams[figure.figsize][10,8] # 构造数据 x [0.2515,0.3724,0.3336…

深入理解操作系统与计算机体系结构

文章目录 操作系统(Operator System)为什么要有操作系统操作系统是如何进行管理的为什么说操作系统是安全&#xff0c;稳定&#xff0c;高效的理解系统调用和库函数 操作系统(Operator System) 概念&#xff1a; 操作系统&#xff08;Operating System&#xff0c;简称OS&…

python自动化登录(测试篇)

起初是想抓取下请求看能不能做模拟登录。无奈发现&#xff0c;目标网站的请求数据是加密过的&#xff0c;而且网站代码也是编译后的代码。要从编译后的代码中提取加密算法。我的第一想法是明知不可为而不为。但是转念一想&#xff0c;何不试试python大法。 1.前期准备 python我…

WIFI加密方式对无线速率的影响

文章目录 无线加密三种选择&#xff1a;WEP、WPA和WPA2测试平台和测试方法非加密和WEP加密测试 结果差别巨大非加密条件下 300M无线路由实测WEP加密条件下 300M无线路由实测 TKIP加密算法&#xff1a;WPA与WPA2成绩低迷WPA加密&#xff08;TKIP加密算法&#xff09;条件下 300M…

万兆以太网MAC设计(6)IP协议报文格式详解以及IP层模块设计

文章目录 前言&#xff1a;IPv4报文协议格式二、IP_RX模块设计2.1、模块接口2.2、模块工作过程 三、IP_TX模块设计3.1、模块接口3.2、模块工作过程 四、仿真4.1、发送端4.2、接受端 前言&#xff1a;IPv4报文协议格式 参考&#xff1a;https://sunyunqiang.com/blog/ipv4_prot…

CLIP论文笔记:Learning Transferable Visual Models From Natural Language Supervision

导语 会议&#xff1a;ICML 2021链接&#xff1a;https://proceedings.mlr.press/v139/radford21a/radford21a.pdf 当前的计算机视觉系统通常只能识别预先设定的对象类别&#xff0c;这限制了它们的广泛应用。为了突破这一局限&#xff0c;本文探索了一种新的学习方法&#x…

[ESP32]:TFLite Micro推理CIFAR10模型

[ESP32]&#xff1a;TFLite Micro推理CIFAR10模型 模型训练 数据集处理 from keras.datasets import cifar10 from keras.preprocessing.image import ImageDataGenerator from keras.models import Sequential, load_model, Model from keras.layers import Input, Dense, …

SSH新功能揭秘:远程工作提升指南【AI写作】

首先&#xff0c;这篇文章是基于笔尖AI写作进行文章创作的&#xff0c;喜欢的宝子&#xff0c;也可以去体验下&#xff0c;解放双手&#xff0c;上班直接摸鱼~ 按照惯例&#xff0c;先介绍下这款笔尖AI写作&#xff0c;宝子也可以直接下滑跳过看正文~ 笔尖Ai写作&#xff1a;…

【快速入门 LVGL】-- 5、Gui Guider界面移植到STM32工程

上篇&#xff0c;我们已学习&#xff1a;【快速入门 LVGL】-- 4、显示中文 工程中添加了两个按钮作示范。运行效果如图&#xff1a; 本篇&#xff1a;把Gui Guider设计好的界面&#xff0c;移植到STM32工程。 特别地&#xff1a; 在使用Gui Guider进行界面设计时&#xff0c;应…

浅谈叉车车载电脑的市场现状

叉车的起源 叉车源于美国&#xff0c;兴于日本&#xff0c;虽然中国起步较晚&#xff0c;但是近些年来发展迅速。叉车又称叉式装载车&#xff0c;是对于成件托盘类货物进行装卸、堆垛和短距离运输&#xff0c;实现重物搬运作业的轮式工业车辆。 叉车的分类 叉车分为以上六大类…