Java 的 Feign 库提供了一种声明式的 RESTful 风格的调用方法,可以让我们更加便捷地进行服务调用。下面是使用 Feign 实现声明式 RESTful 风格调用的完整攻略。
什么是 Feign
Feign 是 Netflix 开源的一种声明式、模板化的 HTTP 客户端,它的主要作用就是让开发者更加方便的调用 RESTful 风格的 API。
如何使用 Feign
添加依赖
首先,需要在项目中添加 Feign 相关的依赖。
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
创建 Feign 接口
接下来,需要创建一个 Feign 接口,用来定义 RESTful API 的调用方式。
@FeignClient(name = "service-provider", fallback = FallbackService.class)
public interface ApiService {
@GetMapping("/api/hello")
String hello();
}
在上面的代码中,@FeignClient
注解用来声明这是一个 Feign 接口,name
参数指定了服务名,fallback
参数指定了调用失败后的容错处理类。hello
方法使用 @GetMapping
注解表示这是一个 GET 请求,请求路径为 /api/hello
。
创建容错处理类
当远程服务不可用时,需要进行容错处理。这里我们可以创建一个容错处理类,实现 Feign 接口,当出现错误时,返回默认值。
@Component
public class FallbackService implements ApiService {
@Override
public String hello() {
return "fallback";
}
}
注入 Feign 接口
最后,可以在需要使用远程服务的地方注入 Feign 接口。
@RestController
public class HelloController {
@Autowired
private ApiService apiService;
@GetMapping("/hello")
public String hello() {
return apiService.hello();
}
}
在上面的代码中,@Autowired
注解用来注入 Feign 接口,/hello
路径对应的方法会调用 ApiService
的 hello
方法获取返回值。
Feign 的两个示例
下面,分别介绍 Feign 的两个示例。
示例一
首先,我们需要在 application.yml
中配置 Feign 相关的属性。
spring:
application:
name: service-consumer
server:
port: 8080
eureka:
client:
serviceUrl:
defaultZone: http://localhost:8761/eureka/
feign:
client:
config:
default:
connectTimeout: 5000
readTimeout: 5000
loggerLevel: full
其中,spring.application.name
指定了服务名,feign.client.config.default
是 Feign 相关的配置。
然后,创建一个 Feign 接口。
@FeignClient(name = "service-provider", fallback = FallbackService.class)
public interface ApiService {
@GetMapping("/api/hello")
String hello();
}
可以在控制器中使用该接口。
@RestController
public class HelloController {
@Autowired
private ApiService apiService;
@GetMapping("/hello")
public String hello() {
return apiService.hello();
}
}
最后,启动服务提供者和服务消费者,访问 http://localhost:8080/hello
,应该能够看到服务提供者的返回值。
示例二
另外一个示例是使用 Feign 实现上传文件的功能。
首先,创建一个 Feign 接口。
@FeignClient(name = "service-provider", fallback = FallbackService.class)
public interface ApiService {
@PostMapping("/api/uploadFile")
String uploadFile(@RequestParam("file") MultipartFile file);
}
可以看到,在 Feign 接口的方法参数中,使用 @RequestParam
注解声明了一个名为 file
的参数,类型为 MultipartFile
。
然后,创建一个上传文件的控制器。
@RestController
public class FileUploadController {
@Autowired
private ApiService apiService;
@PostMapping("/uploadFile")
public String uploadFile(@RequestParam("file") MultipartFile file) {
return apiService.uploadFile(file);
}
}
在控制器中,使用了 Feign 接口,调用了服务提供者的上传文件接口。
最后,启动服务提供者和服务消费者,上传一个文件,可以看到文件上传成功,服务提供者返回的文件名。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:java使用Feign实现声明式Restful风格调用 - Python技术站