天天看點

SprinCloud元件之Feign

Feign是一個聲明式的Web服務用戶端。這使得Web服務用戶端的寫入更加友善 要使用Feign建立一個界面并對其進行注釋。它具有可插拔注釋支援,包括Feign注釋和JAX-RS注釋。Feign還支援可插拔編碼器和解碼器。Spring Cloud添加了對Spring MVC注釋的支援,并在Spring Web中使用預設使用的HttpMessageConverters。Spring Cloud內建Ribbon和Eureka以在使用Feign時提供負載均衡的http用戶端

本文将介紹Feign的原理和一些相關知識點以及如何在項目中使用

一、Feign的原理

1、啟動時,程式會進行包掃描,掃描所有包下所有@FeignClient注解的類,并将這些類注入到spring的IOC容器中。當定義的Feign中的接口被調用時,通過JDK的動态代理來生成RequestTemplate。

2、RequestTemplate中包含請求的所有資訊,如請求參數,請求URL等

3、RequestTemplate生成Request,然後将Request交給client處理,這個client預設是JDK的HTTPUrlConnection,也可以是OKhttp、Apache的HTTPClient等

4、最後client封裝成LoadBaLanceClient,結合ribbon負載均衡地發起調用

SprinCloud元件之Feign

二、項目中使用

1、搭建Eureka注冊中心

本文不介紹如何搭建Eureka服務,不了解Eureka的可以前往檢視這篇文章學習:SpringCloud元件之Eureka

2、搭建目标服務

a、導入依賴

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.cloud</groupId>
     <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
           

b、啟動類标注Eureka用戶端注解

/**
 * @author Gjing
 */
@SpringBootApplication
@EnableEurekaClient
public class DemoApplication {
    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }
}
           

c、yml檔案配置

server:
  port: 8090
spring:
  application:
    name: demo
eureka:
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka/
           

d、編寫接口,提供給Feign調用

/**
 * @author Gjing
 **/
@RestController
public class TestController {

    @GetMapping("/test")
    public Map<String,Object>test() {
        Map<String,Object> map = new HashMap<>(16);
        map.put("code", "ok");
        return map;
    }

    @GetMapping("/test2")
    public String test2(@RequestParam(name = "param1") String param1) {
        return param1;
    }

    @PostMapping("/test3")
    public Integer test3(Integer id) {
        return id;
    }
}
           

3、搭建調用服務

a、導入依賴

<dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
     <groupId>org.springframework.cloud</groupId>
     <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
     <groupId>org.springframework.cloud</groupId>
     <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
           

b、啟動類增加注解

/**
 * @author Gjing
 */
@SpringBootApplication
@EnableFeignClients
@EnableEurekaClient
public class FeignApplication {

    public static void main(String[] args) {
        SpringApplication.run(FeignApplication.class, args);
    }

}
           

c、yml配置

server:
  port: 8083
spring:
  application:
    name: feign-demo
eureka:
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka/

           

d、建立service,用于調用服務

/**
 * @author Gjing
 **/
@FeignClient(name = "demo")
public interface FeignTestService {

    @RequestMapping(value = "/test", method = RequestMethod.GET)
    Map<String,Object>test();

    @RequestMapping(value = "test4", method = RequestMethod.GET)
    String test2(@RequestParam("param1") String param1);

    @RequestMapping(value = "/test3", method = RequestMethod.POST)
    Integer test3(@RequestParam("id") Integer id);
}
           

e、編寫Controller進行測試通路

/**
 * @author Gjing
 **/
@RestController
public class FeignTestController {

    @Resource
    private FeignTestService feignTestService;

    @GetMapping("/test")
    public String test() {
        return feignTestService.test().toString();
    }

    @GetMapping("/test2")
    public ResponseEntity test2() {
        String test2 = feignTestService.test2("你好");
        return ResponseEntity.ok(test2);
    }

    @GetMapping("/test3")
    public ResponseEntity test3() {
        Integer test3 = feignTestService.test3(1);
        return ResponseEntity.ok(test3);
    }
}
           

4、Feign如何進行回退處理

Feign本身內建了Hystrix,是以,我們直接在啟動類加上

@EnableCircuitBreaker

即可,對Hystrix不了解的可以前往這篇文章:SpringCloud元件之Hystrix

a、pom檔案增加依賴,否則會Hystrix出錯

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

b、啟動類增加注解

@EnableCircuitBreaker

c、yml檔案開啟Hystrix保護

feign:
  hystrix:
    enabled: true
           

d、建立回退類并實作之前的Feign接口類

/**
 * @author Gjing
 **/
@Component
public class FeignTestFallbackImpl implements FeignTestService {
    @Override
    public Map<String, Object> test() {
        // TODO: 2019/7/3 這裡就實作回退後的處理咯 
        Map<String,Object> map = new HashMap<>(16);
        map.put("code", "回退了");
        return map;
    }
    
    @Override
    public String test2(String param1) {
        return null;
    }

    @Override
    public Integer test3(Integer id) {
        return null;
    }
}
           

e、修改feign接口類,設定回退類

/**
 * @author Gjing
 **/
@FeignClient(name = "demo",fallback = FeignTestFallbackImpl.class)
public interface FeignTestService {

    @RequestMapping(value = "/test", method = RequestMethod.GET)
    Map<String,Object> test();

    @RequestMapping(value = "test4", method = RequestMethod.GET)
    String test2(@RequestParam("param1") String param1);

    @RequestMapping(value = "/test3", method = RequestMethod.POST)
    Integer test3(@RequestParam("id") Integer id);
}
           

f、調用測試

如果出現逾時或者異常,将進行回退處理
SprinCloud元件之Feign

本文到此就結束了,如果發現有誤歡迎指正哦,Feign預設是使用HttpUrlConnection進行http請求的,還支援okHttp和httpClient的哈,這些用法大家自行研究,本文不作介紹了,如果有興趣了解另一種使用Feign,可以參考我這篇文章:SpringCloud-Feign,Demo源代碼位址:SpringCloud-Demo