Nacos远程调用服务,负载均衡案例学习

问题 : 我们在订单服务里需要查询商品,如何发起远程调用商品服务查询出来?

方案1 : 使用 RestTemplate 实现远程调用

    /**
     * 订单查询产品
     * @param pid 产品ID
     * @param uid 用户ID
     * @return
     */
    @Override
    public Order createOrder(Long pid, Long uid)
    {
        Order order = new Order();
       
        /**
         * 方案1 : 使用 RestTemplate 实现远程调用
         */
        String url = "http://localhost:8081/products" + pid;
        Product product = restTemplate.getForObject(url, Product.class);

        // 商品
        order.setPid(pid);
        order.setProductName(product.getName());
        order.setProductPrice(product.getPrice());

        // 用户 模拟已经从数据库查到了用户
        order.setUid(1L);
        order.setUsername("xxx");
        order.setNumber(1);

        super.save(order);
        return order;
    }

缺点 : 不优雅,URL硬编码,虽然可以完成服务调用,但是如果IP地址或端口变化就需要手动改动,无法实现负载均衡

方案 2 : 使用 DiscoveryClient 注册中心API

        /**
         * 方案2 : 使用 discoveryClient 注册中心api
         */
        List<ServiceInstance> instances = discoveryClient.getInstances("product-service");
        ServiceInstance instance = instances.get(0);
        int port = instance.getPort();
        String host = instance.getHost();
        String url = "http://" + host + ":" + port + "/products/" + pid;

方案3 : 负载均衡

启动多一个ProductServer,访问的时候就会随机选择两个服务其中一个,实现负载均衡

        /**
         * 方案3 : 负载均衡
         */
        List<ServiceInstance> instances = discoveryClient.getInstances("product-service");
        // 随机选择一个服务
        int index = new Random().nextInt(instances.size());
        ServiceInstance instance = instances.get(index);
        String url = "http://" + instance.getHost() + ":" + instance.getPort() + "/products/" + pid;
        Product product = restTemplate.getForObject(url, Product.class);

方案4 : 基于Ribbon实现负载均衡

  1. 在 RestTemplate 的生成方法上添加 @LoadBalanced注解

        /**
        * 方案4 : 使用Ribbon方式--带负载均衡
        */
        String url = "http://product-service/products/" + pid;
        Product product = restTemplate.getForObject(url, Product.class);
        order.setProductName(product.getName());
        order.setProductPrice(product.getPrice());

方案5 : 使用Feign实现负载均衡

  1. 添加依赖

<!--fegin组件-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
  1. 在启动类上添加@EnableFeignClients注解

  1. 添加IProductEfginService接口

@FeignClient(name = "product-service")
public interface IProductFeginService {
    @GetMapping("/products/{pid}")
    Product get(@PathVariable("pid") Long pid);
}
        /**
         * 方案5 : 使用 Feign 接口--负载均衡
         */
        Product product = productFeignService.get(pid);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值