【SpringCloudNetflix-Ribbon客户端负载均衡】


前言

例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。


一、什么是Ribbon?

Ribbon是Netflix发布的云中间层服务开源项目,主要功能是提供客户端负载均衡算法。Ribbon客户端组件提供一系列完善的配置项,如,连接超时,重试等。简单的说,Ribbon是一个客户端负载均衡器,Ribbon可以按照负载均衡算法(如简单轮询,随机连接等)向多个服务发起调用(正好可以解决上面的问题),我们也很容易使用Ribbon实现自定义的负载均衡算法。

二、为什么要Ribbon

我们知道,为了防止应用出现单节点故障问题,同时为了提高应用的作业能力,我们需要对应用做集群 ,如果我们对user-server(用户服务)做了集群 ,那么这个时候回衍生出一些问题:现在有两个user-server(用户服务)就意味着有两个user-server(用户服务)的通信地址,我的order-server(订单服务)在向user-server(用户服务)发起调用的时候该访问哪个?如何访问?这个时候就需要有一个组件帮我们做请求的分发,即:负载均衡器,而Ribbon就是一个 - 客户端负载均衡器。

三、Ribbon的工作机制

我们将user-server(用户服务)做集群处理,增加到2个节点(注意:两个user-server(用户服务)的服务名要一样,ip和端口不一样),在注册中心的服务通信地址清单中user-server(用户服务)这个服务下面会挂载两个通信地址 。 order-server(订单服务)会定时把服务通信地址清单拉取到本地进行缓存, 那么当order-server(订单服务)在向user-server(用户服务)发起调用时,需要指定服务名为 user-server(用户服务);那么这个时候,ribbon会根据user-server(用户服务)这个服务名找到两个order-server的通信地址 , 然后ribbon会按照负载均衡算法(默认轮询)选择其中的某一个通信地址,发起http请求实现服务的调用,如下图:
代码如下(示例):
![在这里插入图片描述](https://img-blog.csdnimg.cn/eee8954d1bd84fb793aa47f8bc3e2b50.png

四、代码实操

1.提供者user-server(用户服务)集群

1.1 服务集群方案

使用SpringBoot多环境配置方式集群,一个配置文件配置多个order-server环境 ,需要注意的是集群中的多个服务名(spring.application.name)应该一样,我们把相同的东西提取到最上面,不同的东西配置在各自的环境中

1.2 用户服务集群配置

  • 设置idea中的,版本不一样位置不一样,请百度
    在这里插入图片描述
  • 修改application.yml配置中的端口和实例ID,分别启动两个或多个user客户端

2.Controller接口

代码如下(示例):

@RestController
public class UserConroller {
    @Value("${server.port}")   // 获取yml中配置的端口号,区分同一个业务的不同服务
    private Long port;
    @GetMapping("/user/{id}")
    public User getUserById(@PathVariable("id") Long id){
        return new User(id,"张飞","端口号:"+port);
    }
}

3.消费者Order-server集成Ribbon

Ribbon集成官方文档:https://cloud.spring.io/spring-cloud-static/Greenwich.SR5/multi/multi_spring-cloud-ribbon.html#netflix-ribbon-starter

3.1 在Order-server模块中,导入Ribbon依赖

代码如下(示例):

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

3.2 开启负载均衡

修改RestTemplate的Bean的定义方法,加上Ribbon的负载均衡注解@LoadBalanced赋予RestTemplate有负债均衡的能力。

@SpringBootApplication
public class OrderServiceApp{
    public static void main( String[] args )
    {
        SpringApplication.run(OrderServiceApp.class, args);
    }
    // 声明一个RestTemplate交给spring去管理
    // @LoadBalanced 赋予RestTemplate有负债均衡的能力
    @Bean
    @LoadBalanced
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }
}

3.3 Controller调用方式

把 “地址:端口号” 修改为 用户服务的服务名 。底层会通过服务发现的方式使用Ribbin进行负载均衡调用。

@RestController
public class OrderController {
    @Autowired
    private RestTemplate template; // 注入RestTemplate 
    @GetMapping("/order/{id}")
    public User getUser(@PathVariable("id") Long id) {
        // http://USERSERVICE/user/1 USERSERVICE为调用的服务名
        User user = template.getForObject("http://USERSERVICE/user/" + id, User.class);
        return user;
    }
}

4 负载均衡算法

4.1 Ribbon内置算法

1,轮询 com.netflix.loadbalancer.RoundRobinRule
2,随机 com.netflix.loadbalancer.RandomRule
3,重试 先按照RoundRobinRule的策略获取服务,如果获取服务失败则在指定时间内进行重试,获取可用的服务 com.netflix.loadbalancer.RetryRule
4,对RoundRobinRule的扩展,响应速度越快的实例选择权重越多大,越容易被选择 WeightedResponseTimeRule
5,会先过滤掉由于多次访问故障而处于断路器跳闸状态的服务,然后选择一个并发量最小的服务 BestAvailableRule
6,先过滤掉故障实例,再选择并发较小的实例 AvailabilityFilteringRule
7,默认规则,复合判断server所在区域的性能和server的可用性选择服务器ZoneAvoidanceRule

4.2 配置负载均衡算法

Ribbon可以进行全局负载均衡算法配置,也可以针对于具体的服务做不同的算法配置。同时可以使用注解方式和yml配置方式来实现上面两种情况。

4.2.1 注解全局配置

在启动类中,需要将RandomRule配置成Bean即可

	//负载均衡算法
    @Bean
    public RandomRule randomRule(){
        return new RandomRule();
    }
4.2.2 .yml方式配置负载均衡算法

配置全局Ribbon算法

ribbon:
   NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule

配置某个服务的Ribbon算法

user-server:
  ribbon:
    NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule

注意:项目中根据实际需求进行配置


总结

对Ribbon客户端负载均衡的学习,总结基本概念和使用

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值