很多场景下,需要实现不同的微服务采用不同的策略,例如修改Ribbon的负载均衡规则等。Spring Cloud允许使用Java代码自定义Ribbon的配置。

在Spring Cloud中,Ribbon默认配置如下

IClientConfig:Ribbon 的客户端配置,默认采用 com.netflix.client.config.DefaultClientConfigImpl 实现。
IRule:Ribbon 的负载均衡策略,默认采用 com.netflix.loadbalancer.ZoneAvoidanceRule 实现,该策略能够在多区域环境下选择最佳区域的实例进行访问
IPing:Ribbon 的实例检查策略,默认采用 com.netflix.loadbalancer.NoOpPing 实现,该检查策略是一个特殊的实现,实际上他并不会检查实例是否可用,而是始终返回 true ,默认认为所有服务实例都是可以使用
ServerList<Server>:服务实例清单的维护机制,默认采用 com.netflix.loadbalancer.ConfigurationBasedServerList 实现。
ServerListFilter<Server>:服务实例清单过滤机制,默认采用 org.springframework.cloud.netflix.ribbon.ZonePreferenceServerListFilter 实现,该策略能够优先过滤出与请求调用方处理同区域的服务实现
ILoadBalancer:负载均衡器,默认采用 com.netflix.loadbalancer.ZoneAwareLoadBalancer 实现,他具备了区域感知的能力

现使用Java代码自定义Ribbon配置,模拟mima-cloud-producer 服务采用轮询的方式访问,mima-cloud-producer2服务采用随机的方式访问。
mima-cloud-producer 服务启动如下节点:

http://localhost:9905/
http://localhost:9906/

mima-cloud-producer2 服务启动如下节点:

http://localhost:9907/
http://localhost:9908/

打开浏览器,多次访问 http://192.168.1.100:8803/ribbon/get/1,运行效果如下:

host:PC-20161120GHGR,port:,serviceId=mima-cloud-producer,uri=http://PC-20161120GHGR:9906
host:PC-20161120GHGR,port:,serviceId=mima-cloud-producer2,uri=http://PC-20161120GHGR:9908
=============
host:PC-20161120GHGR,port:,serviceId=mima-cloud-producer,uri=http://PC-20161120GHGR:9905
host:PC-20161120GHGR,port:,serviceId=mima-cloud-producer2,uri=http://PC-20161120GHGR:9908
=============
host:PC-20161120GHGR,port:,serviceId=mima-cloud-producer,uri=http://PC-20161120GHGR:9906
host:PC-20161120GHGR,port:,serviceId=mima-cloud-producer2,uri=http://PC-20161120GHGR:9908
=============
host:PC-20161120GHGR,port:,serviceId=mima-cloud-producer,uri=http://PC-20161120GHGR:9905
host:PC-20161120GHGR,port:,serviceId=mima-cloud-producer2,uri=http://PC-20161120GHGR:9908
=============
host:PC-20161120GHGR,port:,serviceId=mima-cloud-producer,uri=http://PC-20161120GHGR:9906
host:PC-20161120GHGR,port:,serviceId=mima-cloud-producer2,uri=http://PC-20161120GHGR:9907
=============
host:PC-20161120GHGR,port:,serviceId=mima-cloud-producer,uri=http://PC-20161120GHGR:9905
host:PC-20161120GHGR,port:,serviceId=mima-cloud-producer2,uri=http://PC-20161120GHGR:9907
=============
host:PC-20161120GHGR,port:,serviceId=mima-cloud-producer,uri=http://PC-20161120GHGR:9906
host:PC-20161120GHGR,port:,serviceId=mima-cloud-producer2,uri=http://PC-20161120GHGR:9908
=============

从运行结果来看,可以发现mima-cloud-producer服务采用轮询的方式,mima-cloud-producer2服务采用随机的方式。

1、创建Ribbon配置类
1.1、ConsumerRibbonClientConfig——Ribbon配置类,采用轮询的策略

package com.mimaxueyuan.consumer.config;

import org.springframework.cloud.netflix.ribbon.ZonePreferenceServerListFilter;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; import com.netflix.client.config.IClientConfig;
import com.netflix.loadbalancer.DummyPing;
import com.netflix.loadbalancer.ILoadBalancer;
import com.netflix.loadbalancer.IPing;
import com.netflix.loadbalancer.IRule;
import com.netflix.loadbalancer.PollingServerListUpdater;
import com.netflix.loadbalancer.Server;
import com.netflix.loadbalancer.ServerList;
import com.netflix.loadbalancer.ServerListFilter;
import com.netflix.loadbalancer.ServerListUpdater;
import com.netflix.loadbalancer.ZoneAvoidanceRule;
import com.netflix.loadbalancer.ZoneAwareLoadBalancer; //自定义ribbon策略可以覆盖RibbonClientConfiguration中的默认配置。
//RibbonClientConfiguration每个方法都可以被覆盖
//自定义的Ribbon配置不能放在SpringApplication的同级或下级目录中会覆盖所有的Ribbon客户端配置,所有的客户端都使用了相同的配置。
//自定义的Ribbon配置不能放在ComponentScan的目录中否则次配置会覆盖所有的Ribbon客户端配置,所有的客户端都使用了相同的配置。
@Configuration
public class ConsumerRibbonClientConfig { public static final int DEFAULT_CONNECT_TIMEOUT = 1000;
public static final int DEFAULT_READ_TIMEOUT = 1000; @Bean
public IRule ribbonRule(IClientConfig config) {
     //轮询策略
ZoneAvoidanceRule rule = new ZoneAvoidanceRule();
rule.initWithNiwsConfig(config);
return rule;
} // 检测服务是否存活
@Bean
public IPing ribbonPing(IClientConfig config) {
return new DummyPing();
} /* 服务列保, 覆盖此方法,必须在yml/properties文件中配置服务列表
@Bean
public ServerList<Server> ribbonServerList(IClientConfig config) {
ConfigurationBasedServerList serverList = new ConfigurationBasedServerList();
serverList.initWithNiwsConfig(config);
return serverList;
}
*/ //服务列表更新器
@Bean
public ServerListUpdater ribbonServerListUpdater(IClientConfig config) {
return new PollingServerListUpdater(config);
} //负载均衡器
@Bean
public ILoadBalancer ribbonLoadBalancer(IClientConfig config,
ServerList<Server> serverList, ServerListFilter<Server> serverListFilter,
IRule rule, IPing ping, ServerListUpdater serverListUpdater) {
return new ZoneAwareLoadBalancer<>(config, rule, ping, serverList,
serverListFilter, serverListUpdater);
} //此接口允许过滤配置或动态获得的具有良好特性的候选服务器列表。
@Bean
public ServerListFilter<Server> ribbonServerListFilter(IClientConfig config) {
ZonePreferenceServerListFilter filter = new ZonePreferenceServerListFilter();
filter.initWithNiwsConfig(config);
return filter;
}
}

1.2、ConsumerRibbonClientConfig2——Ribbon配置类,采用随机的策略

package com.mimaxueyuan.consumer.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; import com.netflix.client.config.IClientConfig;
import com.netflix.loadbalancer.IRule;
import com.netflix.loadbalancer.RandomRule; //自定义ribbon策略可以覆盖RibbonClientConfiguration中的默认配置。
//RibbonClientConfiguration每个方法都可以被覆盖
//自定义的Ribbon配置不能放在SpringApplication的同级或下级目录中会覆盖所有的Ribbon客户端配置,所有的客户端都使用了相同的配置。
//自定义的Ribbon配置不能放在ComponentScan的目录中否则次配置会覆盖所有的Ribbon客户端配置,所有的客户端都使用了相同的配置。
@Configuration
public class ConsumerRibbonClientConfig2 { @Bean
public IRule ribbonRule(IClientConfig config) {
// 负载均衡规则,改为随机
return new RandomRule();
}
}

2、RibbonConsumerApplication——Ribbon启动类,及指定Ribbon的配置类

package com.mimaxueyuan.consumer.robbin;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.cloud.netflix.ribbon.RibbonClient;
import org.springframework.cloud.netflix.ribbon.RibbonClients;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Primary;
import org.springframework.web.client.RestTemplate; import com.mimaxueyuan.consumer.config.ConsumerRibbonClientConfig;
import com.mimaxueyuan.consumer.config.ConsumerRibbonClientConfig2; @SpringBootApplication
//@EnableEurekaClient
@EnableDiscoveryClient
//name=服务提供者的instanceName,configuration指定Ribbon的配置类
//@RibbonClient(name="mima-cloud-producer",configuration=ConsumerRibbonClientConfig.class)
@RibbonClients(
//配置defaultConfiguration会报空指针异常,有知道的同学麻烦告诉下
//defaultConfiguration=RibbonClientConfiguration.class,
value= {
@RibbonClient(name="mima-cloud-producer",configuration=ConsumerRibbonClientConfig.class),
@RibbonClient(name="mima-cloud-producer2",configuration=ConsumerRibbonClientConfig2.class)
})
public class RibbonConsumerApplication { @Bean
// 需要使用负载均衡,必须与Bean一同使用
@LoadBalanced
public RestTemplate balanceRestTemplate() {
return new RestTemplate();
} //需要多个RestTemplate, 有的RestTemplate使用负载均衡,有的不使用,不使用的不增加@LoadBalanced注解
@Primary
@Bean
public RestTemplate noBalanceRestTemplate() {
return new RestTemplate();
} public static void main(String[] args) {
SpringApplication.run(RibbonConsumerApplication.class, args);
} }

3、RibbonConfigController——Ribbon测试类

package com.mimaxueyuan.consumer.robbin.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.cloud.client.loadbalancer.LoadBalancerClient;
import org.springframework.cloud.netflix.ribbon.RibbonLoadBalancerClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate; @RestController
public class RibbonConfigController { // 注入restTemplate, 这个类已经在RibbonConsumerApplication中初始化,并且使用负载均衡
@Autowired //默认按照类型注入,如果需要按照名字注入需要使用@Qualifier注解
@LoadBalanced //使用带有负载均衡的RestTemplate
private RestTemplate balanceRestTemplate; // 以下注入负载均衡客户端LoadBalancerClient是一个接口,下面只有一个RibbonLoadBalancerClient实现类
@Autowired
private LoadBalancerClient loadBalancerClient;
@Autowired
private RibbonLoadBalancerClient ribbonLoadBalancerClient; /**
* ribbon使用
*
* @author Kevin
* @Title: ribbon
* @param id
* @return
* @return: String
*/
@GetMapping("/ribbon/get/{id}")
public String ribbon(@PathVariable("id") String id) {
ServiceInstance instance = loadBalancerClient.choose("mima-cloud-producer");
System.out.println("host:" + instance.getHost() + ",port:" + instance.getPort() + ",serviceId=" + instance.getServiceId() + ",uri=" + instance.getUri());
instance = ribbonLoadBalancerClient.choose("mima-cloud-producer2");
System.out.println("host:" + instance.getHost() + ",port:" + instance.getPort() + ",serviceId=" + instance.getServiceId() + ",uri=" + instance.getUri());
System.out.println("=============");
return "ribbon's demo,please to see console output";
} }

使用Java代码自定义Ribbon配置的更多相关文章

  1. SpringCloud系列八:自定义Ribbon配置

    1. 回顾 上文使用Ribbon实现了客户端侧的负载均衡.但是很多场景下,我们可能需要自定义Ribbon的配置,比如修改Ribbon的负载均衡规则. Spring Cloud允许使用Java代码或属性 ...

  2. SpringCloud系列五:Ribbon 负载均衡(Ribbon 基本使用、Ribbon 负载均衡、自定义 Ribbon 配置、禁用 Eureka 实现 Ribbon 调用)

    1.概念:Ribbon 负载均衡 2.具体内容 现在所有的服务已经通过了 Eureka 进行了注册,那么使用 Eureka 注册的目的是希望所有的服务都统一归属到 Eureka 之中进 行处理,但是现 ...

  3. 用JAVA代码获取Weblogic配置的JNDI 数据源连接

    第一步:生成与JDK版本对应的weblogicjar,利用cmd 进入到weblogic_home 路径下进入到server/lib目录,然后运行  JDK  1.6 命令 "java -j ...

  4. 基于java代码的springmvc配置

    在我的印象中,开发一个web项目首选当然是springmvc,而配置springmvc无非就是web.xml里配置其核心控制器DispatcherServlet.然后把所有的请求都交给它处理,再配个视 ...

  5. JavaConfig 使用Java代码进行显示配置

    从Spring 3起,JavaConfig功能已经包含在Spring核心模块,它允许开发者将bean定义和在Spring配置XML文件到Java类中. 需要先加载spring-context 包 &l ...

  6. mybatis逆向工程生成java代码和xml配置

    mybatis官方提供了一个逆向工程包,可以针对数据库表自动生成mybatis执行所需要的Pojo.Mapper xml文件.Mapper 接口文件. mybatis-generator有很多种用法: ...

  7. 使用配置文件自定义Ribbon配置

    1.application.yml——Ribbon配置文件 debug: false spring: application: name: mcc-ribbon-properties cloud: c ...

  8. Spring Cloud 通过代码自定义配置Ribbon

    我们还是先从官网文档开始学习,如下图所示,我们可以搞一个测试配置类,来验证是否真的可以通过代码来自定义配置Ribbon,但文档明确给出了警告:即这个测试配置类不能放在@ComponentScan所扫描 ...

  9. 使用Java代码配置MyBatis Generator

    使用MyBatis Generator生成器时,有时候没办法使用xml型的配置文件,比如将Maven项目设置成pom打包方式(<packaging>pom</packaging> ...

随机推荐

  1. 什么叫做API?看完你就理解了

    阅读编程资料时经常会看到API这个名词,网上各种高大上的解释估计放倒了一批初学者.初学者看到下面这一段话可能就有点头痛了. API(Application Programming Interface, ...

  2. SFTP搭建@windows using freeSHHd&FileZilla

    转自:http://blog.163.com/ls_19851213/blog/static/531321762009815657395/ Windows  xp 下 搭建 基于  ssh 的sftp ...

  3. 第一个VS2015 Xaramin Android项目(续)

    上文说到已经第一个 App已经可以运行,但是并不能调试! 经过细心发现,我察觉到VS刚开始进入了调试模式,但是一闪而过.也就是说调试失败了,此时需要等待一段时间才能打开此App,如果立即打开App 会 ...

  4. XML文件的DTD编写

    <?xml version="1.0" encoding="UTF-8" ?> <!--DTD外部引用:--> <!DOCTYPE ...

  5. turtle库的学习笔记

    (1)turtle使用pen来绘制图形 pendown()  放下画笔,移动到指定点后继续绘制 penup()   提起画笔,用于另起一个地方绘制时使用 pensize(width)   设置画笔线条 ...

  6. instr()函数--支持模糊查询

    1)instr()函数的格式  (俗称:字符查找函数) 格式一:instr( string1, string2 )    /   instr(源字符串, 目标字符串) 格式二:instr( strin ...

  7. SAS 逻辑库

    SAS逻辑库 SAS逻辑库是一个或多个SAS文件的集合,用于组织.查找和管理 SAS文件.SAS逻辑库管理的SAS文件包括SAS数据集.SAS目录.已编 译的SAS程序,以及多维数据库文件等. 1.逻 ...

  8. ABP框架系列之二十一:(Domain-Services-领域服务)

    Introduction Domain Services (or just Service, in DDD) is used to perform domain operations and busi ...

  9. 【转】Linux中的EAGAIN含义

    在Linux环境下开发经常会碰到很多错误(设置errno),其中EAGAIN是其中比较常见的一个错误(比如用在非阻塞操作中). 从字面上来看,是提示再试一次.这个错误经常出现在当应用程序进行一些非阻塞 ...

  10. navicat for mysql安装与破解

    Windows系统的电脑 navicat for mysql 的安装软件以及破解包 方法/步骤     从网上下载需要用到的navicat for mysql 的安装软件以及破解包.   双击navi ...