zoukankan      html  css  js  c++  java
  • springCloud初识2-负载均衡Ribbon

    负载均衡Ribbon

    Ribbon是Netflix 发布的负载均衡器,它有助于控制HTTP和TCP客户端的行为。为Ribbon配置服务提供者地址列表后,Ribbon 就可基于某种负载均衡算法,自动地帮助服务泌费者去请求。
    Ribbon 默认为我们提供了很多的负载均衡算法,例如轮询(一个一个轮下去到结尾又从头开始)、随机等。当然,我们也可为Ribbon实现自定义的负载均衡算法。

    基本使用

    1--引入启动器(消费方引入)

    eureka默认集成了ribbon,引入了eureka后可以不用再引入ribbon
    

    2--覆盖默认配置

    可不用覆盖任何配置也可以使用
    

    3--引导类启用组件(消费方开启)

    package com.xiaoai.service;
    
    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.context.annotation.Bean;
    import org.springframework.web.client.RestTemplate;
    
    @SpringBootApplication
    @EnableDiscoveryClient  //启用eureka客户端,@EnableEurekaClient也可以
    public class XiaoaiServiceConsumerApplication {
    
    	@Bean
    	@LoadBalanced  //开启ribbon负载均衡
    	public RestTemplate restTemplate(){
    		return new RestTemplate();
    	}
    
    	public static void main(String[] args) {
    		SpringApplication.run(XiaoaiServiceConsumerApplication.class, args);
    	}
    }
    
    

    4--消费方控制器方法消费

    package com.xiaoai.service.controller;
    
    import com.xiaoai.service.pojo.User;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.cloud.client.ServiceInstance;
    import org.springframework.cloud.client.discovery.DiscoveryClient;
    import org.springframework.web.bind.annotation.*;
    import org.springframework.web.client.RestTemplate;
    
    import java.util.List;
    
    @RestController
    @RequestMapping("/consumer/user")
    public class UserController {
    
    //    //--------------------------------------------消费方传统方式调用提供方
    //    @Autowired
    //    private RestTemplate restTemplate;
    
    //    @GetMapping
    //    @ResponseBody
    //    public User queryUserById(@RequestParam("id")Long id){
    //        return this.restTemplate.getForObject("http://localhost:8081/user/"+id,User.class);
    //    }
    
    //    //--------------------------------------------改造消费方,解决地址硬编码问题
    //    @Autowired
    //    private RestTemplate restTemplate;
    //    @Autowired
    //    private DiscoveryClient discoveryClient;  //最早的时候服务发现注册都是通过DiscoveryClient来实现的,随着版本变迁把DiscoveryClient服务注册抽离出来变成了ServiceRegistry抽象,专门负责服务注册,DiscoveryClient专门负责服务发现
    //
    //    @GetMapping
    //    @ResponseBody
    //    public User queryUserById(@RequestParam("id")Long id){
    //        List<ServiceInstance> instances = discoveryClient.getInstances("service-provider"); //通过serviceId获取实例列表
    //        ServiceInstance instance = instances.get(0); //获取一个服务实例,由于这里只运行了一个提供服务,直接获取列表第一个即可
    //        return this.restTemplate.getForObject("http://" + instance.getHost() + ":" + instance.getPort() + "/user/"+id,User.class); //通过实例拼接对应的url
    //    }
    
        //-----------------------------------------------改造消费方,解决地址硬编码问题    启用ribbon负载均衡后
        @Autowired
        private RestTemplate restTemplate;
    
        @GetMapping
        @ResponseBody
        public User queryUserById(@RequestParam("id")Long id){
            return this.restTemplate.getForObject("http://service-provider/user/"+id,User.class);
        }
    
    }
    

    定义负载均衡策略

    可实现 Irule接口自定义策略
    默认已经实现了好几种

    如何设置默认某一种策略?
    可以在消费服务端application.yml配置文件加入配置

    service- provider:  # 这是服务提供方的服务id即之前自己注册服务时定义的名称
      ribbon:
        NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule  
    
  • 相关阅读:
    9.Nginx常用模块
    8.Nginx基本概述
    7.HTTP协议
    6. SSH远程管理服务实战
    5. Sersync实时同步
    docker 安装 rabbitMQ服务器
    rabbitmq pika(python)订阅发布多客户端消费场景简单使用
    rabbitmq和kafka大概比较
    flask接收跨域请求
    命令提示符出现-bash-4.1$如何解决
  • 原文地址:https://www.cnblogs.com/xiaoaiying/p/13432839.html
Copyright © 2011-2022 走看看