前言
上一章节学习了
Ribbon
,通常利用它的RestTemplate
来实现对REST API
的调用,形成了一套模版化的调用方法。但在实际开发过程中,调用的API可能不止一处,而用RestTemplate
的调用每一步都是模版化内容。Fegin
在此基础上做了进一步的封装,我们只需要创建一个接口
并用注解
的方式来配置它,即可完成对服务提供方的接口绑定,简化了在使用Ribbon
时,自行封装服务调用客户端的开发量。
Fegin 简介
Fegin
是 Netflix 开发的声明式、模版化的HTTP
客户端,其灵感来自Retrofit
、JAXRS-2.0
以及WebSocket
。Fegin
可帮助我们更加快捷、优雅的调用HTTP API
。
在SpringCloud
中,使用 Fegin 非常简单——创建一个接口添加一些注解,代码就完成了。Fegin 支持多种注解,列入Fegin
自带的注解或者JAX-RS
注解等。
SpringCloud
对Fegin
进行了增强,使 Fegin 支持了Spring MVC
注解,并整合了Ribbon
和Eureka
,从而让 Fegin 的使用更加便捷。
快速入门
Ribbon章节的微服务使用的是 RestTemplate
(负载均衡通过整合Ribbon
实现)调用 REST API
的。本章采用Fegin
实现声明式的RESTful API
调用。
前提: 在第二章节中我们已经写好了注册中心Eureka
和服务的提供者Client
,将它们启动,并访问。
- 复制 上一章的
eureka-consumer-ribbon
项目,将artifactId
改为Fegin
pom
文件修改,引入Fegin
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
- 修改启动类
FeignApplication.java
,通过@EnableDiscoveryClient
注册为Eureka
客户端应用,以获得服务发现的能力。同时@EnableFeignClients
注解开启Fegin
@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
public class FeignApplication {
public static void main(String[] args) {
SpringApplication.run(FeignApplication.class, args);
}
}
- 创建一个
Fegin
接口,并添加@FeginClient
注解,用于创建Ribbon
负载均衡器,其中的name
参数对应的是调用对应的服务名,这里是已经在注册中心注册的微服务client
名称。
@FeignClient(name = "client")
@Component
public interface HelloRemote {
@GetMapping("/msg")
public String msg(@RequestParam("name")String name);
}
- 创建
FeignController
类,并实现HelloRemote
的接口。通过上面创建的接口来实现对Client
服务提供的/msg
接口进行调用。
@RestController
public class FeignController {
@Autowired
private HelloRemote helloRemote;
@GetMapping("/fegin")
public String index(@RequestParam("name") String name){
return helloRemote.msg(name);
}
}
- 编写配置文件
application.yml
spring:
application:
name: feign
server:
port: 7001
eureka:
client:
service-url:
defaultZone: http://localhost:8761/eureka
- 启动
Fegin
后就可以在 Eureka 界面上看到服务已经注册成功。
测试 :在浏览器访问 http://localhost:7001/fegin?name=fegin
。可以看到浏览器上返回了信息:hello~ fegin! welcome spring cloud.8081
,再按一次返回了信息:hello~ fegin! welcome spring cloud.8082
,原因是启动了两个client,端口分别为8081、8082。Fegin
将请求分别向两个客户端轮训发送,可见 Fegin
也实现了负载均衡。而与Ribbon 不同的是,通过Fegin 我们只需要定义服务绑定接口,以声明式的方法,优雅而简单的实现服务的调用。
小结
本章简单的说明了如何通过 Fegin
实现声明式服务调用,还有许多的配置这里就不一一说明了