引言

本篇博客简单介绍微服务负载均衡的概念,并通过 IDEA 多端口启动应用的方式,模拟多个应用实例,使用自定义和 Ribbon 两种方式实现基本的负载均衡策略。

微服务代码以《Spring Cloud Alibaba——Nacos实现服务治理》为基础。

一、什么是负载均衡

负载指的是系统接收请求的压力,通常来讲,单体应用如果接收的请求量过多,会对应用本身造成一定的并发困扰,导致逻辑出错,甚至是服务瘫痪。

为了解决单个应用访问量过大的情况,人们很自然的想到将一个单体应用克隆多份,来分摊请求量,均衡负载。

负载均衡就是将负载(工作任务、访问量)进行分摊到多个操作单元(服务器、组件)上执行的一套技术。

根据负载均衡发生的位置不同,一般分为:服务端负载均衡、客户端负载均衡

1、服务端负载均衡指的是分摊工作发生在服务提供者一方,比如常见的 Nginx 。

2、客户端负载均衡则恰好相反,它指的是分摊工作发生在服务请求的一方,即在发送请求之前就已经选好了由具体的哪一个实例处理请求。如下图所示:

一般在微服务中,都是使用客户端负载均衡

二、IDEA 中模拟多个微服务实例

使用 idea 可以轻松的为一个 spring boot 服务创建多个微服务实例。以《Spring Cloud Alibaba——Nacos实现服务治理》的代码用例为例,这里简单回顾一下 Demo 用例。

我们创建了一个电商系统,有三个微服务:shop-user 用户微服务、shop-product 商品微服务、shop-order 订单微服务,我们使用 Nacos 实现了服务的注册发现,并实现了完整的用户下单——>查询商品——>返回订单的微服务调用逻辑,如下图所示:

但上述案例只涉及到了一个订单微服务实例对应另一个商品微服务实例,并没有任何负载均衡的效果,为了演示负载均衡,我们可以通过 idea 将shop-product 微服务启动多个实例。

方法是,在启动项中添加多个:

配置好第二个商品微服务实例之后,我们启动 ProductApplication 和 ProductApplication2,可以在 Nacos 中看到注册的商品服务实例有 2 个(关于Nacos 的相关知识参考《Spring Cloud Alibaba——Nacos实现服务治理》):

三、自定义负载均衡

最简单的负载均衡机制就是通过随机数,根据服务提供者(商品服务)的实例数量,来随机生成服务序号,从而确定访问的实例。

我们在订单微服务中加入随机数代码:

以下是完整代码:

@Slf4j
@RestController
@RequestMapping("/order")
public class OrderController {@Autowiredprivate RestTemplate restTemplate;@Autowiredprivate DiscoveryClient discoveryClient;@Autowiredprivate OrderService orderService;/**** 下单* @param pid* @return*/@GetMapping("/prod/{pid}")public Order order(@PathVariable("pid") Integer pid) {log.info("接收到{}号商品的下单请求,准备调用商品微服务", pid);// 获取服务实例列表List<ServiceInstance> serviceList = discoveryClient.getInstances("service-product");// 生成随机下标 0 1int index = new Random().nextInt(serviceList.size());// 获取实例对象ServiceInstance productService = serviceList.get(index);// 调用商品微服务,查询商品信息Product prod = restTemplate.getForObject("http://" + productService.getHost() + ":" + productService.getPort() + "/product/" + pid, Product.class);log.info("查询到{}号商品信息,内容是:{}", pid, JSON.toJSONString(prod));// 下单(即创建订单并保存)Order order = new Order();order.setUid(1);order.setUsername("测试用户");order.setPid(pid);order.setPname(prod.getPname());order.setPprice(prod.getPprice());order.setNumber(1);// 订单入库orderService.createOrder(order);log.info("创建订单成功,订单信息为:{}", JSON.toJSONString(order));return order;}
}

启动 OrderApplication ,并调用下单接口,观察每次请求时,商品微服务后台日志的打印情况:

总共请求了四次,商品实例1调用了3次,商品实例2调用了1次,随机数负载均衡成功。

四、Ribbon 实现负载均衡

Ribbon 是 Spring Cloud 的一个组件,它可以让我们使用一个注解就能轻松搞定负载均衡。Ribbon 的默认负载均衡策略是轮询。

整合方法只需两步:

1、在 RestTemplate 注入的时候,添加 @LoadBalanced 注解:

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

2、修改服务调用的方法,以服务名称直接代替 ip 和 端口号:

@GetMapping("/prod/{pid}")
public Order order(@PathVariable("pid") Integer pid) {log.info("接收到{}号商品的下单请求,准备调用商品微服务", pid);// 调用商品微服务,查询商品信息Product prod = restTemplate.getForObject("http://service-product/product/" + pid, Product.class);log.info("查询到{}号商品信息,内容是:{}", pid, JSON.toJSONString(prod));...return ...;
}

(演示效果略)

Ribbon 的常用负载均衡策略有三个:

RoundRobinRule 轮询选择 service instance 轮询 index,选择索引对应的服务实例
RandomRule 随机选择一个 instance

在 index 上随机,选择对应位置的服务实例

BestAvailableRule 选择一个最小的并发请求的 instance

考察每个实例,如果实例被 tripped 了,则忽略。再选择其中 ActiveRequestsCount最小的实例

修改 Ribbon 的负载均衡策略非常简单,只需要在配置文件中指定即可:

# 调用的服务名称
service-product:ribbon:NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule

演示效果同第三节。

总结

项目的代码以《Spring Cloud Alibaba——Nacos实现服务治理》基础,可能缺少一些中间环境,建议结合阅读。

负载均衡的作用是分摊流量,避免某一个服务因为请求压力而瘫痪。

负载均衡的模式一般有两种,客户端负载均衡和服务端负载均衡。一般在微服务调用中,都是使用客户端负载均衡。

Ribbon是实现负载均衡的重要组件,它的负载均衡策略主要有三个:轮询(默认)、随机、最小并发。

Spring Cloud —— 负载均衡与 Ribbon 应用相关推荐

  1. Spring Cloud 负载均衡

    负载均衡是微服务架构中必须使用的技术,通过负载均衡来实现系统的高可用.集群扩容等功能.负载均衡可通过硬件设备及软件来实现,硬件比如:F5.Array等,软件比如:LVS.Nginx等.如下图是负载均衡 ...

  2. Spring Cloud——负载均衡Ribbon

  3. Spring Cloud 系列之 Netflix Ribbon 负载均衡

    什么是 Ribbon Ribbon 是一个基于 HTTP 和 TCP 的 客服端负载均衡工具,它是基于 Netflix Ribbon 实现的. 它不像 Spring Cloud 服务注册中心.配置中心 ...

  4. Spring Cloud中Hystrix、Ribbon及Feign的熔断关系是什么?

    导读 今天和大家聊一聊在Spring Cloud微服务框架实践中,比较核心但是又很容易把人搞得稀里糊涂的一个问题,那就是在Spring Cloud中Hystrix.Ribbon以及Feign它们三者之 ...

  5. 04 | 负载均衡:Ribbon 如何保证微服务的高可用

    上一讲我们对 Nacos 的集群环境与实现原理进行了讲解,我们已经可以轻松将单个微服务接入到 Nacos 进行注册,但是微服务本不是孤岛,如何实现有效的服务间稳定通信是本文即将介绍的主要内容,本次我们 ...

  6. spring python负载均衡_Spring Cloud:使用Ribbon实现负载均衡详解(上)

    1. 什么是 Ribbon? Spring Cloud Ribbon 是一套实现客户端负载均衡的工具.注意是客户端,当然也有服务端的负载均衡工具,我们后面再介绍.可以认为 Ribbon 就是一个负载均 ...

  7. Spring Cloud源码分析——Ribbon客户端负载均衡

    年前聊了Eureka和Zookeeper的区别,然后微服务架构系列就鸽了三个多月,一直沉迷逛B站,无法自拔.最近公司复工,工作状态慢慢恢复(又是元气满满地划水).本文从以下3个方面进行分析(参考了翟永 ...

  8. 微服务(三) 【手摸手带你搭建Spring Cloud】 Ribbon 什么是负载均衡?spring cloud如何实现负载均衡?ribbon负载均衡有几种策略?Ribbon是什么?

    在上一章,我介绍了springcloud的eureka搭建.我们做了服务注册.最后我们还介绍了一些续约,失效剔除等参数配置.已经不需要再通过手动输入ip去访问服务,而是通过中心只需要通过服务名就可以获 ...

  9. Spring Cloud Alibaba 负载均衡:Ribbon 如何保证微服务的高可用

    上一讲我们对 Nacos 的集群环境与实现原理进行了讲解,我们已经可以轻松将单个微服务接入到 Nacos 进行注册,但是微服务本不是孤岛,如何实现有效的服务间稳定通信是本文即将介绍的主要内容,本次我们 ...

最新文章

  1. 计算TD-LTE DL 峰值速率的工具和相关参数
  2. java timezone 107_java - Java使用TimeZone - 堆栈内存溢出
  3. maven实战笔记-13
  4. jquery ui 自動完成對中文字搜尋Bug(firefox)
  5. Spin Control (上下控件)
  6. border:none 与border:0的区别
  7. iframe vue 前进 后退_vue常见面试题
  8. selenium+java自动化测试环境搭建mac
  9. win 10 arm iso 文件下载
  10. NIO蔚来EC6ES6ES8智能电动汽车维修手册电路图用户手册技术信息资料
  11. dis计算机领域中是什么意思,dis
  12. 树莓派支持的最小linux,世界上最小的电脑:树莓派
  13. 当里皮也成过客,请善待国足主帅的继任者
  14. PUN 2 菜鸟养成记 2主服务
  15. 使用协成将异步转同步
  16. 【历史上的今天】9 月 28 日:“超级计算机之父”诞生;三星推出移动支付;LibreOffice 发布
  17. java 数组的class_Java Class isArray()方法
  18. BigDecimal 比较大小
  19. Linux signal、sigaction的使用总结
  20. 如何在启动时禁用Razer突触启动画面

热门文章

  1. chroot函数使用_PHP chroot()函数与示例
  2. 想快速拥有个人网站?来试试这个...
  3. vc给exe更改图标
  4. 带头节点循环链表实现队列
  5. python Chrome + selenium自动化测试与python爬虫获取网页数据
  6. 利用MFC按钮使能(或禁用)属性使按钮变正常色(或灰色)
  7. 矩阵连乘 动态规划 详解
  8. tomcat 启动项目 页面文字乱码_项目通过tomcat部署到服务器,请求数据页面中文乱码问题...
  9. awk 内嵌正则 提取字符串_使用awk提取字符串中的数字或字母
  10. linux cordova安装教程,cordova搭建环境