1、OpenFeign實現遠程調用
1.1 services.pom引入依賴
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
1.2 在service-order微服務中新建feign.ProductFeignClient.java
package com.zhenbang.feign;import com.zhenbang.product.bean.Product;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;@FeignClient("service-product") // feign客戶端
public interface ProductFeignClient {// MVC注解的兩套使用邏輯// 1、標注在Controller ,是接受這樣的請求// 2、標注在FeignClient,是發送這樣的請求@GetMapping("/product/{id}")Product getProductById(@PathVariable("id") Long id);}
- 這里需要說明
@FeignClient
注解的Value值是要調用的微服務名字 @GetMapping
請求,要調用的product-service
微服務的controller
函數,此處在controller中復制
1.3 注入以及調用
@Resource
ProductFeignClient productFeignClient;
Product productFromRemote = productFeignClient.getProductById(productId);
2、OpenFeign調用詳細日志實現
3、OpenFeign超時控制
- 連接超時和讀取超時
- 默認時間分別是 10s 和 60s
- 超時配置
4、OpenFeign重試機制
- 默認沒有重試
- 可以設置重試(100ms,1s,5)
最大重復次數5次、如果相隔時間超過1s,不再重試,第2次是100ms,第三次是100ms*1.5
增加一個重試配置類
package com.zhenbang.config;import feign.Retryer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class RetryerConfig {@BeanRetryer retryer(){return new Retryer.Default();// 這個放那三個參數}
}
5、OepenFeign配置攔截器
以請求攔截器為例
5.1 請求攔截器java文件
java文件
package com.zhenbang.interceptor;import feign.RequestInterceptor;
import feign.RequestTemplate;
import org.springframework.stereotype.Component;import java.util.UUID;
/*攔截器使用的第二種方式*/
@Component
public class TokenRequestInterceptor implements RequestInterceptor {@Overridepublic void apply(RequestTemplate requestTemplate) {System.out.println("攔截器啟動");/*為這次請求頭種添加token信息*/// 主要是requestTemplate.header("X-Token", UUID.randomUUID().toString());}
}
5.2 攔截器配置使用
方法一:在yml文件中
方法二:攔截器加Component
組件
這里使用第2種方式
6、OpenFeign兜底返回Fallback
6.1 編寫回調函數
6.2 ProductFeignClientFallback.java
package com.zhenbang.feign.fallback;
import java.math.BigDecimal;import com.zhenbang.feign.ProductFeignClient;
import com.zhenbang.product.bean.Product;
@Component
public class ProductFeignClientFallback implements ProductFeignClient {@Overridepublic Product getProductById(Long id) {System.out.println("回調兜底");Product product = new Product();product.setId(id);product.setPrice(new BigDecimal("0"));product.setProductName("");product.setNum(0);return product; // 如果調用失敗,就走回調這個邏輯,返回空值}
}
6.3 service.pom引入Sentinel依賴
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-sentinel</artifactId></dependency>
6.4 yml開啟Sentinel功能
- feign用Sentinel開啟熔斷功能