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

2019-11-20 11:44:03 +08:00
 tctc4869

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

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

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

2833 次点击
所在节点    Java
9 条回复
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
2019-11-20 11:55:31 +08:00
不要用 HashMap 有并发问题,用 CurrentHashMap
tctc4869
2019-11-20 12:02:55 +08:00
@chendy 因为是 Socket,不是 http,springmvc 是应用层的容器
imzhoukunqiang
2019-11-20 13:54:21 +08:00
反射即可,较为灵活,性能的话我想还行,毕竟相当多框架都是使用反射。
使用接口类的话,可以考虑直接去实现 Servlet 那套 API
fanfou
2019-11-20 15:04:14 +08:00
Controller 直接透传 Service?
qwerthhusn
2019-11-20 15:23:37 +08:00
那 SpringMVC 的 Controller 不就是反射调用。。。可以把 Method 方法(直接到方法级而不是类级)缓存起来,直接 invoke 就行了

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

如果实际需要设置的 key 很多,可以考虑加大哈希桶数量( 64,128...)降低冲突率,但是感觉咋优化也应该提升不了什么。。使用 netty,瓶颈多半会出现在使用 netty 不当上面,比如 handler 出现了同步 IO。。
godoway
2019-11-20 16:35:28 +08:00
后者感觉像是设计要给 router,其实 router-handler 模式挺适合 netty 的。
aguesuka
2019-11-22 22:42:36 +08:00
初始化的时候 spring 扫描注解得到 bean,然后扫描 bean 中的方法得到路径.将路径存到 map 中.
以后调用直接调方法
spring 就是这样做的,可以去模仿 spring mvc 的源码
donglan1995
2019-11-29 15:56:42 +08:00
那你为什么不用 webflux...

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/621324

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX