Springboot集成OpenFeign Demo詳解
最近整理一下微服務的文章,先拿一直用的OpenFeign開刀
思考:微服務之間如何方便優(yōu)雅的實現(xiàn)服務間的遠程調用
一、說說openFeign是什么吧
說到這個,那不得不先說說RPC
1.什么是RPC
RPC 全稱是 Remote Procedure Call ,即遠程過程調用,其對應的是我們的本地調用。RPC 的目的是:讓我們調用遠程方法像調用本地方法一樣。
//本地調用 R result = orderService.findOrderByUserId(id); //RPC遠程調用 orderService為代理對象 R result = orderService.findOrderByUserId(id);

RPC框架設計架構
2. 什么是Feign
Feign是Netflix開發(fā)的聲明式、模板化的HTTP客戶端,F(xiàn)eign可幫助我們更加便捷、優(yōu)雅地調用HTTP API。
Feign可以做到使用 HTTP 請求遠程服務時就像調用本地方法一樣的體驗,開發(fā)者完全感知不到這是遠程方法,更感知不到這是個 HTTP 請求。它像 Dubbo 一樣,consumer 直接調用接口方法調用 provider,而不需要通過常規(guī)的 Http Client 構造請求再解析返回數(shù)據(jù)。它解決了讓開發(fā)者調用遠程接口就跟調用本地方法一樣,無需關注與遠程的交互細節(jié),更無需關注分布式環(huán)境開發(fā)。
Spring Cloud openfeign對Feign進行了增強,使其支持Spring MVC注解,另外還整合了Ribbon和Eureka,從而使得Feign的使用更加方便。
2.1 OpenFeign和Feign的區(qū)別
Feign
Feign是SpringCloud組件中的一個輕量級RESTful的Http服務客戶端,F(xiàn)eign內置了Ribbon,用來做客戶端負載均衡,去調用服務注冊中心的服務。Feign的使用方式是:使用Feign的注解定義接口,調用這個接口,就可以調用服務注冊中心的服務。
OpenFeign
OpenFeign是SpringCloud在Feign的基礎上支持了SpringMVC的注解,如@RequestMapping等。OpenFeign的@FeignClient可以解析SpringMVC的@RequestMapping注解下的接口,并通過動態(tài)代理的方式產生實現(xiàn)類,實現(xiàn)類中做負載均衡并調用其他服務。
2.2 Ribbon&Feign對比
Ribbon+RestTemplate進行微服務調用
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
//調用方式
String url = "http://mall-order/order/findOrderByUserId/"+id;
R result = restTemplate.getForObject(url,R.class);Feign進行微服務調用
@FeignClient(value = "mall-order",path = "/order")
public interface OrderFeignService {
@RequestMapping("/findOrderByUserId/{userId}")
public R findOrderByUserId(@PathVariable("userId") Integer userId);
}
//調用
@Autowired
OrderFeignService orderFeignService;
//feign調用
R result = orderFeignService.findOrderByUserId(id);2.3 Feign的設計架構

二、Spring Cloud Alibaba快速整合Feign
下面是Springboot集成OpenFeign Demo,完全照著來妥妥的沒問題
服務提供者我就不寫了,這就是正常的controller,主要是調用者這塊,接下來寫的也是這個
1.在pom.xml文件中添加以下依賴
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
2.調用端添加啟動注解 @EnableFeignClients
@EnableAsync
@SpringBootApplication(exclude = { DataSourceAutoConfiguration.class, DruidDataSourceAutoConfigure.class })
@EnableDiscoveryClient
@EnableFeignClients //掃描和注冊feign客戶端的beanDefinition
@MapperScan("com.**.**.**.**.mapper")
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
3.編寫調用接口+@FeignClient注解
創(chuàng)建一個FeignClient接口,用于定義要調用的遠程服務的方法:
@FeignClient(value = "base-application", path = "/base")
@RequestMapping("/api/testDemo")
public interface OpenFeignBaseDemo {
@PostMapping("/queryList")
String queryList(@RequestBody JSONObject jsonObject);
}
在上面的代碼中,我們使用@FeignClient注解指定了要調用的遠程服務的名稱。然后,我們定義了一個名為queryList的方法,并使用@PostMapping注解指定了要調用的遠程服務的API路徑。
4.發(fā)起調用,像調用本地方式一樣調用遠程服務
在其他類中使用OpenFeignBaseDemo 來調用遠程服務的方法
@RestController
@RequestMapping("/openFeignDemo")
public class OpenFeignControllerDemo {
@Autowired
private OpenFeignBaseDemo openFeignBase;
@PostMapping(value = "/test", produces = { "application/json;charset=utf-8" })
public ResponseEntity test(@RequestBody JSONObject jsonObject) {
//feign調用
String res = openFeignBase.queryList(jsonObject);
return new ResponseEntity(res, HttpStatus.OK);
}
}
5.結果預覽
啟動兩個工程,postmain調用 請求url :localhost:8088/server/openFeignDemo/test。

6.這里我必須強調一下第3步這個參數(shù)設置的含義
public @interface FeignClient {
@AliasFor("name")
String value() default "";
String contextId() default "";
@AliasFor("value")
String name() default "";
String qualifier() default "";
String url() default "";
boolean decode404() default false;
Class<?>[] configuration() default {};
Class<?> fallback() default void.class;
Class<?> fallbackFactory() default void.class;
String path() default "";
boolean primary() default true;
}下面就對各個屬性進行分析
1.value、name
value和name的作用一樣,如果沒有配置url那么配置的值將作為服務名稱,用于服務發(fā)現(xiàn)。反之只是一個名稱。
2.contextId
我們不想將所有的調用接口都定義在一個類中,有一種解決方案就是為每個Client手動指定不同的contextId,這樣就不會沖突了。
3.url
url用于配置指定服務的地址,相當于直接請求這個服務,不經(jīng)過Ribbon的服務選擇。像調試等場景可以使用。
4.decode404
當調用請求發(fā)生404錯誤時,decode404的值為true,那么會執(zhí)行decoder解碼,否則拋出異常。
5.configuration
configuration是配置Feign配置類,在配置類中可以自定義Feign的Encoder、Decoder、LogLevel、Contract等。
6.fallback
定義容錯的處理類,也就是回退邏輯,fallback的類必須實現(xiàn)Feign Client的接口,無法知道熔斷的異常信息。
7.fallbackFactory
也是容錯的處理,可以知道熔斷的異常信息。
8.path
path定義當前FeignClient訪問接口時的統(tǒng)一前綴,比如接口地址是/user/get, 如果你定義了前綴是user, 那么具體方法上的路徑就只需要寫/get 即可。
9.primary
primary對應的是@Primary注解,默認為true,官方這樣設置也是有原因的。當我們的Feign實現(xiàn)了fallback后,也就意味著Feign Client有多個相同的Bean在Spring容器中,當我們在使用@Autowired進行注入的時候,不知道注入哪個,所以我們需要設置一個優(yōu)先級高的,@Primary注解就是干這件事情的。
10.qualifier
qualifier對應的是@Qualifier注解,使用場景跟上面的primary關系很淡,一般場景直接@Autowired直接注入就可以了。
7.報錯解決
如果遇到這樣的錯誤:feign.RetryableException: Read timed out executing POST
可以做如下處理:yaml配置
feign:
client:
config:
default:
connectTimeout: 1000
readTimeout: 6000
或者propertis配置
feign.client.config.default.connect-timeout=20000 feign.client.config.default.read-timeout=20000
到此這篇關于Springboot集成OpenFeign Demo詳解的文章就介紹到這了,更多相關Springboot集成OpenFeign內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Java使用Calendar類實現(xiàn)動態(tài)日歷
這篇文章主要為大家詳細介紹了Java使用Calendar類實現(xiàn)動態(tài)日歷,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-07-07
springMVC之HandlerExceptionResolver使用
這篇文章主要介紹了springMVC之HandlerExceptionResolver使用,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-11-11

