OpenFeign服務接口調用
- 一、OpenFeign
- 二、cloud-consumer-feign-order80
- 三、測試
-
- 3.1 測試負載均衡
- 3.2 測試逾時控制
一、OpenFeign
Feign是一個聲明式的Web Service用戶端。它的出現使開發Web Service用戶端變得很簡單。使用Feign隻需要建立一個接口加上對應的注解,比如:@FeignClient注解。
Feign有可插拔的注解,包括@Feign注解和JAX-RS注解。Feign也支援編碼器和解碼器,Spring Cloud Open Feign對Feign進行增強支援Spring MVC注解,可以像Spring Web一樣使用HttpMessageConverters等。
Feign是一種聲明式、模闆化的HTTP用戶端。在Spring Cloud中使用Feign,可以做到使用HTTP請求通路遠端服務,就像調用本地方法一樣的,開發者完全感覺不到這是在調用遠端方法,更感覺不到在通路HTTP請求。
功能可插拔的注解支援,包括Feign注解和JAX-RS注解。支援可插拔的HTTP編碼器和解碼器(Gson,Jackson,Sax,JAXB,JAX-RS,SOAP)。
支援Hystrix和它的Fallback。支援Ribbon的負載均衡。支援HTTP請求和響應的壓縮。
靈活的配置:基于 name 粒度進行配置支援多種用戶端:JDK URLConnection、apache httpclient、okhttp,ribbon)支援日志支援錯誤重試url支援占位符可以不依賴注冊中心獨立運作。
二、cloud-consumer-feign-order80
pom.xml
<!-- 引入eureka用戶端 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<!-- open feign -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
主啟動類OrderFeignMain80
package com.atguigu.springcloud;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.openfeign.EnableFeignClients;
@SpringBootApplication
@EnableFeignClients
public class OrderFeignMain80 {
public static void main(String[] args) {
/*Feign是一個聲明式WebService用戶端,使用feign能讓編寫WebService用戶端更加簡單,
*使用方式-定義一個服務接口然後在上面添加注解
* Feign可以與Eureka和Ribbon結合使用以支援負載均衡
*/
SpringApplication.run(OrderFeignMain80.class,args);
}
}
FeignConfig日志輸出級别配置類
package com.atguigu.springcloud.config;
import feign.Logger;
import org.springframework.context.annotation.Configuration;
@Configuration
public class FeignConfig {
Logger.Level feignLoggerLevel(){
return Logger.Level.FULL;
}
}
OrderFeignController
package com.atguigu.springcloud.controller;
import com.atguigu.springcloud.entities.CommonResult;
import com.atguigu.springcloud.entities.Payment;
import com.atguigu.springcloud.service.PaymentFeignService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class OrderFeignController {
@Autowired
private PaymentFeignService paymentFeignService;
@GetMapping("/consumer/payment/get/{id}")
public CommonResult<Payment> getPaymentById(@PathVariable("id") Long id){
return paymentFeignService.getPaymentById(id);
}
逾時控制
@GetMapping(value = "/consumer/payment/feign/timeout")
public String paymentFeignTimeOut(){
//用戶端預設等待1秒鐘
return paymentFeignService.paymentFeignTimeOut();
}
}
PaymentFeignService
package com.atguigu.springcloud.service;
import com.atguigu.springcloud.entities.CommonResult;
import com.atguigu.springcloud.entities.Payment;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
@Component
@FeignClient(value = "CLOUD-PAYMENT-SERVICE") //8001微服務名稱
//使用方式:微服務調用接口+注解 即->提供方8001微服務調用接口[email protected]
public interface PaymentFeignService {
//這是8001微服務接口位址
@GetMapping("/payment/get/{id}")
CommonResult<Payment> getPaymentById(@PathVariable("id") Long id);
@GetMapping(value = "/payment/feign/timeout")
String paymentFeignTimeOut();
}
三、測試
依次啟動7001、7002、8001、8002、OrderFeignMain80。
啟動後通路http://eureka7001.com:7001/得到注冊的服務狀況
3.1 測試負載均衡
通路http://localhost:80/consumer/payment/get/1會輪詢落在8001和8002服務上
3.2 測試逾時控制
通路8001,正常通路
第一次通路http://localhost:80/consumer/payment/feign/timeout,正常
過幾秒鐘再通路,已經無法通路