SpringCloud (二)、Ribbon客户端负载均衡

Ribbon

学过Nginx的都知道它是一个服务端负载均衡器,而Ribbon 也是一个负载均衡器,只不过它是基于基于HTTP和TCP的客户端负载均衡器。

代码实现

准备工作

1、启动一个eureka服务
2、一个生产者集群,有两个节点(端口7900、端口7901)
3、一个ribbon 客户端

生产者我们用上次的代码即可,下面是ribbon客户端的代码实现。

一、使用默认的负载均衡策略(轮询)

1、导入依赖

官方的文档是需要导入spring-cloud-starter-ribbon 依赖,如下图
这里写图片描述
但是呢,我们需要导入的eureka的依赖已经包含了ribbon的依赖

这里写图片描述
所以导入spring-cloud-starter-eureka即可

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
2、加上注解

只需要在客户端的RestTemplate bean上加上注解@LoadBalanced即可用默认的负载均衡策略(轮询)。

@SpringBootApplication
@EnableEurekaClient
public class CustomerRibbonApplication {

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

    @Bean
    @LoadBalanced
    public RestTemplate restTemlate() {
        return new RestTemplate();
    }
}
3、控制层访问生产者

常规我们的restTemplate.getForObject()的第一个参数地址是写死的,这里我们写上服务名称 producer即可

@RestController
public class TestController {

    @Autowired
    private RestTemplate restTemplate;

    @GetMapping("/provider/{id}")
    public Object test(@PathVariable("id") String id) {
        Object obj = restTemplate.getForObject("http://producer/item/"+id,Object.class);
        System.out.println("obj="+obj.toString());
        return obj;
    }
把生产者和eureka服务与ribbon客户端启之后,我们看看eureka 的服务注册情况

这里写图片描述

因为我们知道生产者有一个片段代码是长这样的:

@GetMapping("/item/{id}")
public Object test(@PathVariable("id")String id,HttpServletRequest request) {
    int port = request.getServerPort();
    System.out.println("item---id,port:"+port);
    return new Item(id,port+"");
}

然后我们浏览器访问:
http://localhost:8901/provider/1
刚好调用的是生产者/item/{id}这个接口,我们可以观察控制台的打印情况,知道负载均衡是否有效,我们多请求几次,然后看控制台的代码如下:

这里写图片描述

从打印结果知道,我们已经成功实现了负载均衡

还有就是,这个默认的是轮询的负载均衡,我们怎么自定义自己的负载均衡策略,看下面第二种情况

二、自定义负载均衡策略

1、创建一个自定义的配置类RuleConfig

这个配置类的路径,不要在启动类的包路径之下

@Configurable
public class RuleConfig {
    @Bean
    public IRule ribbonRule(IClientConfig config) {
        //RandomRule 是随机策略
        return new RandomRule();
    }

}

我们看看IRule的实现类
这里写图片描述
结合自己的需要,返回相应的Rule即可

2、启动类加注解

@RibbonClient注解给哪个服务启动负载均衡策略,参数中的name 是服务名称,configuration 后面跟着是负载均衡自定义配置类

@Configuration
@RibbonClient(name="producer2",configuration=RuleConfig.class)
@SpringBootApplication
@EnableEurekaClient
public class CustomerRibbonApplication {

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

    @Bean
    @LoadBalanced
    public RestTemplate restTemlate() {
        return new RestTemplate();
    }
}
3、测试是否生效
@RestController
public class TestController {


    @Autowired
    private LoadBalancerClient loadBalancerClient;

    @GetMapping("/test")
    public Object test2() {
        //下面是当前的访问请求producer2服务中,具体选择的是哪个服务
        ServiceInstance serverInstance = loadBalancerClient.choose("producer2");
        String result = "===="+serverInstance.getHost()+":"+serverInstance.getPort();
        System.out.println(result);
        return result;
    }
}
eureka 服务注册情况

这里写图片描述

多次访问:http://localhost:8901/test
查看控制台

这里写图片描述

可以知道是随机的,还有一种是,如果我想要producer服务 是默认的,producer2服务是随机的,怎么配置

其实很简单,想要的默认的不需要配置,只配置你想要自定义的即可,如下:随机加轮询
这里写图片描述

Github代码地址

收工
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值