Spring Cloud Feign的使用案例详解
作者:碰磕
Feign简介
Feign是Netflix开发的⼀个轻量级RESTful的HTTP服务客户端(⽤它来发起请求,远程调⽤的),是以Java接⼝注解的⽅式调⽤Http请求,⽽不⽤像Java中通过封装HTTP请求报⽂的⽅式直接调⽤,Feign被⼴泛应⽤在Spring Cloud 的解决⽅案中。类似于Dubbo,服务消费者拿到服务提供者的接⼝,然后像调⽤本地接⼝⽅法⼀样去调⽤,实际发出的是远程的请求。
Feign可帮助我们更加便捷,优雅的调⽤HTTP API:不需要我们去拼接url然后调⽤restTemplate的api,在SpringCloud中,使⽤Feign⾮常简单,创建⼀个接⼝(在消费者–服务调⽤⽅这⼀端),并在接⼝上添加⼀些注解,代码就完成了。
SpringCloud对Feign进⾏了增强,使Feign⽀持了SpringMVC注解(OpenFeign),本质:封装了Http调⽤流程,更符合⾯向接⼝化的编程习惯,类似于Dubbo的服务调⽤,Dubbo的调⽤⽅式其实就是很好的⾯向接⼝编程。
💻它是声明性(注解)web服务客户端
要使用Feign,需创建一个接口并对其进行注解它是一个远程调用的组件(接口,注解)http调用的💻Feign集成了ribbon ribbon里集成了eureka
使用
与上篇文章ribbon的案例相似,也是客户端互相访问、互相帮助
实现:两个商家,一个中介,一个提供商,用户访问中介的接口,中介向提供商发送请求去制作
同样是创建两个client,之前创过就不走流程了
我这里创建了一个order-service-01
和一个user-service-02
order-service-01: 提供商
配置文件配置:
server: port: 8080 spring: application: name: order-service eureka: client: service-url: defaultZone: 你的远程eureka地址
启动类开启客户端
@EnableEurekaClient
编写一个出订单的controller
@RestController public class OrderControll { @GetMapping("doOrder") public String doOrder(){ return "正在制作面条"; } }
启动即可
user-service-02: 中介
关键依赖:
<!-- feign依赖--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency>
配置文件application.yml
:
server: port: 8081 spring: application: name: user-service eureka: client: service-url: defaultZone: 你的远程eureka地址
启动类开启服务
@EnableFeignClients:开启feign
@EnableDiscoveryClient @EnableFeignClients
关键:创建接口类UserOrderfeign
需要调用提供商(order-service)的doOrder的接口即向下方代码编写即可
/** * 下方注解: * value就是提供者的应用名称 */ @FeignClient(value="order-service") public interface UserOrderfeign { /** * 你需要调用哪个controller就写它的方法签名 * @return */ @GetMapping("doOrder") String doOrder(); }
编写controller
实现类
直接引入编写的userOrderfeign即可直接调用提供商的接口
@RestController public class UserControll { @Autowired public UserOrderfeign userOrderfeign; @GetMapping("userDoOrder") public String userDoOrder(){ System.out.println("来客人了..."); //发起远程调用 String str=userOrderfeign.doOrder(); return str; } }
运行最终访问localhost:8081/userDoOrder页面就会显示提供商返回的内容了~
传参
需确保参数列表一致,返回值一致,方法签名一致
- URL传参:参数列表使用
@PathVariable
- GET传参:参数列表使用
@RequestParam
- POST传参:参数列表使用
@RequestParam
或者Requestbody
基于上方案例继续使用
order-service
控制器编写方法
URL拼接传参
//url拼接传参 @GetMapping("testUrl/{name}/and/{age}") public String testUrl(@PathVariable("name")String name,@PathVariable("age")Integer age){ System.out.println(name+":"+age); return "ok"; }
GET传参
//url传递一个参数 @GetMapping("oneParam") public String oneParam(@RequestParam String name){ System.out.println(name); return "ok"; } //url传递多个参数 @GetMapping("twoParam") public String twoParam(@RequestParam(required = false) String name,@RequestParam(required = false)Integer age){ System.out.println(name); System.out.println(age); return "ok"; }
POST传参
编写实体类order
这里用到了
lambok
实现自动添加有参无参set、get等方法
@Data @AllArgsConstructor @NoArgsConstructor @Builder public class Order { private Integer id; private String name; private Double price; private Date time; }
//Post请求传递一个对象 @PostMapping("oneObj") public String oneObj(@RequestBody Order order){ System.out.println(order); return "ok"; } //Post请求传递一个对象一个参数 @PostMapping("oneObjOneParam") public String oneObjOneParam(@RequestBody Order order,@RequestParam("name")String name){ System.out.println(order); System.out.println(name); return "ok"; }
调用
user-service
的feign接口中编写控制类的传参方法
/url拼接传参 @GetMapping("testUrl/{name}/and/{age}") public String testUrl(@PathVariable("name")String name, @PathVariable("age")Integer age); //url传递一个参数 @GetMapping("oneParam") public String oneParam(@RequestParam String name); //url传递多个参数 @GetMapping("twoParam") public String twoParam(@RequestParam(required = false) String name,@RequestParam(required = false)Integer age); //Post请求传递一个对象 @PostMapping("oneObj") public String oneObj(@RequestBody Order order); //Post请求传递一个对象一个参数 @PostMapping("oneObjOneParam") public String oneObjOneParam(@RequestBody Order order,@RequestParam("name")String name);
user-service
控制器中编写方法调用
@GetMapping("testParam") public String testParam(){ String zt = userOrderFeign.testUrl("zt", 21); System.out.println(zt); String xzl = userOrderFeign.oneParam("xzl"); System.out.println(xzl); String wf = userOrderFeign.twoParam("wf", 22); System.out.println(wf); Order order= Order.builder() .name("牛排") .price(188D) .time(new Date()) .id(1) .build(); String s = userOrderFeign.oneObj(order); System.out.println(s); String param = userOrderFeign.oneObjOneParam(order, "dqf"); System.out.println(param); return "ok"; }
以上即可实现传参~
拓展
feign的默认等待时间是1s,超过1s就直接报错超时
配置超时、连接时间
Tip:
feign只是封装了远程调用的功能 底层还是ribbon 所以需要修改ribbon的时间
#feign只是封装了远程调用的功能 底层还是ribbon 所以需要修改ribbon的时间 ribbon: ReadTimeout: 3000 #3s超时时间 ConnectTimeout: 3000 #连接服务的超时时间
日志打印
编写日志功能有利于错误排查
日志级别
NONE
:默认的,不显示任何日志;
BASIC
:仅记录请求方法、URL、响应状态码及执行时间;
HEACIERS
:除了BASIC中定义的信息之外,还有请求和响应的头信息
FULL
:除了HEADERS中定义的信息之外,还有请求和响应的正文及元数据。
在启动类application
中编写
/** * 打印日志信息 */ @Bean public Logger.Level level(){ return Logger.Level.FULL; }
配置文件中yml
开启日志客户端
logging: level: com.pengke.userservice02.feign.UserOrderfeign: debug # 需要打印请求该接口的日志...
level下是feign接口的路径
这样即可实现用户访问该接口实现对应的日志打印相关信息
到此这篇关于Spring Cloud Feign的使用的文章就介绍到这了,更多相关Spring Cloud Feign的使用内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!