学而时习之,不亦说乎!

                             --《论语》

Ribbon使用版本2.2.2

Ribbon是什么?

  开始接触Ribbon的时候,网上以及很多书上都说Ribbon是一个负载均衡的工具,提供各种负载均衡算法。

  但是分析完源码后,在我的理解里,Ribbon是一个http客户端,它具备了负载均衡,失败重试,ping等功能。

  比如httpclient就是一个http客户端,它就是用来发送http请求的,但是Ribbon在httpclient上做了更多的封装,满足更好的使用,当然,也可以使用其他的http客户端。

  所以,Ribbon并不是很多人说的负载均衡工具,而是一个具有负载均衡等功能的http客户端。

  即:Ribbon是http客户端。

示例

package org.crazyit.cloud;

import com.netflix.client.ClientFactory;
import com.netflix.client.IClient;
import com.netflix.client.config.DefaultClientConfigImpl;
import com.netflix.client.config.IClientConfig;
import com.netflix.client.config.IClientConfigKey;
import com.netflix.client.http.HttpRequest;
import com.netflix.client.http.HttpRequest.Verb;
import com.netflix.client.http.HttpResponse;
import com.netflix.config.ConfigurationManager;
import com.netflix.loadbalancer.ILoadBalancer;
import com.netflix.loadbalancer.Server;
import com.netflix.niws.client.http.RestClient; /**
*
* @author zby
* @date 2019年1月23日
* @Description ↓↑←→↘↙↖↗↔
*/
@SuppressWarnings("all")
public class RibbonMain { public static final String DELIMITER = ".";
public static final String DEFAULT = "default";
public static final String CUSTOM = "custom"; public static void main(String[] args) throws Exception {
// 创建指定名称的客户端配置,会使用默认配置进行初始化,然后使用archaius读取自定义的配置
// IClientConfig iClientConfig = ClientFactory.getNamedConfig("default");↓
IClientConfig defaltClientConfig = ClientFactory.getNamedConfig(DEFAULT, DefaultClientConfigImpl.class); // 使用archaius设置自定义配置,配置结构为:name+namespace+key。name由我们指定,namespace是固定的,Ribbon的namespace就是ribbon,key是配置的名称
ConfigurationManager.getConfigInstance().setProperty(getPropertyKey(CUSTOM, IClientConfigKey.Keys.ListOfServers),
"http://www.spring.io,http://www.apache.org");
ConfigurationManager.getConfigInstance().setProperty(getPropertyKey(CUSTOM, IClientConfigKey.Keys.MaxAutoRetriesNextServer), 0);
// ConfigurationManager.getConfigInstance().setProperty(getPropertyKey(CUSTOM, IClientConfigKey.Keys.ClientClassName),
// "com.netflix.client.IClient子类全路径");
// ConfigurationManager.getConfigInstance().setProperty(getPropertyKey(CUSTOM, IClientConfigKey.Keys.NIWSServerListClassName),
// "com.netflix.loadbalancer.ServerList子类全路径");
// ConfigurationManager.getConfigInstance().setProperty(getPropertyKey(CUSTOM, IClientConfigKey.Keys.NFLoadBalancerClassName),
// "com.netflix.loadbalancer.ILoadBalancer子类全路径");
// ConfigurationManager.getConfigInstance().setProperty(getPropertyKey(CUSTOM, IClientConfigKey.Keys.NFLoadBalancerPingClassName),
// "com.netflix.loadbalancer.IPing子类全路径");
// ConfigurationManager.getConfigInstance().setProperty(getPropertyKey(CUSTOM, IClientConfigKey.Keys.NFLoadBalancerRuleClassName),
// "com.netflix.loadbalancer.IRule子类全路径");
IClientConfig customClientConfig = ClientFactory.getNamedConfig(CUSTOM, DefaultClientConfigImpl.class); printAllRibbonConfig(defaltClientConfig, customClientConfig); // 默认配置
// ClientClassName=com.netflix.niws.client.http.RestClient
// NIWSServerListClassName=com.netflix.loadbalancer.ConfigurationBasedServerList
// NFLoadBalancerClassName=com.netflix.loadbalancer.ZoneAwareLoadBalancer
// NFLoadBalancerPingClassName=com.netflix.loadbalancer.DummyPing
// NFLoadBalancerRuleClassName=com.netflix.loadbalancer.AvailabilityFilteringRule // IClient iClient = ClientFactory.getNamedClient("zby");↓
IClient iClient = ClientFactory.getNamedClient(CUSTOM, DefaultClientConfigImpl.class);
RestClient restClient = (RestClient) iClient;
HttpRequest httpRequest = HttpRequest.newBuilder().uri("/").verb(Verb.GET).build();
System.out.println(httpRequest.getUri());
HttpResponse httpResponse = restClient.executeWithLoadBalancer(httpRequest, null);
System.out.println(httpResponse.getStatus()); // ILoadBalancer iLoadBalancer = ClientFactory.getNamedLoadBalancer(CUSTOM);↓
ILoadBalancer iLoadBalancer = ClientFactory.getNamedLoadBalancer(CUSTOM, DefaultClientConfigImpl.class);
for (int i = 0; i < 6; i++) {
Server server = iLoadBalancer.chooseServer(null);
System.out.println(server);
} } /**
*
* @author zby
* @date 2019年1月23日
* @param name
* @param iClientConfigKey
* @return
* @Description 获取Ribbon配置的key
*/
public static String getPropertyKey(String name, IClientConfigKey<?> iClientConfigKey) {
return name + DELIMITER + DefaultClientConfigImpl.DEFAULT_PROPERTY_NAME_SPACE + DELIMITER + iClientConfigKey.key();
} public static void printAllRibbonConfig(IClientConfig iClientConfig1, IClientConfig iClientConfig2) {
for (IClientConfigKey iClientConfigKey : IClientConfigKey.Keys.values()) {
println(iClientConfig1, iClientConfig2, iClientConfigKey);
}
} private static void println(IClientConfig iClientConfig1, IClientConfig iClientConfig2, IClientConfigKey<?> iClientConfigKey) {
System.out.println(iClientConfigKey.key());
System.out.println(
"\t\t\t\t\t\t【" + iClientConfig1.get(iClientConfigKey) + "】" + "←--------→【" + iClientConfig2.get(iClientConfigKey) + "】");
}
}

 输出结果:

RequestIdHeaderName
【null】←--------→【null】
EnableGZIPContentEncodingFilter
【false】←--------→【false】
ServerListRefreshInterval
【null】←--------→【null】
UseIPAddrForServer
【false】←--------→【false】
MaxTotalHttpConnections
【200】←--------→【200】
PoolKeepAliveTimeUnits
【SECONDS】←--------→【SECONDS】
VipAddressResolverClassName
【com.netflix.client.SimpleVipAddressResolver】←--------→【com.netflix.client.SimpleVipAddressResolver】
VipAddress
【null】←--------→【null】
EnablePrimeConnections
【false】←--------→【false】
ForceClientPortConfiguration
【null】←--------→【null】
NFLoadBalancerPingClassName
【com.netflix.loadbalancer.DummyPing】←--------→【com.netflix.loadbalancer.DummyPing】
MinPrimeConnectionsRatio
【1.0】←--------→【1.0】
MaxHttpConnectionsPerHost
【50】←--------→【50】
PoolKeepAliveTime
【900】←--------→【900】
ConnectionManagerTimeout
【2000】←--------→【2000】
ProxyPort
【null】←--------→【null】
PrioritizeVipAddressBasedServers
【true】←--------→【true】
EnableMarkingServerDownOnReachingFailureLimit
【null】←--------→【null】
ReadTimeout
【5000】←--------→【5000】
ServerDownFailureLimit
【null】←--------→【null】
IsHostnameValidationRequired
【null】←--------→【null】
listOfServers
【】←--------→【http://spring.io,http://www.apache.org】
FollowRedirects
【false】←--------→【false】
KeyStorePassword
【null】←--------→【null】
ProxyHost
【null】←--------→【null】
MaxAutoRetries
【0】←--------→【0】
StaleCheckingEnabled
【null】←--------→【null】
EnableZoneExclusivity
【false】←--------→【false】
MaxRetriesPerServerPrimeConnection
【9】←--------→【9】
RequestSpecificRetryOn
【null】←--------→【null】
ConnIdleEvictTimeMilliSeconds
【30000】←--------→【30000】
TargetRegion
【null】←--------→【null】
InitializeNFLoadBalancer
【null】←--------→【null】
EnableConnectionPool
【true】←--------→【true】
ClientClassName
【com.netflix.niws.client.http.RestClient】←--------→【com.netflix.niws.client.http.RestClient】
MaxTotalTimeToPrimeConnections
【30000】←--------→【30000】
ConnectionCleanerRepeatInterval
【30000】←--------→【30000】
Version
【null】←--------→【null】
ReceiveBufferSize
【null】←--------→【null】
PoolMaxThreads
【200】←--------→【200】
PoolMinThreads
【1】←--------→【1】
CustomSSLSocketFactoryClassName
【null】←--------→【null】
PrimeConnectionsClassName
【com.netflix.niws.client.http.HttpPrimeConnection】←--------→【com.netflix.niws.client.http.HttpPrimeConnection】
EnableZoneAffinity
【false】←--------→【false】
Linger
【null】←--------→【null】
MaxConnectionsPerHost
【50】←--------→【50】
OkToRetryOnAllOperations
【false】←--------→【false】
KeyStore
【null】←--------→【null】
TrustStorePassword
【null】←--------→【null】
BackoffTimeout
【null】←--------→【null】
NFLoadBalancerClassName
【com.netflix.loadbalancer.ZoneAwareLoadBalancer】←--------→【com.netflix.loadbalancer.ZoneAwareLoadBalancer】
ServerListUpdaterClassName
【null】←--------→【null】
NIWSServerListClassName
【com.netflix.loadbalancer.ConfigurationBasedServerList】←--------→【com.netflix.loadbalancer.ConfigurationBasedServerList】
MaxTotalConnections
【200】←--------→【200】
ServerDownStatWindowInMillis
【null】←--------→【null】
DeploymentContextBasedVipAddresses
【null】←--------→【null】
ConnectionPoolCleanerTaskEnabled
【true】←--------→【true】
IgnoreUserTokenInConnectionPoolForSecureClient
【null】←--------→【null】
TrustStore
【null】←--------→【null】
GZipPayload
【null】←--------→【null】
NFLoadBalancerMaxTotalPingTime
【null】←--------→【null】
IsSecure
【null】←--------→【null】
MaxAutoRetriesNextServer
【1】←--------→【0】
SendBufferSize
【null】←--------→【null】
NFLoadBalancerRuleClassName
【com.netflix.loadbalancer.AvailabilityFilteringRule】←--------→【com.netflix.loadbalancer.AvailabilityFilteringRule】
NIWSServerListFilterClassName
【null】←--------→【null】
AppName
【null】←--------→【null】
ConnectTimeout
【2000】←--------→【2000】
IsClientAuthRequired
【false】←--------→【false】
PrimeConnectionsURI
【/】←--------→【/】
NFLoadBalancerPingInterval
【null】←--------→【null】
SecurePort
【null】←--------→【null】
Port
【7001】←--------→【7001】
RulePredicateClasses
【null】←--------→【null】
/
200
spring.io:80
www.apache.org:80
spring.io:80
www.apache.org:80
spring.io:80
www.apache.org:80

  

 留下的疑问?

1.ClientFactory242行和248行是否重复???
2.个人觉得ClientFactory70行的loadBalancer = registerNamedLoadBalancerFromclientConfig(restClientName, clientConfig);改为loadBalancer = getNamedLoadBalancer(restClientName, clientConfig);是否更好???

Ribbon是什么?的更多相关文章

  1. Devexpress Ribbon Add Logo

    一直在网上找类似的效果.在Devpexress控件里面的这个是一个Demo的.没法查看源代码.也不知道怎么写的.所以就在网上搜索了半天的. 终于找到类似的解决办法. 可以使用重绘制的办法的来解决. [ ...

  2. 问题解决——MFC Ribbon 响应函数 错乱 执行其他函数

    ==================================声明================================== 本文原创,转载在正文中显要的注明作者和出处,并保证文章的完 ...

  3. 问题解决——MFC Ribbon 添加图标

    =================================版权声明================================= 版权声明:本文为博主原创文章 未经许可不得转载  请通过右 ...

  4. Office2013插件开发Outlook篇(2)-- Ribbon

    一.获取当前实例 在Ribbon1的任何方法中调用如下代码,可获取当前实例. 如: Application application = new Application(); var list = ap ...

  5. WPF中Ribbon控件的使用

    这篇博客将分享如何在WPF程序中使用Ribbon控件.Ribbon可以很大的提高软件的便捷性. 上面截图使Outlook 2010的界面,在Home标签页中,将所属的Menu都平铺的布局,非常容易的可 ...

  6. sharepont 2013 隐藏Ribbon 菜单

    引用:C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\15\ISAPI\Microsoft.Web.Comma ...

  7. 使用vs2010创建MFC C++ Ribbon程序

    Your First MFC C++ Ribbon Application with Visual Studio 2010 Earlier this month, I put together my ...

  8. E-Form++图形可视化源码库新增同BCGSoft的Ribbon结合示例

    2015年11月20日,来自UCanCode E-Form++源码库的开发团队消息,E-Form++正式提供了同BCGSoft的Ribbon界面风格相结合的示例,如下图: 下载此示例请访问: http ...

  9. DotNetBar 第2课,窗口设置 Ribbon Form 样式

    1. 新增 windows 窗体时,选 Ribbon Form 2. 窗体继承 Office2007RibbonForm 3. 设计窗口下面,删除 删除styleManager1  组件 窗口效果如下 ...

  10. MSCRM 2013/2015 Ribbon Editor

    由于新版本2015的解决方案与之前有变化,因此许多老的Tools已经不能使用,推荐给大家新的Ribbon Editor Tool. 下载地址: http://www.develop1.net/publ ...

随机推荐

  1. 20155209 2016-2017-2 《Java程序设计》第七周学习总结

    20155209 2016-2017-2 <Java程序设计>第七周学习总结 教材学习内容总结 认识时间与日期 时间的度量 GMT(Greenwich Mean Time) 时间:现在不是 ...

  2. ViewController的属性

    [ViewController的属性] 1.navigationItem,只读,只第一次引用的时候被创建. The first time the property is accessed, the U ...

  3. B-spline Curves 学习之B样条基函数的定义与性质(2)

    B-spline Basis Functions 本博客转自前人的博客的翻译版本,前几章节是原来博主的翻译内容,但是后续章节博主不在提供翻译,后续章节我在完成相关的翻译学习. (原来博客网址:http ...

  4. Oracle电子商务套件版本12.1.3自述文件 (Doc ID 1534411.1)

    文档内容 用途 适用范围 详细信息   应用版本更新包   更新后的步骤   包含的修补程序列表   变更记录   文档可访问性 参考 适用于: Oracle Applications DBA - 版 ...

  5. Linux系统的运行级的概念

    Linux OS 将操作 环境分为以下7个等级,即 0:关机 1:单用户模式(单用户.无网络) 2:无网络支持的多用户模式(多用户.无网络) 3:有网络支持的多用户模式(多用户.有网络) 4:保留,未 ...

  6. java写入换行符

    写入一个文件,生成文本文档,里面写入1000行字符,但是写出来的没有换行.所以纠结,百度了下,一行完事. String crlf=System.getProperty("line.separ ...

  7. winform在A窗体刷新B窗体,并改变窗体的属性

    //A窗体设置B窗体的属性并刷新B窗体 Application.OpenForm["窗体名称"].Controls["控件名称"].visible=true;

  8. C# 中多态和重载的区别

    一.多态性意味着有多重形式. 在面向对象编程范式中,多态性往往表现为"一个接口,多个功能". using System; using System.Collections.Gene ...

  9. C# 中 String 类型的详细讲解

    C# 字符串(String) 在 C# 中,您可以使用字符数组来表示字符串,但更常见的做法是使用 string 关键字来声明一个字符串变量.string 关键字是 System.String 类的别名 ...

  10. [UWP]xaml中自定义附加属性使用方法的注意项

    ---恢复内容开始--- 随笔小记,欢迎指正 在UWP平台上做WVVM的时候,想针对ListBox的SelectionChanged事件定义一个自定义的命令,于是使用自定义附加属性的方式.可是最后自定 ...