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

现在有既能处理 http 服务又能处理 tcp 服务的成熟框架么?

  •  
  •   tctc4869 · 2020-05-11 17:54:50 +08:00 · 4705 次点击
    这是一个创建于 1657 天前的主题,其中的信息可能已经有所发展或是发生改变。

    一个项目有 http 服务和底层的 tcp 服务,想过用 spring boot 启动后异步启动 netty,但是有人建议一个进程最好不要挂两个服务端程序。如果技术菜,netty 内存管理处理不好,就容易死掉。

    那有没有一个封装好的网络服务框架,既能处理 http 服务,又能处理 tcp 服务处理,处理策略像 netty 可以设置两个 handler,一个无法处理,可以交给下一个处理。如果侦测到是 http 请求就交给 http 处理,如果不是,就交给底层的 tcp 处理器处理

    当然解决方式,除了把 http 和 tcp 处理挂在一个程序,还有一个方式,把一个进程服务拆分两个进程服务。但这种要面临进程服务管理上的问题

    netty 自带 HttpObjectAggregator,我没用过,有用过的么,加了这个,如果还得要添加自定义 tcp 处理的话,会有什么问题么,除了 netty,还有其他的方式么?比如 vert.x 那个?那个有谁用过么?

    27 条回复    2020-06-24 16:35:39 +08:00
    wysnylc
        1
    wysnylc  
       2020-05-11 18:25:55 +08:00
    socket 吧
    diggzhang
        2
    diggzhang  
       2020-05-11 18:34:39 +08:00
    akka-http?
    est
        3
    est  
       2020-05-11 18:35:48 +08:00
    没有。
    catror
        4
    catror  
       2020-05-11 19:01:37 +08:00 via Android
    用 websocket 不就好了?
    tctc4869
        5
    tctc4869  
    OP
       2020-05-11 19:19:51 +08:00
    @catror websocket,websocket 能处理非电脑平板手机的客户端交互么呢?比如客户端是单片机,这种情况呢?
    heiybb
        6
    heiybb  
       2020-05-11 19:25:11 +08:00
    donyee
        7
    donyee  
       2020-05-11 19:37:28 +08:00
    你这是同一个端口处理请求的吗? vertx 封装了 http tcp 模块的,http 部分比较好用,tcp 部分未使用过
    sagaxu
        8
    sagaxu  
       2020-05-11 20:20:33 +08:00 via Android
    vertx 了解一下,常见协议都支持了,还能用 kotlin 协程
    Kakajing
        9
    Kakajing  
       2020-05-11 20:29:45 +08:00
    Netty——One framework master all Framework
    guixiexiezou
        10
    guixiexiezou  
       2020-05-11 21:20:21 +08:00
    我猜楼主估计是想同时监听 tcp,同时又想要的 http 回调吧。一般 java 游戏服务端的操作是:用 netty 处理普通 tcp,嵌入一个 tomcat 或者 jetty ( sparkjava 是最简单了的方式了)处理 http...既简单又高效
    catror
        11
    catror  
       2020-05-11 23:50:50 +08:00 via Android
    @tctc4869 可以,websocket 哪都能用。看你项目原始需求是啥,如果只是需要一条长链接数据通道,我觉得用 websocket 是最简单的。
    horsea
        12
    horsea  
       2020-05-12 00:41:16 +08:00
    我也有这个疑问,有请游戏开发行业的人解答下,游戏 websocket 用 netty,http 用什么框架集成呢?
    luozic
        13
    luozic  
       2020-05-12 01:15:13 +08:00 via iPhone
    vertx 底层就是 netty,不少 Java 框架都是用 netty 做底层,按你的需求,找个支持得框架去抄代码。
    Malthael
        14
    Malthael  
       2020-05-12 08:06:16 +08:00
    我用的就是 spring boot + netty 处理 http 、tcp 、websocket 啥的,挺好的啊。
    ffLoveJava
        15
    ffLoveJava  
       2020-05-12 08:27:05 +08:00
    @Malthael 请问只用 netty 一个端口就能都相应 http 、tcp 、websocket 吗? 不用再用 tomcat 吗
    Malthael
        16
    Malthael  
       2020-05-12 08:30:55 +08:00
    @ffLoveJava #15 不能,我都是分端口处理的
    tctc4869
        17
    tctc4869  
    OP
       2020-05-12 08:48:19 +08:00
    @Malthael 我害怕的是我 netty 内存管理技术菜,导致内存管理处理不好,致使 http 或 tcp 服务死掉,因为我遇到过,不过不是 tomcat+netty,而是 undertow+netty 做一个服务端信息中转站,有几次出现进程服务不能正常使用,只能关闭重启再来,后来把 undertow 的 http 服务和 netty 服务拆成两个进程服务,挂了很多天这个问题就没有了。
    zyxcompany
        18
    zyxcompany  
       2020-05-12 08:57:47 +08:00
    frp
    enrio
        19
    enrio  
       2020-05-12 09:09:43 +08:00
    @tctc4869 websocket 也是可以的。不要把它想得就一定要在浏览器上跑,它归根到底也只是一个应用层协议。我就用过 Java 的 websocket 客户端。
    javapythongo
        20
    javapythongo  
       2020-05-12 10:09:09 +08:00
    sprongboot + netty
    zoharSoul
        21
    zoharSoul  
       2020-05-12 10:10:56 +08:00
    netty vertx
    dogfeet
        22
    dogfeet  
       2020-05-12 10:14:02 +08:00
    akka-stream,前面 gateway 将 tcp,http,websocket 消息统一转换成内部消息。
    剩下的就是一致的消息进入到流中统一处理。后期换可以方便的扩展成集群模式。
    fkdog
        23
    fkdog  
       2020-05-12 17:01:46 +08:00
    @tctc4869 因为菜就不去实践了。。。?
    horsea
        24
    horsea  
       2020-05-12 21:04:07 +08:00
    @Malthael spring boot + netty 是写到 1 个项目里,还是说 2 个项目。
    Malthael
        25
    Malthael  
       2020-05-12 21:08:15 +08:00
    @tctc4869 #17 没碰到过内存的问题,不知道你是怎么部署的。
    @horsea #24 一个项目,netty 管理的 tcp 和 websocket 在 springboot 里是定义成服务启动的。
    cs419
        26
    cs419  
       2020-05-12 23:35:29 +08:00
    如果你写多线程 别人提醒你可能有死锁的问题
    你想着要不我用多进程吧
    那担心是多余的 这说明你都没用上锁 那也就不会出现死锁

    用 netty 怕遇上内存泄漏的话
    多虑了 你应该还没用上 内存直接访问的 api
    你担心内存管理的不好 程序挂掉 那你换个框架 该挂还是挂

    服务拆成两个 java 进程就不挂掉 并不能说明就是 netty 的内存处理不当
    或许 你一个 java 进程 但 http tcp 各用一个端口 也不会挂掉
    yamasa
        27
    yamasa  
       2020-06-24 16:35:39 +08:00
    迷惑行为。我们这儿一个很重要的微服务一直都是 boot+netty 开两个端口,正式上线之后从来没有过内存问题。netty 内存能出问题无非就是直接内存未正确释放这一类呗,我还巴不得我遇到过几次,彻底定位长长见识,以后出去面试还能吹水呢哈哈。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1000 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 33ms · UTC 23:08 · PVG 07:08 · LAX 15:08 · JFK 18:08
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.