前提须知: nacos注册中心使用
介绍
通俗的讲, 负载均衡就是将负载(工作任务,访问请求)进行分摊到多个操作单元(服务器,组件)上
进行执行。
根据负载均衡发生位置的不同,一般分为服务端负载均衡和客户端负载均衡。
服务端负载均衡指的是发生在服务提供者一方,比如常见的Nginx负载均衡者执行。
而客户端负载均衡指的是发生在服务请求的一方,也就是在发送请求之前已经选好了由哪个实例处理请求
我们在微服务调用关系中一般会选择客户端负载均衡,也就是在服务调用的一方来决定服务由哪个提供
准备工作
启动多个微服务
-
通过idea再启动一个 微服务(原来的端口是8081),设置其端口为8082(另一个端口),项目代码都一样
-
在选项VM option 设置服务端口:
-Dserver.port=xxxx
-
通过nacos可查看微服务的启动情况
配置
启动类
- 在启动类上(也是配置类)加以下代码,在要请求其他微服务项目的项目中配
- 在业务代码上即可注入此对象进行请求操作
@Bean
@LoadBalanced
public RestTemplate restTemplate(){
return new RestTemplate();
}
application.yml配置负载均衡策略
- Ribbon内置了多种负载均衡策略,内部负载均衡的顶级接口为
com.netflix.loadbalancer.IRule
- 这样演示使用RandomRule负载均衡策略
product-service: # 调用的提供者的名称(不是本项目,而是调用的另一个项目的名)
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule
服务调用的方法_演示(做参考)
- 重点在
Product product = restTemplate.getForObject("http://product-service/product/"+productId,Product.class);
这行代码 product-service
是微服务的名(nacos注册中心也有显示,微服务的application.yml里面设置名字),调用这个微服务的接口请求获取数据- nacos原理:服务在启动的时候会把自己的信息,放到注册中心中,并且会把注册中心的服务列表信息,拉去本地,所以这里请求的
product-service
则是其他服务的信息,即可访问到,所以负载均衡是需要有注册中心才可执行的
@Service
@Slf4j
public class OrderServiceImpl implements OrderService {
@Autowired
private OrderDao orderDao;
@Autowired
private RestTemplate restTemplate;
@Override
public Order createOrder(Long productId,Long userId) {
log.info("接收到{}号商品的下单请求,接下来调用商品微服务查询此商品信息", productId);
//远程调用商品微服务,查询商品信息
Product product = restTemplate.getForObject(
"http://product-service/product/"+productId,Product.class);
log.info("查询到{}号商品的信息,内容是:{}", productId, JSON.toJSONString(product));
//创建订单并保存
Order order = new Order();
order.setUid(userId);
order.setUsername("edt");
order.setPid(productId);
order.setPname(product.getPname());
order.setPprice(product.getPprice());
order.setNumber(1);
orderDao.save(order);
log.info("创建订单成功,订单信息为{}", JSON.toJSONString(order));
return order;
}
}
效果演示(参考)
- 访问同样的url地址,被负载均衡后会访问到不同端口的微服务(演示的是8081端口和8082)