首页 > 其他分享 >4.OpenFeign

4.OpenFeign

时间:2023-05-25 20:34:10浏览次数:43  
标签:OpenFeign BaseResult System public println order out

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

标签:OpenFeign,BaseResult,System,public,println,order,out
From: https://www.cnblogs.com/Myvlog/p/17432775.html

相关文章

  • OpenFeign
    OpenFeign简介Feign是一个声明式的WebService客户端,是一种声明式、模板化的HTTP客户端。OpenFeign是SpringCloud在Feign的基础上支持了SpringMVC的注解,如@RequesMapping等。OpenFeign的@FeignClient可以解析SpringMVC的@RequestMapping注解下的接口,并通过动态代理的方式产......
  • 微服务使用openfeign调用单点的会话失效问题
    项目Springcloud,认证中心方式实现SSO使用开源框架Sa-Token本身的单独访问每个客户端服务的单点就没有问题。然后单点通过Fegin调用就不好使了!主要使用的Sa-Token的微服务单点功能使用的依赖如下<!--SA-TokenSSO--><dependencyManagement><dependencies>......
  • 聊聊我认为的OpenFeign
    此篇文章不从源码角度解析,网上一搜一大把。我个人的习惯是自己评估与思考下大概的设计思路是什么,然后看源码与博客佐证。否则一来就是使用然后看源码,一坨一坨的代码,真的看的头疼。以上仅是个人的学习方法。聊聊OpenFeign,其实这个框架,之前用过,但没留意太多;说白了这个框架的出现就......
  • 从0开始搭建一个微服务项目(使用openfeign)
    本文发布时间:2023-05-05尚在学习当中,如有不足,请指正!!!项目结构本篇文章是之前项目的后续版本,前面的内容可看链接:从0开始搭建一个微服务项(并注册到nacos)_bgbgking的博客-CSDN博客因本篇内容较前篇跨幅较大,有兴趣可查看源码链接:spring-cloud-demo:springcloud基础架构及其......
  • springcloud OpenFeign的使用
    在这里只记录OpenFeign关键的使用步骤,A、B两个项目是基于springboot、springcloud实现的,并且在nacos中有服务注册。第一步:导入依赖<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</a......
  • openfeign的使用
    项目目录结构craft微服务(服务提供者):包含craft-core模块、craft-facade模块;core模块是craft微服务的核心模块,facade是craft微服务对外提供远程调用模块 1、添加openfeign依赖<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-s......
  • OpenFeign组装请求头Header
    组装单个Header参数@RequestHeader("Authorization")Stringtoken组装多个Header参数@PostMapping(value="/a/b",headers={"Content-Type=application/json","a=AAAAAA","b=BBBBB"})ObjectcreateSth(@RequestBodyModel......
  • OpenFeign优雅的远程调用
    OpenFeign目录旁边可以查询具体的目录结构和跳转一.快速开发1.依赖<!‐‐ openfeign 远程调用‐‐><dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring‐cloud‐starter‐openfeign</artifactId></dependency>2.编写调用接口+@Feig......
  • 通过OpenFeign远程调用同局域网的其他接口
    通过OpenFeign远程调用同局域网的其他接口需要的依赖<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId></dependency><!--feig......
  • day07-OpenFeign-服务调用
    SpringCloudOpenFeign-服务调用1.OpenFeign介绍https://github.com/spring-cloud/spring-cloud-openfeignOpenFeign是一个声明式WebService客户端,使用OpenFeign让编写WebService客户端更加简单它的使用方法是定义一个服务端口然后在上面添加注解OpenFeign也支持可插拔式......