负载均衡(Load Balance)是将负载(工作任务/访问请求)进行分摊到多个操作单元(服务器,组件)上进行执行,在微服务里常用到.
根据负载均衡发生位置的不同,一般分为服务端负载均衡和客户端负载均衡
上图中,前者服务端负载均衡 后者客户端负载均衡
在微服务调用关系中一般会选择客户端负载均衡,举例-->粤核酸就是一种客户端负载均衡的方式去实现的
2>基于Ribbon的负载均衡(器)三大组件组成负载均衡器
>>负载规则-->从服务器列表中决定用哪个服务器
>>ping任务-->用来验证服务器是否可用
>>服务器列表
Ribbon是Spring Cloud的一个组件, 它可以让我们使用一个注解就能轻松的搞定负载均衡
在启动类的restTemplate()方法上贴@LoadBalanced
http请求和ribbon的融合
@SpringBootApplication
public class OrderServer {
public static void main(String[] args) {
SpringApplication.run(OrderServer.class,args);
}
// 通过java代码去调用一个http的接口地址
@Bean
@LoadBalanced
public RestTemplate restTemplate(){
return new RestTemplate();
}
}
@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("古天乐");
order.setPid(productId);
order.setPname(product.getPname());
order.setPprice(product.getPprice());
order.setNumber(1);
orderDao.save(order);
log.info("创建订单成功,订单信息为{}", JSON.toJSONString(order));
return order;
}
}
3>负载均衡的执行原理
Product product = restTemplate.getForObject(
"http://product-service/product/"+productId,Product.class);
1)在RestTemplate的bean中贴@LoadBanlanced,在请求之前,会对地址进行处理
2)通过截取的方式,截取http://到第一个/的内容 获取服务名product-service
3)获取到DiscoveryClient,通过getInstances("product-service") 获取本地缓存列表的集合 如果获取不到 就执行最后一步
4)根据内部设置负载均衡策略选中其中一个主机(这里策略默认轮询) 获取主机和端口
5)将URL地址的服务名替换成具体的ip地址
6)进行远程调用
4>负载均衡的策略
这里用RandomRule 随机策略去做案例
在服务站服务的application.yml文件中配置
product-service: # 调用的提供者的名称
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule
重新启动 再访问就行了



