OpenFeign入門操作

語言: CN / TW / HK

OpenFeign

OpenFeifn也是服務呼叫與Ribbon相比簡化了使用Spring cloud Ribbon時,自動封裝服務呼叫客戶端的開發量。Feign集成了Ribbon利用Ribbon維護了Payment的服務列表資訊,並且通過輪詢實現了客戶端的負載均衡。而與Ribbon不同的是,通過feign只需要定義服務繫結介面且以宣告式的方法,優雅而簡單的實現了服務呼叫

使用方法

  • 介面+註解: 微服務呼叫介面[email protected]

  • 新建一個cloud-consumer-openFeign-order80消費端

  • pom

xml <dependencies> <!--openfeign--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency> <!--eureka client--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency> <dependency><!-- 引入自己定義的api通用包,可以使用Payment支付Entity --> <groupId>com.cloud</groupId> <artifactId>cloud-api-commons</artifactId> <version>1.0-SNAPSHOT</version> </dependency> <!--web--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> <!--一般基礎通用配置--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <scope>runtime</scope> <optional>true</optional> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies>

  • 主啟動類要加@EnableFeignClients

  • 新建業務層介面PaymentFeignService介面並新增註解@FeignClient

這裡抽象方法就對應服務介面@GetMapping("/payment/get/{id}")

java @Component @FeignClient(value = "CLOUD-PAYMENT-SERVICE") public interface OpenFeignService { @GetMapping("/payment/get/{id}") public Result<Payment> getPaymentById(@PathVariable("id") Long id); }

  • 寫控制層Controller 這就正常寫

```java @RestController @Slf4j public class FeignController {

  @Resource
  private OpenFeignService openFeignService;

  @GetMapping(value = "/consumer/payment/get/{id}")
  public Result<Payment> getPaymentById(@PathVariable("id") Long id)
  {
      return openFeignService.getPaymentById(id);
  }

}

```

  • 測試

啟動7001->8001/8002->80

進行測試會發現OpenFeign自帶負載均衡配置項,這是因為它也集成了ribbon包。

OpenFeign超時設定

  • 故意讓8001埠睡一會

java @GetMapping(value = "/payment/feign/timeout") public String paymentFeignTimeOut() { System.out.println("*****paymentFeignTimeOut from port: "+port); //暫停幾秒鐘執行緒 try { TimeUnit.SECONDS.sleep(3); } catch (InterruptedException e) { e.printStackTrace(); } return port; }

  • 測試一下

feign.jpg

  • 發現並沒有找到介面報404,這是因為feign預設請求為1秒,而我們讓程式睡了3秒使用者等不了只能給他說沒有這個請求,如果真遇到複雜程式就要我們手動調整一下最大時間上限.

這裡我們調的ribbon的時間其實也都一樣,因為feign已經集成了ribbon

yml ribbon: ReadTimeout: 5000 # 毫秒時間, 同feign的 ConnectTimeout: 5000 #, 同feign的

  • 再進行測試 會等待三秒才會得到資料

feign2.jpg

  • feign的配置

```yml feign: client: config: default: // 這個代表 服務,default為任意服務,可以指定服務名來指定呼叫該服務時的超時時間 connectTimeout: 毫秒時間,建立連線的超時時間,一般只在發現服務時用到 readTimeout: 毫秒時間 ,介面請求的超時時間

```

OpenFeign日誌列印

  • Feign 提供了日誌列印功能,我們可以通過配置來調整日誌級別,從而瞭解 Feign 中 Http 請求的細節。說白了就是對Feign介面的呼叫情況進行監控和輸出,現在介面少等以後介面多可以更好的維護。

  • 配置類

java @Configuration public class FeignConfig { @Bean Logger.Level feignLoggerLevel(){ return Logger.Level.FULL; } }

  • yml配置

java logging: level: # feign日誌以什麼級別監控 哪個介面 com.wzj.springcloud.service.OpenFeignService: debug

  • 啟動測試

feignlog.jpg

openfeign 和 feign

Feign 是Spring Cloud元件中的一個輕量級RESTful的HTTP服務客戶端Feign內建了Ribbon,用來做客戶端負載均衡,去呼叫服務註冊中心的服務。Feign的使用方式是:使用Feign的註解定義介面,呼叫這個介面,就可以呼叫服務註冊中心的服務。OpenFeign是Spring Cloud 在Feign的基礎上支援了SpringMVC的註解,如@RequesMapping等等。OpenFeign的@FeignClient可以解析SpringMVC的@RequestMapping註解下的介面,並通過動態代理的方式產生實現類,實現類中做負載均衡並呼叫其他服務。 org.springframework.cloud spring-cloud-starter-feign org.springframework.cloud spring-cloud-starter-openfeign

| Feign | OpenFeign | | ------------------------------------------------------------ | ------------------------------------------------------------ | | 是Spring Cloud元件中的一個輕量級RESTful的HTTP服務客戶端Feign內建了Ribbon,用來做客戶端負載均衡,去呼叫服務註冊中心的服務。 | 是Spring Cloud 在Feign的基礎上支援了SpringMVC的註解,如@RequesMapping等等。 | | Feign的使用方式是:使用Feign的註解定義介面,呼叫這個介面,就可以呼叫服務註冊中心的服務。 | OpenFeign的@FeignClient可以解析SpringMVC的@RequestMapping註解下的介面,並通過動態代理的方式產生實現類,實現類中做負載均衡並呼叫其他服務。 | | org.springframework.cloud spring-cloud-starter-feign | org.springframework.cloud spring-cloud-starter-openfeign | | | |

為什麼有Ribbon又出現OpenFeig呢?

為了方便,讓程式寫起來更有邏輯。比如我們之前用Ribbon+RestTemplate方式去獲得暴露的埠,我們是直接在Controller中進行的,而程式碼寫起來也不是很順暢的對吧。而我們之前寫程式碼是怎麼樣的?是不是剛開始學時老師就強調dao-service-controller,但是你用了是不是就沒辦法呼叫service是不是違背了本來的意願其實也沒那麼嚴重。這是OpenFeign就出現了,他封裝了Ribbon只是在介面成用註解進行完成操作,是不是方便很多寫起來更加方便了。這裡理解為8001的controller介面為80端的serviceImpl或者dao層是不是更好理解點。