OpenFeign简介
OpenFeign是一种声明式、模板化的HTTP客户端。在Spring Cloud中使用OpenFeign,可以做到使用HTTP请求访问远程服务,就像调用本地方法一样的,开发者完全感知不到这是在调用远程方法,更感知不到在访问HTTP请求。
Feign / OpenFeign对比
Feign | OpenFeign |
---|---|
Feign是Springcloud组件中的一个轻量级Restful的HTTP服务客户端,Feign内置了Ribbon,用来做客户端负载均衡,去调用服务注册中心的服务。Feign的使用方式是:使用Feign的注解定义接口,调用这个接口,就可以调用服务注册中心的服务 | OpenFeign 是Spring Cloud在feign的基础上支持了SpringMVC的注解,如@RequestMapping等。OpenFeign的@FeignClint可以解析SpringMVC的@RequestMapping注解下的接口,并通过动态代理的方式产生实现类,实现类中做负载均衡并调用其它服务 |
OpenFeign的功能
1.可插拔的注解支持,包括Feign注解和JAX-RS注解。
2.支持可插拔的HTTP编码器和解码器(Gson,Jackson,Sax,JAXB,JAX-RS,SOAP)。
3.支持Hystrix和它的Fallback。
4.支持Ribbon的负载均衡。
5.支持HTTP请求和响应的压缩。
6.灵活的配置:基于 name 粒度进行配置
7.支持多种客户端:JDK URLConnection、apache httpclient、okhttp,ribbon)
8.支持日志
9.支持错误重试
10.url支持占位符
11.可以不依赖注册中心独立运行
springboot 整合 OpenFeign
- 如下搭建基础项目架构
- api 添加pom依赖
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
<version>2.0.4.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-openfeign-core</artifactId>
<version>2.0.4.RELEASE</version>
</dependency>
</dependencies>
- provider / consumer 添加pom依赖
<dependencies>
<dependency>
<groupId>com.example</groupId>
<artifactId>openfeign-api</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
- 添加 @EnableFeignClients 注解
@EnableFeignClients // 启用openFeign
@SpringBootApplication
public class OpenfeignConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(OpenfeignConsumerApplication.class, args);
}
}
- api中接口添加 @FeignClient 注解(指定url,可不依赖注册中心独立运行)
/**
* @author wangli
* @date 2021-04-02 9:24 PM
*/
@FeignClient(name="DemoApiService", url="localhost:8080/")
public interface DemoApiService {
@GetMapping("/test")
String test();
}
- provider 中 controller 直接实现 api 中接口,可少些一个接口
import com.example.openfeignapi.service.DemoApiService;
import org.springframework.web.bind.annotation.RestController;
/**
* @author wangli
* @date 2021-04-02 9:33 PM
*/
@RestController
public class DemoController implements DemoApiService{
@Override
public String test() {
return "test openfeign...";
}
}
- consumer 方远程调用,注入DemoApiService即可
import com.example.openfeignapi.service.DemoApiService;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
/**
* @author wangli
* @date 2021-04-02 11:10 PM
*/
@RestController
public class ConsumerController {
@Resource
DemoApiService demoApiService;
@GetMapping("/testRemote")
public String testRemote() {
return demoApiService.test();
}
}