1.OpenFeign是什么
Feign是一个声明式的web服务客户端,让编写web服务客户端变得非常容易,只需创建一个接口并在接口上添加注解即可。创建的这个接口通过@FeignClient注解去把服务端的口暴暴露出来。用于服务调用。
2.简要说明
2.1现有服务端,服务名称为CLOUD-PAYMENT-SERVICE,它提供了下面的服务接口
@GetMapping(value = "/payment/get/{id}") public CommonResult getPaymentById(@PathVariable("id") Long id) throws InterruptedException { TimeUnit.SECONDS.sleep(3); Payment payment = paymentService.getPaymentById(id); log.info("*****查询结果:"+payment); if (payment!=null){ //说明有数据,能查询成功 return new CommonResult(200,"查询成功" + serverport,payment); }else { return new CommonResult(444,"没有对应记录,查询ID:"+id,null); } }
2.2在消费者端通过RestTemplate消费
public static final String PAYMENT_URL = "http://CLOUD-PAYMENT-SERVICE";
@GetMapping("/consumer/payment/get/{id}") public CommonResult<Payment> getPayment(@PathVariable("id") Long id){ return restTemplate.getForObject(PAYMENT_URL+"/payment/get/"+id,CommonResult.class); }
这里我们是采用restTemplate去调用服务的接口,如果想要按照习惯性编码,用消费者端service去调用服务端的接口,就可以使用OpenFeign
3.使用
3.1加入依赖
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency>
完整依赖
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <parent> <artifactId>cloud2020</artifactId> <groupId>com.atguigu.springcloud</groupId> <version>1.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>cloud-consumer-feign-order80</artifactId> <dependencies> <dependency> <groupId>com.atguigu.springcloud</groupId> <artifactId>cloud-api-commons</artifactId> <version>${project.version}</version> </dependency> <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-web --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-web --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-devtools --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <scope>runtime</scope> <optional>true</optional> </dependency> <!-- https://mvnrepository.com/artifact/org.projectlombok/lombok --> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-test --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency> </dependencies> </project>
4.yml配置
(注册中心用的Eureka)
server: port: 80 eureka: client: register-with-eureka: false service-url: defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka #集群版
5.创建一个service,使用@FeignClient注解
package com.atguigu.springcloud.service; import com.atguigu.springcloud.entities.CommonResult; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.stereotype.Component; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; /** * @Classname PaymentFeignService * @Description TODO * @Date 2021/4/26 0026 下午 4:24 * @Created by jcc */ @Component @FeignClient(value = "CLOUD-PAYMENT-SERVICE") //value - 服务的名称 public interface PaymentFeignService { //这个接口是CLOUD-PAYMENT-SERVICE服务下提供的接口 @GetMapping(value = "/payment/get/{id}") public CommonResult getPaymentById(@PathVariable("id") Long id); }
@FeignClient的value属性为服务端的名称,这个service下的接口和服务端的接口一样,这样子这个service就代理了服务端的接口,直接通过这个service就可以调用服务端的接口
6.调用
package com.atguigu.springcloud.controller; import com.atguigu.springcloud.service.PaymentFeignService; import com.atguigu.springcloud.entities.CommonResult; import com.atguigu.springcloud.entities.Payment; import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; @RestController @Slf4j public class OrderController { @Resource private PaymentFeignService paymentFeignService; @GetMapping("/consumer/payment/get/{id}") public CommonResult<Payment> getPayment(@PathVariable("id") Long id){ return paymentFeignService.getPaymentById(id); } }
这样子就完成了基本的调用
7.配置超时时间
Fegin的默认的调用服务端额超时时间为1秒,超过这个时间服务没有返回的,直接报错,但是,有时候有些服务的调用事件会比较长,就需要对超时时间进行配置
加入配置
feign: client: config: default: #简历连接所用的时间,适用于网络状况正常的情况下,两端连接所需要的时间 ConnectTimeOut: 5000 #指建立连接后从服务端读取到可用资源所用的时间 ReadTimeOut: 10000
完整配置
server: port: 80 eureka: client: register-with-eureka: false service-url: defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka #集群版 feign: client: config: default: #简历连接所用的时间,适用于网络状况正常的情况下,两端连接所需要的时间 ConnectTimeOut: 5000 #指建立连接后从服务端读取到可用资源所用的时间 ReadTimeOut: 10000
8.日志打印
当我们需要知道fegin的详细的工作过程的时候,可以打开fegin的日志功能
它的日志有下面四个级别
8.1创建配置类
package com.atguigu.springcloud.config; import feign.Logger; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; /** * @Classname FeignConfig * @Description TODO * @Date 2021/4/26 0026 下午 5:04 * @Created by jcc */ @Configuration public class FeignConfig { @Bean Logger.Level feignLoggerLevel(){ return Logger.Level.FULL; } }
8.2配置文件
logging:
level:
com.atguigu.springcloud.service.PaymentFeignService: debug
完整配置
server: port: 80 eureka: client: register-with-eureka: false service-url: defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka #集群版 logging: level: com.atguigu.springcloud.service.PaymentFeignService: debug feign: client: config: default: #简历连接所用的时间,适用于网络状况正常的情况下,两端连接所需要的时间 ConnectTimeOut: 5000 #指建立连接后从服务端读取到可用资源所用的时间 ReadTimeOut: 10000
完成,此时已经打印详细功能
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?