一、负载均衡介绍
1.1、问题描述
上篇文章中远程调用的代码如下:
List<ServiceInstance> instances = discoveryClient.getInstances("product-service"); // 服务可能有多个,获取第一个
EurekaServiceInstance instance = (EurekaServiceInstance) instances.get(0);
- 根据应用名称获取了服务实例列表。
- 从列表中选择了一个服务实例。
**思考:**如果一个服务对应多个实例呢?流量是否可以合理的分配到多个实例呢?
现象观察:
我们再启动 2 个 product-service 实例。选中要启动的服务,右键选择 Copy Configuration,在弹出的框中选择 Modify options -> Add VM options,添加 VM options:-Dserver.port=9091(端口号根据实际情况修改)。
现在 IDEA 的 Service 窗口就会多出来一个启动配置,右键启动服务就可以。同样的操作,再启动 1 个实例,共启动 3 个服务。
观察 Eureka,可以看到 product-service 下有三个实例。
访问日志:访问 http://127.0.0.1:8080/order/1。通过观察日志我们发现:请求多次访问,都是同一台机器。这肯定不是我们想要的结果,我们启动多个实例,是希望可以分担其他机器的负荷,那么如何实现呢?
解决方案: 我们可以对上述代码进行简单修改:
private static AtomicInteger atomicInteger = new AtomicInteger(1);
private static List<ServiceInstance> instances;
@PostConstruct
public void init() {
// 根据应用名称获取服务列表
instances = discoveryClient.getInstances("product-service");
}
public OrderInfo selectOrderById(Integer orderId) {
OrderInfo orderInfo = orderMapper.selectOrderById(orderId);
// 轮询获取实例
int atomicInteger.getAndIncrement() % instances.size();
instances.get(index);
log.info(instance.getInstanceId());
instance.getUri() + + orderInfo.getProductId();
restTemplate.getForObject(url, ProductInfo.class);
orderInfo.setProductInfo(productInfo);
orderInfo;
}


