springcloud如何远程调用负载均衡之Ribbon

文章目录

  • 介绍
  • 准备工作
    • 启动多个微服务
    • 配置
      • 启动类
      • application.yml配置负载均衡策略
  • 服务调用的方法_演示(做参考)
  • 效果演示(参考)

前提须知: nacos注册中心使用

介绍

通俗的讲, 负载均衡就是将负载(工作任务,访问请求)进行分摊到多个操作单元(服务器,组件)上

进行执行。

根据负载均衡发生位置的不同,一般分为服务端负载均衡客户端负载均衡

服务端负载均衡指的是发生在服务提供者一方,比如常见的Nginx负载均衡者执行。
而客户端负载均衡指的是发生在服务请求的一方,也就是在发送请求之前已经选好了由哪个实例处理请求

springcloud如何远程调用负载均衡之Ribbon_第1张图片
我们在微服务调用关系中一般会选择客户端负载均衡,也就是在服务调用的一方来决定服务由哪个提供

准备工作

启动多个微服务

  • 通过idea再启动一个 微服务(原来的端口是8081),设置其端口为8082(另一个端口),项目代码都一样
    在这里插入图片描述

  • 在选项VM option 设置服务端口:-Dserver.port=xxxx
    springcloud如何远程调用负载均衡之Ribbon_第2张图片

  • 通过nacos可查看微服务的启动情况
    在这里插入图片描述

配置

启动类

  • 在启动类上(也是配置类)加以下代码,在要请求其他微服务项目的项目中配
  • 在业务代码上即可注入此对象进行请求操作
@Bean
@LoadBalanced
public RestTemplate restTemplate(){
	return new RestTemplate();
}

application.yml配置负载均衡策略

  • Ribbon内置了多种负载均衡策略,内部负载均衡的顶级接口为com.netflix.loadbalancer.IRule
    springcloud如何远程调用负载均衡之Ribbon_第3张图片
  • 这样演示使用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则是其他服务的信息,即可访问到,所以负载均衡是需要有注册中心才可执行的

springcloud如何远程调用负载均衡之Ribbon_第4张图片

@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)
    springcloud如何远程调用负载均衡之Ribbon_第5张图片
    springcloud如何远程调用负载均衡之Ribbon_第6张图片

你可能感兴趣的:(后端,ribbon,springcloud)