zoukankan      html  css  js  c++  java
  • 使用ribbon实现负载均衡

    使用ribbon之前的准备工作:

      1.你要有两个服务,一个是服务消费方(下图的xing-movie是消费方),一个是服务提供方(xing-user是服务提供者),并且服务提供方要有两个实例,也就是xing-user有两个实例,分别运行在8070和8071端口。

      2.所有服务注册到eureka server中。

        

    接下来我们在movie服务使用ribbon实现负载均衡调用中调用user服务,spring cloud使用ribbon很简单

      1.引入依赖,因为user服务的pom.xml中引入了eureka的依赖,eureka的依赖包含了ribbon的依赖所以这一步省略

      2.在movie服务的启动类中加入标红的代码,加入是为了在之后调用的时候可以直接@Autowired  restTemplate,顺便提醒一下,@Autowired是 byType的,不是byName:

      

    package com.xing.movie;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.cloud.client.loadbalancer.LoadBalanced;
    import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
    import org.springframework.context.annotation.Bean;
    import org.springframework.web.client.RestTemplate;
    
    @SpringBootApplication
    @EnableEurekaClient
    public class SpringDemoApplication {
    
        @Bean
        @LoadBalanced
        public RestTemplate restTemplate() {
            return new RestTemplate();
        }
        public static void main(String[] args) {
            SpringApplication.run(SpringDemoApplication.class, args);
        }
    }

      启动类写好之后我们去controller类中写调用user服务的方法:

         @Autowired
        private RestTemplate restTemplate;

       @ApiOperation(value = "查询用户", notes = "查询用户")//方法说明
        @ApiResponses(value = {@ApiResponse(code = 200, message = "成功", response = Movie.class)})//响应数据说明,可以有多个
        @ApiImplicitParam(name = "name", value = "用户名", paramType = "path", required = true, dataType = "String")
        @GetMapping(value = "/findUerByName/{name}",produces = { "application/json;charset=UTF-8" })
        public User findUserByName(@PathVariable String name) {
            return this.restTemplate.getForObject("http://xing-user/user/findByName/"+name, User.class);
        }

      标红的地方要注意使用的是user服务的spring.application.name,这里使用到的user服务在上一篇博客中有具体的代码,最后一行代码中的User.class是返回类型,如果报错那就去user服务中把User类拷贝过来,到目前为止ribbon的简答的负载均衡就搞定了,查看结果

    可以看到已经成功的调用到了user服务,并返回了数据,这个时候我们只能说服务调用成功并不能说负载均衡。这个网页我们多刷新几遍,多做几次请求,之后去查看后台数据会发现user1中的控制台打印了数据,user2的控制台也打印了数据,说明负载均衡成功。

    简单提一下spring cloud中ribbon的负载均衡算法默认是轮询。那么我们不想使用轮询怎么自定义呢?

    我们首先需要创建一个class,根据官方文档这个类必须在启动类能扫描的范围之外,所以这个class定义的位置如下:

    RibbonConfig.java:

    package com.xing.config;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
    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;
    
    /**
    * Copyright: Copyright (c) 2018 LanRu-Caifu
    * @ClassName: RibbonConfig.java
    * @Description: 自定义ribbon配置类
    * @version: v1.0.0
    * @author: zjx
    * @date: 2018年11月2日 上午10:08:36
     */
    
    @Configuration
    public class RibbonConfig {
        
        @Autowired
        IClientConfig config;
        
        @Bean
        @ConditionalOnMissingBean
        public IRule ribbonRule(IClientConfig config) {
            System.out.println("-------ribbon自定义随机------");
            return new RandomRule();
        }
    }
    RibbonConfig.java

    movie服务的启动类修改之后如下:

    package com.xing.movie;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.cloud.client.loadbalancer.LoadBalanced;
    import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
    import org.springframework.cloud.netflix.ribbon.RibbonClient;
    import org.springframework.context.annotation.Bean;
    import org.springframework.web.client.RestTemplate;
    
    import com.xing.config.RibbonConfig;
    
    @SpringBootApplication
    @EnableEurekaClient
    @RibbonClient(name = "xing-user" , configuration = RibbonConfig.class)
    public class SpringDemoApplication {
    
        @Bean
        @LoadBalanced
        public RestTemplate restTemplate() {
            return new RestTemplate();
        }
        public static void main(String[] args) {
            SpringApplication.run(SpringDemoApplication.class, args);
        }
    }
    SpringDemoApplication

    最后启动类测试,做了4次请求,user1打印了3次,user2打印了1次

     

    还有其他的很多种配置方式,这里只简单写出这种,以后有空还会补充配置文件的方式等等

     源码地址:https://github.com/OnlyXingxing/SpringCloud

  • 相关阅读:
    Which is the best software for MANET simulation?
    CORE—Common Open Research Emulator—INSTALL—Network Emulator
    Open-Source Network Simulators—CORE—Cloonix—GNS3—IMUNES
    mutt—linux命令行发带附件邮件—message file too big
    幼儿园复读生
    【codeforces 779D】String Game
    【BZOJ 1014】 [JSOI2008]火星人prefix
    【t004】切割矩阵
    【BZOJ 1015】 [JSOI2008]星球大战starwar
    【BZOJ 1016】[JSOI2008]最小生成树计数(搜索+克鲁斯卡尔)
  • 原文地址:https://www.cnblogs.com/xing-12/p/9889153.html
Copyright © 2011-2022 走看看