V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
StarkWhite
V2EX  ›  Java

Java 是不是没有好的热部署方案?

  •  3
     
  •   StarkWhite · 2019-07-24 09:46:43 +08:00 · 17523 次点击
    这是一个创建于 1931 天前的主题,其中的信息可能已经有所发展或是发生改变。

    像 Node,PHP 推代码到服务器就行了,Java 每次打 jar/war 包、停止旧服务、启动新服务,挺麻烦的,从启动到能访问还得等几分钟。

    第 1 条附言  ·  2019-07-24 17:58:18 +08:00
    我目前是在做单机、单体服务,希望能够在不停服务的情况下更新服务。
    不管是 热部署、热更新、热加载,还是别的方式都请大家给出建议,谢谢
    第 2 条附言  ·  2019-07-25 10:15:32 +08:00
    被人安利了 apijson,大家评估下
    第 3 条附言  ·  2019-07-25 10:15:57 +08:00
    apijson 的热更新怎么样?
    https://v2ex.com/t/586011
    118 条回复    2020-01-03 10:18:24 +08:00
    1  2  
    NizumaEiji
        1
    NizumaEiji  
       2019-07-24 09:49:41 +08:00
    OSGI?
    laravel
        2
    laravel  
       2019-07-24 09:50:40 +08:00
    k8s
    gwybiaim
        3
    gwybiaim  
       2019-07-24 09:55:34 +08:00   ❤️ 2
    有 hotswap 啊
    相关的工具也很多,比如阿里巴巴的 arthas
    https://alibaba.github.io/arthas/index.html
    http://hengyunabc.github.io/arthas-online-hotswap/
    airfling
        4
    airfling  
       2019-07-24 09:55:52 +08:00
    这个是是 jvm 的性质导致的,没有好的解决方案,以前有 osgi,但是那个其实也是要很久
    zzf2019
        5
    zzf2019  
       2019-07-24 09:56:21 +08:00
    不都是 灰度发布吗?从访问上来说非常平滑呀,这不是 java 的问题吧,node、php 都是只有一个服务吗
    nikandaoleshenme
        6
    nikandaoleshenme  
       2019-07-24 09:59:36 +08:00   ❤️ 2
    不知道有种工具叫脚本么,
    再说了,要不是部署时间间隙这么长,哪有时间来 v 站逛 [搜狗表情]
    efaun
        7
    efaun  
       2019-07-24 10:00:55 +08:00
    分布式是用来干嘛的
    chendy
        8
    chendy  
       2019-07-24 10:02:01 +08:00
    反向代理 + 脚本
    k8s 之类自带滚动升级的东西
    lastpass
        9
    lastpass  
       2019-07-24 10:02:48 +08:00 via Android
    完全可以很简单的热部署呀,我现在就在使用。
    在 windows 下编辑和调试代码,自动热部署到另一台 linux 服务器。
    StarkWhite
        10
    StarkWhite  
    OP
       2019-07-24 10:03:43 +08:00
    @zzf2019 就一台服务器,自己做个人小项目,怎么灰度发布 😂
    ala2008
        11
    ala2008  
       2019-07-24 10:04:31 +08:00
    难道只有一个服务器?
    StarkWhite
        12
    StarkWhite  
    OP
       2019-07-24 10:04:44 +08:00
    @cshijiel 感谢分享。但是在 arthas 官网的说明里没有热部署啊。hotswap 我再看看
    liangkang1436
        13
    liangkang1436  
       2019-07-24 10:06:31 +08:00
    推荐 Jrebel
    https://jrebel.com/
    gwybiaim
        14
    gwybiaim  
       2019-07-24 10:06:57 +08:00
    @StarkWhite 看第二个链接,三个命令就可以。最关键的是 redefine 命令,参考 https://alibaba.github.io/arthas/redefine.html
    guokeke
        15
    guokeke  
       2019-07-24 10:07:55 +08:00 via Android
    单机可以用 nginx 反代多个 server 那样搞
    Xbluer
        16
    Xbluer  
       2019-07-24 10:08:14 +08:00 via iPhone
    @StarkWhite 问题就变成了,个人小项目直接重启一下又不会太久,上啥热部署啊
    StarkWhite
        17
    StarkWhite  
    OP
       2019-07-24 10:08:41 +08:00
    @laravel k8s 那一套太重了,还不如手动部署。。。
    Caballarii
        18
    Caballarii  
       2019-07-24 10:09:48 +08:00
    java 从来不止起一个服务,停一个切路由起完了再切回来就好了
    StarkWhite
        19
    StarkWhite  
    OP
       2019-07-24 10:10:59 +08:00
    @lastpass 你怎么实现的呢?
    jowan
        20
    jowan  
       2019-07-24 10:11:44 +08:00
    PHP 也得看你是什么业务
    像我们的光推代码是不行的 还得重启队列,Socket 等服务
    StarkWhite
        21
    StarkWhite  
    OP
       2019-07-24 10:13:35 +08:00
    @chendy 反向代理+脚本 看起来可行,只是写脚本太麻烦了,还有重启服务后状态会丢啊。

    k8s 那一套太重了,还不如手动部署。。。
    StarkWhite
        22
    StarkWhite  
    OP
       2019-07-24 10:15:39 +08:00
    @liangkang1436 感谢,但是 jrebel 官网打不开,蜜汁尴尬
    lastpass
        23
    lastpass  
       2019-07-24 10:16:07 +08:00 via Android
    @StarkWhite #19 依靠 idea 和 jvm 的支持呀。首先 ssh 连接到远程服务器,配置 remote tomcat。tomcat 配置 jmx remote 开启远程调试。最后 idea 配置 automatic upload 以推送资源文件。
    lihongjie0209
        24
    lihongjie0209  
       2019-07-24 10:16:29 +08:00   ❤️ 2
    类似这种问题, 你可以问一下 windows 团队为什么更新需要重启
    notreami
        25
    notreami  
       2019-07-24 10:18:36 +08:00
    类比 Node,PHP 的话,springboot 的 devtools 就可以了,监听某个目录下的文件,有变化就重新加载运行。
    稳定点的话,使用模块化方式,比如 osgi、Jigsaw、Guice 等等,但是这些都太麻烦,对开发方式影响太大。
    crayhuang
        26
    crayhuang  
       2019-07-24 10:33:35 +08:00
    jrebel+1
    szq8014
        27
    szq8014  
       2019-07-24 10:37:07 +08:00
    想直接发布代码也没人有阻止呀~比如 maven 项目,就可以直接在服务器更新代码然后再 package 再 run。 [此处需要加狗头]
    redford42
        28
    redford42  
       2019-07-24 10:37:25 +08:00   ❤️ 5
    不然 Java 图标为什么是一杯咖啡呢
    Raymon111111
        29
    Raymon111111  
       2019-07-24 10:47:02 +08:00
    答案是 是

    没有简便的解决方案

    jvm 特性导致的
    rockyou12
        30
    rockyou12  
       2019-07-24 10:52:07 +08:00
    单机 java 又是个人项目最好就别搞灰度了,费力不讨好。用 nginx 其实也不算简单,要你本地新旧两个服务用不同端口,然后 upstream。

    k8s 的 deployment 发布已经是最省事的灰度发布了,如果机器不够真的不如不做
    Infernalzero
        31
    Infernalzero  
       2019-07-24 10:57:43 +08:00   ❤️ 1
    楼上也很多人说了,这个没有彻底的解决方案,jvm 特性导致
    只能是想办法减少启动时间,这里主要分两块,一块是 JIT 导致的,只能像阿里那样从 jvm 层面去改
    还有一块是 spring 导致的,因为 spring 的依赖注入,创建 bean 和扫描非常耗时,所以使得 java 应用启动更慢,这个目前业界的思路是把依赖注入放到编译构建阶段去做,对应的框架是 micronaut,但是这个要取代 spring 有点困难。
    qiyuey
        32
    qiyuey  
       2019-07-24 11:04:54 +08:00
    热部署一定是需要的吗?
    passerbytiny
        33
    passerbytiny  
       2019-07-24 11:10:03 +08:00
    “类似这种问题, 你可以问一下 windows 团队为什么更新需要重启” —— lihongjie0209

    纵观楼主的回复,还是这个最接近答案,其他人可以散了。
    fivesmallq
        34
    fivesmallq  
       2019-07-24 11:10:46 +08:00
    你可以试试 play 1.x https://www.playframework.com/documentation/1.5.x/home

    支持热部署,springboot 的 devtools 太 low 了,实际上还是重启。

    不过这个特性不建议生产环境使用
    Takamine
        35
    Takamine  
       2019-07-24 11:25:17 +08:00
    devtools。
    mineqiqi
        36
    mineqiqi  
       2019-07-24 11:32:58 +08:00
    分布式的项目可以平滑过渡升级,但是并不是热部署
    StarkWhite
        37
    StarkWhite  
    OP
       2019-07-24 11:40:24 +08:00
    @redford42 意思应该先自己冲一杯咖啡,然后在慢慢喝,喝完了可以瞄一眼进度?/滑稽
    StarkWhite
        38
    StarkWhite  
    OP
       2019-07-24 11:41:36 +08:00
    @mineqiqi 没钱啊,个人小项目上分布式,得买几台服务器,而且运维麻烦
    luckyrayyy
        39
    luckyrayyy  
       2019-07-24 11:42:56 +08:00
    nginx or docker
    lihongjie0209
        40
    lihongjie0209  
       2019-07-24 11:44:02 +08:00
    @StarkWhite #38 没必要上分布式, 只用多节点就可以了. 一台服务器部署两个一样的应用, 监听不同的端口, nginx 做负载就好了
    est
        41
    est  
       2019-07-24 11:48:52 +08:00
    node 那个不叫热部署吧。。。

    严格的说文件拷贝过程中出了什么差错还会出问题的。
    th00000
        42
    th00000  
       2019-07-24 12:01:30 +08:00
    现在部署都是集群内的 rolling update, 楼主的热部署指的是在同一个服务不停的情况下, 直接推送更新吧, 在当前的集群环境下, 个人认为必要性越来越低.
    但是开发的时候爽啊
    不用改一行代码就重启了, 直接 reload 完事.
    ninjachen
        43
    ninjachen  
       2019-07-24 12:06:26 +08:00
    对的,nginx 那边做个路由,然后反向代理到多个 port,也就是多个 java 实例
    Weixiao0725
        44
    Weixiao0725  
       2019-07-24 12:38:46 +08:00
    从根本上来说,java 是做不到热更新的,因为 Java 中只要 jar 包中的文件被载入到内存后,就不支持删除。像 Tomcat 那种热部署,无非也就是把所有的数据结构重新载入一遍。
    akira
        45
    akira  
       2019-07-24 12:59:53 +08:00
    热不热不重要,只要能"快速"
    StarkWhite
        46
    StarkWhite  
    OP
       2019-07-24 14:22:00 +08:00
    @qiyuey 能省很多时间啊
    StarkWhite
        47
    StarkWhite  
    OP
       2019-07-24 14:23:00 +08:00
    @cshijiel 感谢。
    “注意,redefine 后的原来的类不能恢复,redefine 有可能失败(比如增加了新的 field ),参考 jdk 本身的文档。”
    看来不稳定啊,还是有缺陷。
    StarkWhite
        48
    StarkWhite  
    OP
       2019-07-24 14:23:54 +08:00
    @akira 也是,就是想省事儿~ 如果有别的类似热更新、热加载之类方式的也行啊
    pursuer
        49
    pursuer  
       2019-07-24 14:34:52 +08:00 via Android
    @Weixiao0725 classloader 是可以从内存卸载 jar 包的,只是如果不清除外部引用的话不会被 gc 清理
    StarkWhite
        50
    StarkWhite  
    OP
       2019-07-24 14:43:06 +08:00
    @jowan 也是,这个又引申出来状态丢失问题。所有重启服务的方式,都会导致缓存丢失。。。
    StarkWhite
        51
    StarkWhite  
    OP
       2019-07-24 14:44:11 +08:00
    @th00000 对的,但我就一台服务器啊,搞不了集群
    StarkWhite
        52
    StarkWhite  
    OP
       2019-07-24 14:44:51 +08:00
    @est 文件都拷贝出差错了,那用什么方式都会有问题吧 😂
    gwybiaim
        53
    gwybiaim  
       2019-07-24 14:46:45 +08:00
    @StarkWhite 没错,redefine 有很多约束
    wr410
        54
    wr410  
       2019-07-24 14:46:50 +08:00
    与其想办法怎么弄热部署,不如想办法从前端做多机均衡,如果你关闭指令发出之后,还有线程没跑完连接没断开,这时候你就知道前端均衡的好处了。
    yuankui
        55
    yuankui  
       2019-07-24 14:50:13 +08:00
    需要一套新轮子,楼主等我消息 😆
    freexyxyz
        56
    freexyxyz  
       2019-07-24 14:51:27 +08:00
    用 Jenkins 之类的工具,配个流水线就行了……
    est
        57
    est  
       2019-07-24 14:57:31 +08:00
    @StarkWhite 比如你 index.html 先拷贝完毕,这个时候引用了 main.23333.js 然后这个文件还没拷完。

    是不是就出问题了。
    StarkWhite
        58
    StarkWhite  
    OP
       2019-07-24 14:59:31 +08:00
    @cshijiel hotswap 限制太大了,基本没法用啊,除了修复小 bug。。。
    “只允许修改方法体,不允许增加新的 class、不允许新增字段、不允许新增方法、不允许修改方法签名”
    cominghome
        59
    cominghome  
       2019-07-24 15:00:12 +08:00
    事实上有成熟的流水线的话,热更新听起来就像一个伪需求
    StarkWhite
        60
    StarkWhite  
    OP
       2019-07-24 15:00:23 +08:00
    @yuankui 期待,到时候记得通知我哈
    StarkWhite
        61
    StarkWhite  
    OP
       2019-07-24 15:02:44 +08:00
    @fivesmallq
    例子挺全的,但一看核心库居然只有 10 多个类。
    原来我以为它基于 Spring,怎么看都不像,用它岂不是得还框架了。。。
    https://github.com/playframework/playframework/tree/master/core/play-java/src/main/java/play
    yuankui
        62
    yuankui  
       2019-07-24 15:08:15 +08:00   ❤️ 1
    我们之前,有个 spring 应用,启动很慢,我专门统计了下每个 bean 的初始化时间长。后来发现主要是以下几类:

    - 那些需要远程连接服务进行初始化的,比如 RPC 连接初始化
    - 那些需要加载大量数据到内存中的(比如建立一个字典)


    所以,要想应用实现热加载,关键是让应用无状态,这就是 php 的主要是方式。

    另外一个就是状态向后兼容,比如之前内存保存在一个对象 class A(a,b,c),后面加了个字段 class A'(a,b,c,d),目前 jvm 里面还没有工具支持,将这种数据 A 对象升级成 A'对象,但是实际上,让人来做,是可以做的。js 是可以的,因为 js 运行时全是 object ( kv ),天然具有向后兼任性。所以即使 js 应用,有状态,数据还是能做到兼容,不需要重启。

    所以综上,主要是问题其实不是 Java 的问题,而是框架的问题,也就是 spring 的问题。(楼上不是有人说 play 支持热加载吗?我没具体看啥原理哈)

    可能目前这个还不是痛点,就是大家遇到了,也是尽量先不启动应用进行开发,而是进行“单元开发”=》“单元测试”

    等差不多了, 在起应用,然后这个时候,即使有小 bug,也可以利用 IDE 的动态加载,将 body 体里面的实现替换,这个是不需要重启的。
    arrow8899
        63
    arrow8899  
       2019-07-24 15:31:28 +08:00
    拆分服务,减小部署包大小;
    减少不必要的依赖,加快启动速度;
    无状态;
    分布式负载均衡,滚动升级。
    StarkWhite
        64
    StarkWhite  
    OP
       2019-07-24 15:34:36 +08:00
    @yuankui 赞,感谢分享。网上看到说 Play 也是基于 hotswap 的原理,看起来也会有 #58 楼 hotswap 的各种不支持的问题。
    StarkWhite
        65
    StarkWhite  
    OP
       2019-07-24 15:35:50 +08:00
    @cominghome 个人小项目也整个流水线?真是袁隆平的锅 /狗头
    kaneg
        66
    kaneg  
       2019-07-24 15:37:37 +08:00 via iPhone
    JSP 可以解决你的问题
    StarkWhite
        67
    StarkWhite  
    OP
       2019-07-24 15:51:45 +08:00
    @kaneg JSP 这种古董技术都要淘汰了。。。现在都是前后端分离
    freexyxyz
        68
    freexyxyz  
       2019-07-24 15:58:32 +08:00
    @StarkWhite 你想实现 “提交代码……然后服务器自动更新好” 用 CI/CD 工具就行……流水线就是 devops 里的一个叫法,可以玩的很高级,也可以往简单了玩……你配个持续部署出来就行了
    StarkWhite
        69
    StarkWhite  
    OP
       2019-07-24 16:39:26 +08:00
    @freexyxyz 在公司也用 Jenkins,自己业务搞个小项目也用它不划算啊
    StarkWhite
        70
    StarkWhite  
    OP
       2019-07-24 16:39:59 +08:00
    @StarkWhite 业余
    StarkWhite
        71
    StarkWhite  
    OP
       2019-07-24 17:13:42 +08:00
    @rockyou12 是啊,费力不讨好。
    低配 ECS 云服务器,Nginx 重载配置到生效也得好几分钟 /囧
    StarkWhite
        72
    StarkWhite  
    OP
       2019-07-24 17:14:48 +08:00
    @efaun 目前在做个人小项目,单机、单体服务,搞分布式运维麻烦,还要钱啊
    StarkWhite
        73
    StarkWhite  
    OP
       2019-07-24 17:15:21 +08:00
    @Xbluer 不止是重启,还要打包,上传。。。
    efaun
        74
    efaun  
       2019-07-24 17:21:40 +08:00
    @StarkWhite #70 低成本解决的话就弄定时任务,找个深夜无人的时候自动化发布
    yiyi11
        75
    yiyi11  
       2019-07-24 17:43:32 +08:00   ❤️ 1
    如果你要的是只是效率,而不是真正的不停机更新,那么可以试下这个:
    https://help.aliyun.com/document_detail/108590.html?spm=a2c4g.11174283.3.5.1813190cmVAJlX

    Alibaba Cloud Toolkit
    idea 插件
    配置服务器的地址,一键打包,上传,部署 springboot 应用。
    StarkWhite
        76
    StarkWhite  
    OP
       2019-07-24 18:04:56 +08:00
    @efaun 唉,项目太小弄定时任务不划算
    StarkWhite
        77
    StarkWhite  
    OP
       2019-07-24 18:06:28 +08:00
    @Takamine 楼上(#34 )说 devtools 太 low 了,实际上还是重启。这不是我想要的效果。。。
    wowo243
        78
    wowo243  
       2019-07-24 18:37:16 +08:00 via Android
    jrebel 应该是最好的了,但是个人认为依然不够好
    momocraft
        79
    momocraft  
       2019-07-24 18:44:31 +08:00
    我觉得至少要保证版本变更是原子的吧

    所谓 “ PHP 支持热加载” 听上去像面向巧合运营
    Xbluer
        80
    Xbluer  
       2019-07-24 18:48:42 +08:00 via iPhone
    @StarkWhite maven 负责编译测试打包,scp 上传,,ssh 远程命令重启。以上用一个脚本封装一下完全没问题。
    StarkWhite
        81
    StarkWhite  
    OP
       2019-07-24 20:26:57 +08:00
    @wowo243 它有啥问题呢?
    billlee
        82
    billlee  
       2019-07-24 22:05:24 +08:00
    @StarkWhite #51 一台服务器也可以搞集群,你在一台机器上起两个服务就可以了
    okwork
        83
    okwork  
       2019-07-24 22:18:30 +08:00
    楼主服务器配置了多少内存?

    用过一个 4G 内存的机器,项目一启 2G 就没了,后来加到 8G 搞 2 个端口,勉强实现灰度。
    oneisall8955
        84
    oneisall8955  
       2019-07-24 22:45:37 +08:00 via Android   ❤️ 1
    我说下这个情况,让我想起之前几个月的坑。
    1.tomcat 有 autodeploy 选项,直接打 war 包到 webapps 下,会自动解压更新项目。但是都是会停掉服务对应的项目重新开启,也就是说虽然 tomcat pid 不变,但是项目还是停掉在开。况且这个热部署有个坑,就是热部署太多次会导致 Compressed class 满了从而 oom 异常了。(这个空间默认 1G,每次看你 class 总内存多少,除一下就知道多少次就回报异常了)
    所以这个选项对于楼主没用
    2.jrebel 对于开发环境很有用,但有时候还抽风会不生效。这个是 jvm 的一个插件,开发环境我信赖他可以帮助我节约时间,避免多次重启服务器浪费时间。但是对于生产环境,我并不需要每时每刻去实时修改,而是在开发时候,通过频繁修改本地代码实时更新校验修改是否正确,最后再更新到服务器上。况且这个插件还是收费的,你在生产环境里面部署,破解了,被商业检测出来会不会存在什么问题?况且有时候本地调试还会失效,万一生产上面抽风失效了呢?但是自己的小项目,可以尝试这种方式。
    3.问题关键是楼主的单体应用里面。假如是 nginx 配置服务集群均衡,配合上 CI 工具写个脚本一个 tomcat 重启更新就很难自己感受到重启这件事了。还节省自己打包,上传,移动到 webapps 这个步骤,除了实际上是要重启服务器这个操作,基本能满足楼主的要求了吧。
    愚见,并没有实际解决楼主问题,以上均自己工作经验一点分享。
    q397064399
        85
    q397064399  
       2019-07-24 22:57:03 +08:00
    Java 重启太耗时,主要是 bean 的装配,这种工作本来应该放到编译时做的,但是为了更好的解耦,目前 Spring 依赖注入这套玩法灵活性很高,把很多编译时可以做的事情,都放到了运行时,有些 Bean 检查网络连接之类的,反正整个装配阶段是极其耗时的

    另外 Jvm 的特性我不是很清楚,

    另外热更新的这种事情最好不要做,序列化 /反序列化 会产生很多问题,有些小公司的项目本来就混乱,DB 的 model 类又不做版本管理,我至少吃过好几次序列化的亏,这还不是热更新,考虑到热更新 会出更多问题,没有良好的版本管理跟发布流程 建议不要做这种费力不讨好的事情,现在微服务大行其道,就是要利用小服务 这种加载 运行 速度快的特性,即使出问题 可以通过灰度 等方法来解决。
    realpg
        86
    realpg  
       2019-07-25 00:37:52 +08:00
    @jowan #20
    你那些并不是 PHP 的内容啊……
    涉及的也不是 PHP 热更新的部分
    Weixiao0725
        87
    Weixiao0725  
       2019-07-25 09:02:10 +08:00
    @pursuer 请问有相关的资料吗?如果 java 支持内存删除的话,我想那些打桩工具不需要只在启动的时候注入,任何程序运行的时候都可以重新卸载某个类然后再读入字节码,编辑和载入。
    StarkWhite
        88
    StarkWhite  
    OP
       2019-07-25 10:16:50 +08:00
    @billlee 用不同的端口吗?
    StarkWhite
        89
    StarkWhite  
    OP
       2019-07-25 10:18:43 +08:00
    @okwork 最低配的阿里云 ECS,1 核 1GHz,1G 内存,40G 云盘。。。
    StarkWhite
        90
    StarkWhite  
    OP
       2019-07-25 10:19:42 +08:00
    @oneisall8955 感谢分享,打这么多字,辛苦了哈
    pursuer
        91
    pursuer  
       2019-07-25 10:34:30 +08:00 via Android
    @Weixiao0725
    直接看 classloader 的 api 文档就可以
    加载卸载还是要以 classloader 为单位的。没有引用的 classloader,System.gc 就清理了,只是要保证没有引用很困难,要求工程的模块化做的很好。
    StarkWhite
        92
    StarkWhite  
    OP
       2019-07-25 10:36:59 +08:00
    @pursuer 被人案例了 apijson 的热更新,但我没有看到它有用 classloader,这个靠谱吗?
    https://v2ex.com/t/586011
    wangxiaoaer
        93
    wangxiaoaer  
       2019-07-25 10:48:29 +08:00
    我们一般开个新端口启动一个新的应用,nginx 指向新应用,重启 nginx,停止老应用。
    StarkWhite
        94
    StarkWhite  
    OP
       2019-07-25 11:01:54 +08:00
    @wangxiaoaer 我那个垃圾服务器重启 nginx 得几分钟才能让配置生效。。。
    fivesmallq
        95
    fivesmallq  
       2019-07-25 11:06:55 +08:00
    @StarkWhite https://github.com/playframework/play1 你看错了,你看的那个是 2.x 的,用 scala 重写的,1.x 的才是主要用 java 的。
    StarkWhite
        96
    StarkWhite  
    OP
       2019-07-25 11:12:33 +08:00
    @fivesmallq 这样啊,感谢,我再瞅瞅
    StarkWhite
        97
    StarkWhite  
    OP
       2019-07-25 11:19:04 +08:00
    @fivesmallq 这个代码量就正常了,像是一个 HTTP Server 框架该有的,哈哈
    fivesmallq
        98
    fivesmallq  
       2019-07-25 11:26:20 +08:00
    @StarkWhite 对的,你跑下 demo,会喜欢的,适合中小型项目
    StarkWhite
        99
    StarkWhite  
    OP
       2019-07-25 11:59:54 +08:00
    @fivesmallq 感谢,我试试。现在已经用 SpringBoot 开发了一些接口了。
    如果 Play 确实好用,而且迁移成本不高的话,可以迁过去看看。
    StarkWhite
        100
    StarkWhite  
    OP
       2019-07-25 12:00:31 +08:00
    @StarkWhite 话说这个框架有么有什么大的坑呢?
    1  2  
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5540 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 33ms · UTC 08:30 · PVG 16:30 · LAX 00:30 · JFK 03:30
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.