一、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-feignserver: port: 8084 context-path: /spring#服務注冊中心的配置內容,指定服務注冊中心的位置eureka: client: serviceUrl: defaultZone: http://user:password@localhost:8761/eureka/
三、自定義Feign的 配置
1、自定義Configuration
@Configurationpublic class FooConfiguration { @Bean public Contract feignContract() { //這將SpringMvc Contract 替換為feign.Contract.Default return 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);*/}
新聞熱點
疑難解答