Ribbon学习

Ribbon学习

Ribbon概念

Spring Cloud Ribbon是基于Netflix Ribbon实现的一套客户端负载均衡工具

概念说:主要提供客户端的软件负载均衡算法和服务调用,Ribbon客户端组件提供一系列完善的配置项,如连接超时、重试等

代码说:Ribbon通过配置文件中列出Load Balancer(负载均衡)所有的机器,自动基于某种规则(简单轮询、随机连接等)去连接这些机器,让我们很容易的实现自定义负载均衡算法。

添加依赖

springcloud 2020.0.x版本后默认使用的spring-cloud-starter-loadbalancer,我们需要移除他,添加Ribbon依赖

<!--Eureka Client依赖-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
    <!--移除默认使用的spring-cloud-starter-loadBalancer-->
    <!--<exclusions>
                <exclusion>
                    <groupId>org.springframework.cloud</groupId>
                    <artifactId>spring-cloud-starter-loadbalancer</artifactId>
                </exclusion>
            </exclusions>-->
</dependency>
<!--添加Ribbon依赖-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
    <!--在springcloud 2020.0.x版本已经剔除了ribbon,所以要显示的指定版本-->
    <version>2.2.8.RELEASE</version>
</dependency>

Ribbon默认负载规则替换

Ribbon默认为轮询策略,以下代码修改为随机策略

注意:定义的配置类一定不能放在@ComponentScan能扫描的位置,官方提醒

配置类

@Configuration
public class MySelfRule {
    @Bean
    public IRule getRule(){
        //指定随机轮询
        return new RandomRule();
    }
}

启动类

@SpringBootApplication
@EnableEurekaClient
//name:指定服务提供者,configuration:自定义的策略配置类
@LoadBalancerClient(name = "PAYMENT-SERVICE",configuration= MySelfRule.class)
public class ApplicationOrder {
    public static void main(String[] args) {
        SpringApplication.run(ApplicationOrder.class,args);
    }
}

主要功能

通过RestTemplate+ @LoadBalanced 注解实现服务调用负载均衡,可参考以上进行代码进行默认策略修改

定义RestTemplate

@Configuration
public class ApplicationContextConfig {

    @Bean
    @LoadBalanced //开启负载均衡
    public RestTemplate getRestTemplate(){
        return new RestTemplate();
    }

}

使用RestTemplate

//getForEntity方式:会返回整个响应的内容,包括状态码、响应头、响应体等
ResponseEntity<AjaxResult> forEntity =
        restTemplate.getForEntity(PAYMENT_URL + "list", AjaxResult.class);
return forEntity.getBody();

//getForObject方式:只返回结果json串
AjaxResult forEntity =
                restTemplate.getForObject(PAYMENT_URL + "paymentById/{id}", AjaxResult.class,id);
        return forEntity;
posted @ 2021-08-06 00:20  幸运刘  阅读(48)  评论(0)    收藏  举报