從零開始學(xué)springboot整合feign跨服務(wù)調(diào)用的方法
介紹
微服務(wù)橫行的互聯(lián)網(wǎng)世界, 跨服務(wù)調(diào)用顯得很平凡, 我們除了采用傳統(tǒng)的http方式接口調(diào)用, 有沒有更為優(yōu)雅方便的方法呢?
答案是肯定的,feign就提供了輕便的方式!
如果你的服務(wù)都注冊了注冊中心,比如nacos, 那么調(diào)用會顯得很輕松, 只需一個注解, 帶上需要調(diào)用的服務(wù)名即可,**feign + nacos**會幫你做剩余的事.
如果沒有注冊中心, 也無需擔(dān)心, feign一樣可以以傳統(tǒng)的
ip:port
方式進(jìn)行調(diào)用~
下面,我們來實(shí)踐下吧
springboot整合feign
引入依賴, 這里注意, spring-cloud.version記得要和spring-boot版本匹配, 我這里spring-boot版本是2.1.3, 所以spring-cloud選擇Greenwich.SR2版本.
大致的版本對應(yīng)關(guān)系如下

更詳細(xì)的請去https://start.spring.io/actuator/info
查詢!
<properties>
<spring-cloud.version>Greenwich.SR2</spring-cloud.version>
</properties>
<dependencyManagement>
<dependencies>
<!--SpringCloud依賴 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<!--openfeign跨服務(wù)調(diào)用-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<!--openfeign底層使用ApacheHttpClient調(diào)用-->
<dependency>
<groupId>io.github.openfeign</groupId>
<artifactId>feign-httpclient</artifactId>
</dependency>
</dependencies>
然后我們?nèi)ロ椖康膯宇惿霞由献⒔?br />
@EnableFeignClients

最后, 加上Feign的配置
application.properties
server.port=9999 #******************openfeign配置,參數(shù)采用的是默認(rèn)的配置,可根據(jù)實(shí)際情況調(diào)整*********************** #啟用ApacheHttpClient。默認(rèn)就是true,使用HttpClientConnectionManager管理連接復(fù)用 feign.httpclient.enabled=true #連接池的最大連接數(shù),默認(rèn)200 feign.httpclient.max-connections=200 #每個路由(服務(wù)器)分配的組最大連接數(shù),默認(rèn)50 feign.httpclient.max-connections-per-route=50 #連接最大存活時間,默認(rèn)900秒 feign.httpclient.time-to-live=900 #連接最大存活時間單位秒 feign.httpclient.time-to-live-unit=seconds #FeignAcceptGzipEncodingInterceptor攔截器被激活,會在header中添加Accept-Encoding:gzip,deflate,表明服務(wù)端在返回值時可以使用如下兩個方式壓縮返回結(jié)果 feign.compression.response.enabled=true #FeignContentGzipEncodingInterceptor攔截器被激活,會在header中添加Content-Encoding:gzip,deflate,表明body中的參數(shù)是使用這兩個方式的壓縮 feign.compression.request.enabled=true #content-length大于2048就進(jìn)行請求參數(shù)的gzip壓縮 feign.compression.request.minRequestSize=2048 #開啟斷路器 feign.hystrix.enabled=true #斷路器的隔離策略,默認(rèn)就是線程池,SEMAPHORE模式下,就是主線程調(diào)用的遠(yuǎn)程的服務(wù),即同步的 hystrix.command.default.execution.isolation.strategy=THREAD #斷路器超時設(shè)置 hystrix.command.default.execution.timeout.enabled=true #總體請求在45秒還是無法得到響應(yīng),建議觸發(fā)熔斷(ribbon每個請求讀取15秒超時,兩個實(shí)例重試就是30秒,openfeign外層默認(rèn)會進(jìn)行一次調(diào)用,4次重試) hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds=45000 #斷路器的線程池存在一個問題,在隊列滿了以后,不會再去創(chuàng)建新的線程直到maximumSize #核心線程池大小 hystrix.threadpool.default.coreSize=10 #最大線程池大小 hystrix.threadpool.default.maximumSize=10 #超過這個空閑時間,多于coreSize數(shù)量的線程會被回收,1分鐘 hystrix.threadpool.default.keepAliveTimeMinutes=1 #隊列的大小,默認(rèn)為-1,即沒有隊列 hystrix.threadpool.default.maxQueueSize=200 #隊列任務(wù)達(dá)到此閾值后,就開始拒絕;實(shí)際使用此參數(shù)進(jìn)行隊列是否滿的判斷 hystrix.threadpool.default.queueSizeRejectionThreshold=180 #負(fù)載均衡配置 #讀取超時15秒,與原RestTemplate保持一致 ribbon.ReadTimeout=15000 #連接超時15秒,與原RestTemplate保持一致 ribbon.ConnectTimeout=15000 ##每臺服務(wù)器最多重試次數(shù),但是首次調(diào)用不包括在內(nèi) ribbon.MaxAutoRetries=0 ##最多重試多少臺服務(wù)器,與實(shí)際實(shí)例數(shù)保持一致(不包括首臺) ribbon.MaxAutoRetriesNextServer=1 #是否所有操作都重試, # false:get請求中,連接超時,讀取超時都會重試,其他請求(put,post)連接超時重試,讀取超時不重試。 # true:get請求中,連接超時,讀取超時都會重試,其他請求(put,post)連接超時重試,讀取超時重試。 #對于請求(put,post)要做好接口的冪等性 ribbon.OkToRetryOnAllOperations=true
spring-boot整合feign完成, 接下來我們編寫測試代碼
測試代碼
兩個服務(wù)
- sb-alibaba-nacos (被調(diào)用方服務(wù), 127.0.0.1:8081), 提供 getInfoById接口
- sb-feign (調(diào)用方服務(wù), 127.0.0.1:9999), 提供 getInfoById 測試接口
sb-alibaba-nacos提供的測試接口
@GetMapping(value = "getInfoById")
public String getInfoById(@RequestParam(value = "id") Long Id) {
return "example-service return :" + Id;
}
sb-feign相關(guān)代碼
我們新建個包 feign,用來放所有涉及跨服務(wù)調(diào)用的類

ExampleControllerFeignClient.java:
package com.mrcoder.sbfeign.feign;
import feign.hystrix.FallbackFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
@FeignClient(name = "sb-alibaba-nacos", url = "http://127.0.0.1:8081/", fallbackFactory = ExampleControllerFeignClient.ExampleControllerFeignClientFallbackFactory.class)
public interface ExampleControllerFeignClient {
@GetMapping(value = "getInfoById")
String getInfoById(@RequestParam(value = "id") Long Id);
/**
* 服務(wù)降級內(nèi)部類
*/
@Component
class ExampleControllerFeignClientFallbackFactory implements FallbackFactory<ExampleControllerFeignClient> {
private Logger logger = LoggerFactory.getLogger(ExampleControllerFeignClientFallbackFactory.class);
@Override
public ExampleControllerFeignClient create(Throwable cause) {
return new ExampleControllerFeignClient() {
@Override
public String getInfoById(Long signingLogId) {
logger.error("跨服務(wù)調(diào)用失敗, 原因是:" + cause.getMessage());
return "失敗, 原因是:" + cause.getMessage();
}
};
}
}
}
關(guān)鍵代碼就是
@FeignClient(name = "sb-alibaba-nacos", url = "http://127.0.0.1:8081/", fallbackFactory = ExampleControllerFeignClient.ExampleControllerFeignClientFallbackFactory.class)
- name 就是被調(diào)用方的服務(wù)名稱 (
這里如果你沒有配置服務(wù)注冊中心的化,其實(shí)可以隨便寫) - url 就是被調(diào)用方的地址(
如果配置了服務(wù)注冊中心, 可以不寫!, 不過兩個服務(wù)必須都注冊!,這樣才能找到!) - fallbackFactory 就是調(diào)用失敗時指定的處理類
最后, 我們寫個測試方法
package com.mrcoder.sbfeign.controller;
import com.mrcoder.sbfeign.feign.ExampleControllerFeignClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
@CrossOrigin
@RestController
public class TestController {
@Autowired
private ExampleControllerFeignClient exampleControllerFeignClient;
@RequestMapping(value = "getInfoById", method = RequestMethod.GET)
public String test(@RequestParam(value = "id") Long Id) {
return exampleControllerFeignClient.getInfoById(Id);
}
}
開啟兩個服務(wù)sb-alibaba-nacos, sb-feign
而后訪問sb-feign的測試方法
http://localhost:9999/getInfoById?id=22
出現(xiàn)
sb-alibaba-nacos return :22
跨服務(wù)調(diào)用成功~
到此這篇關(guān)于從零開始學(xué)springboot整合feign跨服務(wù)調(diào)用的文章就介紹到這了,更多相關(guān)springboot整合feign跨服務(wù)調(diào)用內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot @PostConstruct原理用法解析
這篇文章主要介紹了SpringBoot @PostConstruct原理用法解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-08-08
IDEA中創(chuàng)建maven項目webapp目錄無法識別即未被標(biāo)識的解決辦法
在學(xué)習(xí)SpringMVC課程中,基于IDEA新建maven項目模塊后,webapp目錄未被標(biāo)識,即沒有小藍(lán)點(diǎn)的圖標(biāo)顯示,所以本文給大家介紹了IDEA中創(chuàng)建maven項目webapp目錄無法識別即未被標(biāo)識的解決辦法,需要的朋友可以參考下2024-03-03
Java中線程組ThreadGroup與線程池的區(qū)別及示例
這篇文章主要介紹了Java中線程組與線程池的區(qū)別及示例,ThreadGroup是用來管理一組線程的,可以控制線程的執(zhí)行,查看線程的執(zhí)行狀態(tài)等操作,方便對于一組線程的統(tǒng)一管理,需要的朋友可以參考下2023-05-05
SpringCloud微服務(wù)之Config知識總結(jié)
今天帶大家學(xué)習(xí)SpringCloud微服務(wù)中的Config的相關(guān)知識,文中有非常詳細(xì)的介紹,對正在學(xué)習(xí)SpringCloud微服務(wù)的小伙伴們有很好地幫助,需要的朋友可以參考下2021-05-05
Java 在Word中創(chuàng)建郵件合并模板并合并文本和圖片的操作方法
通過Java程序展示如何來實(shí)現(xiàn)創(chuàng)建模板,并通過郵件合并功能來合并文本數(shù)據(jù)和圖片數(shù)據(jù)的方法,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友參考下吧2021-07-07
SpringBoot項目nohup啟動運(yùn)行日志過大的解決方案
這篇文章主要介紹了SpringBoot項目nohup啟動運(yùn)行日志過大的解決方案,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-05-05

