OpenFeign入門操作
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;
}
- 測試一下
- 發現並沒有找到介面報404,這是因為feign預設請求為1秒,而我們讓程式睡了3秒使用者等不了只能給他說沒有這個請求,如果真遇到複雜程式就要我們手動調整一下最大時間上限.
這裡我們調的ribbon的時間其實也都一樣,因為feign已經集成了ribbon
yml
ribbon:
ReadTimeout: 5000 # 毫秒時間, 同feign的
ConnectTimeout: 5000 #, 同feign的
- 再進行測試 會等待三秒才會得到資料
- 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
- 啟動測試
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層是不是更好理解點。