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

在 netty 服务端做一个 MVC 控制器,基于反射注解和基于 HashMap<String,接口类>的两种方式,哪种综合来看比较好?

  •  
  •   tctc4869 · 2019-11-20 11:44:03 +08:00 · 2819 次点击
    这是一个创建于 1612 天前的主题,其中的信息可能已经有所发展或是发生改变。

    使用 netty 制作了一个服务端,调用报文头通过 if 转向对应的方法,老用 ifelse 不是很好,于是想制作类似 SpringMvc 的 s 方法级控制器,这点上首先想到了反射和注解,也有了思路,但听说反射效率性能问题。网上也有很多描述反射性能问题的。

    还有另一个办法,基于 HashMap<String,接口类>的方式,而这又分为两种,一是基于 JDK1.8 的 Lambda 表达式匿名方法,但这样的话,一个接口只能写一个方法,不然无法用 lambda 表达式。还有一种是声明接口字段,然后 new 出匿名类。在匿名类里面的各个方法进行开发。

    这两种方式综合起来,那种比较好,尤其可能在是在 Spring 容器主导的环境下

    第 1 条附言  ·  2019-11-20 16:40:28 +08:00
    突然想到,既然基于 Spring 的话,比较有效一个办法,既然是在 Spring 容器的环境下的 web 服务端,那么在 tomcat 启动的时候用,ApplicationContext 获得符合要求的 nettyController 的 bean,在异步创建 netty 服务端程序的时候,通过属性设置或构造函数传入 netty 服务端的监听器里进去,还避免了要在怎么在 netty 获得 Spring 容器的麻烦
    9 条回复    2019-11-29 15:56:42 +08:00
    chendy
        1
    chendy  
       2019-11-20 11:53:31 +08:00
    spring 容器主导,那为啥不直接 spring-mvc 呢
    反射参考 spring-mvc
    lambda 参考 https://docs.spring.io/spring-framework/docs/current/spring-framework-reference/web.html#webmvc-fn
    wysnylc
        2
    wysnylc  
       2019-11-20 11:55:31 +08:00
    不要用 HashMap 有并发问题,用 CurrentHashMap
    tctc4869
        3
    tctc4869  
    OP
       2019-11-20 12:02:55 +08:00
    @chendy 因为是 Socket,不是 http,springmvc 是应用层的容器
    imzhoukunqiang
        4
    imzhoukunqiang  
       2019-11-20 13:54:21 +08:00
    反射即可,较为灵活,性能的话我想还行,毕竟相当多框架都是使用反射。
    使用接口类的话,可以考虑直接去实现 Servlet 那套 API
    fanfou
        5
    fanfou  
       2019-11-20 15:04:14 +08:00
    Controller 直接透传 Service?
    qwerthhusn
        6
    qwerthhusn  
       2019-11-20 15:23:37 +08:00
    那 SpringMVC 的 Controller 不就是反射调用。。。可以把 Method 方法(直接到方法级而不是类级)缓存起来,直接 invoke 就行了

    上面兄弟说 HashMap 有并发问题?这个应该是静态的,加载完成之后就不会再动了,并发 get 是不会出现并发问题的。

    如果实际需要设置的 key 很多,可以考虑加大哈希桶数量( 64,128...)降低冲突率,但是感觉咋优化也应该提升不了什么。。使用 netty,瓶颈多半会出现在使用 netty 不当上面,比如 handler 出现了同步 IO。。
    godoway
        7
    godoway  
       2019-11-20 16:35:28 +08:00
    后者感觉像是设计要给 router,其实 router-handler 模式挺适合 netty 的。
    aguesuka
        8
    aguesuka  
       2019-11-22 22:42:36 +08:00
    初始化的时候 spring 扫描注解得到 bean,然后扫描 bean 中的方法得到路径.将路径存到 map 中.
    以后调用直接调方法
    spring 就是这样做的,可以去模仿 spring mvc 的源码
    donglan1995
        9
    donglan1995  
       2019-11-29 15:56:42 +08:00
    那你为什么不用 webflux...
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2806 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 12:02 · PVG 20:02 · LAX 05:02 · JFK 08:02
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.