什么是负载均衡
通俗的讲负载均衡就是将负载(工作任务,访问请求)进行分摊到多个操作单元(服务器,组件)上进行执行。根据负载均衡发生位置的不同,一般分为服务端负载均衡和客户端端负载均衡。
服务端负载均衡指的是发生在服务提供者一方,比如常见的nginx负载均衡,而客户端负载均衡指的是发生在服务请求的一方也就是在发送请求之前已经选好了由哪个实例处理请求。
自定义实现负载均衡
上一篇文章《Nacos Discovery–服务治理》已经介绍了nacos的简单应用,下面将用nacos的随机调用机制,实现简单的负载均衡。
- 第一步:创建同服务名的多个微服务
在idea中点击编辑配置启动文件
- 第二步:启动多个微服务
- 第三步:刷新nacos服务列表
- 第四步:编写调用代码
@RestController
@RequestMapping("/order/info")
@Slf4j
public class OrderController {
@Autowired
RestTemplate restTemplate;
@Autowired
private DiscoveryClient discoveryClient;
@RequestMapping("/getOrderByProductId")
public String getOrderInfo(@RequestParam(name = "id",value = "id") Integer id){
// 通过nacos服务列表中的服务名,获取要访问的微服务,因为同一个服务器可能会有一个服务集群,所以返回的是一个列表
List<ServiceInstance> serviceInstanceList = discoveryClient.getInstances("service-product");
// 随机调用机制
int index = new Random().nextInt(serviceInstanceList.size());
ServiceInstance serviceInstance = serviceInstanceList.get(index);
String productInfo = restTemplate.getForObject("http://" + serviceInstance.getHost() + ":" + serviceInstance.getPort() +"/product/info/getInfoById?id=" + id,String.class);
log.info("id={},返回结果是{}",id,productInfo);
return productInfo;
}
// @RequestMapping("/getOrderByProductId")
// public String getOrderInfo(@RequestParam(name = "id",value = "id") Integer id){
// // 通过nacos服务列表中的服务名,获取要访问的微服务,因为同一个服务器可能会有一个服务集群,所以返回的是一个列表
// List<ServiceInstance> serviceInstanceList = discoveryClient.getInstances("service-product");
// if (serviceInstanceList.size() == 0){
// return null;
// }
// // 取其中一个进行访问
// ServiceInstance serviceInstance = serviceInstanceList.get(0);
// String productInfo = restTemplate.getForObject("http://" + serviceInstance.getHost() + ":" + serviceInstance.getPort() +"/product/info/getInfoById?id=" + id,String.class);
// log.info("id={},返回结果是{}",id,productInfo);
// return productInfo;
// }
// @RequestMapping("/getOrderByProductId")
// public String getOrderInfo(@RequestParam(name = "id",value = "id") Integer id){
// String productInfo = restTemplate.getForObject("http://localhost:8072/product/info/getInfoById?id=" + id,String.class);
// log.info("id={},返回结果是{}",id,productInfo);
// return productInfo;
// }
}