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"? ...
随机推荐
- SQL sum和group by HAVING
Aggregate functions (like SUM) often need an added GROUP BY functionality. 集合函数(类似SUM)经常需要用GROUP BY来 ...
- Oracle中merge into语法
merge into 语句就是insert和update的一个封装,简单来说就是: 有则更新,无则插入 下面说怎么使用 MERGE INTO table_Name T1(匿名) using (另外一 ...
- 2018第九届蓝桥杯决赛(C++ B组)
逛了大半个北京还是挺好玩de 第一题 标题:换零钞 x星球的钞票的面额只有:100元,5元,2元,1元,共4种. 小明去x星旅游,他手里只有2张100元的x星币,太不方便,恰好路过x星银行就去换零钱. ...
- 17.Merge Two Binary Trees(合并两个二叉树)
Level: Easy 题目描述: Given two binary trees and imagine that when you put one of them to cover the ot ...
- 【转】Automated Testing Detail Test Plan
Automated Testing Detail Test PlanAutomated Testing DTP Overview This Automated Testing Detail Test ...
- java 常用操作(保留小数位数、int转string,string转int)
1.保留2位小数 //similarityTemp为double类型,需要保留2位有效数据,利用String.format String strTemp=String.format("%.2 ...
- C语言单片机中延时程序的实现
在单片机或嵌入式系统的程序,常常用规定次数的空循环来实现延时 /** * 通过一个空循环体循环让程序运行一段时间.在嵌入式系统中,这个函数用来实现延时. * * 参数: * u16 i -- 循 ...
- AnnotationConfigApplicationContext
package com.test; import java.io.IOException; import java.io.InputStream; import java.net.URL; impor ...
- IOS 11 永不升级方法
解决一直跳苹果升级提示终极解决方法:安装方法很简单,1:进设置-通用-存储空间与iCloud用量-管理储存空间.选择ios xxx 点击他,点删除[如果没有就略过]2:点击:https://oldca ...
- NETCore 调试
https://www.cnblogs.com/MingQiu/p/8227644.html https://www.cnblogs.com/shumin/p/9967854.html 前言 core ...