中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何在springboot中使用feign實現跨服務調用

發布時間:2021-03-02 16:39:28 來源:億速云 閱讀:1724 作者:Leah 欄目:開發技術

這篇文章給大家介紹如何在springboot中使用feign實現跨服務調用,內容非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。

springboot整合feign

引入依賴, 這里注意, spring-cloud.version記得要和spring-boot版本匹配, 我這里spring-boot版本是2.1.3, 所以spring-cloud選擇Greenwich.SR2版本.

大致的版本對應關系如下

如何在springboot中使用feign實現跨服務調用

更詳細的請去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跨服務調用-->
  <dependency>
   <groupId>org.springframework.cloud</groupId>
   <artifactId>spring-cloud-starter-openfeign</artifactId>
  </dependency>
  <!--openfeign底層使用ApacheHttpClient調用-->
  <dependency>
   <groupId>io.github.openfeign</groupId>
   <artifactId>feign-httpclient</artifactId>
  </dependency>
 </dependencies>

然后我們去項目的啟動類上加上注解
@EnableFeignClients

如何在springboot中使用feign實現跨服務調用

最后, 加上Feign的配置
application.properties

server.port=9999
#******************openfeign配置,參數采用的是默認的配置,可根據實際情況調整***********************
#啟用ApacheHttpClient。默認就是true,使用HttpClientConnectionManager管理連接復用
feign.httpclient.enabled=true
#連接池的最大連接數,默認200
feign.httpclient.max-connections=200
#每個路由(服務器)分配的組最大連接數,默認50
feign.httpclient.max-connections-per-route=50
#連接最大存活時間,默認900秒
feign.httpclient.time-to-live=900
#連接最大存活時間單位秒
feign.httpclient.time-to-live-unit=seconds
#FeignAcceptGzipEncodingInterceptor攔截器被激活,會在header中添加Accept-Encoding:gzip,deflate,表明服務端在返回值時可以使用如下兩個方式壓縮返回結果
feign.compression.response.enabled=true
#FeignContentGzipEncodingInterceptor攔截器被激活,會在header中添加Content-Encoding:gzip,deflate,表明body中的參數是使用這兩個方式的壓縮
feign.compression.request.enabled=true
#content-length大于2048就進行請求參數的gzip壓縮
feign.compression.request.minRequestSize=2048

#開啟斷路器
feign.hystrix.enabled=true
#斷路器的隔離策略,默認就是線程池,SEMAPHORE模式下,就是主線程調用的遠程的服務,即同步的
hystrix.command.default.execution.isolation.strategy=THREAD
#斷路器超時設置
hystrix.command.default.execution.timeout.enabled=true
#總體請求在45秒還是無法得到響應,建議觸發熔斷(ribbon每個請求讀取15秒超時,兩個實例重試就是30秒,openfeign外層默認會進行一次調用,4次重試)
hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds=45000
#斷路器的線程池存在一個問題,在隊列滿了以后,不會再去創建新的線程直到maximumSize
#核心線程池大小
hystrix.threadpool.default.coreSize=10
#最大線程池大小
hystrix.threadpool.default.maximumSize=10
#超過這個空閑時間,多于coreSize數量的線程會被回收,1分鐘
hystrix.threadpool.default.keepAliveTimeMinutes=1
#隊列的大小,默認為-1,即沒有隊列
hystrix.threadpool.default.maxQueueSize=200
#隊列任務達到此閾值后,就開始拒絕;實際使用此參數進行隊列是否滿的判斷
hystrix.threadpool.default.queueSizeRejectionThreshold=180

#負載均衡配置
#讀取超時15秒,與原RestTemplate保持一致
ribbon.ReadTimeout=15000
#連接超時15秒,與原RestTemplate保持一致
ribbon.ConnectTimeout=15000
##每臺服務器最多重試次數,但是首次調用不包括在內
ribbon.MaxAutoRetries=0
##最多重試多少臺服務器,與實際實例數保持一致(不包括首臺)
ribbon.MaxAutoRetriesNextServer=1
#是否所有操作都重試,
# false:get請求中,連接超時,讀取超時都會重試,其他請求(put,post)連接超時重試,讀取超時不重試。
# true:get請求中,連接超時,讀取超時都會重試,其他請求(put,post)連接超時重試,讀取超時重試。
#對于請求(put,post)要做好接口的冪等性
ribbon.OkToRetryOnAllOperations=true

spring-boot整合feign完成, 接下來我們編寫測試代碼

測試代碼

兩個服務

  • sb-alibaba-nacos (被調用方服務, 127.0.0.1:8081), 提供 getInfoById接口

  • sb-feign (調用方服務, 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相關代碼

我們新建個包 feign,用來放所有涉及跨服務調用的類

如何在springboot中使用feign實現跨服務調用

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);

 /**
  * 服務降級內部類
  */
 @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("跨服務調用失敗, 原因是:" + cause.getMessage());
     return "失敗, 原因是:" + cause.getMessage();
    }
   };
  }
 }
}

關鍵代碼就是

@FeignClient(name = "sb-alibaba-nacos", url = "http://127.0.0.1:8081/", fallbackFactory = ExampleControllerFeignClient.ExampleControllerFeignClientFallbackFactory.class)
  • name 就是被調用方的服務名稱 (這里如果你沒有配置服務注冊中心的化,其實可以隨便寫)

  • url 就是被調用方的地址(如果配置了服務注冊中心, 可以不寫!, 不過兩個服務必須都注冊!,這樣才能找到!)

  • fallbackFactory 就是調用失敗時指定的處理類

最后, 我們寫個測試方法

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);
 }
}

開啟兩個服務sb-alibaba-nacos, sb-feign

而后訪問sb-feign的測試方法

http://localhost:9999/getInfoById?id=22

出現

sb-alibaba-nacos return :22

關于如何在springboot中使用feign實現跨服務調用就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

仁怀市| 阳谷县| 来安县| 桂东县| 温州市| 达拉特旗| 吉木萨尔县| 阳谷县| 科技| 新安县| 镇宁| 巴彦县| 安吉县| 沙坪坝区| 民勤县| 庄河市| 灯塔市| 凉城县| 鄂托克旗| 壶关县| 安阳市| 泸溪县| 通山县| 天长市| 宣武区| 通江县| 驻马店市| 济南市| 蓝山县| 平定县| 紫云| 祁门县| 屏山县| 年辖:市辖区| 白山市| 神池县| 遂宁市| 财经| 西峡县| 榆中县| 郯城县|