• Springcloud服务调用Feign组件以及负载均衡


    前言

    Ribbon是Spring Cloud的一个组件, 它可以让我们使用一个注解就能轻松的搞定负载均衡。
    前边我们调用是从服务中获取实例获取调用的地址和端口,从而调用服务,这样特别麻烦,Feign是Spring Cloud提供的一个声明式的伪Http客户端, 它使得调用远程服务就像调用本地服务一样简单, 只需要创建一个接口并添加一个注解即可。Nacos很好的兼容了Feign, Feign默认集成了 Ribbon, 所以在Nacos下使用Fegin默认就实现了负载均衡的效果。

    项目实战

    随机获取服务调用

    从上篇中,我们复制两个module改下端口,也可以IDEA中直接进行改端口运行两个服务。查看nacos查询服务。
    module
    启动成功之后,登录nacos进行查询服务。
    nacos服务注册成功
    此时我们在订单中进行调用product服务。
    订单中代码,获取商品服务实例的列表,随机获取一个实例进行调用。

     //从nacos服务注册中心获取product服务
            List<ServiceInstance> productServiceInstanceList =  discoveryClient.getInstances("springcloud-product");
            int index = new Random().nextInt(productServiceInstanceList.size());
            ServiceInstance productServiceInstance =
                    discoveryClient.getInstances("springcloud-product").get(index);
            String productUrl = productServiceInstance.getHost()+":"+productServiceInstance.getPort();
            log.info("获取到的商品实例的url:"+productUrl);
            Product product = restTemplate.getForObject("http://"+productUrl+"/springcloud/product/getProductById/"+order.getProductId(), Product.class);
            res.put("product",product);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    调用结果

    ribbon实现负载均衡

    ribbon非常简单,直接在在RestTemplate 的生成方法上添加@LoadBalanced注解即可。

    /**
     * 获取RestTemplate
     */
    @Configuration
    public class RestemplateConfig {
        @LoadBalanced
        @Bean
        public RestTemplate getRestTemplate(){
            return new RestTemplate();
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    访问日志可以看到ribbon相关的
    
    • 1

    日志
    负载均衡策略接口类
    负载均衡策略类

    public interface IRule {
        Server choose(Object var1);
    
        void setLoadBalancer(ILoadBalancer var1);
    
        ILoadBalancer getLoadBalancer();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    也可以自己定义负载均衡策略,配置一下ribbon负载均衡对应的类即可,这里就不多说。
    具体的实现类

    feign实现服务调用
    引入feign组件依赖
        
            <dependency>
                <groupId>org.springframework.cloudgroupId>
                <artifactId>spring-cloud-starter-openfeignartifactId>
            dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    启动类
    @EnableDiscoveryClient
    @SpringBootApplication
    @EnableFeignClients//开启Fegin
    public class SpringcloudOrderApplication {
        public static void main(String[] args) {
            SpringApplication.run(SpringcloudOrderApplication.class,args);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    product服务接口
    @FeignClient("springcloud-product")
    public interface ProductService {
        //指定调用提供者的哪个方法
        //@FeignClient+@GetMapping 就是一个完整的请求路径
        @GetMapping(value = "/springcloud/product/getProductById/{product_id}")
        Product getProductById(@PathVariable("product_id") Integer product_id);
    }
    @FeignClient("springcloud-user")
    public interface UserService {
        @GetMapping(value = "/springcloud/user/getUserByUseId/{user_id}")
        User getUserByUseId(@PathVariable("user_id") Integer user_id);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    controller测试类
    @RestController
    @RequestMapping("/springcloud/feign/order")
    @Slf4j
    public class OrderFeignController {
    
        @Autowired
        IOrderService orderService;
        @Autowired
        ProductService productService;
        @Autowired
        private UserService userService;
        /**
         * 获取订单列表
         * @return
         */
        @GetMapping("/getOrderById/{order_id}")
        public HashMap<String,Object> getOrderById(@PathVariable("order_id")Integer order_id){
            HashMap<String,Object> res = new HashMap<>();
            //获取订单
            Order order = orderService.getById(order_id);
            res.put("order",order);
            //直接使用服务名字作为URL进行调用
            //获取用户
            User user = userService.getUserByUseId(order.getUserId());
            res.put("user",user);
            //获取商品信息
            Product product = productService.getProductById(order.getProductId());
            res.put("product",product);
            return res;
        }
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    测试

    测试

    日志

  • 相关阅读:
    ROS中关于时间的API
    python中setattr()函数用法详解
    Lwip之TCP协议实现(二)
    Jetpack DataBinding使用--Jetpack系列
    Apache网页优化
    【基于C的排序算法】插入排序之直接插入排序
    深度学习优化算法相关文章
    Vue2+SpringBoot实现数据导出到csv文件并下载
    物理引擎介绍
    第二章 字与段的总结
  • 原文地址:https://blog.csdn.net/qq_37400096/article/details/126769796