前面已经完成了 Feign 的准备工作,下面将通过一个简单的例子来介绍如何使用 Feign 调用 HTTP 服务。
💢注意,该项目仅仅是一个非常简单的 Spring Boot 项目,不需要引入 Spring Cloud 相关的依赖。
完整的 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>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>3.2.9</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.hxstrive</groupId> <artifactId>demo_netflix_feign</artifactId> <version>0.0.1-SNAPSHOT</version> <name>demo_netflix_feign</name> <description>demo_netflix_feign</description> <properties> <java.version>17</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <scope>runtime</scope> <optional>true</optional> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </dependency> <!-- feign 依赖 --> <dependency> <groupId>io.github.openfeign</groupId> <artifactId>feign-jackson</artifactId> <version>11.8</version> </dependency> </dependencies> <build> <finalName>demo_netflix_feign</finalName> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
一个常见的 Spring Boot 启动类,代码如下:
package com.hxstrive.demo_netflix_feign; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; /** * 启动类 * @author hxstrive.com */ @SpringBootApplication public class DemoFeignApplication { public static void main(String[] args) { SpringApplication.run(DemoFeignApplication.class, args); } }
该配置文件仅仅用来配置端口和应用名称、以及日志信息,内容如下:
server: port: 8080 spring: application: name: feign_application logging: level: root: debug
说的直白点,就是创建一个接口,该接口定义了用来调用目标 HTTP 服务的一些方法定义,一个简单的 Feign 客户端代码如下:
package com.hxstrive.demo_netflix_feign.feign; import feign.Contract; import feign.Feign; import feign.RequestLine; import feign.codec.Decoder; import feign.codec.Encoder; /** * 用户 Feign * @author hxstrive.com */ public interface SimpleFeign { // 定义获取用户信息的方法 @RequestLine("GET /simple/hello") public String get(); // 创建Feign客户端实例的静态方法 static SimpleFeign create() { return Feign.builder() .encoder(new Encoder.Default()) .decoder(new Decoder.Default()) .contract(new Contract.Default()) .target(SimpleFeign.class, "http://localhost:8090/"); } }
注意,这里没有在类上面添加任何注解,在使用的时候通过类名调用 create() 静态方法或一个 SimpleFeign 接口的实例,通过调用该实例的 get() 方法就可以发起 http://localhost:8090/simple/hello 的 GET 请求。
该控制器用来接收客户端的请求,然后使用 Feign 客户端调用具体的 HTTP 服务,代码如下:
package com.hxstrive.demo_netflix_feign.controller; import com.hxstrive.demo_netflix_feign.dto.CommonReturn; import com.hxstrive.demo_netflix_feign.entity.User; import com.hxstrive.demo_netflix_feign.feign.SimpleFeign; import com.hxstrive.demo_netflix_feign.feign.UserFeign; import com.hxstrive.demo_netflix_feign.feign.UserRestfulFeign; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import java.util.List; /** * 控制器 * @author hxstrive.com */ @RestController public class FeignController { @GetMapping("/demo1") public String demo1() { return SimpleFeign.create().get(); } }
启动该 Spring Boot 项目,同时将“Feign 准备工作”章节的服务启动起来。在浏览器访问 localhost:8080/demo1 地址,效果如下图:
从上图可知,已经成功使用 Netflix Feign 调用到了目标服务,搞定……后续将学习更多关于 Feign 的知识。
💢注意:该示例是后续学习的基础示例,后续将在该示例的基础上进行,不会单独创建项目。💢