有个问题请问下:在集成Netty时报错,说是平台没有提供低级别API,这是什么原因呢? io.netty.util.internal.PlatformDependent - Your platform does not provide complete low-level API for accessing direct buffers reliably. Unless explicitly requested, heap buffer will always be preferred to avoid potential system instability.
io.netty.util.internal.PlatformDependent0 - sun.misc.Unsafe.theUnsafe: unavailable java.lang.NoClassDefFoundError: sun/misc/Unsafe at io.netty.util.internal.PlatformDependent0$1.run(PlatformDependent0.java:87) at java.base/java.security.AccessController.doPrivileged(Native Method) at io.netty.util.internal.PlatformDependent0.<clinit>(PlatformDependent0.java:83) at io.netty.util.internal.PlatformDependent.isAndroid(PlatformDependent.java:272) at io.netty.util.internal.PlatformDependent.<clinit>(PlatformDependent.java:92) at io.netty.channel.nio.NioEventLoop.newTaskQueue0(NioEventLoop.java:284) at io.netty.channel.nio.NioEventLoop.newTaskQueue(NioEventLoop.java:155) at io.netty.channel.nio.NioEventLoop.<init>(NioEventLoop.java:137) at io.netty.channel.nio.NioEventLoopGroup.newChild(NioEventLoopGroup.java:138) at io.netty.channel.nio.NioEventLoopGroup.newChild(NioEventLoopGroup.java:37) at io.netty.util.concurrent.MultithreadEventExecutorGroup.<init>(MultithreadEventExecutorGroup.java:84) at io.netty.util.concurrent.MultithreadEventExecutorGroup.<init>(MultithreadEventExecutorGroup.java:58) at io.netty.channel.MultithreadEventLoopGroup.<init>(MultithreadEventLoopGroup.java:52) at io.netty.channel.nio.NioEventLoopGroup.<init>(NioEventLoopGroup.java:88) at io.netty.channel.nio.NioEventLoopGroup.<init>(NioEventLoopGroup.java:83) at io.netty.channel.nio.NioEventLoopGroup.<init>(NioEventLoopGroup.java:64) at io.netty.channel.nio.NioEventLoopGroup.<init>(NioEventLoopGroup.java:52)
精选留言(30)
作者回复: 因为偏底层了,然后课程设计的时候选取的是最重要的点,所以没有讲这块,怕跑偏,后面我会根据您的意见,把一些类似没提到然后大家觉得重要的问题做成一个小册子,单独再发出来,这样可能会更好点。回头我做好了,找个地方放下,再来想办法通知您!
作者回复: 网络知识:《TCP/IP详解》、《图解TCP/IP》、《Wireshark网络分析就这么简单》
Java 网络编程:《Java 网络编程》、《Java TCP/IP Socket编程》
Netty 相关:《Netty权威指南》《Netty实战》(译自《Netty in action》: Norman Maurer)《Netty进阶之路:跟着案例学Netty》
目前看到极客时间的课程里,和源码相关的效果并不是太完美,希望这门课能成功。
Netty水深,希望能多在评论区交流
作者回复: 最近也在思考这个问题,就是有限得时间怎么能讲解那么多细枝末节,所以觉得还是把主线交代清楚,然后剩下的大家一起讨论交流,找出大家都关心的,然后一起研究下,看看可能整理出来比如:netty常见问题100问什么的,这样也是很好的一种方式。
作者回复: 既然你都用netty做了,单从你的设计来看,没有什么问题,但是你可能需要考虑一些额外的问题,比如你写备份的那个请求和你的主业务之间是同步还是异步?如果失败怎么补偿等等?我们做过类似的事情,都是另外搞了一个独立服务来单独做的,因为这种需求对实时性要求不高。然后补偿也好做,怎么做,也都不影响主服务。另外对于图片这种特别的文件类型,大多都不大,所以可以做一些聚合,比如文件存储成100M,然后里面有很多小文件,这样减小文件碎片,另外文件目录,要分散点,避免1个目录存无数个,不然会很慢,等等了,扯远了;
回正题,你这个问题上来就这样问,我只能说没有问题,肯定也能做通,但是你可以考虑更多的问题,就像开始说的,独立出一个服务专门做这个事情。
作者回复: 👍
作者回复: 尽量做到,但是反思下,有的时候,讲的时候有的以为大家都知道,就一笔带过了,如果以后发现哪里讲的太粗略,可以留言反馈下,然后一起梳理。
作者回复: 一起努力!
作者回复: 谢谢支持,最开始我也选了jdk来做,发现确实繁琐,虽然学到了知识,但是工程实践还是用大众方案好。只能说java nio也不是白学,第三章就能看出来本质还是java nio编程,只是netty更好用
作者回复: 来的早不如来的巧
作者回复: 谢谢,希望能坚持下去,有所收获!
作者回复: 希望如此!
关于netty典型的生产场景,能介绍几个吗?
作者回复: 只要是使用java语言,且需要网络通信,都可以用,覆盖tcp.udp.也支持常用应用层协议,所以都能用,但是假设你不追求高性能,直接基于现有的框架(大多也都基于netty)之类写写业务不涉及通信层,那你可能只需要了解它就行了。
作者回复: 嗯,因为设计课程的时候,是期望有一点基础的,至少对NIO有一点点了解,否则的话,60讲根本没有办法讲完。你说的先讲Helloworld的方式,个人感觉不是太适合netty,因为netty的hello world太简单了,因为大多netty自己做好了,所以当时改了顺序,先讲原理,再讲案例。如果不太习惯的话,可以尝试先实践后原理再结合来看。谢谢
作者回复: 单从问题的描述(描述的不是很清晰)看,不像netty的问题,倒像网络互通性问题,既然提到代理,那你也可以使用netty提供的一些代理handler(Socks5ProxyHandler等)来试试。
再问下,是在思科中国研发中心的哪个分公司呢?
作者回复: 谢谢支持,本身不算隐私问题,但不知道这里可方便说那么具体,不好意思啊
作者回复: 这点重口难调,怕讲多了跑题
io.netty.util.internal.PlatformDependent - Your platform does not provide complete low-level API for accessing direct buffers reliably. Unless explicitly requested, heap buffer will always be preferred to avoid potential system instability.
io.netty.util.internal.PlatformDependent0 - sun.misc.Unsafe.theUnsafe: unavailable
java.lang.NoClassDefFoundError: sun/misc/Unsafe
at io.netty.util.internal.PlatformDependent0$1.run(PlatformDependent0.java:87)
at java.base/java.security.AccessController.doPrivileged(Native Method)
at io.netty.util.internal.PlatformDependent0.<clinit>(PlatformDependent0.java:83)
at io.netty.util.internal.PlatformDependent.isAndroid(PlatformDependent.java:272)
at io.netty.util.internal.PlatformDependent.<clinit>(PlatformDependent.java:92)
at io.netty.channel.nio.NioEventLoop.newTaskQueue0(NioEventLoop.java:284)
at io.netty.channel.nio.NioEventLoop.newTaskQueue(NioEventLoop.java:155)
at io.netty.channel.nio.NioEventLoop.<init>(NioEventLoop.java:137)
at io.netty.channel.nio.NioEventLoopGroup.newChild(NioEventLoopGroup.java:138)
at io.netty.channel.nio.NioEventLoopGroup.newChild(NioEventLoopGroup.java:37)
at io.netty.util.concurrent.MultithreadEventExecutorGroup.<init>(MultithreadEventExecutorGroup.java:84)
at io.netty.util.concurrent.MultithreadEventExecutorGroup.<init>(MultithreadEventExecutorGroup.java:58)
at io.netty.channel.MultithreadEventLoopGroup.<init>(MultithreadEventLoopGroup.java:52)
at io.netty.channel.nio.NioEventLoopGroup.<init>(NioEventLoopGroup.java:88)
at io.netty.channel.nio.NioEventLoopGroup.<init>(NioEventLoopGroup.java:83)
at io.netty.channel.nio.NioEventLoopGroup.<init>(NioEventLoopGroup.java:64)
at io.netty.channel.nio.NioEventLoopGroup.<init>(NioEventLoopGroup.java:52)