SpringCloud微服务入门:ribbon负载均衡整合与使用

说明

         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服务直接的接口调用与交互

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值