Spring-cloud之Ribbon负载均衡的使用及负载均衡策略配置(与Eurka配合使用)
什么是Ribbon,ribbon有什么用,个人先总结一下(不正确请提出讨论):Ribbon是基于客户端的负载均衡器,为我们提供了多样的负载均衡的方案,比如轮询,最小的并发请求的server,随机server等;其默认的策略是ZoneAvoidanceRule,也就是复合判断server所在区域的性能和server的可用性选择server,使用ZoneAvoidancePredicate和AvailabilityPredicate来判断是否选择某个server,前一个判断判定一个zone的运行性能是否可用,剔除不可用的zone(的所有server),AvailabilityPredicate用于过滤掉连接数过多的Server。
在上面两篇博文中我们介绍了Eureka的使用和相关的博文教程。在上一篇博文中(https://blog.csdn.net/asd529735325/article/details/85044158),在我们服务调用方,我们就用到了Ribbon,我们使用Ribbon的RestTemplate,其整合了EurekaClient,Ribbon基于客户端的负载均衡器为我们提供了多样的负载均衡的功能,我们所需要做的就是在Spring中注册一个RestTemplate,并且添加@LoadBalanced 注解。(上一篇我们添加的是LoadBalanced,默认ZoneAvoidanceRule策略)。
这里我们详细实验一下Ribbon如何实现的负载均衡。
在https://github.com/wades2/EurekaDemo2这个代码的基础上我们添加了一个Client端,也是作为server实例的。

为了区分是最终究竟访问的哪个EurekaClient,我们的Cotroller返回的和第一个有差异(但是实际开发中不可以!我们这里只是为了实验!!强调!!)。
我们按照之前注册到服务端一样把新的Client注册到Eurekaserver,以下是我个人的配置文件:
spring.application.name=Eureka-client
#eureka.client.allow-redirects=false
#修改启动端口
server.port=8085
eureka.client.serviceUrl.defaultZone=http://user:123456@localhost:8083/eureka,http://user:123456@localhost:8082/eureka
#eureka.client.register-with-eureka=true
eureka.instance.ip-address=true
注意:spring.application.name必须和EurekaClient的一致,因为restTemplate是通过spring.application.name+请求接口地址来实现请求的类似于httpClient的框架(可以理解成域名或IP+端口号就能实现请求,只是在Ribbon中换了个形式而已)。
package com.example.demo.controller;
import com.netflix.appinfo.InstanceInfo;
import com.netflix.discovery.EurekaClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("user")
public class UserController {
@Autowired
private EurekaClient eurekaClients;
// @Autowired
// private DiscoveryClient discoveryClient;
@GetMapping("getUser")
public String getUser() {
//todo 得到eureka server的服务实例
// InstanceInfo info=eurekaClients.getNextServerFromEureka("Eureka-client",false);
// return info.getHomePageUrl();
return "hello client2";
}
}
Controller除了返回的信息不一样,其他都一样。
然后启动访问http://localhost:8086/getUser/routine,我们可以看到,请求同样的url,返回的一次是hello client2,一次是hello one,我们可以知道,客户端的负载均衡已经完成了。
接下来我们来说说如何根据自己的需求配置负载均衡策略,我们刚在前文提到Ribbon默认的策略是ZoneAvoidanceRule,我们通过实验来试试其他策略:
在Eurakacaller中Controller下new一新的Class作为config,来配置我们的策略。

然后重构下Controller(因为之前是把Config直接写在Controller里面的):
package com.example.demo.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
@RestController
//@Configuration
public class Controller {
// @Bean
// @LoadBalanced
// public RestTemplate getRestTemplate() {
// return new RestTemplate();
// }
//
// @GetMapping("getUser/routine")
// public String routine() {
// RestTemplate restTemplate = getRestTemplate();
//
// String json = restTemplate.getForObject("http://Eureka-client/user/getUser", String.class);
// return json;
// }
@Autowired
private RestTemplate restTemplate;
@GetMapping("getUser/routine")
public String routine() {
// RestTemplate restTemplate = configBean.getRestTemplate();
String json = restTemplate.getForObject("http://Eureka-client/user/getUser", String.class);
return json;
}
// @GetMapping("getUser/routine2")
// public String routine2() {
// RestTemplate restTemplate = getRestTemplate();
// String json = restTemplate.getForObject("http://Eureka-client/user/getUser2", String.class);
// return json;
// }
}
然后配置下我们的Ribbon策略:
package com.example.demo.controller;
import com.netflix.loadbalancer.IRule;
import com.netflix.loadbalancer.RandomRule;
import com.netflix.loadbalancer.RoundRobinRule;
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;
@Configuration
public class ConfigBean {
@Bean
@LoadBalanced // ribbon负载均衡
public RestTemplate getRestTemplate() {
return new RestTemplate();
}
@Bean
public IRule muRule() {
return new RoundRobinRule();//轮询
// return new RandomRule();// 随机
}
}
选择轮询还是随机看你,如果注销了muRule,则变为默认策略。
OK,有关Ribbon的配置就结束了,欢迎大家一起讨论评论。
这里推荐一个对Ribbon有深入研究大佬的博客地址,看了后会明白很多,Ribbon是如何通过restTemplate来发送http请求调用的:https://blog.csdn.net/puhaiyang/article/details/79682177
Spring-cloud之Ribbon负载均衡的使用及负载均衡策略配置(与Eurka配合使用)的更多相关文章
- spring cloud 使用ribbon简单处理客户端负载均衡
假如我们的multiple服务的访问量剧增,用一个服务已经无法承载, 我们可以把Hello World服务做成一个集群. 很简单,我们只需要复制Hello world服务,同时将原来的端口8762修改 ...
- spring cloud: 关闭ribbon负载均衡
spring cloud: 关闭ribbon负载均衡 1.eureka服务 2.2个user服务:7900/7901 3,movie服务 movie服务去请求 user的用户信息,而此时只想请求790 ...
- spring cloud: Hystrix(二):简单使用@HystrixCommand的commandProperties配置@HistrixProperty隔离策略
spring cloud: Hystrix(二):简单使用@HystrixCommand的commandProperties配置@HistrixProperty隔离策略 某电子商务网站在一个黑色星期五 ...
- Spring Cloud微服务笔记(四)客户端负载均衡:Spring Cloud Ribbon
客户端负载均衡:Spring Cloud Ribbon 一.负载均衡概念 负载均衡在系统架构中是一个非常重要,并且是不得不去实施的内容.因为负载均衡对系统的高可用性. 网络压力的缓解和处理能力的扩容的 ...
- Spring Cloud Gateway Ribbon 自定义负载均衡
在微服务开发中,使用Spring Cloud Gateway做为服务的网关,网关后面启动N个业务服务.但是有这样一个需求,同一个用户的操作,有时候需要保证顺序性,如果使用默认负载均衡策略,同一个用户的 ...
- Spring Cloud - 切换Ribbon的负载均衡模式
Spring Cloud Ribbon是一个基于HTTP和TCP的客户端负载均衡工具,它基于Netflix Ribbon实现.通过Spring Cloud的封装,可以让我们轻松地将面向服务的REST模 ...
- spring cloud 通过 ribbon 实现客户端请求的负载均衡(入门级)
项目结构 环境: idea:2020.1 版 jdk:8 maven:3.6.2 1. 搭建项目 ( 1 )父工程:spring_cloud_demo_parent pom 文件 <?xml v ...
- Spring cloud 之Ribbon(二)负载均衡原理
ribbon实现负载均衡的原理 我们从Ribbon实现负载均衡的代码可以看到,Ribbon是通过RestTemPlate实现客户端负载均衡的,准确的说是RestTemPlate上的@LoadBalan ...
- Spring Cloud 之 Ribbon
新建Spring Boot工程,命名为ribbon 1.pom.xml添加依赖 <?xml version="1.0" encoding="UTF-8"? ...
随机推荐
- 【转】32位plsql连接64位oracle
源地址:http://www.cnblogs.com/ymj126/p/3712727.html
- C语言数据结构-栈的实现-初始化、销毁、长度、取栈顶元素、查找、入栈、出栈、显示操作
1.数据结构-栈的实现-C语言 #define MAXSIZE 100 //栈的存储结构 typedef struct { int* base; //栈底指针 int* top; //栈顶指针 int ...
- linux下将当前目录下的文件名存到一个文本文件里
如果只是想得到当前目录下(不包括子目录)的相关文件时:ls -l | grep ".gz$" > 1.txt 如果想得到当前目录下,包括子目录中的相关文件时,应该用find ...
- HDU - 6416 :Rikka with Seam(DP & 前缀和 & 数学)
pro:给定N*M的矩阵,现在让你在每一行删去一个位置,然后形成新N*(M-1)的矩阵,问有多少种不同的新的矩阵.需要满足相邻行删去的位置不大于K. (题目是01矩阵,其实任意矩阵都可以做,本题算法里 ...
- HashMap 1.8的源码分析三
线程安全问题: 在添加时候并没有进行安全考虑,枷锁 所以是线程不安全的,接下来进行代码测试; package com.mmall.concurrency.example.commonUnsafe; i ...
- Unity 动画系统 AnimationEvent 动画事件
- 以Tkinter模块来学习Python实现GUI(图形用户界面)编程
tk是什么:它是一个图形库,支持多个操作系统,使用tcl语言开发的.tkinter是Python内置的模块, 与tk类似的第三方图形库(GUI库)还有很多,比如:Qt,GTK,wxWidget,wxP ...
- 使用sqlmetal工具自动生成SQL数据库的Linq类文件
第一部:找到sqlmetal.exe. 运行cmd. 执行命令 cd C:\Program Files (x86)\Microsoft SDKs\Windows\v8.1A\bin\NETFX 4.5 ...
- HMAC算法加密
/** * HMAC算法加密 * @param message 待加密信息 * @param key 密钥 * @return */ public static String HmacSHA256(b ...
- 轻量级RPC框架-motan
https://github.com/weibocom/motan/wiki/zh_quickstart#%E7%AE%80%E5%8D%95%E8%B0%83%E7%94%A8%E7%A4%BA%E ...