使用 netty 制作了一个服务端,调用报文头通过 if 转向对应的方法,老用 ifelse 不是很好,于是想制作类似 SpringMvc 的 s 方法级控制器,这点上首先想到了反射和注解,也有了思路,但听说反射效率性能问题。网上也有很多描述反射性能问题的。
还有另一个办法,基于 HashMap<String,接口类>的方式,而这又分为两种,一是基于 JDK1.8 的 Lambda 表达式匿名方法,但这样的话,一个接口只能写一个方法,不然无法用 lambda 表达式。还有一种是声明接口字段,然后 new 出匿名类。在匿名类里面的各个方法进行开发。
这两种方式综合起来,那种比较好,尤其可能在是在 Spring 容器主导的环境下
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 |
2
wysnylc 2019-11-20 11:55:31 +08:00
不要用 HashMap 有并发问题,用 CurrentHashMap
|
4
cookii 2019-11-20 13:54:21 +08:00
反射即可,较为灵活,性能的话我想还行,毕竟相当多框架都是使用反射。
使用接口类的话,可以考虑直接去实现 Servlet 那套 API |
5
fanfou 2019-11-20 15:04:14 +08:00
Controller 直接透传 Service?
|
6
qwerthhusn 2019-11-20 15:23:37 +08:00
那 SpringMVC 的 Controller 不就是反射调用。。。可以把 Method 方法(直接到方法级而不是类级)缓存起来,直接 invoke 就行了
上面兄弟说 HashMap 有并发问题?这个应该是静态的,加载完成之后就不会再动了,并发 get 是不会出现并发问题的。 如果实际需要设置的 key 很多,可以考虑加大哈希桶数量( 64,128...)降低冲突率,但是感觉咋优化也应该提升不了什么。。使用 netty,瓶颈多半会出现在使用 netty 不当上面,比如 handler 出现了同步 IO。。 |
7
godoway 2019-11-20 16:35:28 +08:00
后者感觉像是设计要给 router,其实 router-handler 模式挺适合 netty 的。
|
8
aguesuka 2019-11-22 22:42:36 +08:00
初始化的时候 spring 扫描注解得到 bean,然后扫描 bean 中的方法得到路径.将路径存到 map 中.
以后调用直接调方法 spring 就是这样做的,可以去模仿 spring mvc 的源码 |
9
donglan1995 2019-11-29 15:56:42 +08:00
那你为什么不用 webflux...
|