Skip to content

Commit 496cea7

Browse files
committed
feat: refactor (#466)
1 parent a51a59f commit 496cea7

File tree

46 files changed

+399
-173
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

46 files changed

+399
-173
lines changed

camellia-redis-proxy/camellia-redis-proxy-bootstrap/src/main/resources/camellia-redis-proxy.properties

Lines changed: 107 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,34 +1,98 @@
11

2-
## server
2+
#############基本配置##################
3+
4+
# server
5+
## see ServerConf.java
6+
## tcp端口,默认使用application.yml里的server.port,本配置优先级更高
37
port=6380
8+
## 集群名,默认使用spring.application.name,本配置优先级更高
49
application.name=camellia-redis-proxy-server
10+
## 密码
511
password=pass123
12+
## 是否开启监控
613
monitor.enable=false
14+
## console端口
715
console.port=16379
16+
## http端口,小于0则不生效,默认-1
17+
http.port=-1
18+
## uds的地址,缺省则不生效,默认缺省
19+
uds.path=
20+
## 内部通信端口,cluster/sentinel模式下,则必须有,默认为port+10000
821
cport=6381
22+
## 内部通信端口的密码
923
cport.password=pass456
1024

11-
### support standalone、cluster、sentinel
25+
26+
27+
#############网络配置##################
28+
29+
# netty
30+
## see NettyConf.java,一般走默认即可
31+
## support auto、epoll、kqueue、io_uring、nio
32+
netty.transport.mode=auto
33+
34+
35+
#############集群模式##################
36+
37+
38+
# support standalone、cluster、sentinel
1239
proxy.mode=standalone
13-
proxy.node.current.host=10.0.0.1:6380@6381
14-
proxy.node.current.announce.port=-1
40+
## 声明的本机地址,有自动获取的默认值,可以通过本配置替换掉,格式为host:port@cport
41+
proxy.node.current.host=
42+
## 声明的本机端口,有自动获取的默认值,可以通过本配置替换掉,要大于0的数字
43+
proxy.node.current.announce.port=
44+
45+
46+
## cluster mode
47+
### 内置了2种实现:DefaultClusterModeProvider和ConsensusClusterModeProvider,也可以自定义ProxyClusterModeProvider.java
48+
49+
### DefaultClusterModeProvider,基于配置(默认)
50+
cluster.mode.provider.class.name=com.netease.nim.camellia.redis.proxy.cluster.provider.DefaultClusterModeProvider
51+
#### 配置的节点列表
52+
cluster.mode.nodes=10.0.0.1:6380@6381,10.0.0.2:6380@6381
53+
54+
### ConsensusClusterModeProvider,基于redis
55+
#cluster.mode.provider.class.name=com.netease.nim.camellia.redis.proxy.cluster.provider.ConsensusClusterModeProvider
56+
#### redis地址
57+
redis.consensus.leader.selector.redis.url=redis://@127.0.0.1:6379
58+
#### redis-key,一个集群一个key
59+
redis.consensus.leader.selector.redis.key=xxx
1560

16-
#### cluster mode
17-
proxy.cluster.mode.nodes=10.0.0.1:6380@6381,10.0.0.2:6380@6381
1861

19-
#### sentinel mode
20-
proxy.sentinel.mode.nodes=10.0.0.1:6380@6381,10.0.0.2:6380@6381
21-
proxy.sentinel.mode.master.name=camellia_sentinel
22-
proxy.sentinel.mode.sentinel.username=xxx
23-
proxy.sentinel.mode.sentinel.password=xxx
62+
## sentinel mode
63+
### 内置了2种实现:DefaultSentinelModeProvider和RedisSentinelModeProvider,也可以自定义SentinelModeProvider.java
64+
sentinel.mode.master.name=xxx
65+
sentinel.mode.sentinel.username=xxx
66+
sentinel.mode.sentinel.password=xxx
67+
68+
### DefaultSentinelModeProvider,基于配置(默认)
69+
sentinel.mode.provider.class.name=com.netease.nim.camellia.redis.proxy.sentinel.DefaultSentinelModeProvider
70+
#### 配置的节点列表
71+
sentinel.mode.nodes=10.0.0.1:6380@6381,10.0.0.2:6380@6381
72+
73+
### RedisSentinelModeProvider,基于redis
74+
#sentinel.mode.provider.class.name=com.netease.nim.camellia.redis.proxy.sentinel.RedisSentinelModeProvider
75+
#### redis地址
76+
sentinel.mode.provider.redis.url=redis://@127.0.0.1:6379
77+
#### redis-key,一个集群一个key
78+
sentinel.mode.provider.redis.key=xxx
79+
80+
81+
#############路由配置##################
2482

2583
# route
26-
### see RouteConfProviderEnums.java
84+
## 路由实现,内置路由实现见:RouteConfProviderEnums.java
85+
## 内置: default(默认)、camellia_dashboard、multi_tenants_v1、multi_tenants_v2、multi_tenants_simple_config
86+
## 也可以自定义实现RouteConfProvider.java,则配置一个类的全路径即可
2787
route.conf.provider=default
2888

2989
### default route
90+
#### 优先看route.conf,如果没有则看route.conf.file
91+
#### 支持单个地址,也支持复杂配置(json)
3092
route.conf=redis://@127.0.0.1:6379
93+
#### 支持外置其他配置文件作为数据原,支持class_path下的文件名,也支持绝对路径下的文件地址
3194
route.conf.file=resource-table.json
95+
#### 配置检查更新的间隔
3296
route.conf.check.interval.millis=3000
3397

3498
### camellia dashboard route
@@ -42,10 +106,36 @@ camellia.dashboard.connect.timeout.millis=10000
42106
camellia.dashboard.read.timeout.millis=60000
43107
camellia.dashboard.headers={"k1":"v1"}
44108

109+
### multi_tenants_v1
110+
#### 表示pass123密码指向bid=1/bgroup=default,路由是redis://@127.0.0.1:6379
111+
pass123.password.1.default.route.conf=redis://@127.0.0.1:6379
112+
#### 表示pass456密码指向bid=2/bgroup=default,路由是一个复杂的配置
113+
pass456.password.2.default.route.conf={"type": "simple","operation": {"read": "redis://passwd123@127.0.0.1:6379","type": "rw_separate","write": "redis-sentinel://passwd2@127.0.0.1:6379,127.0.0.1:6378/master"}}
45114

46-
## netty
47-
#### see NettyConf.java
48-
#### support auto、epoll、kqueue、io_uring、nio
49-
netty.transport.mode=auto
115+
### multi_tenants_v2
116+
####指向了一个json数组,包含了3组路由
117+
multi.tenant.route.config=[{"bid":1,"bgroup":"route1","password":"passwd1","route":"redis://passxx@127.0.0.1:16379"},{"bid":1,"bgroup":"route2","password":"passwd2","route":"redis-cluster://@127.0.0.1:6380,127.0.0.1:6381,127.0.0.1:6382"},{"bid":1,"bgroup":"route3","password":"passwd3","route":{"type":"simple","operation":{"read":"redis://passwd123@127.0.0.1:6379","type":"rw_separate","write":"redis-sentinel://passwd2@127.0.0.1:6379,127.0.0.1:6378/master"}}}]
118+
119+
### multi_tenants_simple_config
120+
#### 外部系统(满足simple_config的接口规范即可)
121+
simple.config.fetch.url=http://127.0.0.1:8080
122+
simple.config.fetch.key=xxx
123+
simple.config.fetch.secret=xxx
124+
#### 表示pass123密码指向bid=1/bgroup=default,路由biz=biz1,路由配置通过外部系统获取
125+
pass123.password.1.default.route.conf.biz=biz1
126+
#### 表示pass456密码指向bid=2/bgroup=default,路由biz=biz2,路由配置通过外部系统获取
127+
pass456.password.2.default.route.conf.biz=biz2
128+
129+
130+
#############插件配置##################
131+
132+
# 插件列表,逗号分隔
133+
## 内置插件见:ProxyPluginEnums.java
134+
## 也可以自定义ProxyPlugin.java,配置一个类的全路径即可
135+
## 每个插件的配置参考具体的plugin实现代码即可
136+
proxy.plugin.list=monitorPlugin,hotKeyPlugin,bigKeyPlugin
137+
138+
139+
140+
#############其他配置##################
50141

51-
## others

camellia-redis-proxy/camellia-redis-proxy-core/src/main/java/com/netease/nim/camellia/redis/proxy/cluster/ClusterModeCommandMoveInvoker.java

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
import com.netease.nim.camellia.redis.proxy.conf.ServerConf;
66
import com.netease.nim.camellia.redis.proxy.enums.RedisCommand;
77
import com.netease.nim.camellia.redis.proxy.enums.RedisKeyword;
8-
import com.netease.nim.camellia.redis.proxy.netty.GlobalRedisProxyEnv;
98
import com.netease.nim.camellia.redis.proxy.reply.BulkReply;
109
import com.netease.nim.camellia.redis.proxy.reply.ErrorReply;
1110
import com.netease.nim.camellia.redis.proxy.reply.Reply;
@@ -50,9 +49,9 @@ public class ClusterModeCommandMoveInvoker {
5049
private long delayMillis;
5150
private int maxRetry;
5251
private int cacheMillis;
53-
private final ProxyClusterModeProcessor processor;
52+
private final ClusterModeProcessor processor;
5453

55-
public ClusterModeCommandMoveInvoker(ProxyClusterModeProcessor processor) {
54+
public ClusterModeCommandMoveInvoker(ClusterModeProcessor processor) {
5655
this.processor = processor;
5756
int poolSize = ProxyDynamicConf.getInt("cluster.mode.command.move.graceful.execute.pool.size", executorSize);
5857
this.commandMoveExecutor = Executors.newScheduledThreadPool(poolSize, new DefaultThreadFactory("command-move-task"));
@@ -83,15 +82,15 @@ public CompletableFuture<Reply> gracefulCommandMove(int slot) {
8382

8483
private class CommandMoveTask implements Runnable {
8584

86-
private final ProxyClusterModeProcessor processor;
85+
private final ClusterModeProcessor processor;
8786
private final long delayMillis;
8887
private final int maxRetry;
8988
private final CompletableFuture<Reply> future;
9089
private final int slot;
9190

9291
private int retry;
9392

94-
public CommandMoveTask(ProxyClusterModeProcessor processor, long delayMillis, int maxRetry, int slot, CompletableFuture<Reply> future) {
93+
public CommandMoveTask(ClusterModeProcessor processor, long delayMillis, int maxRetry, int slot, CompletableFuture<Reply> future) {
9594
this.processor = processor;
9695
this.delayMillis = delayMillis;
9796
this.maxRetry = maxRetry;

camellia-redis-proxy/camellia-redis-proxy-core/src/main/java/com/netease/nim/camellia/redis/proxy/cluster/ProxyClusterModeProcessor.java renamed to camellia-redis-proxy/camellia-redis-proxy-core/src/main/java/com/netease/nim/camellia/redis/proxy/cluster/ClusterModeProcessor.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
import java.util.concurrent.CompletableFuture;
99

1010

11-
public interface ProxyClusterModeProcessor {
11+
public interface ClusterModeProcessor {
1212

1313
/**
1414
* 命令是否要重定向

camellia-redis-proxy/camellia-redis-proxy-core/src/main/java/com/netease/nim/camellia/redis/proxy/cluster/DefaultProxyClusterModeProcessor.java renamed to camellia-redis-proxy/camellia-redis-proxy-core/src/main/java/com/netease/nim/camellia/redis/proxy/cluster/DefaultClusterModeProcessor.java

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -25,9 +25,9 @@
2525
/**
2626
* Created by caojiajun on 2022/9/29
2727
*/
28-
public class DefaultProxyClusterModeProcessor implements ProxyClusterModeProcessor {
28+
public class DefaultClusterModeProcessor implements ClusterModeProcessor {
2929

30-
private static final Logger logger = LoggerFactory.getLogger(DefaultProxyClusterModeProcessor.class);
30+
private static final Logger logger = LoggerFactory.getLogger(DefaultClusterModeProcessor.class);
3131

3232
private static final int executorSize;
3333
static {
@@ -57,7 +57,7 @@ public class DefaultProxyClusterModeProcessor implements ProxyClusterModeProcess
5757
private boolean clusterModeCommandMoveAlways;
5858
private boolean init = false;
5959

60-
public DefaultProxyClusterModeProcessor(ProxyClusterModeProvider provider) {
60+
public DefaultClusterModeProcessor(ProxyClusterModeProvider provider) {
6161
this.provider = provider;
6262
GlobalRedisProxyEnv.addAfterStartCallback(this::init);
6363
}
@@ -180,7 +180,7 @@ public CompletableFuture<Reply> isCommandMove(Command command) {
180180
}
181181
return null;
182182
} catch (Exception e) {
183-
ErrorLogCollector.collect(DefaultProxyClusterModeProcessor.class, "is command move error", e);
183+
ErrorLogCollector.collect(DefaultClusterModeProcessor.class, "is command move error", e);
184184
return null;
185185
}
186186
}
@@ -229,17 +229,17 @@ public CompletableFuture<Reply> clusterCommands(Command command) {
229229
Reply reply = provider.proxyHeartbeat(command);
230230
future.complete(reply);
231231
} catch (Exception e) {
232-
ErrorLogCollector.collect(DefaultProxyClusterModeProcessor.class, "proxyHeartbeat error", e);
232+
ErrorLogCollector.collect(DefaultClusterModeProcessor.class, "proxyHeartbeat error", e);
233233
future.complete(ErrorReply.NOT_AVAILABLE);
234234
}
235235
});
236236
} catch (Exception e) {
237-
ErrorLogCollector.collect(DefaultProxyClusterModeProcessor.class, "submit proxyHeartbeat task error", e);
237+
ErrorLogCollector.collect(DefaultClusterModeProcessor.class, "submit proxyHeartbeat task error", e);
238238
future.complete(ErrorReply.NOT_AVAILABLE);
239239
}
240240
return future;
241241
} else {
242-
ErrorLogCollector.collect(DefaultProxyClusterModeProcessor.class, "not support cluster command, arg = " + arg);
242+
ErrorLogCollector.collect(DefaultClusterModeProcessor.class, "not support cluster command, arg = " + arg);
243243
return CompletableFuture.completedFuture(Utils.commandNotSupport(redisCommand));
244244
}
245245
}

camellia-redis-proxy/camellia-redis-proxy-core/src/main/java/com/netease/nim/camellia/redis/proxy/cluster/provider/AbstractProxyClusterModeProvider.java renamed to camellia-redis-proxy/camellia-redis-proxy-core/src/main/java/com/netease/nim/camellia/redis/proxy/cluster/provider/AbstractClusterModeProvider.java

Lines changed: 7 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
import com.netease.nim.camellia.redis.proxy.command.ProxyCurrentNodeInfo;
66
import com.netease.nim.camellia.redis.proxy.conf.ProxyDynamicConf;
77
import com.netease.nim.camellia.redis.proxy.conf.ServerConf;
8-
import com.netease.nim.camellia.redis.proxy.netty.GlobalRedisProxyEnv;
98
import com.netease.nim.camellia.redis.proxy.reply.Reply;
109
import com.netease.nim.camellia.redis.proxy.upstream.connection.RedisConnectionAddr;
1110
import com.netease.nim.camellia.tools.executor.CamelliaThreadFactory;
@@ -21,9 +20,9 @@
2120
/**
2221
* Created by caojiajun on 2024/6/19
2322
*/
24-
public abstract class AbstractProxyClusterModeProvider implements ProxyClusterModeProvider {
23+
public abstract class AbstractClusterModeProvider implements ProxyClusterModeProvider {
2524

26-
private static final Logger logger = LoggerFactory.getLogger(AbstractProxyClusterModeProvider.class);
25+
private static final Logger logger = LoggerFactory.getLogger(AbstractClusterModeProvider.class);
2726

2827
/**
2928
* exeuctor size
@@ -55,7 +54,7 @@ public abstract class AbstractProxyClusterModeProvider implements ProxyClusterMo
5554
/**
5655
* default constructor
5756
*/
58-
public AbstractProxyClusterModeProvider() {
57+
public AbstractClusterModeProvider() {
5958
}
6059

6160
/**
@@ -113,9 +112,9 @@ protected final Set<ProxyNode> initNodes(boolean checkEmpty) {
113112
}
114113
Set<ProxyNode> initNodes = null;
115114
try {
116-
String string = ProxyDynamicConf.getString("proxy.cluster.mode.nodes", null);
115+
String string = ProxyDynamicConf.getString("cluster.mode.nodes", null);
117116
if (string == null) {
118-
throw new IllegalArgumentException("missing 'proxy.cluster.mode.nodes' in ProxyDynamicConf");
117+
throw new IllegalArgumentException("missing 'cluster.mode.nodes' in ProxyDynamicConf");
119118
}
120119
String[] split = string.split(",");
121120
initNodes = new HashSet<>();
@@ -125,7 +124,7 @@ protected final Set<ProxyNode> initNodes(boolean checkEmpty) {
125124
initNodes.add(node);
126125
}
127126
if (initNodes.isEmpty()) {
128-
throw new IllegalArgumentException("parse 'proxy.cluster.mode.nodes' error");
127+
throw new IllegalArgumentException("parse 'cluster.mode.nodes' error");
129128
}
130129
} catch (Exception e) {
131130
if (checkEmpty) {
@@ -146,13 +145,7 @@ protected final Set<ProxyNode> initNodes(boolean checkEmpty) {
146145
*/
147146
protected final ProxyNode current() {
148147
if (current != null) return current;
149-
String host = ProxyDynamicConf.getString("proxy.cluster.mode.current.node.host", null);
150-
ProxyNode proxyNode;
151-
if (host != null) {
152-
proxyNode = new ProxyNode(host, GlobalRedisProxyEnv.getPort(), GlobalRedisProxyEnv.getCport());
153-
} else {
154-
proxyNode = ProxyCurrentNodeInfo.current();
155-
}
148+
ProxyNode proxyNode = ProxyCurrentNodeInfo.current();
156149
if (proxyNode.getPort() == 0 || proxyNode.getCport() == 0) {
157150
throw new IllegalStateException("redis proxy not start");
158151
}

camellia-redis-proxy/camellia-redis-proxy-core/src/main/java/com/netease/nim/camellia/redis/proxy/cluster/provider/ConsensusProxyClusterModeProvider.java renamed to camellia-redis-proxy/camellia-redis-proxy-core/src/main/java/com/netease/nim/camellia/redis/proxy/cluster/provider/ConsensusClusterModeProvider.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@
1515
import com.netease.nim.camellia.redis.proxy.reply.StatusReply;
1616
import com.netease.nim.camellia.redis.proxy.upstream.connection.RedisConnection;
1717
import com.netease.nim.camellia.redis.proxy.upstream.connection.RedisConnectionHub;
18-
import com.netease.nim.camellia.redis.proxy.util.BeanInitUtils;
1918
import com.netease.nim.camellia.redis.proxy.util.ConcurrentHashSet;
2019
import com.netease.nim.camellia.redis.proxy.util.ConfigInitUtil;
2120
import com.netease.nim.camellia.redis.proxy.util.Utils;
@@ -31,9 +30,9 @@
3130
/**
3231
* Created by caojiajun on 2024/6/18
3332
*/
34-
public class ConsensusProxyClusterModeProvider extends AbstractProxyClusterModeProvider {
33+
public class ConsensusClusterModeProvider extends AbstractClusterModeProvider {
3534

36-
private static final Logger logger = LoggerFactory.getLogger(ConsensusProxyClusterModeProvider.class);
35+
private static final Logger logger = LoggerFactory.getLogger(ConsensusClusterModeProvider.class);
3736

3837
private final ReentrantLock lock = new ReentrantLock();
3938
private final ReentrantLock initLock = new ReentrantLock();

camellia-redis-proxy/camellia-redis-proxy-core/src/main/java/com/netease/nim/camellia/redis/proxy/cluster/provider/DefaultProxyClusterModeProvider.java renamed to camellia-redis-proxy/camellia-redis-proxy-core/src/main/java/com/netease/nim/camellia/redis/proxy/cluster/provider/DefaultClusterModeProvider.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,9 +29,9 @@
2929
/**
3030
* Created by caojiajun on 2022/9/30
3131
*/
32-
public class DefaultProxyClusterModeProvider extends AbstractProxyClusterModeProvider {
32+
public class DefaultClusterModeProvider extends AbstractClusterModeProvider {
3333

34-
private static final Logger logger = LoggerFactory.getLogger(DefaultProxyClusterModeProvider.class);
34+
private static final Logger logger = LoggerFactory.getLogger(DefaultClusterModeProvider.class);
3535

3636
private final ReentrantLock lock = new ReentrantLock();
3737
private boolean init = false;

camellia-redis-proxy/camellia-redis-proxy-core/src/main/java/com/netease/nim/camellia/redis/proxy/command/AbstractProxyNodesDiscovery.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
package com.netease.nim.camellia.redis.proxy.command;
22

3-
import com.netease.nim.camellia.redis.proxy.cluster.ProxyClusterModeProcessor;
3+
import com.netease.nim.camellia.redis.proxy.cluster.ClusterModeProcessor;
44
import com.netease.nim.camellia.redis.proxy.cluster.ProxyNode;
5-
import com.netease.nim.camellia.redis.proxy.sentinel.ProxySentinelModeProcessor;
5+
import com.netease.nim.camellia.redis.proxy.sentinel.SentinelModeProcessor;
66

77
import java.util.List;
88

@@ -11,15 +11,15 @@
1111
*/
1212
public abstract class AbstractProxyNodesDiscovery implements ProxyNodesDiscovery {
1313

14-
private final ProxyClusterModeProcessor proxyClusterModeProcessor;
15-
private final ProxySentinelModeProcessor proxySentinelModeProcessor;
14+
private final ClusterModeProcessor proxyClusterModeProcessor;
15+
private final SentinelModeProcessor proxySentinelModeProcessor;
1616

1717
/**
1818
* abstract proxy nodes discovery
1919
* @param proxyClusterModeProcessor proxyClusterModeProcessor
2020
* @param proxySentinelModeProcessor proxySentinelModeProcessor
2121
*/
22-
public AbstractProxyNodesDiscovery(ProxyClusterModeProcessor proxyClusterModeProcessor, ProxySentinelModeProcessor proxySentinelModeProcessor) {
22+
public AbstractProxyNodesDiscovery(ClusterModeProcessor proxyClusterModeProcessor, SentinelModeProcessor proxySentinelModeProcessor) {
2323
this.proxyClusterModeProcessor = proxyClusterModeProcessor;
2424
this.proxySentinelModeProcessor = proxySentinelModeProcessor;
2525
}

0 commit comments

Comments
 (0)