wordpress软件站,永久免费生成app网站,四川学校网站建设,重庆网站推广外包引言
本篇博客简单介绍微服务负载均衡的概念#xff0c;并通过 IDEA 多端口启动应用的方式#xff0c;模拟多个应用实例#xff0c;使用自定义和 Ribbon 两种方式实现基本的负载均衡策略。
微服务代码以《Spring Cloud Alibaba——Nacos实现服务治理》为基础。
一、什么是…引言
本篇博客简单介绍微服务负载均衡的概念并通过 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);// 获取服务实例列表ListServiceInstance 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是实现负载均衡的重要组件它的负载均衡策略主要有三个轮询默认、随机、最小并发。