iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >Spring Cloud Feign怎么实现动态URL
  • 534
分享到

Spring Cloud Feign怎么实现动态URL

2023-06-29 04:06:30 534人浏览 独家记忆
摘要

这篇“spring Cloud Feign怎么实现动态URL”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇

这篇“spring Cloud Feign怎么实现动态URL”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Spring Cloud Feign怎么实现动态URL”文章吧。

需求描述

动态URL的需求场景:

有一个异步服务S,它为其他业务(业务A,业务B...)提供异步服务接口,在这些异步接口中执行完指定逻辑之后需要回调相应业务方的接口。

Spring Cloud Feign怎么实现动态URL

这在诸如风控审核,支付回调等场景中挺常见的。

那么,这个回调业务方接口该怎么实现呢?
首先,需要约定好回调这些业务方接口时的请求方法(通常为POST请求),请求参数格式(通常为JSON格式,方便扩展)和响应消息格式(通常为jsON格式)。

具体调用业务方接口时有2种办法来实现:
1.在服务S的每一个异步接口中都独立写一套回调的逻辑
2.因为回调的方法类型和参数格式是约定好的,所以可以写一个统一的公共回调方法即可

方法1显然不是最优选择,这样做会带来大量重复的代码逻辑,而且非常不利用后期维护和升级。
方法2的实现更加灵活一些,便于扩展。

如下将阐述如何使用Feign框架定义一个公共的回调方法。

具体实现

在Feign中能实现动态URL的基础是框架本身就支持,只需要在接口方法中包含一个java.net.URI参数,Feign就会将该参数值作为目标主机地址,详见Interface Annotations一节中的“Overriding the Request Line”部分。

如下将分别阐述独立使用Feign和使用spring cloud OpenFeign实现定义统一的回调方法。

使用Feign定义统一回调方法

定义统一回调方法:

public interface Callbackapi {        @RequestLine("POST {path}")    @Headers({        "Content-Type: application/json",        "Accept: application/json"    })    Object callback(URI host, @Param("path") String path, @QueryMap Map<String, Object> queryMap, Subject body);       @RequestLine("POST")    @Headers({        "Content-Type: application/json",        "Accept: application/json"    })    Object callback(URI uri, @QueryMap Map<String, Object> queryMap, Subject body);}

调用回调方法:

CallbackAPI callbackAPI = Feign.builder()        .encoder(new GsonEncoder())        .decoder(new GsonDecoder())        .logger(new Slf4jLogger())        .logLevel(Logger.Level.FULL)        .target(CallbackAPI.class, "EMPTY"); // 注意:这里的url参数不能为空字符串,但是可以设置为任意字符串值,在这里设置为“EMPTY”String uri = "Http://localhost:8080";Map<String, Object> queryMap = new HashMap<>(0);queryMap.put("k", "v");Subject body = Subject.builder().id(10).build();// 请求主机地址与路径分开传递callbackAPI.callback(URI.create(uri), "/test/simple/post/json", queryMap, body);// 直接将完整请求完整路径作为uri类型参数callbackAPI.callback(URI.create("http://localhost:8080/test/simple/post/json"), queryMap, body);

详细请求日志如下:

2022-02-14 15:32:13,118 DEBUG [main] f.Logger [Slf4jLogger.java:72] [CallbackAPI#callback] ---> POST http://localhost:8080/test/simple/post/json?k=v HTTP/1.1
2022-02-14 15:32:13,118 DEBUG [main] f.Logger [Slf4jLogger.java:72] [CallbackAPI#callback] Accept: application/json
2022-02-14 15:32:13,118 DEBUG [main] f.Logger [Slf4jLogger.java:72] [CallbackAPI#callback] Content-Length: 14
2022-02-14 15:32:13,118 DEBUG [main] f.Logger [Slf4jLogger.java:72] [CallbackAPI#callback] Content-Type: application/json
2022-02-14 15:32:13,118 DEBUG [main] f.Logger [Slf4jLogger.java:72] [CallbackAPI#callback] 
2022-02-14 15:32:13,118 DEBUG [main] f.Logger [Slf4jLogger.java:72] [CallbackAPI#callback] {
  "id": 10
}
2022-02-14 15:32:13,118 DEBUG [main] f.Logger [Slf4jLogger.java:72] [CallbackAPI#callback] ---> END HTTP (14-byte body)
2022-02-14 15:32:13,153 DEBUG [main] f.Logger [Slf4jLogger.java:72] [CallbackAPI#callback] <--- HTTP/1.1 200 (32ms)
2022-02-14 15:32:13,153 DEBUG [main] f.Logger [Slf4jLogger.java:72] [CallbackAPI#callback] connection: keep-alive
2022-02-14 15:32:13,153 DEBUG [main] f.Logger [Slf4jLogger.java:72] [CallbackAPI#callback] content-length: 9
2022-02-14 15:32:13,153 DEBUG [main] f.Logger [Slf4jLogger.java:72] [CallbackAPI#callback] content-type: application/json
2022-02-14 15:32:13,153 DEBUG [main] f.Logger [Slf4jLogger.java:72] [CallbackAPI#callback] date: Mon, 14 Feb 2022 07:32:13 GMT
2022-02-14 15:32:13,153 DEBUG [main] f.Logger [Slf4jLogger.java:72] [CallbackAPI#callback] keep-alive: timeout=60
2022-02-14 15:32:13,153 DEBUG [main] f.Logger [Slf4jLogger.java:72] [CallbackAPI#callback] 
2022-02-14 15:32:13,153 DEBUG [main] f.Logger [Slf4jLogger.java:72] [CallbackAPI#callback] {"id":10}
2022-02-14 15:32:13,153 DEBUG [main] f.Logger [Slf4jLogger.java:72] [CallbackAPI#callback] <--- END HTTP (9-byte body)

显然,动态设置目标主机和接口路径已经成功了。

使用Spring Cloud Feign定义统一回调方法

在Spring Cloud Feign中实现定义统一回调接口方法可以直接使用注解进行标注,非常简洁。

定义统一回调方法:

// 注意:这里的url属性值不能为空字符串,但是可以设置为任意字符串值,在这里设置为“EMPTY”@FeignClient(value = "CallbackAPI", url = "EMPTY", configuration = CallbackConfiguration.class)public interface CallbackAPI {        @RequestMapping(value = "{path}", method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)    Object callback(URI host,                    @PathVariable("path") String path,                    @SpringQueryMap Map<String, Object> queryMap,                    @RequestBody Object body);        @RequestMapping(method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)    Object callback(URI uri,                    @SpringQueryMap Map<String, Object> queryMap,                    @RequestBody Object body);}// 回调接口配置public class CallbackConfiguration {    @Bean    public Encoder feignEncoder() {        return new GsonEncoder();    }    @Bean    public Decoder feignDecoder() {        return new GsonDecoder();    }    @Bean    public Retryer feignRetryer() {        return new Retryer.Default();    }    @Bean    public Logger feignLogger() {        return new Slf4jLogger();    }    @Bean    public Logger.Level feignLoggerLevel() {        return Logger.Level.FULL;    }}

调用回调方法:

@AutowiredCallbackAPI callbackAPI;String uri = "http://localhost:8080";Map<String, Object> queryMap = new HashMap<>(0);queryMap.put("k", "v");Subject subject = Subject.builder().id(10).build();// 请求主机地址与路径分开传递this.callbackAPI.callback(URI.create(uri), "/test/simple/post/json", queryMap, subject);// 直接将完整请求完整路径作为uri类型参数this.callbackAPI.callback(URI.create("http://localhost:8080/test/simple/post/json"), queryMap, subject);

详细请求日志如下:

2022-02-14 15:38:38.908 DEBUG 20184 --- [           main] feign.Logger                             : [CallbackAPI#callback] ---> POST http://localhost:8080/test/simple/post/json?k=v HTTP/1.1
2022-02-14 15:38:38.908 DEBUG 20184 --- [           main] feign.Logger                             : [CallbackAPI#callback] Accept: application/json
2022-02-14 15:38:38.908 DEBUG 20184 --- [           main] feign.Logger                             : [CallbackAPI#callback] Content-Length: 14
2022-02-14 15:38:38.908 DEBUG 20184 --- [           main] feign.Logger                             : [CallbackAPI#callback] Content-Type: application/json
2022-02-14 15:38:38.908 DEBUG 20184 --- [           main] feign.Logger                             : [CallbackAPI#callback] 
2022-02-14 15:38:38.908 DEBUG 20184 --- [           main] feign.Logger                             : [CallbackAPI#callback] {
  "id": 10
}
2022-02-14 15:38:38.908 DEBUG 20184 --- [           main] feign.Logger                             : [CallbackAPI#callback] ---> END HTTP (14-byte body)
2022-02-14 15:38:38.924 DEBUG 20184 --- [           main] s.n.www.protocol.http.HttpURLConnection  : sun.net.www.MessageHeader@539c48307 pairs: {POST /test/simple/post/json?k=v HTTP/1.1: null}{Accept: application/json}{Content-Type: application/json}{User-Agent: Java/1.8.0_271}{Host: localhost:8080}{Connection: keep-alive}{Content-Length: 14}
2022-02-14 15:38:38.945 DEBUG 20184 --- [           main] s.n.www.protocol.http.HttpURLConnection  : sun.net.www.MessageHeader@681e913c6 pairs: {null: HTTP/1.1 200}{Content-Type: application/json}{Content-Length: 9}{Date: Mon, 14 Feb 2022 07:38:38 GMT}{Keep-Alive: timeout=60}{Connection: keep-alive}
2022-02-14 15:38:38.952 DEBUG 20184 --- [           main] feign.Logger                             : [CallbackAPI#callback] <--- HTTP/1.1 200 (37ms)
2022-02-14 15:38:38.952 DEBUG 20184 --- [           main] feign.Logger                             : [CallbackAPI#callback] connection: keep-alive
2022-02-14 15:38:38.952 DEBUG 20184 --- [           main] feign.Logger                             : [CallbackAPI#callback] content-length: 9
2022-02-14 15:38:38.952 DEBUG 20184 --- [           main] feign.Logger                             : [CallbackAPI#callback] content-type: application/json
2022-02-14 15:38:38.952 DEBUG 20184 --- [           main] feign.Logger                             : [CallbackAPI#callback] date: Mon, 14 Feb 2022 07:38:38 GMT
2022-02-14 15:38:38.953 DEBUG 20184 --- [           main] feign.Logger                             : [CallbackAPI#callback] keep-alive: timeout=60
2022-02-14 15:38:38.953 DEBUG 20184 --- [           main] feign.Logger                             : [CallbackAPI#callback] 
2022-02-14 15:38:38.955 DEBUG 20184 --- [           main] feign.Logger                             : [CallbackAPI#callback] {"id":10}
2022-02-14 15:38:38.955 DEBUG 20184 --- [           main] feign.Logger                             : [CallbackAPI#callback] <--- END HTTP (9-byte body)

从日志详情看,在Spring Cloud Feign中同样实现动态URL的效果。

以上就是关于“Spring Cloud Feign怎么实现动态URL”这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注编程网精选频道。

--结束END--

本文标题: Spring Cloud Feign怎么实现动态URL

本文链接: https://www.lsjlt.com/news/322700.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Spring Cloud Feign怎么实现动态URL
    这篇“Spring Cloud Feign怎么实现动态URL”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇...
    99+
    2023-06-29
  • Spring Cloud Feign怎么实现自动降级
    这篇文章主要讲解了“Spring Cloud Feign怎么实现自动降级”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Spring Cloud Feign怎...
    99+
    2024-04-02
  • Spring Cloud中Feign怎么使用
    本篇内容主要讲解“Spring Cloud中Feign怎么使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Spring Cloud中Feign怎么使用”吧!创建公共接口首先我们来创建一个普通的...
    99+
    2023-06-19
  • Spring Cloud中怎么配置Feign
    这期内容当中小编将会给大家带来有关Spring Cloud中怎么配置Feign,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。Ribbon配置ribbon的配置其实非常简单,直接在application.p...
    99+
    2023-06-19
  • 怎么用Spring Cloud Feign实现文件上传下载
    这篇“怎么用Spring Cloud Feign实现文件上传下载”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看...
    99+
    2023-06-29
  • Spring Cloud中Feign的实现原理是什么
    本篇内容主要讲解“Spring Cloud中Feign的实现原理是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Spring Cloud中Feign的实现原理是什么”吧!目录一、什么是Fei...
    99+
    2023-06-20
  • Spring Cloud Feign内部实现代码细节
    1. 概述 Feign用于服务间调用,它的内部实现是一个包含Ribbon(负载均衡)的**JDK-HttpURLConnection(Http)**调用。虽然调用形式是类似于RPC,...
    99+
    2024-04-02
  • Spring Cloud中的动态路由怎么利用 Zuul实现
    今天就跟大家聊聊有关Spring Cloud中的动态路由怎么利用 Zuul实现,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。Zuul 是提供动态路由,监控,弹性,安全等的边缘服务。Z...
    99+
    2023-05-31
    springcloud zuul 动态路由
  • Spring Cloud如何实现服务消费者Feign
    小编给大家分享一下Spring Cloud如何实现服务消费者Feign,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!一、Feign简介Feign是一个声明式的伪H...
    99+
    2023-06-19
  • Spring Cloud Gateway动态路由Apollo实现详解
    目录背景路由的加载实现动态路由背景 在之前我们了解的Spring Cloud Gateway配置路由方式有两种方式 通过配置文件 spring: cloud: gatew...
    99+
    2022-11-13
    Spring Cloud Gateway Apollo Spring Cloud Gateway 动态路由
  • SpringCloudFeign实现动态URL
    目录需求描述具体实现使用Feign定义统一回调方法使用Spring Cloud Feign定义统一回调方法总结需求描述 动态URL的需求场景: 有一个异步服务S,它为其他业务(业务A...
    99+
    2024-04-02
  • feign调用实现url和接口路径的动态配置化
    做接口开发请求第三方服务的接口,大概率会用feign做请求,而feign也是最常用的一种rpc框架; 这里主要是说明在进行feign请求的时候,第三方服务的url和接口也是可以通过读取配置文件的配置,来进行请求的; 至于为什么要把接口和ur...
    99+
    2023-09-06
    java 后端
  • Spring Cloud中如何使用Feign 实现负载均衡
    Spring Cloud中如何使用Feign 实现负载均衡,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。下面来介绍一下使用 Feign 负载均衡。在介绍之前,我们先来对 Fei...
    99+
    2023-06-04
  • Nacos+Spring Cloud Gateway动态路由配置实现步骤
    目录前言一、Nacos环境准备1、启动Nacos配置中心并创建路由配置2、连接Nacos配置中心二、项目构建1、项目结构2、编写测试代码三、测试动态网关配置1、启动服务,观察注册中心...
    99+
    2024-04-02
  • Nacos+Spring Cloud Gateway动态路由如何配置实现
    小编给大家分享一下Nacos+Spring Cloud Gateway动态路由如何配置实现,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!前言  Nacos最近项目一直在使用,其简单灵活,支持更细粒度的命令空间,分组等为麻烦...
    99+
    2023-06-20
  • spring cloud oauth2 feign遇到的坑怎么解决
    本篇内容主要讲解“spring cloud oauth2 feign遇到的坑怎么解决”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“spring cloud...
    99+
    2023-06-29
  • Spring Cloud中怎么使用 Feign上传文件
    Spring Cloud中怎么使用 Feign上传文件,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。加依赖<dependency> <groupId...
    99+
    2023-05-30
    springcloud feign
  • Spring Cloud Alibaba 使用 Feign+Sentinel 怎么完成熔断
    这篇文章主要讲解了“Spring Cloud Alibaba 使用 Feign+Sentinel 怎么完成熔断”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Spring Cloud Alib...
    99+
    2023-06-14
  • Spring Cloud中Feign怎么自定义配置与使用
    这篇文章主要介绍了Spring Cloud中Feign怎么自定义配置与使用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Spring Cloud中Feign怎么自定义配置与使用文章都会有所收...
    99+
    2023-07-02
  • SpringCloud使用Feign实现动态路由操作
    目录一、理解及原理1.1理解1.2原理二、Feign搭建实现步骤三、配置文件(pom.xml)四、程序代码五、结果演示一、理解及原理 1.1理解 Feign基于接口 + 注解的方式,...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作