一起來學SpringCloud 聲明式Http調用Feign

序言

​ 作爲Spring Cloud的子項目之一,Spring Cloud OpenFeign以將OpenFeign集成到Spring Boot應用中的方式,爲微服務架構下服務之間的調用提供瞭解決方案。首先,利用了OpenFeign的聲明式方式定義Web服務客戶端;其次還更進一步,通過集成Ribbon或Eureka實現負載均衡的HTTP客戶端。

此文章僅限入門 SpringCloud版本爲 Greenwich

​ 早期版本的 FeignSpring Cloud 團隊集成在 spring-cloud-netflix 子項目下,但如今 Spring Cloud 團隊將 Spring Cloud Feign 獨立成一個單獨的 spring-cloud-openfeign 項目

使用

導入依賴

<dependencies>
      <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>
</dependencies>

然後是yml

server:
  port: 7001
spring:
  application:
    name: spring-cloud-action-server-order
eureka:
  instance:
    prefer-ip-address: true
    instance-id: ${spring.cloud.client.ip-address}:${spring.application.instance_id:${server.port}}
    hostname: localhost
  client:
    service-url:
      defaultZone: http://${eureka.instance.hostname}:8761/eureka/

然後是主函數

@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
public class ATestApplication {
    public static void main(String[] args) {
        SpringApplication.run(ATestApplication.class, args);
    }
}

我們知道Ribbon 使用RestTemplate 那樣的調用,但是那樣調用的話非常的不方便,也略顯醜陋,那麼我們使用的Feign就完全可以解決這樣的問題了,讓調用Http請求像調用本地服務那樣簡單。

我們聲明一個接口

@FeignClient(name = "spring-cloud-action-server-order", decode404 = true)
//@FeignClient(name = "products", url = "http://localhost:7002/getProducts")
//@FeignClient(value = "product", serviceId = "spring-cloud-action-server-order", path = "/getProducts", decode404 = true)
public interface ProductService {
   //這裏的的
    @GetMapping("/getProducts")
    String getProducts();
}
  • name:指定 FeignClient 的名稱,該屬性會作爲微服務的名稱,用於服務發現
  • value:同 name 字段互通
  • serviceId:指定服務ID,每個註冊到註冊中心上的客戶端都會有對應的 serviceId 一般是 spring.application.name,與 namevalue 互通
  • url: 一般用於調試,可以指定一個詳細地址(http://localhost:7002/getProducts)
  • path: 請求統一路徑,可以看成 @RequestMapping("/products")
  • decode404:404 錯誤時,調用 decoder 進行解碼,否則拋出 FeignException
  • fallback:發生錯誤時,回調 hystrix 類/方法(後面會詳細介紹)

然後在Controller中這樣使用即可。

@RestController
public class OrderController {

    @Autowired
    private ProductService productService;

    @GetMapping
    public String query() {
        return serverBService.query();
    }
}

是不是很方便。

Feign攔截器

​ 使用Spring Cloud時,通常會用 Feign 來調用遠程服務,比如遠程服務的權限驗證,需要在 header 中傳遞 token之類的。在方法中顯示傳遞又過於麻煩了,這時候就可以考慮使用 Feign 提供的RequestInterceptor 接口,只要實現了該接口,那麼Feign每次做遠程調用之前都可以被它攔截下來在進行包裝。

只需要實現一個 RequestInterceptor 即可。

@Configuration
public class FeignInterceptor implements RequestInterceptor {
    @Override
    public void apply(RequestTemplate requestTemplate) {
        requestTemplate.header("token", "jwt");
    }
}

比如你在調試 具有jwt token傳輸的服務的時候,爲了方便測試一般可以自己附加一個這樣就方便多了。

在服務的另外一端就可以通過 這樣獲取到了

@RestController
public class ProductController {
    @GetMapping("/getProducts")
    public String getProducts(@RequestHeader String token) {
        return token;
    }
}

此文章僅限入門,切記啊不會用找不到多去官網看文檔!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章