4.OpenFeign

5.OpenFeign

OpenFeign主要基于接口和注解实现了远程调用

5.1.简介

官网:https://docs.spring.io/spring-cloud-openfeign/docs/2.2.4.RELEASE/reference/html/#spring-cloud-feign

Feign声明性(注解)Web服务客户端。

它使编写Web服务客户端更加容易。

要使用Feign,先创建一个接口并对其进行注解。它具有可插入注解支持,包括Feign注解和JAX-RS注解。

Feign还支持可插拔编码器和解码器。SpringCloud添加了对SpringMVC注解的支持,并且支持使用HttpMessageConvertersSpringWeb中默认使用的注解。

SpringCloud 集成了RibbonEureka以及SpringCloudLoadBalancer,以在使用Feign时提供负载平衡的http客户端

Feign是一个远程调用的组件 (接口,注解),由http`调用的

Feign集成了ribbon -> ribbon里面集成了eureka

所以等于Feign集成了ribbon以及eureka

5.2.快速入门

image-20230525131831623

5.2.1.创建eureka-server

这里和上面的一样,不做多重复

5.2.2.创建order-service

①创建

这里和上面的基本一致

只需要添加依赖的时候再加一个lombok依赖即可

②controller

image-20230525132602099

③配置类

image-20230525132616487

5.2.3.创建user-service

①选择依赖

image-20230525132513053

②启动类

image-20230525135845594

③配置类

image-20230525135007739

④feign

image-20230525140943651

⑤controller

image-20230525140924479

5.2.4.访问测试

http://localhost:8002/userDoOrder

此时访问的是8002(user-service),但也是可以获取到8001(order-service)的信息

image-20230525140832943

5.2.5.总结

调用顺序

user-service的userDoOrder -> 通过feign调用doOrder -> 调用order-service的doOrder

调用超时设置

ribbon: #feign 默认调用 1s 超时
    ReadTimeout: 5000 #修改调用时长
    ConnectTimeout: 5000 #修改连接时长

5.3.有参处理

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

1.通过URL传参数,GET请求,参数列表使用@PathVariable("")

2.如果是GET请求,每个基本参数必须加==@RequestParam("")

3.如果是POST请求,而且是对象集合等参数,必须加@Requestbody 或者@RequestParam

5.3.1.order-service中

①创建BaseResult类

public class BaseResult implements Serializable {
    private Integer code;
    private String msg;
    private Object data;
    public static BaseResult success(Integer code, String msg, Object data) {
        BaseResult baseResult = new BaseResult();
        baseResult.setCode(code);
        baseResult.setData(data);
        baseResult.setMsg(msg);
        return baseResult;
    }
}

②创建Order类

public class Order implements Serializable {
    private String orderSn;
    private String orderName;
    private String orderDetail;
    private Date orderTime;
    private String userId;
}

③创建TestParamController类

@RestController
public class TestParamController {
    //单个参数
    @GetMapping("/testOneParam")
    public BaseResult oneParam(@RequestParam("name") String name) {
        System.out.println(name);
        return BaseResult.success(200, "成功", "ok");
    }

    //两个参数
    @PostMapping("testTwoParam")
    public BaseResult twoParam(@RequestParam("name") String name,@RequestParam("age") Integer age) {
        System.out.println(name + ":" + age);
        return BaseResult.success(200, "ok", "ok");
    }

    //单个对象
    @PostMapping("testObjectParam")
    public BaseResult objectParam(@RequestBody Order order) {
        System.out.println(order);
        return BaseResult.success(200, "ok", order);
    }

    //单个对象+一个参数
    @PostMapping("testOneObjectOneParam")
    public BaseResult oneObjectOneParam(@RequestBody Order order, @RequestParam String name) {
        System.out.println(order);
        System.out.println(name);
        return BaseResult.success(200, "ok", order);
    }

    //URI传参
    @GetMapping("testUrlParam/{id}")
    public BaseResult testUrlParam(@PathVariable("id") Integer id) {
        System.out.println(id);
        return BaseResult.success(200, "ok", id);
    }
}

5.3.2.user-service中

①创建Order和BaseResult类

①创建BaseResult类

②创建Order类

②修改UserOrderFeign接口

/**
 * @FeignClient:声明是feign的调用
 * value:后面的值必须和提供者的服务名一致
 */
@FeignClient(value = "order-service")
public interface UserOrderFeign {

    //需要调用的那个方法签名
    //方法签名:一个方法的唯一标识,包括方法的注解,方法的参数,返回值等
    //这里调用的是order-service的doOrder方法
    @GetMapping("/doOrder")
    public String doOrder();

    //单个参数
    @GetMapping("testOneParam")
    public BaseResult oneParam(@RequestParam("name") String name);
    //两个参数
    @PostMapping("testTwoParam")
    public BaseResult twoParam(@RequestParam("name") String name,@RequestParam("age") Integer age);
    //一个对象
    @PostMapping("testObjectParam")
    public BaseResult objectParam(@RequestBody Order order);
    //一个对象+一个参数
    @PostMapping("testOneObjectOneParam")
    public BaseResult oneObjectOneParam(@RequestBody Order order, @RequestParam String name);
    //url传参
    @GetMapping("testUrlParam/{id}")
    public BaseResult testUrlParam(@PathVariable("id") Integer id);
}

③创建TestController类

@RestController
public class TestController {
    @Autowired
    private UserOrderFeign userOrderFeign;
    @RequestMapping("testFeignParam")
    public String testFeignParam() {
    //测试一个参数
        BaseResult result1 = userOrderFeign.oneParam("bjpowernode");
        System.out.println(result1);
        System.out.println("--------------------------------------------------");
        //测试多个参数
        BaseResult result2 = userOrderFeign.twoParam("bjpowernode", 666);
        System.out.println(result2);
        System.out.println("--------------------------------------------------");
        //测试一个对象
        Order order = new Order("111", "牛排", "一份牛排 256g", new Date(), "159357");
        BaseResult result3 = userOrderFeign.objectParam(order);
        System.out.println(result3);
        System.out.println("--------------------------------------------------");
        //测试 url 传参
        BaseResult result4 = userOrderFeign.testUrlParam(999);
        System.out.println(result4);
        System.out.println("--------------------------------------------------");
        //测试一个对象 一个参数
        BaseResult result5 = userOrderFeign.oneObjectOneParam(order,
        "bjpowernodebjpowernode");
        System.out.println(result5);
        System.out.println("--------------------------------------------------");
        return "ok";
}

5.3.3.访问测试

http://localhost:8081/testFeignParam

5.4时间日期参数问题

使用feign远程调用时,传递Date类型,接收方的时间会相差14个小时,是因为时区造成的

处理方案

1.使用字符串传递参数,接收方转换成时间类型(推荐使用)不要单独传递时间

2.使用JDK8的LocalDate(日期) 或LocalDateTime(日期和时间,接收方只有秒,没有毫 秒)

3.自定义转换方法

传参总结

get请求只用来传递基本参数,而且加注解@RequestParam

post请求用来传递对象参数,并且加注解@RequestBody

posted @   22-10-21  阅读(16)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 字符编码:从基础到乱码解决
· 提示词工程——AI应用必不可少的技术
点击右上角即可分享
微信分享提示