首頁 >Java >java教程 >spring cloud 之 Feign 使用HTTP請求遠端服務

spring cloud 之 Feign 使用HTTP請求遠端服務

巴扎黑
巴扎黑原創
2017-06-26 11:09:372203瀏覽

一、Feign 簡介

在spring Cloud Netflix堆疊中,各個微服務都是以HTTP介面的形式暴露自身服務的,因此在呼叫遠端服務時就必須使用HTTP客戶端。我們可以使用JDK原生的URLConnection、Apache的Http Client、Netty的非同步HTTP Client, Spring的RestTemplate。但是,用起來最方便、最優雅的還是要屬Feign了。

Feign是一種宣告式、模板化的HTTP客戶端。在Spring Cloud中使用Feign, 我們可以做到使用HTTP請求遠端服務時能與呼叫本地方法一樣的編碼體驗,開發者完全感知不到這是遠端方法,更感知不到這是一個HTTP請求。

二、feign的使用在spring cloud中的使用

#1、新增依賴

      <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-feign</artifactId>   </dependency>

2、建立FeignClient

@FeignClient(name="SPRING-PRODUCER-SERVER/spring")public interface FeignUserClient {
  @RequestMapping( value = "/findAll/{name}",method = RequestMethod.GET)  public List<SpringUser> findAll(@PathVariable("name") String name);
  
  @RequestMapping( value = "/findUserPost",method = RequestMethod.POST)  public SpringUser findUserPost(@RequestBody SpringUser springUser);//复合类型好像默认是POST请求
}
  • @FeignClient(name="SPRING-PRODUCER-SERVER/spring"):用於通知Feign元件對該介面進行代理(不需要編寫接口實作),name屬性指定我們要呼叫哪個服務。用戶可直接透過@Autowired注入。

  • @RequestMapping表示在呼叫該方法時需要向/group/{groupId}發送GET請求。

  • @PathVariable與SpringMVC中對應註解意義相同。

原理:Spring Cloud應用在啟動時,Feign會掃描標有@FeignClient註解的接口,產生代理,並註冊到Spring容器中。產生代理時Feign會為每個接口方法創建一個RequetTemplate對象,該對象封裝了HTTP請求所需的全部信息,請求參數名、請求方法等信息都是在這個過程中確定的,Feign的模板化就體現在這裡。

3、啟動類別上新增註解

@Configuration
@ComponentScan
@EnableAutoConfiguration
@EnableEurekaClient
@EnableFeignClientspublic class SpringConsumerServerFeignApplication {public static void main(String[] args) {
        SpringApplication.run(SpringConsumerServerFeignApplication.class, args);
    }
}

4、設定檔 application.yml

spring:
 application:
  name: spring-consumer-server-feign
server: 
 port: 8084
 context-path: /spring
#服务注册中心的配置内容,指定服务注册中心的位置
eureka:
 client:
  serviceUrl:
   defaultZone: http://user:password@localhost:8761/eureka/

#三、自訂Feign的設定

1、自訂Configuration

@Configurationpublic class FooConfiguration {
    @Beanpublic Contract feignContract() {//这将SpringMvc Contract 替换为feign.Contract.Defaultreturn new feign.Contract.Default();
    }
}

2、使用自訂的Configuration

@FeignClient(name="SPRING-PRODUCER-SERVER/spring",configuration=FooConfiguration.class)public interface FeignUserClient {
    @RequestLine("GET /findAll/{name}")public List<SpringUser> findAll(@Param("name") String name);    
 /* @RequestMapping( value = "/findAll/{name}",method = RequestMethod.GET)
  public List<SpringUser> findAll(@PathVariable("name") String name);
  
  @RequestMapping( value = "/findUserPost",method = RequestMethod.POST)
  public SpringUser findUserPost(@RequestBody SpringUser springUser);*/}
@RequestLine:是feign的注解


为每个创建的Feign客户端创建一个记录器。默认情况下,记录器的名称是用于创建Feign客户端的接口的完整类名。Feign日志记录仅响应DEBUG级别。logging.level.project.user.UserClient: DEBUG
在配置文件application.yml 中加入:
logging:
 level:
  com.jalja.org.spring.simple.dao.FeignUserClient: DEBUG

在自訂的Configuration的類別中新增日誌等級

@Configurationpublic class FooConfiguration {   /* @Bean
    public Contract feignContract() {
        //这将SpringMvc Contract 替换为feign.Contract.Default
        return new feign.Contract.Default();
    }*/@Bean
    Logger.Level feignLoggerLevel() {//设置日志return Logger.Level.FULL;
    }
}

PS:Feign請求逾時問題

Hystrix預設的逾時時間是1秒,如果超過這個時間尚未回應,將會進入fallback程式碼。而首次請求往往會比較慢(因為Spring的懶載入機制,要實例化一些類別),這個回應時間可能就大於1秒了
解決方案有三種,以feign為例。
方法一
hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds: 5000
此設定是讓Hystrix的逾時時間改為5秒
方法二
hystrix.command. default.execution.timeout.enabled: false
此配置,用於停用Hystrix的逾時時間
方法三
feign.hystrix.enabled: false
該配置,用於索性停用feign的hystrix 。此做法除非一些特殊場景,不建議使用。

<br><br>

以上是spring cloud 之 Feign 使用HTTP請求遠端服務的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn