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層是不是更好理解點。