Ribbon 负载均衡机制

官方文档地址:https://github.com/Netflix/ribbon/wiki/Working-with-load-balancers

1. Ribbon 内置的负载均衡规则

  ① RoundRobinRule

    此规则是默认规则,通过轮询服务器列表的方式选择服务器

  ② AvailabilityFilteringRule

    此规则会跳过短路的服务器和有高并发连接数的服务器

    默认情况下RestClient最近3次无法与服务建立连接,会被置为短路状态。可以通过配置修改次数,具体可通过上述连接查看文档

  ③ WeightedResponseTimeRule

    每个服务器根据其平均响应时间给予权重。响应时间越长,权重就越小。此规则随机选择服务器,其中可能性有服务器的权重决定

  ④ ZoneAvoidanceRule

    以可用的服务器为基础,对服务器进行分类选择

  ④ BestAvailiableRuel

    略短路的机器,并选择并发数较低的服务器

  ⑤ RandomRule

    随机选择一个可用的服务器

  ⑥ RetryRule

    重试机制的选择逻辑

2.自定义规则

 (1)默认轮询规则

import com.netflix.loadbalancer.BaseLoadBalancer;
import com.netflix.loadbalancer.ILoadBalancer;
import com.netflix.loadbalancer.Server; import java.util.ArrayList;
import java.util.List; public class LoadBalancerTest {
public static void main(String[] args) {
ILoadBalancer loadBalancer = new BaseLoadBalancer(); List<Server> servers = new ArrayList<>();
servers.add(new Server("localhost", 8080));
servers.add(new Server("localhost", 8081)); loadBalancer.addServers(servers); for (int i = 0; i < 10; i++) {
Server server = loadBalancer.chooseServer(null);
System.out.println(server);
} }
}

  (2)自定义规则

import com.netflix.loadbalancer.ILoadBalancer;
import com.netflix.loadbalancer.IRule;
import com.netflix.loadbalancer.Server; import java.util.List;
import java.util.Random; public class MyRule implements IRule { private ILoadBalancer iLoadBalancer; @Override
public Server choose(Object o) {
List<Server> servers = iLoadBalancer.getAllServers(); Random random = new Random();
int num = random.nextInt(10);
if (num > 7) {
return getServerByPort(servers, 8081);
}
return getServerByPort(servers, 8080);
} @Override
public void setLoadBalancer(ILoadBalancer iLoadBalancer) {
this.iLoadBalancer = iLoadBalancer;
} @Override
public ILoadBalancer getLoadBalancer() {
return this.iLoadBalancer;
} private Server getServerByPort(List<Server> servers, int port) {
for (Server server : servers) {
if (server.getPort() == port) {
return server;
}
}
return null;
}
}
import com.idelan.test.rules.MyRule;
import com.netflix.client.ClientFactory;
import com.netflix.client.http.HttpRequest;
import com.netflix.client.http.HttpResponse;
import com.netflix.config.ConfigurationManager;
import com.netflix.loadbalancer.BaseLoadBalancer;
import com.netflix.loadbalancer.Server;
import com.netflix.niws.client.http.RestClient; import java.net.URI;
import java.util.ArrayList;
import java.util.List; public class TestMyRule { public static void main(String[] args) throws Exception{
//customRules(); testRibbon();
} //自定义负载均衡规则
public static void customRules() {
BaseLoadBalancer loadBalancer = new BaseLoadBalancer();
MyRule rule = new MyRule();
rule.setLoadBalancer(loadBalancer);
loadBalancer.setRule(rule); List<Server> servers = new ArrayList<>();
servers.add(new Server("localhost", 8080));
servers.add(new Server("localhost", 8081));
loadBalancer.addServers(servers); for (int i = 0; i < 10; i++) {
Server server = loadBalancer.chooseServer(null);
System.out.println(server);
}
} //通过自定义负载均衡规则访问服务端接口
public static void testRibbon() throws Exception{
//通过properties配置文件导入配置信息
//ConfigurationManager.loadPropertiesFromResources("my-ribbon.properties"); //通过java代码导入配置信息
ConfigurationManager.getConfigInstance().setProperty(
"my-client.ribbon.listOfServers", "localhost:8080, localhost:8081");
ConfigurationManager.getConfigInstance().setProperty("my-client.ribbon.NFLoadBalancerRuleClassName", MyRule.class.getName()); RestClient client = (RestClient) ClientFactory.getNamedClient("my-client");
HttpRequest request = HttpRequest.newBuilder().uri(new URI("/person")).build(); //
for (int i = 0; i < 10; i++) {
HttpResponse response = client.executeWithLoadBalancer(request); //
System.out.println("返回结果为 Status code for " + response.getRequestedURI() + " :" + response.getStatus()+"内容:"+response.getEntity(String.class));
}
}
}

说明:此处需要导入的jar包和上一篇博客(负载均衡框架 ribbon 一)中需要导入的jar包一样

负载均衡框架 ribbon 二的更多相关文章

  1. 负载均衡框架 ribbon 一

    Ribbon开源地址:https://github.com/Netflix/ribbon/wiki/Getting-Started 1.Ribbon简介 负载均衡框架,支持可插拔式的负载均衡规则 支持 ...

  2. API网关spring cloud gateway和负载均衡框架ribbon实战

    通常我们如果有一个服务,会部署到多台服务器上,这些微服务如果都暴露给客户,是非常难以管理的,我们系统需要有一个唯一的出口,API网关是一个服务,是系统的唯一出口.API网关封装了系统内部的微服务,为客 ...

  3. 负载均衡框架 ribbon 三

    Ribbon 在 SpringCloud 中的使用 1.构建 Eureka 注册中心 smart-platform-eureka1 (1)导入jar包 <properties> <p ...

  4. 客户端负载均衡框架:Spring Cloud Ribbon

    最近在学习Spring Cloud的知识,现将客户端负载均衡框架 Spring Cloud Ribbon 的相关知识笔记整理如下.[采用 oneNote格式排版]

  5. 【Spring Cloud】客户端负载均衡组件——Ribbon(三)

    一.负载均衡 负载均衡技术是提高系统可用性.缓解网络压力和处理能力扩容的重要手段之一. 负载均衡可以分为服务器负载均衡和客户端负载均衡,服务器负载均衡由服务器实现,客户端只需正常访问:客户端负载均衡技 ...

  6. Spring Cloud之负载均衡组件Ribbon原理分析

    目录 前言 一个问题引发的思考 Ribbon的简单使用 Ribbon 原理分析 @LoadBalanced 注解 @Qualifier注解 LoadBalancerAutoConfiguration ...

  7. SpringCloud 客户端负载均衡:Ribbon

    目录 Ribbon 介绍 开启客户端负载均衡,简化 RestTemplate 调用 负载均衡策略 Ribbon 介绍 Ribbon 是 Netflix 提供的一个基于 Http 和 TCP 的客户端负 ...

  8. Spring Cloud官方文档中文版-客户端负载均衡:Ribbon

    官方文档地址为:http://cloud.spring.io/spring-cloud-static/Dalston.SR2/#_spring_cloud_netflix 文中例子我做了一些测试在:h ...

  9. Nginx反向代理与负载均衡应用实践(二)

    Nginx反向代理与负载均衡应用实践(二) 链接:https://pan.baidu.com/s/1xB20bnuanh0Avs4kwRpSXQ 提取码:migq 复制这段内容后打开百度网盘手机App ...

随机推荐

  1. linear correlation coefficient|Correlation and Causation|lurking variables

    4.4 Linear Correlation 若由SxxSyySxy定义则为: 所以为了计算方便: 所以,可以明白的是,Sxx和Sx是不一样的! 所以,t r is independent of th ...

  2. JQuery实现复制数据到剪贴板之各种麻花与右键点击弹出选择菜单

    1.如果小伙伴们只是想实现点击某个按钮(通过click事件)实现复制功能. 那小哥哥我在这里推荐大家使用2个非常好用的插件 (1)clipboard.js:纯js插件,无需flash,相对来说更轻量级 ...

  3. Windows2012R2 设置NTP时间服务器

    一.服务端配置 (Ntp服务器,客户端将根据这台服务器的时间进行同步) 1.微软键+R键,进入“运行”,输入“regedit”,进入注册表 2. HKEY_LOCAL_MACHINE\SYSTEM\C ...

  4. iOS传感器集锦、飞机大战、开发调试工具、强制更新、Swift仿QQ空间头部等源码

    iOS精选源码 飞机大作战 MUPhotoPreview -简单易用的图片浏览器 LLDebugTool是一款针对开发者和测试者的调试工具,它可以帮... 多个UIScrollView.UITable ...

  5. inode和block

    1:磁盘分区并被格式化为ext4 后,文件系统会生成一定数量的 inode 和block 2:   inode 称为索引节点,他的作用是存放文件的属性信息以及作为文件的索引. 3:ext3和ext4文 ...

  6. python数据类型:元组

    python数据类型:元组 python的元组与列表类似,但是元组的元素不能修改 元组使用小括号,列表使用大括号 元组创建简单,只需要在括号中添加元素,使用逗号隔开 创建元组: tup1 = (50, ...

  7. 实现api开发实例页面

    主要实现功能: 1.通过点击不同的option选项,自动生成不同的代码. 功能分析: 1.点击不同的option选项,这里其实就是使用了一个事件即onchange,把这个事件放在<select& ...

  8. iOS(Swift)学习笔记之去除UINavigationBar下方横线

    本文为原创文章,转载请标明出处 // 去除UINavigationBar下方横线 navigationController.navigationBar.shadowImage = UIImage() ...

  9. 修改xampp中phpmyadmin用户管理

    用相关软件打开位于D:/xampp/phpMyAdmin文件夹中的config.inc.php文件. 搜索$cfg['Servers'][$i]['auth_type'] = 'config'; 将其 ...

  10. 849. Dijkstra求最短路 I

    给定一个n个点m条边的有向图,图中可能存在重边和自环,所有边权均为正值. 请你求出1号点到n号点的最短距离,如果无法从1号点走到n号点,则输出-1. 输入格式 第一行包含整数n和m. 接下来m行每行包 ...