Skip to content

Commit 344c187

Browse files
committed
feat(hbase-client): support custom config mode for dynamic reload (#422)
1 parent 6c97033 commit 344c187

5 files changed

Lines changed: 111 additions & 2 deletions

File tree

camellia-hbase-client/camellia-hbase-spring-boot/src/main/java/com/netease/nim/camellia/hbase/springboot/CamelliaHBaseConfiguration.java

Lines changed: 37 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,14 @@
1212
import com.netease.nim.camellia.hbase.CamelliaHBaseTemplate;
1313
import com.netease.nim.camellia.hbase.conf.CamelliaHBaseConf;
1414
import com.netease.nim.camellia.hbase.connection.CamelliaHBaseConnectionFactory;
15+
import com.netease.nim.camellia.hbase.exception.CamelliaHBaseException;
1516
import com.netease.nim.camellia.hbase.resource.HBaseResource;
17+
import com.netease.nim.camellia.hbase.resource.HBaseTemplateResourceTableUpdater;
1618
import com.netease.nim.camellia.hbase.util.CamelliaHBaseInitUtil;
1719
import com.netease.nim.camellia.hbase.util.HBaseResourceUtil;
1820
import com.netease.nim.camellia.tools.utils.FileUtils;
21+
import org.slf4j.Logger;
22+
import org.slf4j.LoggerFactory;
1923
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
2024
import org.springframework.boot.context.properties.EnableConfigurationProperties;
2125
import org.springframework.context.annotation.Bean;
@@ -31,6 +35,8 @@
3135
@EnableConfigurationProperties({CamelliaHBaseProperties.class})
3236
public class CamelliaHBaseConfiguration {
3337

38+
private static final Logger logger = LoggerFactory.getLogger(CamelliaHBaseConfiguration.class);
39+
3440
@Bean
3541
@ConditionalOnMissingBean(value = {ProxyEnv.class})
3642
public ProxyEnv proxyEnv() {
@@ -122,8 +128,38 @@ public CamelliaHBaseTemplate hBaseTemplate(CamelliaHBaseProperties properties) {
122128
throw new IllegalArgumentException("only support xml/yml");
123129
}
124130
return new CamelliaHBaseTemplate(env, camelliaApi, remote.getBid(), remote.getBgroup(), remote.isMonitor(), remote.getCheckIntervalMillis());
131+
} else if (type == CamelliaHBaseProperties.Type.CUSTOM) {
132+
CamelliaHBaseProperties.Custom custom = properties.getCustom();
133+
String className = custom.getResourceTableUpdaterClassName();
134+
if (className == null) {
135+
throw new IllegalArgumentException("resourceTableUpdaterClassName missing");
136+
}
137+
HBaseTemplateResourceTableUpdater updater;
138+
try {
139+
Class<?> clazz;
140+
try {
141+
clazz = Class.forName(className);
142+
} catch (ClassNotFoundException e) {
143+
clazz = Thread.currentThread().getContextClassLoader().loadClass(className);
144+
}
145+
updater = (HBaseTemplateResourceTableUpdater) clazz.getConstructor().newInstance();
146+
logger.info("HBaseTemplateResourceTableUpdater init success, class = {}", className);
147+
} catch (Exception e) {
148+
logger.error("HBaseTemplateResourceTableUpdater init error, class = {}", className, e);
149+
throw new CamelliaHBaseException(e);
150+
}
151+
Map<String, String> conf = custom.getConf();
152+
CamelliaHBaseConf camelliaHBaseConf = new CamelliaHBaseConf();
153+
for (Map.Entry<String, String> entry : conf.entrySet()) {
154+
camelliaHBaseConf.addConf(entry.getKey(), entry.getValue());
155+
}
156+
CamelliaHBaseEnv env = new CamelliaHBaseEnv.Builder()
157+
.connectionFactory(new CamelliaHBaseConnectionFactory.DefaultHBaseConnectionFactory(camelliaHBaseConf))
158+
.proxyEnv(proxyEnv())
159+
.build();
160+
return new CamelliaHBaseTemplate(env, updater);
125161
} else {
126-
throw new IllegalArgumentException("only support local/remote");
162+
throw new IllegalArgumentException("only support local/remote/custom");
127163
}
128164
}
129165
}

camellia-hbase-client/camellia-hbase-spring-boot/src/main/java/com/netease/nim/camellia/hbase/springboot/CamelliaHBaseProperties.java

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ public class CamelliaHBaseProperties {
1414
private Type type = Type.LOCAL;
1515
private Local local = new Local();
1616
private Remote remote;
17+
private Custom custom;
1718

1819
public Type getType() {
1920
return type;
@@ -39,6 +40,14 @@ public void setRemote(Remote remote) {
3940
this.remote = remote;
4041
}
4142

43+
public Custom getCustom() {
44+
return custom;
45+
}
46+
47+
public void setCustom(Custom custom) {
48+
this.custom = custom;
49+
}
50+
4251
public static class Local {
4352
private ConfType confType = ConfType.XML;
4453
private XML xml = new XML();
@@ -294,10 +303,32 @@ public static enum ConfType {
294303
}
295304
}
296305

306+
public static class Custom {
307+
private String resourceTableUpdaterClassName;
308+
private Map<String, String> conf = new HashMap<>();
309+
310+
public String getResourceTableUpdaterClassName() {
311+
return resourceTableUpdaterClassName;
312+
}
313+
314+
public void setResourceTableUpdaterClassName(String resourceTableUpdaterClassName) {
315+
this.resourceTableUpdaterClassName = resourceTableUpdaterClassName;
316+
}
317+
318+
public Map<String, String> getConf() {
319+
return conf;
320+
}
321+
322+
public void setConf(Map<String, String> conf) {
323+
this.conf = conf;
324+
}
325+
}
326+
297327

298328
public static enum Type {
299329
LOCAL,
300330
REMOTE,
331+
CUSTOM,
301332
;
302333
}
303334
}

camellia-hbase-client/camellia-hbase/src/main/java/com/netease/nim/camellia/hbase/CamelliaHBaseTemplate.java

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,9 @@
77
import com.netease.nim.camellia.core.util.ResourceTransferUtil;
88
import com.netease.nim.camellia.hbase.resource.HBaseResource;
99
import com.netease.nim.camellia.hbase.resource.HBaseResourceWrapper;
10+
import com.netease.nim.camellia.hbase.resource.HBaseTemplateResourceTableUpdater;
1011
import com.netease.nim.camellia.hbase.util.CamelliaHBaseInitUtil;
12+
import com.netease.nim.camellia.hbase.util.HBaseResourceUtil;
1113
import org.apache.hadoop.hbase.client.*;
1214
import org.apache.hadoop.hbase.filter.CompareFilter;
1315

@@ -25,9 +27,11 @@ public class CamelliaHBaseTemplate implements ICamelliaHBaseTemplate {
2527
private static final boolean defaultMonitorEnable = false;
2628

2729
private final ReloadableProxyFactory<CamelliaHBaseClientImpl> factory;
30+
private final CamelliaApi service;
2831

2932
public CamelliaHBaseTemplate(CamelliaHBaseEnv env, CamelliaApi service, long bid, String bgroup,
3033
boolean monitorEnable, long checkIntervalMillis) {
34+
this.service = service;
3135
this.factory = new ReloadableProxyFactory.Builder<CamelliaHBaseClientImpl>()
3236
.service(new ApiServiceWrapper(service, env))
3337
.clazz(CamelliaHBaseClientImpl.class)
@@ -39,6 +43,28 @@ public CamelliaHBaseTemplate(CamelliaHBaseEnv env, CamelliaApi service, long bid
3943
.build();
4044
}
4145

46+
public CamelliaHBaseTemplate(CamelliaHBaseEnv env, HBaseTemplateResourceTableUpdater updater) {
47+
this(env, new LocalDynamicCamelliaApi(updater.getResourceTable(), HBaseResourceUtil.HBaseResourceTableChecker),
48+
defaultBid, defaultBgroup, defaultMonitorEnable, defaultCheckIntervalMillis);
49+
updater.addCallback(new ResourceTableUpdateCallback() {
50+
@Override
51+
public void callback(ResourceTable resourceTable) {
52+
if (service instanceof LocalDynamicCamelliaApi) {
53+
((LocalDynamicCamelliaApi) service).updateResourceTable(resourceTable);
54+
}
55+
reloadResourceTable();
56+
}
57+
});
58+
}
59+
60+
public final void reloadResourceTable() {
61+
factory.reload(false);
62+
}
63+
64+
public CamelliaHBaseTemplate(HBaseTemplateResourceTableUpdater updater) {
65+
this(CamelliaHBaseEnv.defaultHBaseEnv(), updater);
66+
}
67+
4268
public CamelliaHBaseTemplate(CamelliaHBaseEnv env, String url, long bid, String bgroup,
4369
boolean monitorEnable, long checkIntervalMillis,
4470
int connectTimeoutMillis, int readTimeoutMillis) {
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package com.netease.nim.camellia.hbase.resource;
2+
3+
import com.netease.nim.camellia.core.api.ResourceTableUpdater;
4+
import com.netease.nim.camellia.core.model.ResourceTable;
5+
import com.netease.nim.camellia.hbase.util.HBaseResourceUtil;
6+
7+
8+
public abstract class HBaseTemplateResourceTableUpdater extends ResourceTableUpdater {
9+
10+
@Override
11+
public void checkResourceTable(ResourceTable resourceTable) {
12+
super.checkResourceTable(resourceTable);
13+
HBaseResourceUtil.checkResourceTable(resourceTable);
14+
}
15+
16+
}

camellia-redis-client/camellia-redis-spring-boot-starters/camellia-redis-spring-boot/src/main/java/com/netease/nim/camellia/redis/springboot/CamelliaRedisConfiguration.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,7 @@ public CamelliaRedisTemplate camelliaRedisTemplate(CamelliaRedisProperties prope
119119
CamelliaRedisProperties.Custom custom = properties.getCustom();
120120
String className = custom.getResourceTableUpdaterClassName();
121121
if (className == null) {
122-
throw new IllegalArgumentException("proxyRouteConfUpdaterClassName missing");
122+
throw new IllegalArgumentException("resourceTableUpdaterClassName missing");
123123
}
124124
RedisTemplateResourceTableUpdater updater;
125125
try {

0 commit comments

Comments
 (0)