Apollo1. Google Guice概念:Guice 是 google 开源的轻量级依赖注入框架(DI),类似于重量级的Spring IOC的DI。所以对于轻量级的应用,Guice比较合适。
Guice:整个框架的门面
Injector:一个依赖的管理上下文
Binder:一个接口和实现的绑定
Module:一组 Binder
Provider:bean 的提供者
Key:Binder 中对应一个 Provider
Scope:Provider 的作用域
Binding类型结构:
1234public interface Binding<T> extends Element { Key<T> getKey(); Provider<T> getProvider();}
键 Key 唯一地确定每一个绑定。 键 Key 包含了客户代码所依赖的类型以及一个可选的标注。你可以使用标注来区分指向同一类型的多个绑定。
生成T类型实例的工厂
Module:继承AbstractModule来生产Binding对象,该步骤 ...
分布式锁1. CAP理论
一致性 :数据在多个副本之间能够保持一致的特性。数据库中的一致性是数据库总是从一个一致性的状态转换到另外一个一致性的状态。
可用性:系统提供的服务一直处于可用的状态,每次请求都能获得正确的响应。
分区容错性:分布式系统在遇到任何网络分区故障的时候,仍然能够对外提供满足一致性和可用性的服务。
网络分区:在分布式系统中,不同的节点分布在不同的子网络中,由于一些特殊的原因,这些子节点之间出现了网络不通的状态,但他们的内部子网络是正常的。从而导致了整个系统的环境被切分成了若干个孤立的区域,这就是分区。
首先,我们得知道,分布式系统,是避免不了分区的,分区容错性是一定要满足的,我们看看在满足分区容错的基础上,能不能同时满足一致性和可用性?
假如现在有两个分区N1和N2,N1和N2分别有不同的分区存储D1和D2,以及不同的服务S1和S2。
在满足一致性 的时候,N1和N2的数据要求值一样的,D1=D2。
在满足可用性的时候,无论访问N1还是N2,都能获取及时的响应。
接下来:
保证一致性:此时D1和D2数据不一致,要保证一致性就不能返回不一致的数据, ...
RocketMQ
RocketMQ5.0中的几个角色NameServer、Broker 和 Proxy,它们的作用如下:
NameServer: NameServer 是 RocketMQ 的名称服务器,负责管理消息队列和消费者组。
Broker:Broker 是 RocketMQ 的消息代理服务器,负责接收、处理和存储消息。
Proxy: Proxy 是 RocketMQ 的代理服务器,用于扩展消息代理服务器的性能和容量。Proxy 可以将消息路由 到多个 Broker 上,以实现负载均衡和容错。Proxy 还提供了一些接口,如队列管理、消费者管理、配置管理 等,供客户端使用。
总之,NameServer、Broker 和 Proxy 都是 RocketMQ 分布式消息代理服务器的重要组成部分,它们共同协作,实现消息的传输和处理。
在5.0版本中 Proxy 和 Broker 可以根据实际诉求可以分为 Local 模式和 Cluster 模式。
没有特殊的需求或者遵循从早期版本平滑升级的思路,可以选用Local模式。I
在 Local 模式下,Broker 和 Proxy 是 ...
Java虚拟线程的内幕
1. java虚拟线程的创建方法1. 通过虚拟线程工厂创建1234ThreadFactory factory = Thread.ofVirtual() .name("work-virtual-", 1) .factory();factory.newThread(() -> {});
2. 通过线程的静态方法创建1Thread.startVirtualThread(() -> {});
3. 通过线程池对象12345678ThreadFactory factory = Thread.ofVirtual() .name("work-virtual-", 1) .factory();factory.newThread(() -> {}); // 每个任务对应一个虚拟线程ExecutorService executorService = Executors.newVirtualThreadPer ...
正则匹配的原理1. 正则表达式基本每种语言都有自己的正则表达式库,
匹配字符
[abc]
匹配a,b,c中的任意一个字符
[^abc]
不匹配a,b,c中的所有字符,“^”只有作为第一个字符出现才有效
[a-g]
匹配a-g范围内的任意一个字符
[^a-g]
不匹配a-g中的所有字符
[H-N]
匹配H-N范围内的任意一个字符
[0-9]
匹配0-9范围内的任意一个字符
[a-gH-N]
匹配a-g,H-N范围内的任意一个字符
.
,匹配除换行符以外的任意字符
\s
匹配任意的空白符
\S
[^\s]
\d
匹配数字
\D
[^\d]
\w
匹配字母或数字
\W
[^\w]
频次范围
*
重复零次或更多次{0,}
+
重复一次或更多次{1,}
?
重复零次或一次{0,1}
{n}
重复n次
{n,}
重复n次或更多次
{n,m}
重复n到m次
\w*
贪婪模式
\w*?
非贪婪模式
定点符
^
字符串开始符
$
字符串结尾符
\b
匹配单词的开始或结束
\B
非单 ...
布隆过滤器布隆过滤球实质上是一个超长的字节数组,经过布隆过滤器的判断,如果判断key存在于系统中,则在系统中可能不存在;如果判断不存在于系统中,则必定不存在
初始时的布隆过滤器:
假设存在
y1 = f(x) = length(str)
y2 = f(x) = length(str) * 2 - 1
y3 = f(x) = length(str) * 3 - 2
这三个函数
现在需要将[“a”, “ab”, “abc”]三个字符串存入布隆过滤器,操作如下
最后一步存入abc后,布隆过滤器变成了如图所示的状态
当查询字符串 ab 时,把字符串 ab 做上面的函数映射,根据三个函数可以得到 111 的组合,都为1,说明系统可能存在字符串ab
当查询字符串 ac 时, 把字符串 ac 做上面的函数映射,根据三个函数可以得到 111 的组合,都为1,说明系统可能存在字符串ac,其实并不存在,这就取决于我们设计的hash函数是否足够分散
当查询字符串 abcdefg 时,把字符串 abcdefg 做上面的函数映射,根据三个函数可以得 ...
java直接内存分配的原理分析1. java的内存布局众所周知,java中对象的创建都是基于java堆进行的,如下为java的内存结构
2. java对象内存布局java对象在堆内存中的内存布局如下所示,分别显示了java 的对象和数组对象的内存结构
对于java对象实例,其都是存储在java堆中的,接下来我们说明这个问题,对于直接操作内存,我们需要获取Unsafe对象
1234567891011private static Unsafe unsafe; static { try { Field theInternalUnsafe = Unsafe.class.getDeclaredField("theUnsafe"); theInternalUnsafe.setAccessible(true); unsafe = (Unsafe) theInternalUnsafe.get(null); } catch (NoSuchFieldException | IllegalAccess ...
Netty剖析1. Rector模型
2. 核心组件
EventLoop:事件循环,处理注册到内核中关注的事件集合
EventLoopGroup:管理EventLoop,读写事件操作时由next()方法进行EventLoop的负载均衡,如接收到一个连接,由EventLoopGroup负载到EventLoop并注册内核事件,后续有关该事件的操作都由该EventLoop操作
Channel:该Channel可以类比于底层的套接字,可以基于该channel进行操作
UnSafe:Channel进行的读写等操作通过Pipeline后,最终进行实际操作的都为该类,并且每一个Channel都有属于自己的Unsafe实现,该类可与底层套接字操作,如注册感兴趣的事件等
Pipeline:每一个Channel都绑定了一个Pipeline,每一个Pipeline里面又包含多个 ChannelHandlerContext
ChannelHandlerContext:该组件封装了ChannelHandler,将各个ChannelHandler封装起来,方便Pipeline构造双向链表
ChannelHandl ...


