文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

如何在springboot中使用feign实现跨服务调用

2023-06-06 16:25

关注

这篇文章给大家介绍如何在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#连接池的最大连接数,默认200feign.httpclient.max-connections=200#每个路由(服务器)分配的组最大连接数,默认50feign.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提供的测试接口

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

最后, 我们写个测试方法

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@RestControllerpublic 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实现跨服务调用就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     807人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     351人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     314人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     433人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     221人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯