OpenFeign 详解

   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

添加注解@EnableFeignClients开启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);
}

openFeign如何传参

 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); 
     下图是官方给出的实例

OpenFeign 详解_第1张图片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

Feign logging

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;
    }
}

你可能感兴趣的:(spring,cloud,java,springcloud)