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
注解的支持,并且支持使用HttpMessageConverters
,SpringWeb
中默认使用的注解。
SpringCloud
集成了Ribbon
和Eureka
以及SpringCloudLoadBalancer
,以在使用Feign
时提供负载平衡的http
客户端。
Feign
是一个远程调用的组件 (接口,注解),由http`调用的
Feign
集成了ribbon
-> ribbon
里面集成了eureka
所以等于Feign
集成了ribbon
以及eureka
5.2.快速入门
5.2.1.创建eureka-server
5.2.2.创建order-service
①创建
只需要添加依赖的时候再加一个lombok
依赖即可
②controller
③配置类
5.2.3.创建user-service
①选择依赖
②启动类
③配置类
④feign
⑤controller
5.2.4.访问测试
http://localhost:8002/userDoOrder
此时访问的是8002(user-service),但也是可以获取到8001(order-service)的信息
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类
②修改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