0 背景铺垫
微服务项目有一个重要的功能:可以很容易动态扩缩容
这里我们不谈容器技术(docker/k8s这些),传统的扩缩容简单理解就是服务集群。
**扩:**特定时期(比如促销,天灾人祸)一个微服务可能容易挂掉(撑不住/宕机),那么多开几个就行,此为扩。
**缩:**特定时期过后,多开的微服务可以适当关掉多余的,此为缩
这里考虑扩的问题,以订单与商品服务为例子,
设想一种场景:如果某天公司要促销,单一的订单服务,商品服务不一定能撑得住,该怎么扩容。
扩容常用的手段就是集群,如下:
集群存在一个很大问题,客户端发起的请求让哪个微服务处理?
解决方案:负载均衡服务器
1 什么是负载均衡
通俗的讲, 负载均衡就是将负载(工作任务,访问请求)进行分摊到多个操作单元(服务器,组件)上进行执行。
根据负载均衡发生位置的不同,一般分为服务端负载均衡和客户端负载均衡。
服务端负载均衡指的是发生在服务提供者一方,比如常见的Nginx负载均衡
客户端负载均衡指的是发生在服务请求的一方,也就是在发送请求之前已经选好了由哪个实例处理请求
微服务调用关系中一般会选择客户端负载均衡,也就是在服务调用的一方来决定服务由哪个提供者执行。
那问题来:代码上如何实现?
2 自定义负载均衡
需求:开启2个商品客户端(localhost:8081/localhost:8082),这里说明一下,真实开发服务器可定是部署在不同的服务器中,ip不一样,端口可以一样。此时为学习,只有一台电脑,使用不同端口模拟一下。
2.1 通过idea再启动一个 shop-product 微服务,设置其端口为8082: -Dserver.port=8082
2.2 通过nacos查看微服务的启动情况
2.3 修改 OrderServiceImpl 的代码,实现负载均衡
package com.example.server.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.example.domain.Order;
import com.example.domain.Product;
import com.example.server.mapper.OrderMapper;
import com.example.server.service.OrderService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;
import java.util.List;
import java.util.Random;
@Service
public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements OrderService {
@Autowired
private RestTemplate restTemplate;
@Autowired
private DiscoveryClient discoveryClient;
@Override
public Order createOrder(Long pid, Long uid) {
Order order = new Order()