Netty解析-Echo的bind&connect
借助 Netty 官方 Echo 实例: Echo Demo
问题
- 如何与底层交互
- Bootstrap 与 ServerBootstreap 有什么异同
- NioSocketChannel 与 NioServerSocketChannel 有什么异同
- 为什么说 netty 是事件驱动,其事件是如何传播的
- 为什么 ServerBootstrap 需要两个 EventLoopGroup,分别有什么用
Netty中的ByteBuf-Pooled与内存管理
Demo
1 | ByteBuf buf = PooledByteBufAllocator.DEFAULT.buffer(); |
直接看 PooledByteBufAllocator.newHeapBuffer(int initialCapacity, int maxCapacity)
1 | protected ByteBuf newHeapBuffer(int initialCapacity, int maxCapacity) { |
Netty-UnpooledByteBuf 源码剖析
ByteBuffer 源码剖析
要点:
- JDK 原生支持,主要用于 NIO
- 包含两个实现
- HeapByteBuffer: 基于 Java 堆实现
- DirectByteBuffer: 使用 unsafe 的 API 进行堆外操作
- 核心方法为
put(byte)
与get()
。分别是往ByteBuffer里写一个字节,和读一个字节。 - 读写模式分离,正常的应用场景是:往ByteBuffer里写一些数据,然后
flip()
,然后再读出来。 - 在 JDK11 中 MappedByteBuffer 的创建实际是 DirectByteBuffer
- DirectByteBuffer 的垃圾回收利用了幻象引用进行回收,详见下面的
Cleaner
关于 asyncio 的喃喃自语
大多数东西都是根据之前学习中的印象而来,这篇文章更多的是喃喃自语吧。
协程
在 Python 3.5 之前,协程在我眼中应该就是 yield
这个语法的同义,通过 send
、throw
等方法来作为其交互,用于多进程中以提升效率,然而就 Python 的使用环境来说,其实接触到的机会并不是太多。
在 Python 3.5 之后,给了一种新的,现在看起来还是比较友好的选择
1 | async def hello(): |
在 I/O
密集的地方,填入 await
,在 def
前面加上 async
,不需要去适应至今让我还是十分不适的 yield
/ yield from
Kafka生产者分析——RecordAccumulator
前文介绍过,KafkaProducer 可以有同步和异步两种方式发送消息,其实两者的底层实现相同,都是通过异步方式实现的。主线程调用 KafkaProducer#send()
方法发送消息的时候,先将消息放到 RecordAccumulator
中暂存,然后主线程就可以从 send()
方法中返回了,此时消息并没有真正地发送给 Kafka,而是缓存在了 RecordAccumulator
中。之后,业务线程通过 KafkaProducer#send()
方法不断向 RecordAccumulator
追加消息,当达到一定的条件,会唤醒 Sender
线程发送 RecordAccumulator
中的消息。
下面我们就来介绍 RecordAccumulator
的结构。首先需要注意的是,**RecordAccumulator
至少有一个业务线程和一个 Sender
线程并发操作,所以必须是线程安全的**。
Spring源码分析-AOP
动态 AOP 使用示例
创建用于拦截的 bean
1
2
3
4
5
6
7
8@Data
public class TestBean {
private String testStr = "test";
public void test() {
System.out.println("test");
}
}创建 Advisor
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30@Aspect
public class AspectJTest {
@Pointcut("execution(* *.test(..))")
public void test() {
}
@Before("test()")
public void beforeTest() {
System.out.println("beforeTest");
}
@After("test()")
public void afterTest() {
System.out.println("afterTest");
}
@Around("test()")
public Object aroundTest(ProceedingJoinPoint p) {
System.out.println("brfore around");
Object o = null;
try {
o = p.proceed();
} catch (Throwable e) {
e.printStackTrace();
}
System.out.println("after around");
return o;
}
}创建配置文件
1
2
3<aop:aspectj-autoproxy />
<bean id="testBean" class="io.github.binglau.bean.TestBean" />
<bean class="io.github.binglau.AspectJTest" />测试
1
2
3
4
5
6@Test
public void testAop() {
ApplicationContext ctx = new ClassPathXmlApplicationContext("beanFactory.xml");
TestBean bean = (TestBean) ctx.getBean("testBean");
bean.test();
}不出意外结果
1
2
3
4
5brfore around
beforeTest
test
after around
afterTest
可知 <aop:aspectj-autoproxy />
是开启 aop 的关键,我们不妨由此入手。
Kafka生产者分析——KafkaProducer
文章参考自《Apache Kafka 源码剖析》
github 地址:https://github.com/BingLau7/kafka,里面有代码的相关注释
具体部署方式不进行指导了,网上资料比较多
KafkaProducer Demo
1 | public class ProducerDemo { |