openfeign基础应用
1.概念
OpenFeign是一种声明式、模板化的HTTP客户端。在Spring Cloud中使用OpenFeign,可以做到使用HTTP访问远程服务时就像调用本地方法一样的,开发者完全感知不到这是在调用远程方法,更感知不到在访问HTTP请求,用法其实就是编写一个接口,在接口上添加注解即可。
2.基本使用
pom.xml
<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>com.zt.studydemo</groupId> <artifactId>study_demo</artifactId> <version>0.0.1-SNAPSHOT</version> <relativePath/> <!-- lookup parent from repository --> </parent> <artifactId>openFeign-consumer-9999</artifactId> <version>0.0.1-SNAPSHOT</version> <name>openFeign-consumer-9999</name> <description>openFeign-consumer-9999</description> <properties> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> <!--不使用Ribbon 进行客户端负载均衡--> <exclusions> <exclusion> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-ribbon</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-loadbalancer</artifactId> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
yml:
server: port: 9999 spring: main: allow-circular-references: true application: name: openFeign-consumer-9999 cloud: nacos: discovery: server-addr: 192.168.56.10:3333 management: endpoints: web: exposure: include: '*'
启动类:
@SpringBootApplication @EnableDiscoveryClient @EnableFeignClients//添加此注解 public class OpenFeignConsumer9999Application { public static void main(String[] args) { SpringApplication.run(OpenFeignConsumer9999Application.class, args); } }
调用服务提供者:
@Service @FeignClient("nacos-provider") //表示远程调用服务名称 public interface OpenFeignService { /** * 此方法表示远程调用info/{id}接口 */ @GetMapping("info/{id}") public String getInfo(@PathVariable("id") Long id); }
控制器类:
@RestController public class OpenFeignController { @Autowired private OpenFeignService openFeignService; @GetMapping("getInfo/{id}") public String getInfo(@PathVariable("id") Long id){ return openFeignService.getInfo(id); } }
测试结果:
3.设置超时时间
直接在yml添加配置即可
feign: # 设置超时时间 client: config: default: ConnectTimeOut: 5000 #指的是建立连接所用的时间,适用于网络状况正常的情况下,两端连接所用的时间。如果超过5秒,报错 ReadTimeOut: 5000 #指的是建立连接后从服务器读取到可用资源所用的时间。
4.日志打印
Feign 提供了日志打印功能,我们可以通过配置来调整日志级别,从而了解 Feign 中 Http 请求的细节。简单理解,就是对Feign接口的调用情况进行监控和输出
日志级别:
- NONE:默认的,不显示任何日志;
- BASIC:仅记录请求方法、URL、响应状态码及执行时间;
- HEADERS:除了 BASIC 中定义的信息之外,还有请求和响应的头信息;
- FULL:除了 HEADERS 中定义的信息之外,还有请求和响应的正文及元数据。
具体使用:
需要在启动类中通过@Bean注解注入OpenFeign的日志功能
@SpringBootApplication @EnableDiscoveryClient @EnableFeignClients//添加此注解 public class OpenFeignConsumer9999Application { public static void main(String[] args) { SpringApplication.run(OpenFeignConsumer9999Application.class, args); } @Bean Logger.Level feignLoggerLevel(){ return Logger.Level.FULL; } }
yml配置:
#设置日志打印级别 logging: level: com.zt: debug
测试:
5.整合sentinel
引入依赖:
<dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId></dependency><dependency> <groupId>io.github.openfeign</groupId> <artifactId>feign-hystrix</artifactId></dependency>
配置yml:
feign:# 和sentinel集成sentinel: enabled: true
OpenFegin接口编写:
这里我们的接口写法和之前保持一致,但是要注意,我们这里要多增加一个FeignClient的属性:fallback: 定义容错的处理类,当调用远程接口失败或超时时,会调用对应接口的容错逻辑,fallback指定的类必须实现@FeignClient标记的接口
@Service@FeignClient(value = "nacos-provider",fallback = OpenFeignServiceImpl.class)public interface OpenFeignService { /** * 此方法表示远程调用info/{id}接口 */ @GetMapping("info/{id}") public String getInfo(@PathVariable("id") Long id);}
实现类:
@Componentpublic class OpenFeignServiceImpl implements OpenFeignService { @Override public String getInfo(Long id) { return "服务降级返回!"; }}
测试:
此时如果我们访问http://localhost:8084/getInfo/1的地址是没有问题的,但是如果此时我们人为停止9001/9002服务,这个时候就会触发fallback属性对应的处理类型完成服务降级。