SpringCloud利用Feign访问外部http请求

2023-11-03

       大家好,目前接手了一个项目,具体的逻辑并不复杂,主要是一个"中间商"角色, 比如客户端通过我访问高德地图API,就不需要带秘钥,直接带高德API所需的入参和url后缀,就可以访问。

      目前遇到这样一个问题,项目架构师要求所有的项目自己写的htttpClintUtils或者其他工具,需要替换到feign的形式来完成调用,但是,目前这个项目访问外部的http接口很多,比如,提供的高德服务就有10多种,一共有大几十类型,这样的话,如果按照以前的方式,一个接口指定一个高德子服务,那岂不是要累死 = =!

     累死人的写法:(仅参考)

@FeignClient(value = "test",url = "http://ip:port")
public interface TestFeign {
    /**
     * @return 高德服务接口
     * @description 访问高德地理编码服务
     */
    @PostMapping(value = "/Amap/geo")
    Object geo(@RequestBody GeoEntity entity);

    /**
     * @return 高德服务接口
     * @description 访问高德逆地理编码服务
     */
    @PostMapping(value = "/Amap/regeo")
    Object regeo(@RequestBody RegeoEntity entity);


    .........
    ...........
}

       然后如果我除了高德服务还有其他外部服务,并且其他外部服务下的子接口,不一定就两个,那这样写的话,要头大死,并且这样的写法,在服务的内部,不能做秘钥和权限的动态配置,只能在url上做指定,比较笨拙,所以就需要一种可以灵活访问外部httpClient的Feign接口,只需要我指定一个url,指定下提交的post数据,就可以得到返回结果,岂不是美滋滋?

       话不多说,先上pom.xml

 <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
            <version>2.0.1.RELEASE</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
            <version>2.0.1.RELEASE</version>
        </dependency>

        <!-- 引入 httpclient -->
        <dependency>
            <groupId>org.apache.httpcomponents</groupId>
            <artifactId>httpclient</artifactId>
        </dependency>
        <dependency>
            <groupId>com.netflix.feign</groupId>
            <artifactId>feign-httpclient</artifactId>
            <version>8.18.0</version>
        </dependency>

前两个是feign和服务降级用到的包,后两个是用Apache Http替换原生的feign-http-client用来提供连接池等功能。

bootstap.yml 部分配置:

feign:
  httpclient:
    enabled: true
  hystrix:
    enabled: true
hystrix:
  command:
    default:
      execution:
        isolation:
          thread:
            timeoutInMilliseconds: 3000  #降级超时时间,我设置为3秒。 feign.retry默认超时时间是5s.

设置了个降级超时时间,还有启动了feign访问外部httpClient配置和服务降级配置。

在spingbootApplication启动类上增加注解:

@EnableFeignClients  @EnableHystrix

代码部分:

public interface HttpRequestFeign {

    @RequestLine("GET")
    String sendGetRequest(URI baseUri);

    @RequestLine("POST")
    String sendPostRequest(URI baseUri, Map map);
}

调用部分,这里我在我的BaseController构造注解,其他服务Controller继承,提供调用能力:

 @Autowired
    public BaseController(Decoder decoder, Encoder encoder) {
        httpRequestFeign = Feign.builder().encoder(encoder).decoder(decoder)
                .target(Target.EmptyTarget.create(HttpRequestFeign.class));

    }
 protected String httpPostSend( String url, Map map) {
        String response = "";
        try {
            response = httpRequestFeign.sendPostRequest(new URI(url), map);
            logger.info("调用外部服务返回的数据为->{}", response);
            // 这里改成重试的超时异常
        } catch (RetryableException a) {
            logger.error("调用外部服超时错误->{}", response);
        } catch (Exception e) {
            logger.error("调用外部服异常错误->{}", response);
        }
        return response;
    }

这里只列举了Post的,Get方式,就不用了携带map参数了。

然后在你的Controller层增加降级@HystrixCommand注解,并指定降级方法:

 @HystrixCommand(fallbackMethod = "fallback")
 @PostMapping(value = "/1_0_0/{subServer}", produces = "application/json;charset=UTF-8")
 public Object send(@RequestBody Map<String, Object> map, @PathVariable String subServer) {

.......................
....................


 private Object fallback(Map<String, String> map, String subserver, Throwable e) {
        logger.error("xxx服务发生问题,入参:{},地址:{}", map, subserver);
        return Result.fail(ResultCode.INTERNAL_SERVER_ERROR.getCode(), ERROR_MSG + e.toString());
    }

在send方法里可以自行进行拼接url,而Map就是传递给第三方服务的数据。

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SpringCloud利用Feign访问外部http请求 的相关文章

  • Java中反射是如何实现的?

    Java 7 语言规范很早就指出 本规范没有详细描述反射 我只是想知道 反射在Java中是如何实现的 我不是问它是如何使用的 我知道可能没有我正在寻找的具体答案 但任何信息将不胜感激 我在 Stackoverflow 上发现了这个 关于 C
  • Java EE:如何获取我的应用程序的 URL?

    在 Java EE 中 如何动态检索应用程序的完整 URL 例如 如果 URL 是 localhost 8080 myapplication 我想要一个可以简单地将其作为字符串或其他形式返回给我的方法 我正在运行 GlassFish 作为应
  • 如何在 Play java 中创建数据库线程池并使用该池进行数据库查询

    我目前正在使用 play java 并使用默认线程池进行数据库查询 但了解使用数据库线程池进行数据库查询可以使我的系统更加高效 目前我的代码是 import play libs Akka import scala concurrent Ex
  • 在画布上绘图

    我正在编写一个 Android 应用程序 它可以在视图的 onDraw 事件上直接绘制到画布上 我正在绘制一些涉及单独绘制每个像素的东西 为此我使用类似的东西 for int x 0 x lt xMax x for int y 0 y lt
  • 如何找到给定字符串的最长重复子串

    我是java新手 我被分配寻找字符串的最长子字符串 我在网上研究 似乎解决这个问题的好方法是实现后缀树 请告诉我如何做到这一点或者您是否有任何其他解决方案 请记住 这应该是在 Java 知识水平较低的情况下完成的 提前致谢 附 测试仪字符串
  • 制作一个交互式Windows服务

    我希望我的 Java 应用程序成为交互式 Windows 服务 用户登录时具有 GUI 的 Windows 服务 我搜索了这个 我发现这样做的方法是有两个程序 第一个是服务 第二个是 GUI 程序并使它们进行通信 服务将从 GUI 程序获取
  • JAXb、Hibernate 和 beans

    目前我正在开发一个使用 Spring Web 服务 hibernate 和 JAXb 的项目 1 我已经使用IDE hibernate代码生成 生成了hibernate bean 2 另外 我已经使用maven编译器生成了jaxb bean
  • INSERT..RETURNING 在 JOOQ 中不起作用

    我有一个 MariaDB 数据库 我正在尝试在表中插入一行users 它有一个生成的id我想在插入后得到它 我见过this http www jooq org doc 3 8 manual sql building sql statemen
  • 反射找不到对象子类型

    我试图通过使用反射来获取包中的所有类 当我使用具体类的代码 本例中为 A 时 它可以工作并打印子类信息 B 扩展 A 因此它打印 B 信息 但是当我将它与对象类一起使用时 它不起作用 我该如何修复它 这段代码的工作原理 Reflection
  • Mockito when().thenReturn 不必要地调用该方法

    我正在研究继承的代码 我编写了一个应该捕获 NullPointerException 的测试 因为它试图从 null 对象调用方法 Test expected NullPointerException class public void c
  • 斯坦福 NLP - 处理文件列表时 OpenIE 内存不足

    我正在尝试使用斯坦福 CoreNLP 中的 OpenIE 工具从多个文件中提取信息 当多个文件 而不是一个 传递到输入时 它会给出内存不足错误 All files have been queued awaiting termination
  • 十进制到八进制的转换[重复]

    这个问题在这里已经有答案了 可能的重复 十进制转换错误 https stackoverflow com questions 13142977 decimal conversion error 我正在为一个类编写一个程序 并且在计算如何将八进
  • 如何为俚语和表情符号构建正则表达式 (regex)

    我需要构建一个正则表达式来匹配俚语 即 lol lmao imo 等 和表情符号 即 P 等 我按照以下示例进行操作http www coderanch com t 497238 java java Regular Expression D
  • 在两个活动之间传输数据[重复]

    这个问题在这里已经有答案了 我正在尝试在两个不同的活动之间发送和接收数据 我在这个网站上看到了一些其他问题 但没有任何问题涉及保留头等舱的状态 例如 如果我想从 A 类发送一个整数 X 到 B 类 然后对整数 X 进行一些操作 然后将其发送
  • 为什么HashMap不能保证map的顺序随着时间的推移保持不变

    我在这里阅读有关 Hashmap 和 Hashtable 之间的区别 http javarevisited blogspot sg 2010 10 difference Between hashmap and html http javar
  • 加密 JBoss 配置中的敏感信息

    JBoss 中的标准数据源配置要求数据库用户的用户名和密码位于 xxx ds xml 文件中 如果我将数据源定义为 c3p0 mbean 我会遇到同样的问题 是否有标准方法来加密用户和密码 保存密钥的好地方是什么 这当然也与 tomcat
  • 使用Spring将war文件WEB-INF目录下的资源导入到applicationContext文件中

    我在我的项目中使用 Spring 框架 我想导入下面的所有 xml 资源 文件 WEB INF CustomerService spring integration Jobs applicationContext配置文件中war文件的目录
  • 如何从泛型类调用静态方法?

    我有一个包含静态创建方法的类 public class TestClass public static
  • 使用 JMF 创建 RTP 流时出现问题

    我正处于一个项目的早期阶段 需要使用 RTP 广播DataStream创建自MediaLocation 我正在遵循一些示例代码 该代码目前在rptManager initalize localAddress 出现错误 无法打开本地数据端口
  • 按日期对 RecyclerView 进行排序

    我正在尝试按日期对 RecyclerView 进行排序 但我尝试了太多的事情 我不知道现在该尝试什么 问题就出在这条线上适配器 notifyDataSetChanged 因为如果我不放 不会显示错误 但也不会更新 recyclerview

随机推荐

  • Debian/Ubuntu升级B-B-R教程

    安装 系统要求 Debian Ubuntu系统 内核版本v4 9 3 v4 12 x 得安装gcc Makefile默认只支持gcc 6 你可以修改它 例如 gcc 4 9 1 更换内核并开启BBR 这里手动安装 方法从BBR刚出来时就在博
  • 項目管理

    刚开始拿到一个项目后工作的执行顺序 其实作为一个管理者 难道一个项目后有很多的工作要做 1 wbs 2 难点的调查 1 将项目分解 分解到最细 能分配到每个人的手中的细度为止 标注每个工作包的难易程度 依据每个人的能力和工作的难易程度进行分
  • 莫圣宏:3.30今天黄金操作建议及晚间盘面行情分析

    现在的你是不是还在迷茫中 无论行情暴涨 暴跌 单边还是震荡 你是不是总是没把握住 就是所谓的一买就跌 一跌就割 一割就涨 一涨就追 一追又套 一套再割 这就像一个死套 资金不断缩水 如此循环 如果你处在这样的循环中 请停下来好好想想 总结一
  • 在centos上使用openswan搭建IPSec***

    背景 因公司业务逐渐迁移到阿里云上 所以有需求搭建一条从公司内容到阿里云的 隧道 因环境限制并未有 设备可以使用 所以计划在linux上搭建ipsec 来实现该功能 拓扑图如下 目的 在阿里云服务器172 16 0 11和公司服务器192
  • 华为od机考真题-HJ64-MP3光标位置(中等)

    while 1 try count int input command input if count lt 4 base
  • c++字符串中的字符替换

    include
  • C#:MSB4086:在条件“condition”中,尝试对计算结果为“value”而不是数字的“expression”进行数值比较

    C MSB4086 在条件 condition 中 尝试对计算结果为 value 而不是数字的 expression 进行数值比较 如果条件表达式中需要数字 但该表达式的计算结果为非数值 则 MSBuild 项目文件中会出现此错误 如果项目
  • Shuffle'm Up【模拟】

    题目链接 POJ 3087 题意 给你两刀牌 第一刀是s1 第二刀是s2 然后有目标的理牌的最终形态S12 现在给出理牌的规则 理牌规则 假设s1 123 s2 456 则第一次理牌之后 S 415263 然后新的s1 415 新的s2 2
  • Oauth2授权模式访问之授权码模式(authorization_code)访问

    Oauth3授权模式访问之授权码模式 authorization code 访问 获取code redirect uri可以随便写 在浏览器输入 注意是get请求方式 http localhost 8080 oauth authorize
  • 【U8+】使用天联高级版客户端登录用友U8,指定U8服务器地址。

    问题描述 当使用U8客户端电脑作为天联高级版软件服务器的时候 即 U8应用服务器和远程服务器不是同一台电脑 每次新建天高用户后 新的天高用户 登录天高客户端后并打开U8登录界面 用友U8的登录窗口服务器地址即为天高服务器的计算机名称 而不是
  • chatgpt 优秀项目

    chagpt token 获取 点击即可 一 pandala 项目 仓库地址 pandora docker 部署方案 拉取镜像 docker pull pengzhile pandora 本地启动镜像 docker run d name c
  • python使用kafka收发消息

    简介 kafka是最近几年很流行的消息队列中间件 在大数据以及后端服务领域有很广泛的应用 废话不多说 接下来直接上代码介绍python如何向kafka发送数据以及订阅数据 消息发布 Kafka的消息是 发布 订阅 模式的 接下来先介绍向ka
  • android二级listview列表实现代码(高仿大众点评)

    今天来实现以下大众点评客户端的横向listview二级列表 先看一下样式 这种横向的listview二级列表在手机软件上还不太常见 但是使用过平板的都应该知道 在平板上市比较常见的 可能是因为平板屏幕比较大 而且也能展现更多的内容 下面来看
  • VC数据类型转换大全 (转)

    VC数据类型转换大全 int i 100 long l 2001 float f 300 2 double d 12345 119 char username 程佩君 char temp 200 char buf CString str v
  • 多任务工作流难管理?看dhtmlxGantt如何实现云管理平台高效管理!

    今天我们分享一个关于KeyWorks OS为意大利公共管理机构提供的工作流解决方案 这是将dhtmlxGantt集成到低代码平台的成功案例 关于KeyWorks OS dhtmlxGantt帮助知名低代码管理平台KeyWorks OS完善B
  • 【HDFS】XXXRpcServer和ClientNamenodeProtocolServerSideTranslatorPB小记

    初始化RouterRpcServer时候会new ClientNamenodeProtocolServerSideTranslatorPB 并把当前RouterRpcServer对象 this 传入构造函数 ClientNamenodePr
  • 嵌入式调试技巧-代码自动初始化

    代码自动初始化 概述 在嵌入式开发过程中 可能会遇到初始化代码自动初始化 比如RTT中就运用到这项技术 那么初始化代码是如何做到自动化调用的呢 在嵌入式实际开发过程中 往往需要对 bsp 部分进行外设配置 以及一些模块 参数进行初始化 常见
  • macOS输入法导致系统卡住鼠标圈圈问题/风火轮

    最终解决方案 使用第三方输入法 如微信键盘 搜狗输入法取代自带的简体拼音输入法直接解决 最终解决方案 使用第三方输入法 如微信键盘 搜狗输入法取代自带的简体拼音输入法直接解决 最终解决方案 使用第三方输入法 如微信键盘 搜狗输入法取代自带的
  • This exception may occur if matchers are combined with raw values

    org mockito exceptions misusing InvalidUseOfMatchersException Invalid use of argument matchers 3 matchers expected 2 rec
  • SpringCloud利用Feign访问外部http请求

    大家好 目前接手了一个项目 具体的逻辑并不复杂 主要是一个 中间商 角色 比如客户端通过我访问高德地图API 就不需要带秘钥 直接带高德API所需的入参和url后缀 就可以访问 目前遇到这样一个问题 项目架构师要求所有的项目自己写的httt