• SpringCloud——OpenFeign(参数处理、传递时间参数处理、源码分析,日志处理)


    调用参数处理(重点)

    Feign 传参确保消费者和提供者的参数列表一致 包括返回值 方法签名要一致

    1. 通过 URL 传参数,GET 请求,参数列表使用@PathVariable(“”)
    2. 如果是 GET 请求,每个基本参数必须加@RequestParam(“”)
    3. 如果是 POST 请求,而且是对象集合等参数,必须加@Requestbody 或者@RequestParam

    参数调用

    在OrderController中写url传参、一个参数传参、2个参数传参、一个对象加一个参数传参

    @GetMapping("testUrl/{name}/and/{age}")
    public String testUrl(@PathVariable("name")String name,@PathVariable("age") String age){
        System.out.println(name+":"+age);
        return "ok";
    }
    @GetMapping("oneParam")
    public String oneParam(@RequestParam("name") String name){
        System.out.println(name);
        return "ok";
    }
    
    @GetMapping("twoParam")
    public String twoParam(@RequestParam(value = "name",required = false) String name,@RequestParam("age") String age){
        System.out.println(name);
        System.out.println(age);
        return "ok";
    }
    
    @PostMapping("oneObjoneParam")
    public String oneObjoneParam(@RequestBody Order order,@RequestParam("name") String name){
        System.out.println(order);
        System.out.println(name);
        return "ok";
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    写实体类Order

    @NoArgsConstructor
    @AllArgsConstructor
    @Data
    @Builder
    public class Order {
        private  Integer id;
        private String name;
        private Double price;
        private Date time;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    将实体类复制到user-service中,将OrderController中的方法签名放到user-service中的feign接口

    @GetMapping("doOrder")
    String doOrder();
    
    @GetMapping("testUrl/{name}/and/{age}")
    public String testUrl(@PathVariable("name")String name, @PathVariable("age") String age);
    
    @GetMapping("oneParam")
    public String oneParam(@RequestParam("name") String name);
    
    @GetMapping("twoParam")
    public String twoParam(@RequestParam(value = "name") String name,@RequestParam("age") String age);
    
    @PostMapping("oneObjoneParam")
    public String oneObjoneParam(@RequestBody Order order, @RequestParam("name") String name);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    在user-service中调用feign从而使用orderController中的方法

    @GetMapping("testParam")
    public String testParam(){
        String sjq = orderFeign.testUrl("四季青","18");
        System.out.println(sjq);
    
        String lt = orderFeign.oneParam("11");
        System.out.println(lt);
    
        String jg = orderFeign.twoParam("","");
        System.out.println(jg);
    
        Order order = Order.builder().name("牛排").price(150D).time(new Date()).id(1).build();
        String s = orderFeign.oneObjoneParam(order,"鸡哥");
        System.out.println(s);
        return "ok";
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    测试:
    在这里插入图片描述
    在这里插入图片描述
    注意:@RequestParam后面一定要加value具体值@RequestParam(value = “name”) String name,或者@RequestParam(“name”) String name

    传递时间参数处理

    写一个传递时间的方法
    orderController

    @GetMapping("testTime")
    public String testTime(@RequestParam("time") Date time){
        System.out.println(time);
        return "ok";
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    user-service的feign接口

    @GetMapping("testTime")
    public String testTime(@RequestParam("time") Date time);
    
    • 1
    • 2

    user-service的Controller进行测试

    @GetMapping("time")
    public String time(){
        Date date = new Date();
        System.out.println(date);
        String s = orderFeign.testTime(date);
        return s;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    测试:
    在这里插入图片描述
    在这里插入图片描述
    发现时间不对, ±14个小时,所以不建议单独传递时间参数,建议转换成字符串

    OpenFeign的源码分析

    1. 给接口创建代理对象(启动扫描)
    2. 代理对象执行进入 invoke 方法
    3. 在 invoke 方法里面做远程调用
    @EnableFeignClients(basePackages = {"com.dcits.userserver.feign"})
    
    • 1

    这段代码将指定包扫描位置,将会加速项目启动

    OpenFeign日志功能

    Feign日志级别

    在这里插入图片描述

    使用

    在启动类中写一个bean
    在这里插入图片描述

    /**
     * 打印Feign日志信息 级别
     * @return
     */
    @Bean
    public Logger .Level level(){
        return Logger.Level.FULL;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    在yml进行配置

    logging:
      level:
        com.dcits.userserver.feign.UserOrderFeign: debug # 需要打印这个接口下面的日志
    
    • 1
    • 2
    • 3

    启动测试:
    在这里插入图片描述

  • 相关阅读:
    DataGrip 如何导出和恢复整个数据库数据,使用单个 SQL 文件
    [第六篇]——云服务器
    Spring Bean自动装配的简介
    本科毕业论文内容必须有国内外文献综述吗?
    解密Prompt系列13. LLM Agent-指令微调方案: Toolformer & Gorilla
    Qt报错::failed to parse default search paths from compiler output
    [windows10]win10永久禁用系统自动更新操作方法
    44从零开始用Rust编写nginx,命令行参数的设计与解析及说明
    KubeVirt with DPDK
    js筛选数组中相同的元素组成新数组
  • 原文地址:https://blog.csdn.net/YiRenGengShangBuQi/article/details/126012652