313 Star 3.4K Fork 719

dromara / forest

 / 详情

未来版本需求墙

待處理
擁有者
創建於  
2021-03-23 13:29

未来版本的大致规划如下:

    1. 强化模板表达式,可嵌入EasyEL表达式语言(我自己写的另一个开源项目,类似spEL)
    1. 新增生命周期注解配合表达式语言以减少使用拦截器,大概形式类似:
   @BeforeExecute("log.info('开始发送: ' + req.url)")
   @Success(when="status_2xx and status_3xx", then="result.data")
   @Retry(when="res.timeout and not status_2xx", maxRetryCount=3)
   @Error(when="not res.success")
   @AfterExecute("log.info('请求发送完成')")
    1. 支持protobuf序列化转换器
    1. 基于SOAP/WSDL协议的WebService接口调用(独立子项目: forest-webservice)
    1. 支持GraphQL API格式的接口调用(独立子项目: forest-graphql)
    1. 支持更多ContentType类型
    1. 可配置的、模板化的日志,可定义在日志要打印哪些内容(请求行、请求头、请求体)
    1. 支持SSE
    1. 支持响应式编程接口,集成Reactor(独立子项目: forest-reactor)

PS: EasyEL仓库: https://gitee.com/dt_flys/easy-el

看看大家有什么要补充的需求和功能点以及改进的点

評論 (84)

公子骏 創建了任务
公子骏 關聯倉庫設置為dromara/forest
公子骏 添加
 
新需求
標籤
公子骏 修改了描述
公子骏 修改了描述
公子骏 修改了描述
公子骏 修改了描述
公子骏 修改了描述
公子骏 修改了描述
公子骏 修改了描述
公子骏 修改了描述
公子骏 修改了描述
公子骏 修改了描述
公子骏 置頂等級設置為
公子骏 修改了描述
展開全部操作日誌

最近spring cloud社区 初现Spring Cloud Square 这个项目。感觉大同小异多封装了一层罢了,可以考虑支持根据服务名调用,以及负载均衡策略这些

支持根据服务名调用 +1

公子骏 修改了標題
公子骏 修改了標題

1.6.x版本下的新增特性2:新增生命周期注解配合表达式语言以减少使用拦截器。
这里面的 @BeforeExecute 开始注解到@AfterExecute结束的过程中会打印出当前bean生命周期详情(可配置),以及当前过程的时间吗?(时间可以划分为整体过程时间以及请求url时间)

这些生命周期注解本身不会去打印,也不关心具体做什么事情。是否打印取决于你是否在@BeforeExecute或@AfterExecute中调用 log.info 之类的日志打印语句

好的,谢谢博主的讲解

公子骏 修改了描述
公子骏 修改了描述

对日志打印,是否能传入一下写自定义参数,比如发送短信的,我想传入 [短信发送] phone=188888888 然后请求和返回结果日志中都能携带这些信息,以后如果查询问题 能够快速定位

其实现在也可以通过LogHandler实现,通过request.addAttachment和request.getAttachment方法添加和获取自定义参数

谢谢博主解答 但是我还有一个疑问 怎么从接口处传入参数呢,比如下面的方法,怎么给Attachment赋值
输入图片说明

通过 request.getArgument(参数序号) 和 request.getArguments() 方法可以得到方法调用时传入的任意参数。

了解了 非常感谢博主的解答

感觉声明式调用非常有利于大项目,因为在声明的同时就自动写出了一个API接口清单,方便一览API列表。
但是有时候在项目不大的情况下,就感觉有点略显啰嗦了,我更希望有一些简洁的 Util 式调用的方案,就像 Hutool-http 一样的:

String str = HttpUtil.get("http://xxx.com/xxx");
String str2 = HttpUtil.post("http://xxx.com/xxx");

以下是个人猜想:
forest 在声明式调用已经支持比较完善的情况下,加一个util式调用应该不算太难,底层地基都已经打好了,缺少的可能就是一些相关模块API的设计

这个功能纯属个人意见,如果和 forest 原本的升级计划相冲突,可以直接忽略

能不能支持添加对返回json报文的处理,比如从响应报文中直接返回指定jsonPath的数据,添加对jsonPath的支持或者更强大的spel表达式

是否有计划支持高版本 JDK 呢? jdk 17 是 LTS 是否香呢? :relaxed:

之后版本会支持

jdk17,目前还有bug吧,再等等啊。

public class Test {
    public static void main(String[] args) {
        Stream<Integer> stream = Stream.of(1, 2, 3, 4, 5, 6, 7, 8);
        // peek不会终止流,peek属于中间操作
        Stream<Integer> peek = stream.peek(i -> System.out.println(i));

        long count = peek.count();
        System.out.println("count = " + count);
    }
}

目前的JDk 17,就执行不了,但是JDK 8可以的,JDK的版本在这里https://www.yuque.com/sunxiaping/yg511q/chqmin。

有没有可能这不是bug 而是特性

oauth获取token时候加缓存,并且可以加缓存过期时间

令牌过期时间应该是放服务端维护的吧

支持jdk11的HttpClient

考虑支持websocket吗

1.6大版本更新可以考虑支持 websocket

支持链路跟踪吗

链路跟踪不在Forest的设计功能范围内,可以用其它框架来实现,比如SkyWalking

SkyWalking也需要forest提供插件啊 不然也没法支持

是否可以支持下数据缓存

对微服务的一些支持

目前我在项目中使用的是 com.github.lianjiatech:retrofit-spring-boot-starter 我觉得有一点比较好的就是其使用的是 retrofit 接口,这样开发工具 idea 就直接内置了集成。所以这个项目是不是考虑尽可能融合进已有的生态或者自行提供类似的生态扩展集成。

希望可以拆分http组件,比如 forest-httpclient(java11) ,forest-okhttp3,forest-httpcomponents(httpclient)。其中这几个组件互相不依赖

会在 1.6.x 版本进行拆分

能否支持多种代理模式

是指多种HTTP代理吗?可以考虑一下

考虑支持spring-cloud么,做服务间调用和负载均衡

能否动态的去切换http代理

可以在拦截器中,动态设置代理参数

https://forest.dtflyx.com/docs/basic/request#%E4%BB%A3%E7%90%86

请问能否支持URL带部分特殊字符,例如$。最近调用第三方API的时候,有些会带特殊字符,会转义为24%,直接报404。
例如易快报的API:获取预算节点和子节点详细信息

能否支持实例化多个client,多次使用Forest.clien()返回的是同一个client,拦截器也是

可以自定义实现ForestObjectFactory,然后通过反射注入到ForestConfiguration.forestObjectFactory

已在1.5.36版本支持Fastjson2

okhttp能否打印curl加入这个依赖日志打印curl定位问题更方便

com.github.mrmike
ok2curl
0.7.0

可以自行实现ForestLogHandler接口来实现

希望拦截器等配置能支持实例化

希望能有webui展示页面,在页面中可以查看各个htpp接口信息,并能转为接口文档下载。
在页面中除了基本的用户管理、权限管理、菜单管理等常见的模块,希望还能有接口管理,接口管理中除了对接口信息的管理外,还提供对接口的流量情况、访问失败次数等等做个统计,通过访问量可以直观、清晰地感受到不同接口在业务端的地位是不同的,对于后续业务的选择、营销、关注点等等有个预知。

什么时候更新1.6呢,期待拆分组件,现在引用有点多

会否考虑支持fastjson2.

已在1.5.36版本支持fastjson2

公子骏 修改了標題
公子骏 修改了描述
公子骏 修改了標題

可否支持多个ip负载均衡调用?

日志拦截能否在requestLoggingContent和responseLoggingContent中增加携带attachment参数呢,使用场景:想把一个的完整请求+响应放入一个transaction,这样在日志中框架中,可以展示完整的调用链,而不是两个独立的日志块。

目前可以通过线程绑定变量的方式,去绑定需要携带的transactionId。

希望能支持。

是否考虑引入websocket连接呢?websocket也能作为client :grey_question:

是否考虑加入对 HTTP 请求限流的功能?

谢谢作者的框架,非常好用。
是否考虑添加 配置 非全局 最大异步线程数,
我在文档里没有找到 针对 特定 请求的 最大异步线程数 配置,文档里有多种配置全局 最大异步线程数 的方式,有没有什么方法 或 方式 针对 某个 BaseRequest 请求,配置 最大异步线程数, 因为有些网站 会对 请求 进行 并发数量限制,感觉这个功能还是很有用的,如果有的话麻烦告知一下,非常感谢。

目前来说,异步和同步的线程池只有全局的,如果要针对某一个BaseRequest请求设置线程池是比较困难的,我能大概想到三种比较间接的方案:

  1. 使用 max-route-connections 配置项,能达到比较相似的效果,它能设置每个路由(就是域名)可以同时容纳的最大请求数。缺点是,它不是真正的线程池,它也不区分同步和异步的请求,会一起限制。

  2. 使用多个 ForestConfiguration,每个 ForestConfiguration 配置不同的最大异步线程数,然后根据你的需要将不同的 BaseRequest 接口分配给不同的 ForestConfiguration。缺点是管理相对复杂,而且只有编程式和spring项目可以使用,springboot项目只能有一个全局的 ForestConfiguration (当然你也通过指定 xml 方式来定义 bean 也可以实现配置多个 ForestConfiguration)。

  3. 直接使用自定义的 OkHttpClient 或 HttpClient 对象,绕过 Forest 的线程池,直接使用 Okhttp 和 HttpClient 的连接池进行管理,缺点是实现相对复杂。

可以支持通过配置指定使用哪个json序列化框架,目前最新版本对fastjson2.x版本支持有点问题,有个类报找不到,而且一旦类路径下有了fastjson依赖,就强制使用fastjson,感觉不太好

现在已经可以配置使用哪个json框架了
https://forest.dtflyx.com/pages/1.5.x/converter/#springboot-%E4%B8%8B%E9%85%8D%E7%BD%AE%E5%85%A8%E5%B1%80%E8%BD%AC%E6%8D%A2%E5%99%A8

后面版本也会对 fastjson2 进行适配

已在1.5.36版本支持fastjson2

可否 在拦截器中,支持 对 URL 中 变量得自定义 赋值 ? 现在仅支持 从 方法入参获取或全局配置中获取。

感谢提议,这是一个很好的想法,但要做到在代码中动态变更请求的变量,需要大规模重构,短期内实现不现实,但会往这个方向发展

怎么参与新特性或新项目的讨论与开发,希望能够开放相关通道。 :laughing:

可以加入Forest技术群

重试或者重定向的时候是新创建一个httpclient去发请求,还是使用原来的httpclient。对于状态码是202,302的请求,需要使用原来的httpclient,或者创建新的httpclient携带上第一个请求返回的cookie等头信息

能否支持声明式接口自定义 bean 的 name ,以防多个不同包但类名相同的接口 bean name 冲突,类似 spring 的 @Service("userService")。

能否自定义日志级别,比如我想在 warn 或 error 级别打印请求参数及相应内容。现在只能在 debug 级别打印日志。

当前只有HTTPProxy来支持http代理,但是想使用socks代理就没有好的支持了,麻烦下一个版本更新上去,谢谢!

新版本已支持

强烈建议请求&返回日志合并,或增加标识,否在在同一个链路请求下 请求返回打印穿插 难以识别

希望支持http2.0通信协议

希望支持websocket

希望内置或单独提供一个工具(网页)可以将curl格式的请求直接转换成forest的不同形式的代码。

希望可以将请求的日志输出成curl格式

目前版本就可以通过自定义LogHandler,来自定义各种日志输出格式

希望支持实体参数字段的别名注解,有些接口文档的字段是下划线,JAVA里面字段用驼峰比较规范,感谢。

希望forest的下一个版本中支持converter转换器可以获取到method方法上的annotations,方便自定义转换器做一些特殊处理

可以通过 request.getMethod().getMethod() 获取java反射的方法对象,进而获取其所有的annotation

ForestConverter中没有request对象,怎么获取呢

在实现方法 encodeRequestBody 的时候,它的参数 ForestBody 可以取到 request 对象

public class SimpleResponseConverter extends ForestFastjsonConverter {

public static final List<Integer> SUCCESS_CODE_LIST = Lists.newArrayList(200, 0);

@Override
public <T> T convertToJavaObject(String source, Type targetType) {
    if (targetType == SimpleResponse.class) {
        return JSON.parseObject(source, targetType);
    }
    JSONObject responseObject = JSON.parseObject(source);
    Integer code = responseObject.getInteger("code");
    if (!SUCCESS_CODE_LIST.contains(code)) {
        return null;
    }
    return responseObject.getObject("data", targetType);
}

}
我是想在converter中decode的时候获取方法上的注解做一些特殊处理, 比如上面中直接就解析响应结果判断出code码

在 decode 的时候确实取不到 request,不过可以在拦截器的 onSuccess 取到 response code 判断后再手动处理,但逻辑比较绕。
应该是可以在 decode 方法上加上 ForestResponse 参数

什么时候支持native呢?

forest异常如何区分出连接超时异常和读超时异常呢?

登錄 後才可以發表評論

狀態
負責人
里程碑
Pull Requests
關聯的 Pull Requests 被合併後可能會關閉此 issue
分支
開始時間   -   結束時間
-
置頂選項
優先級
参与者(39)
2238688 xiexin11 1594730045 8571488 there are no cubs 1622625282 1216742 dt flys 1594991700 1766140 sz6 1578959462 2159235 lingkang top 1578967487 486095 jlkm 1578925363 1542270 ancientfairy 1589953107 713109 slxm 1615876739
加载更多
Java
1
https://gitee.com/dromara/forest.git
git@gitee.com:dromara/forest.git
dromara
forest
forest

搜索幫助

14c37bed 8189591 565d56ea 8189591