说明
Spring Cloud Ribbon是一个基于HTTP和TCP的客户端负载均衡工具,它基于Netflix Ribbon实现。通过Spring Cloud的封装,可以让我们轻松地将面向服务的REST模版请求自动转换成客户端负载均衡的服务调用。Spring Cloud Ribbon虽然只是一个工具类框架,它不像服务注册中心、配置中心、API网关那样需要独立部署,但是它几乎存在于每一个Spring Cloud构建的微服务和基础设施中。因为微服务间的调用,API网关的请求转发等内容,实际上都是通过Ribbon来实现的,包括后续我们将要介绍的Feign,它也是基于Ribbon实现的工具。所以,对Spring Cloud Ribbon的理解和使用,对于我们使用Spring Cloud来构建微服务非常重要,说白了就是多台消息生产者,给消费者提供一个负载,通关ribbon轮询,随机等在多台生产者服务器上获取某台服务,下面会讲到怎样使用消费者服务整合ribbon负载进行轮询或者随机等操作。
消息生产者consumer-order整合Ribbon负载均衡
以上consumer-order服务细节不会多讲,以上两篇文章讲解过怎样创建和eureka服务于注册,首先我需要修改原来已有的consumer-order消息消费者服务,相关依赖spring-cloud-starter-netflix-eureka-client,依赖支持ribbon所以不需要再添加其他依赖,只需进行修改其他的。
1.启动类添加RibbonClient 相关注解
/**
* Hello world!
*
*/
@SpringBootApplication
@EnableEurekaClient
@RibbonClient("PROVIDER-USER")
public class App
{
//注解一下restTemplate的bean
@LoadBalanced //启动ribbon负载均衡
@Bean
public RestTemplate template (){
return new RestTemplate();
}
public static void main( String[] args )
{
SpringApplication.run(RibbonApp.class,args);
}
}
2.consumer-order控制器修改使用restTemplate模板调用生产者服务接口修改,以前调用生产者服务时是吧地址写死,如果多台proviede-rorder 服务地址写成Eureka服务注册的Application地址名称如下代码
@RestController
public class OrderController {
@Autowired
private RestTemplate restTemplate; //spring 提供访问rest接口的模板对象
@Value("${url.value}")
private String url;
@GetMapping("/order/{id}")
public User getUser(@PathVariable Long id){
//原来地址改为eureka服务注册的生产者application地址名称PROVIDER-USER
User user= restTemplate.getForObject("http://PROVIDER-USER/user/"+id,User.class);
System.out.println("进入数据:"+user.toString());
return user;
}
}
3.启动多台proviede-rorder服务只需要把端口修改一下就可以了,如eureka注册页面
4.启动已修改好的consumer-order消费者服务,通关接口进行测试
一下接口是可以正常访问到多台消息生产者,ribbin负载默认是轮询的,为了检查是否是轮询负载,下面会通关LoadBalancerClient 来获取访问的地址ip
RestController
public class OrderController {
@Autowired
private RestTemplate restTemplate; //spring 提供访问rest接口的模板对象
@Value("${url.value}")
private String url;
@Autowired
private LoadBalancerClient loadBalancerClient;
@GetMapping("/test")
public void test(){
ServiceInstance serviceInstance = loadBalancerClient.choose("PROVIDER-USER");//查找对应服务的实列,会通关负载均衡算法去找查一个
System.err.println("数据:"+serviceInstance.getServiceId()+serviceInstance.getHost()+":"+serviceInstance.getPort());
}
}
启动服务调用http://http:8900/test接口多刷新几次在查看后台控制器输出。
自定义Ribbon算法及文件配置
通关springcloud官方文档说明可以使用IClientConfig自定义的配置文件进行算法定义,但是前提官方文档说明文件存放的位子,必须不能是子目录或者是同级目录下,存放文件否则会有异常抛出,一下通过@ComponentScan自定义一个注解接口进行排除,代码如下。
1.自定义一个排除注解bean的接口
2.创建 RibbonConfig文件如下
3.RibbonConfig 声明IRule的bean使用随机算法
@ExcludeCommentScan //自定义的排除注解,避免文件存放位子问题
@Configuration
public class RibbonConfig {
@Autowired
IClientConfig clientConfig;
@Bean
public IRule ribbonRule(IClientConfig config){
return new RandomRule(); //返回随机算法
}
}
4.修改启动类
@SpringBootApplication
@EnableEurekaClient
@RibbonClient(name ="PROVIDER-USER",configuration = RibbonConfig.class)
@ComponentScan(excludeFilters = {@ComponentScan.Filter(type = FilterType.ANNOTATION,value =ExcludeCommentScan.class )}) //通关@ComponentScan排除文件存放的位子问题
public class RibbonApp
{
//注解一下restTemplate的bean
@LoadBalanced //启动ribbon负载均衡
@Bean
public RestTemplate template (){
return new RestTemplate();
}
public static void main( String[] args )
{
SpringApplication.run(RibbonApp.class,args);
}
}
5.启动访问test测试接口是否是随机模式算法
还有一种通关yml配置文件来申明算法的,这个就不多讲了,下一篇使用Feign代替RestTemplate服务直接的接口调用与交互