乐趣区

关于springcloud:SpringCloud入门2Ribbon

Ribbon 是客户端的 负载均衡器 ,消费者能够通过服务别名调用服务时,须要 Ribbon 做负载平衡来以 某种机制 拜访理论的服务调用地址。

简略类比,咱们去找 Tony 老师,个别理发店都会有多个 Tony 老师。然而也会有一个相似前台的工作人员为咱们安顿有空的 Tony 老师理发。工作人员就是相似 Ribbon,是依照程序安顿呢,还是随机安顿呢。

Ribbon + Eureka

创立我的项目

同样创立一个 Ribbon 的 空模块 ,而后在 Ribbon 空模块下创立一个ribbon-consume9101 子模块。在父类也就是空模块的 pom 文件中退出依赖

<dependencies>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
    </dependency>
</dependencies>

当你引入了 Eureka 相干的依赖的时候其实就曾经把 Ribbon 的依赖引入进来了,所以如果应用的是 Ribbon + Eureka,能够不必写下面的依赖也能运行。

创立实现后整体的 我的项目构造 如图所示

配置文件

application.yml

server:
  port: 9101

spring:
  application:
    name: ribbon-consume
eureka:
  client:
    fetch-registry: true
    register-with-eureka: true
    service-url:
      defaultZone: http://localhost:8001/eureka/
  instance:
    instance-id: ribbon-consume9101

启动和业务类

留神咱们的服务的提供者是eureka-provide 服务,这个服务名字可能单取provide 更精确点,当前我的项目重构的时候可能会批改。

波及到服务与服务之间的调用,个别会抉择应用 RestTemplate,同时须要把它注入 Spring 容器中,所以抉择应用 配置类

@Configuration
public class ApplicationContextConfig {

    @Bean
    @LoadBalanced       // 负载平衡须要的注解
    public RestTemplate getRestTemplate() {return new RestTemplate();
    }
}

接下来就是 主启动类

@SpringBootApplication
@EnableEurekaClient
@RestController
public class RibbonConsume9101 {
    final String PROVIDE_URL = "http://eureka-provide";

    RestTemplate restTemplate;

    public RibbonConsume9101(RestTemplate restTemplate) {this.restTemplate = restTemplate;}

    @GetMapping("/ribbon/consume")
    public String getInfo() {return "i am consumer, but actually invoke other service: [" + restTemplate.getForObject(PROVIDE_URL + "/eureka/provide", String.class) + "]";
    }

    public static void main(String[] args) {SpringApplication.run(RibbonConsume9101.class, args);
    }
}

测试

  1. 开启 Eureak注册核心EurekaServer8001
  2. 开启 3 个不同端口的 服务提供者EurekaProvide7001EurekaProvide7002 , EurekaProvide7003
  3. 开启刚刚建设的 Ribbon消费者RibbonConsume9101

首先看下 Eureka 注册核心,能够看到 3 个服务提供者,1 个消费者都曾经注册到 Eureka。

接着生产端拜访接口轮询,也是默认规定)。>http://localhost:9101/ribbon/…

自定义配置类

上述调用服务的时候显著是轮询的形式,那如果想要其它形式去调用呢,这时候就须要自定义配置类。

Ribbon 次要有 6 个组件

  • ServerList: 定义获取服务器列表
  • ServerListFilter: 对 ServerList 列表进行二次过滤
  • ServerListUpdater: 定义服务更新策略
  • Iping: 查看服务列表是否存活
  • IRlue: 依据算法抉择调用服务列表中的某一个服务
  • ILoadBalancer: 软件负载均衡器入口,整合以上所有的组件实现负载性能
@Configuration
public class RibbonCustomConfig {
    @Bean
   public IRule ribbonRule() {return new RandomRule();
   }
}

IRlue 接口就是以什么样的 规定 调用服务提供者,能够看下该接口的实现类

怎么让这个配置文件被 Ribbon 感知到呢,就须要利用@RibbonClient 注解。建设一个空的注解类,加上注解和配置类就可能自定义 Ribbon 配置。

@Configuration
@RibbonClient(name = "eureka-provide", configuration = RibbonCustomConfig.class)
public class RibbonConfig {}

这里的名字就是咱们 须要调用的服务端的配置文件中的springcloud.application.name 的值。须要留神的是,在官网文档外面有这样一段话

在这个例子中翻译过去就是RibbonCustomConfig 如果和主启动类在同一个包下,就会被扫描进 Spring 中,这样会导致配置文件会被所有的@RibbonClients 所共享。当然也能够用@ComponentScan 把配置文件排除在外。

重启RibbonConsume9101 服务,其它的不必动,同样调用生产端拜访接口 http://localhost:9101/ribbon/…

点的时候,啥,怎么始终调用的是 7001 端口,难道其它服务挂掉了,能够看到前面显著放慢了点的速度,最初还好没有翻车,的确是改成了随机规定。

自定义配置文件

除了通过配置类来自定义 Ribbon 外,还能够通过配置文件来自定义

这里 clientName 同样是 须要调用的服务端的配置文件中的springcloud.application.name 的值。 如果是齐全本人写的类呢,须要实现对应的接口,这里同样采纳 Netflix 写好的RandomRule 类。

RibbonCustomConfigRibbonConfig 删掉或者全副正文掉都能够,批改配置文件

server:
  port: 9101

spring:
  application:
    name: ribbon-consume
eureka:
  client:
    fetch-registry: true
    register-with-eureka: true
    service-url:
      defaultZone: http://localhost:8001/eureka/
  instance:
    instance-id: ribbon-consume9101

#其实就是加了上面的内容
eureka-provide:
  ribbon:
    NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule

其中eureka-provide 就是 clientName。接着一样重启RibbonConsume9101 服务,其它的不必动,同样调用生产端拜访接口 http://localhost:9101/ribbon/…

值得注意的是,在配置文件中配置的变量是要比配置类中的优先级要高的。

Ribbon

下面是消费者端和服务端都注册进了 Eureka,相当于消费者通过 Eureka 去找到了其它服务提供者的服务。那在真正业务中承受了新的消费者端,并没有注册进 Eureka,怎么解决这个问题呢?

先来看看没有注册进去会产生什么状况,想都不必想必定是间接报错了

创立我的项目

同样在 Ribbon 父模块上面建设一个子模块

配置文件

因为 不必注册 进 Eureka,所以配置文件也要做相应的批改

server:
  port: 9102

spring:
  application:
    name: ribbon-consume-without-eureka

#禁用掉 Eureka,其实禁用不禁用都不影响,因为基本就没导入
ribbon:
  eureka:
    enabled: false

启动和业务类

同样须要导入 RestTemplate 所以能够间接 复制 上一个子模块

@Configuration
public class ApplicationContextConfig {

    @Bean
    @LoadBalanced
    public RestTemplate getRestTemplate() {return new RestTemplate();
    }
}

主启动类也能够间接 复制,不须要用到 Eureka,去掉@EnableEurekaClient 注解并批改类名即可

@SpringBootApplication
@RestController
public class RibbonConsumeWithoutEureka9102 {
    final String PROVIDE_URL = "http://eureka-provide";

    RestTemplate restTemplate;
    
    public RibbonConsumeWithoutEureka9102(RestTemplate restTemplate) {this.restTemplate = restTemplate;}

    @GetMapping("/ribbon/consume")
    public String getInfo() {return "i am consumer, but actually invoke other service: [" + restTemplate.getForObject(PROVIDE_URL + "/eureka/provide", String.class) + "]";
    }

    public static void main(String[] args) {SpringApplication.run(RibbonConsumeWithoutEureka9102.class, args);
    }
}

那怎么消费者调用的时候怎么晓得去哪找提供者的服务呢,就须要动配置文件了

server:
  port: 9102

spring:
  application:
    name: ribbon-consume-without-eureka
ribbon:
  eureka:
    enabled: false

#以下为减少内容
eureka-provide:
  ribbon:
    listOfServers: localhost:7001, localhost:7002, localhost:7003

其中 eureka-provide 就是 须要调用的服务端的配置文件中的springcloud.application.name 的值

开启 RibbonConsume9102 服务,其它的不必动,调用生产端拜访接口 http://localhost:9102/ribbon/…,能够看到也是可能依照 默认轮询 的形式调用服务。

创作不易,如果对你有帮忙,欢送点赞,珍藏和分享啦!

上面是集体公众号,有趣味的能够关注一下,说不定就是你的宝藏公众号哦,根本 2,3 天 1 更技术文章!!!

退出移动版