OpenFeign是springcloud在Feign的基础上支持了SpringMVC的注解,整合了hystrix,同时,可以和Eureka和ribbon配合使用,如@RequestMapping等等。OpenFeign的@FeignClient可以解析SpringMVC的@RequestMapping注解下的接口,并通过动态代理的方式产生实现类,实现类中做负载均衡并调用其他服务。
官网:Spring Cloud OpenFeign
OpenFegin中的两个常用注解
@FeignClient: 用于通知Feign组件对该接口进行代理(不需要编写接口实现),使用者可直接通过@Autowired注入。
@EnableFeignClients:
Spring Cloud应用在启动时,Feign会扫描标有@FeignClient注解的接口,生成代理,并注册到Spring容器中。
Feign和openFeign有什么区别?
Feign | openFiegn |
Feign是SpringCloud组件中一个轻量级RESTful的HTTP服务客户端,Feign内置了Ribbon,用来做客户端负载均衡,去调用服务注册中心的服务。Feign的使用方式是:使用Feign的注解定义接口,调用这个接口,就可以调用服务注册中心的服务 | OpenFeign是SpringCloud在Feign的基础上支持了SpringMVC的注解,如@RequestMapping等。OpenFeign的@FeignClient可以解析SpringMVC的@RequestMapping注解下的接口,并通过动态代理的方式产生实现类,实现类中做负载均衡并调用其他服务。 |
POM文件引入依赖:
org.springframework.cloud
spring-cloud-starter-openfeign
@SpringBootApplication
@EnableFeignClients
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
新建openFeign接口
新建一个openFeign接口,使用@FeignClient注解标注,如下
@FeignClient("stores")
public interface StoreClient {
@RequestMapping(method = RequestMethod.GET, value = "/stores")
List getStores();
@RequestMapping(method = RequestMethod.GET, value = "/stores")
Page getStores(Pageable pageable);
@RequestMapping(method = RequestMethod.POST, value = "/stores/{storeId}", consumes = "application/json")
Store update(@PathVariable("storeId") Long storeId, Store store);
@RequestMapping(method = RequestMethod.DELETE, value = "/stores/{storeId:\\d+}")
void delete(@PathVariable Long storeId);
}
1. 传递JSON数据
如果是 POST 请求,而且是对象集合等参数,在Spring Boot 中通过@RequestBody标识入参
@PostMapping("createOrder")
public String createOrder(@RequestBody Order order ){
System.out.println(order);
return "ok";
}
2. POJO表单传参
这种传参方式也是比较常用,参数使用POJO对象接收
Order createOrder(@SpringQueryMap Order order);
下图是官方给出的实例
3.URL中携带参数
通过 URL 传参数,GET 请求,参数列表使用@PathVariable(“”)
服务提供者代码如下:
@RestController
@RequestMapping("/openfeign/orderprovider")
public class OpenFeignOrderProviderController {
@GetMapping("/getOrder/{id}")
public String getOrder(@PathVariable("id")Integer id){
return "accept one msg id="+id;
}
consumer消费者openFeign接口如下:
@FeignClient(value = "openFeign-orderprovider")
public interface OpenFeignService {
@GetMapping("/openfeign/orderprovider/getOrder/{id}")
String getOrder(@PathVariable("id")Integer id);
}
ReadTimeout: 值的是建立链接所用的时间,适用于网络状况正常的情况下, 两端链接所用的时间
ConectTimeout: 指的是建立链接后从服务器读取可用资源所用的时间
openFeign设置超时时间非常简单,只需要在配置文件中配置,如下:
feign:
client:
config:
## default 设置的全局超时时间,指定服务名称可以设置单个服务的超时时间
default:
connectTimeout: 1000
readTimeout: 1000
openFeign的日志级别如下:
NONE:默认的,不显示任何日志;
BASIC:仅记录请求方法、URL、响应状态码及执行时间;
HEADERS:除了BASIC中定义的信息之外,还有请求和响应的头信息;
FULL:除了HEADERS中定义的信息之外,还有请求和响应的正文及元数据。
配置方式:
1. 配置文件application.yml:
logging.level.project.user.UserClient: DEBUG
2.自定义一个配置类,在其中设置日志级别
@Configuration
public class FooConfiguration {
@Bean
Logger.Level feignLoggerLevel() {
return Logger.Level.FULL;
}
}