前言
OpenFeign 全称 Spring Cloud OpenFeign,它是 Spring 官方推出的一种声明式服务调用与负载均衡组件。我们可以像调用本地方法一样来调用远程服务,而完全感觉不到这是在进行远程调用。
1、常用注解
使用 OpenFegin 进行远程服务调用时,常用注解如下表。
注解 | 说明 |
@FeignClient | 该注解用于通知 OpenFeign 组件对 @RequestMapping 注解下的接口进行解析,并通过动态代理的方式产生实现类,实现负载均衡和服务调用。 |
@EnableFeignClients | 该注解用于开启 OpenFeign 功能,当 Spring Cloud 应用启动时,OpenFeign 会扫描标有 @FeignClient 注解的接口,生成代理并注册到 Spring 容器中。 |
@RequestMapping | Spring MVC 注解,在 Spring MVC 中使用该注解映射请求,通过它来指定控制器(Controller)可以处理哪些 URL 请求,相当于 Servlet 中 web.xml 的配置。 |
@GetMapping | Spring MVC 注解,用来映射 GET 请求,它是一个组合注解,相当于 @RequestMapping(method = RequestMethod.GET) 。 |
@PostMapping | Spring MVC 注解,用来映射 POST 请求,它是一个组合注解,相当于 @RequestMapping(method = RequestMethod.POST) 。 |
2、实践
2.1、修改pom.xml配置
在上一章节 [《微服务实战》 第五章 Spring Cloud Netflix 之 Ribbon ] 基础上,添加OpenFeign依赖项
<?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.hqyj</groupId> <artifactId>SpringCloud</artifactId> <version>0.0.1-SNAPSHOT</version> </parent> <artifactId>customer-api</artifactId> <name>customer-api</name> <description>customer-api</description> <properties> <java.version>1.8</java.version> <maven.compiler.source>8</maven.compiler.source> <maven.compiler.target>8</maven.compiler.target> </properties> <dependencies> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!--devtools 开发工具--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <scope>runtime</scope> <optional>true</optional> </dependency> <!--Spring Boot 测试--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <!--junit 测试--> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> </dependency> <!-- 修改后立即生效,热部署 --> <dependency> <groupId>org.springframework</groupId> <artifactId>springloaded</artifactId> <version>1.2.8.RELEASE</version> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency> <!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-loadbalancer --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-loadbalancer</artifactId> </dependency> <dependency> <groupId>com.hqyj</groupId> <artifactId>common-api</artifactId> <version>0.0.1-SNAPSHOT</version> </dependency> </dependencies> </project>
2.2、增加用户服务接口,添加FeignClient配置
import com.hqyj.common.model.UserInfo; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.stereotype.Component; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import java.util.List; /*** * @title 用户服务接口 * @desctption 用户服务接口 * @author kelvin * @create 2023/5/11 16:44 **/ @Component @FeignClient(value = "USER-SERVICE") public interface UserService { @RequestMapping(value = "/user/userInfoList",method = RequestMethod.GET) public List<UserInfo> userInfoList(); }
2.3、修改控制层UserConsumerController
import com.hqyj.common.model.UserInfo; import com.hqyj.customerapi.service.UserService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import java.util.List; /*** * @title UserConsumerController * @desctption 用户控制层 * @author kelvin * @create 2023/5/11 14:22 **/ @RestController @RequestMapping("/user") public class UserConsumerController { /* @Autowired private UserConsumerService userConsumerService;*/ @Autowired private UserService userService; @GetMapping("/userInfoList") public List<UserInfo> userInfoList(){ return userService.userInfoList(); } }
2.4、启动类增加OpenFeign配置
import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.openfeign.EnableFeignClients; /*** * @title SpringBoot 启动类 * @desctption SpringBoot 启动类 * @author kelvin * @create 2023/5/11 12:22 **/ @SpringBootApplication @EnableFeignClients public class CustomerApiApplication { public static void main(String[] args) { SpringApplication.run(CustomerApiApplication.class, args); } }
2.5、远程调用超时设置
openFeign其实是有默认的超时时间的,默认分别是连接超时时间10秒、读超时时间60秒
可添加配置,自定义超时时间
server: port: 80 eureka: client: register-with-eureka: false #本微服务为服务消费者,不需要将自己注册到服务注册中心 fetch-registry: true #本微服务为服务消费者,需要到服务注册中心搜索服务 service-url: defaultZone: http://localhost:7001/eureka feign: client: config: default: #建立连接所用的时间,适用于网络状况正常的情况下,两端连接所需要的时间 connect-timeout: 5000 #指建立连接后从服务端读取到可用资源所用的时间 read-timeout: 10000