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


前提须知: 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)
    在这里插入图片描述
    在这里插入图片描述
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值