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 {@Beanpublic 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 {@Autowiredprivate NacosDiscoveryProperties nacosDiscoveryProperties;//JUC包下,线程安装的Integerprivate static AtomicInteger count = new AtomicInteger(0);private Server server = null;@Override@SneakyThrowspublic Server choose(Object key) {BaseLoadBalancer loadBalancer = (BaseLoadBalancer) this.getLoadBalancer();//获取服务名称String serverName = loadBalancer.getName();NamingService namingService = nacosDiscoveryProperties.namingServiceInstance();List<Instance> allInstances = namingService.getAllInstances(serverName, true);//6062Instance maxInstance = allInstances.stream().max(Comparator.comparing(Instance::getWeight)).get();//6061Instance 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;}@Overridepublic void initWithNiwsConfig(IClientConfig iClientConfig) {}
}

返回自定义的规则

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

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

 使用注解配置

@Configuration@RibbonClients(defaultConfiguration = MyRule.class) //全局设置负载规则,默认是轮询的
@RibbonClient(name = "nacos-a", configuration = MyRule.class) //针对某个服务,特殊配置
public class RibbonConfig {/*** 全局配置* 指定负载均衡策略*/@Beanpublic 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 = 8085spring.cloud.nacos.discovery.server-addr = 192.168.11.82:8848logging.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@LoadBalancedpublic 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 {@Autowiredprivate NacosDiscoveryProperties nacosDiscoveryProperties;//JUC包下,线程安装的Integerprivate static AtomicInteger count = new AtomicInteger(0);private Server server = null;@Override@SneakyThrowspublic Server choose(Object key) {BaseLoadBalancer loadBalancer = (BaseLoadBalancer) this.getLoadBalancer();//获取服务名称String serverName = loadBalancer.getName();NamingService namingService = nacosDiscoveryProperties.namingServiceInstance();List<Instance> allInstances = namingService.getAllInstances(serverName, true);//6062Instance maxInstance = allInstances.stream().max(Comparator.comparing(Instance::getWeight)).get();//6061Instance 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;}@Overridepublic 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 {@Beanpublic 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应用*/@AutowiredRestTemplate 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.mzph.cn/pingmian/2574.shtml

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

相关文章

网络中其他协议

目录 DNS协议 域名简介 ICMP协议 ICMP功能 ICMP协议格式 ping命令 NAT技术 NATP NAT技术的限制 代理服务器 DNS协议 DNS&#xff08;Domain Name System&#xff0c;域名系统&#xff09;协议&#xff0c;是一个用来将域名转化为IP地址的应用层协议。 为什么有这个协…

“数据中心的秘密武器:ADOP AOC和DAC线缆的选择与优势”

&#x1f335;【DAC电缆和AOC电缆因其低延迟、低功耗和低成本而广泛应用于数据中心的高性能计算网络布线系统。DAC 电缆和 AOC 电缆有多种配置&#xff0c;以满足网络要求。每款产品均提供 10G SFP、25G SFP28、40G QSFP 和 100G QSFP28 数据速率&#xff0c;并提供从 40G 到 4…

python基础--流程控制之条件语句

目标 条件语句作用if语法if…else…多重判断if嵌套 一. 了解条件语句 假设一个场景&#xff1a; 同学们这个年龄去过网吧吗&#xff1f;去网吧进门想要上网必须做的一件事是做什么&#xff1f;&#xff08;考虑重点&#xff09;为什么要把身份证给工作人员&#xff1f;是不…

如何培养单元测试的习惯?怎样才算一个好的单元测试?

你是怎么编写单元测试的呢&#xff1f;很多人的做法是先把所有的功能代码都写完&#xff0c;然后&#xff0c;再针对写好的代码一点一点地补写测试。 在这种编写测试的做法中&#xff0c;单元测试扮演着非常不受人待见的角色。你的整个功能代码都写完了&#xff0c;再去写测试就…

Codeforces Round 816 (Div. 2)(D拆位图论构造 E斜率优化)

C&#xff1a;直接单独算每个位置的贡献&#xff0c;如果当前位置和前面位置重复了&#xff0c;那么前面就没选的位置了 修改的时候只要重新算i和i1位置即可 #include<bits/stdc.h> using namespace std; const int N3e510,M2*N,mod1e97; #define int long long #defin…

RAG开山之作:结合参数化与非参数化记忆的知识密集型NLP任务新解法

20年RAG刚提出时的论文&#xff1a;Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks&#xff0c;也算是RAG的开山之作之一了。 摘要&#xff1a;检索增强生成&#xff08;RAG&#xff09;方法结合了预训练语言模型与基于检索的非参数化记忆&#xff0c;通过…

webview的使用方法和后退键的处理

WebView是一个能够显示网页内容的控件&#xff0c;通常用于Android或iOS应用程序中嵌入网页。下面我将分别说明WebView在Android和iOS中的使用方法&#xff0c;以及如何处理后退键。 Android中的WebView使用方法 添加WebView到布局文件中 在你的布局XML文件中添加WebView控件…

Vue+Echarts 实现中国地图和飞线效果

目录 实现效果准备 实现效果 在线预览&#xff1a;https://mouday.github.io/vue-demo/packages/china-map/dist/index.html 准备 高版本的echarts&#xff0c;不包含地图数据&#xff0c;需要自己下载到项目中 1、地图数据下载 https://datav.aliyun.com/portal/school/at…

Pasta:HHE Optimized Stream Cipher

参考文献&#xff1a; [Dae95] Daemen J .Cipher and hash function design strategies based on linear and differential cryptanalysis[J].Doctoral Dissertation K.u.leuven, 1995.[GPP11] Guo J, Peyrin T, Poschmann A. The PHOTON family of lightweight hash function…

class091 贪心经典题目专题3【左程云算法】

class091 贪心经典题目专题3【左程云算法】 前言版权推荐class091 贪心经典题目专题3最后 前言 2024-4-23 13:58:40 以下内容源自《【左程云算法】》 仅供学习交流使用 版权 禁止其他平台发布时删除以下此话 本文首次发布于CSDN平台 作者是CSDN日星月云 博客主页是https://…

数据转换 | Matlab基于RP递归图一维数据转二维图像方法

目录 效果分析基本介绍程序设计参考资料获取方式 效果分析 基本介绍 Matlab基于RP递归图一维数据转二维图像方法 基于RP&#xff08;Recurrence Plot&#xff09;递归图的方法可以将一维数据转换为二维图像&#xff0c;以可视化数据的动态特征。RP递归图是一种表示时间序列相…

【数据结构3-栈和队列】

数据结构3-栈和队列 1 栈-特殊的线性表-先进后出1.1 栈的三个案例 2 队列-与栈相反-先进先出2.1 队列的案例 3 用C实现栈的代码&#xff1a;4 用C实现队列的代码 1 栈-特殊的线性表-先进后出 1.1 栈的三个案例 2 队列-与栈相反-先进先出 2.1 队列的案例 3 用C实现栈的代码&…

代码随想录算法训练营第三十六天| LeetCode435.无重叠区间、LeetCode763.划分字母区间、LeetCode56.合并区间

LeetCode 435 无重叠区间 题目链接&#xff1a;435. 无重叠区间 - 力扣&#xff08;LeetCode&#xff09; 【解题思路】 需要先将数组按照左/右边界排序&#xff0c;这里按照左边界排序来解 如果第i个区间的左边界大于等于i-1区间的右边界 【解题步骤】 1.判断数组大小&am…

如何处理PHP中的文件上传和下载?

如何处理PHP中的文件上传和下载&#xff1f; 处理PHP中的文件上传和下载是Web开发中常见的任务&#xff0c;涉及到前端表单的设计、后端脚本的编写以及服务器配置等多个方面。下面将详细阐述如何在PHP中实现文件上传和下载的功能。 文件上传 文件上传通常涉及前端表单的创建…

【前端】vue3使用方法

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、vue3简介二、使用步骤三、总结 前言 随着开发语言及人工智能工具的普及&#xff0c;使得越来越多的人学习前端工具&#xff0c;本文主要是介绍vue3的使用方…

package.json 里面的 dependencies 和 devDependencies 的差异

差异 其实不严格的话&#xff0c;没有特别的差异&#xff1b;若是严格&#xff0c;遵循官方的理解。 dependencies&#xff1a;存放线上或者业务能访问的核心代码模块&#xff0c;比如 vue、vue-routerdevDependencies&#xff1a;处于开发模式下所依赖的开发模块&#xff0c…

c++ 二分查找

二分查找&#xff08;Binary Search&#xff09;是一种在有序数组中查找特定元素的高效算法。它通过不断将搜索范围减半来查找目标元素。其时间复杂度为 O(log n)&#xff0c;这是因为每一步都将搜索范围减半&#xff0c;因此算法的性能非常高。 二分查找的基本思想是&#xf…

如何在TestNG中忽略测试用例

在这篇文章中&#xff0c;我们将讨论如何在TestNG中忽略测试用例。TestNG帮助我们忽略使用Test注释的情况&#xff0c;我们可以在不同的级别上忽略这些情况。 首先&#xff0c;只忽略一个测试方法或测试用例。第二&#xff0c;忽略一个类及其子类中的所有情况。第三个是&#…

C语言实现双人贪吃蛇项目(基于控制台界面)

一.贪吃蛇 贪吃蛇是一款简单而富有乐趣的游戏&#xff0c;它的规则易于理解&#xff0c;但挑战性也很高。它已经成为经典的游戏之一&#xff0c;并且在不同的平台上一直受到人们的喜爱和回忆。 二.贪吃蛇的功能 游戏控制&#xff1a;玩家可以使用键盘输入设备来控制蛇的移动方…

二分查找-边界条件讨论

题目&#xff1a;二分查找 存在问题的地方&#xff1a; 边界条件while(left __ right)中是 < 还是 <循环中if(nums[middle] > target) right _____中是middle还是middle - 1 应该在区间上讨论&#xff1a; 左闭右闭&#xff1a;[ left , right ]左闭右开&#xf…