Skip to content

Commit 29a907f

Browse files
committed
Redis Client: add support for the Proxy Registry
1 parent 311e134 commit 29a907f

File tree

8 files changed

+96
-18
lines changed

8 files changed

+96
-18
lines changed

extensions/redis-client/deployment/pom.xml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,10 @@
3131
<groupId>io.quarkus</groupId>
3232
<artifactId>quarkus-tls-registry-deployment</artifactId>
3333
</dependency>
34+
<dependency>
35+
<groupId>io.quarkus</groupId>
36+
<artifactId>quarkus-proxy-registry-deployment</artifactId>
37+
</dependency>
3438
<dependency>
3539
<groupId>io.quarkus</groupId>
3640
<artifactId>quarkus-redis-client</artifactId>

extensions/redis-client/deployment/src/main/java/io/quarkus/redis/deployment/client/RedisClientProcessor.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@
4343
import io.quarkus.deployment.builditem.ShutdownContextBuildItem;
4444
import io.quarkus.deployment.builditem.nativeimage.NativeImageResourceBuildItem;
4545
import io.quarkus.deployment.builditem.nativeimage.RuntimeInitializedClassBuildItem;
46+
import io.quarkus.proxy.deployment.ProxyRegistryBuildItem;
4647
import io.quarkus.redis.client.RedisClient;
4748
import io.quarkus.redis.client.RedisClientName;
4849
import io.quarkus.redis.client.RedisHostsProvider;
@@ -128,7 +129,8 @@ public void init(
128129
ApplicationArchivesBuildItem applicationArchivesBuildItem, LaunchModeBuildItem launchMode,
129130
BuildProducer<NativeImageResourceBuildItem> nativeImageResources,
130131
BuildProducer<HotDeploymentWatchedFileBuildItem> hotDeploymentWatchedFiles,
131-
TlsRegistryBuildItem tlsRegistryBuildItem) {
132+
TlsRegistryBuildItem tlsRegistryBuildItem,
133+
ProxyRegistryBuildItem proxyRegistryBuildItem) {
132134

133135
// Collect the used redis clients, the unused clients will not be instantiated.
134136
Set<String> names = new HashSet<>();
@@ -157,7 +159,8 @@ public void init(
157159
.ifPresent(x -> names.addAll(configuredClientNames(buildTimeConfig, ConfigProvider.getConfig())));
158160

159161
// Inject the creation of the client when the application starts.
160-
recorder.initialize(vertxBuildItem.getVertx(), names, tlsRegistryBuildItem.registry());
162+
recorder.initialize(vertxBuildItem.getVertx(), names, tlsRegistryBuildItem.registry(),
163+
proxyRegistryBuildItem.registry());
161164

162165
// Create the supplier and define the beans.
163166
for (String name : names) {

extensions/redis-client/deployment/src/main/java/io/quarkus/redis/deployment/client/RedisDatasourceProcessor.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
import io.quarkus.deployment.annotations.Record;
2828
import io.quarkus.deployment.builditem.CombinedIndexBuildItem;
2929
import io.quarkus.deployment.builditem.ShutdownContextBuildItem;
30+
import io.quarkus.proxy.deployment.ProxyRegistryBuildItem;
3031
import io.quarkus.redis.datasource.ReactiveRedisDataSource;
3132
import io.quarkus.redis.datasource.RedisDataSource;
3233
import io.quarkus.redis.datasource.codecs.Codec;
@@ -86,7 +87,8 @@ public void init(RedisClientRecorder recorder,
8687
ShutdownContextBuildItem shutdown,
8788
BuildProducer<SyntheticBeanBuildItem> syntheticBeans,
8889
VertxBuildItem vertxBuildItem,
89-
TlsRegistryBuildItem tlsRegistryBuildItem) {
90+
TlsRegistryBuildItem tlsRegistryBuildItem,
91+
ProxyRegistryBuildItem proxyRegistryBuildItem) {
9092

9193
if (clients.isEmpty()) {
9294
return;
@@ -96,7 +98,8 @@ public void init(RedisClientRecorder recorder,
9698
names.add(client.name);
9799
}
98100
// Inject the creation of the client when the application starts.
99-
recorder.initialize(vertxBuildItem.getVertx(), names, tlsRegistryBuildItem.registry());
101+
recorder.initialize(vertxBuildItem.getVertx(), names, tlsRegistryBuildItem.registry(),
102+
proxyRegistryBuildItem.registry());
100103

101104
// Create the supplier and define the beans.
102105
for (String name : names) {

extensions/redis-client/runtime/pom.xml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,10 @@
2727
<groupId>io.quarkus</groupId>
2828
<artifactId>quarkus-tls-registry</artifactId>
2929
</dependency>
30+
<dependency>
31+
<groupId>io.quarkus</groupId>
32+
<artifactId>quarkus-proxy-registry</artifactId>
33+
</dependency>
3034
<dependency>
3135
<groupId>io.smallrye.reactive</groupId>
3236
<artifactId>smallrye-mutiny-vertx-redis-client</artifactId>

extensions/redis-client/runtime/src/main/java/io/quarkus/redis/runtime/client/RedisClientRecorder.java

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
import jakarta.enterprise.inject.Instance;
1414
import jakarta.enterprise.inject.spi.CDI;
1515

16+
import io.quarkus.proxy.ProxyConfigurationRegistry;
1617
import io.quarkus.redis.client.RedisClient;
1718
import io.quarkus.redis.client.reactive.ReactiveRedisClient;
1819
import io.quarkus.redis.datasource.ReactiveRedisDataSource;
@@ -49,7 +50,8 @@ public RedisClientRecorder(RuntimeValue<RedisConfig> rc) {
4950
}
5051

5152
public void initialize(RuntimeValue<io.vertx.core.Vertx> vertx, Set<String> names,
52-
Supplier<TlsConfigurationRegistry> registry) {
53+
Supplier<TlsConfigurationRegistry> tlsRegistrySupplier,
54+
Supplier<ProxyConfigurationRegistry> proxyRegistrySupplier) {
5355
Instance<ObservableRedisMetrics> instance = CDI.current().select(ObservableRedisMetrics.class);
5456
if (instance.isResolvable()) {
5557
this.metrics = instance.get();
@@ -59,11 +61,12 @@ public void initialize(RuntimeValue<io.vertx.core.Vertx> vertx, Set<String> name
5961

6062
this.vertx = Vertx.newInstance(vertx.getValue());
6163

62-
TlsConfigurationRegistry tlsRegistry = registry.get();
64+
TlsConfigurationRegistry tlsRegistry = tlsRegistrySupplier.get();
65+
ProxyConfigurationRegistry proxyRegistry = proxyRegistrySupplier.get();
6366

6467
_registerCodecs();
6568

66-
_initialize(vertx.getValue(), names, tlsRegistry);
69+
_initialize(vertx.getValue(), names, tlsRegistry, proxyRegistry);
6770
}
6871

6972
private static void _registerCodecs() {
@@ -72,7 +75,8 @@ private static void _registerCodecs() {
7275
Codecs.register(codecs.stream());
7376
}
7477

75-
public void _initialize(io.vertx.core.Vertx vertx, Set<String> names, TlsConfigurationRegistry tlsRegistry) {
78+
public void _initialize(io.vertx.core.Vertx vertx, Set<String> names, TlsConfigurationRegistry tlsRegistry,
79+
ProxyConfigurationRegistry proxyRegistry) {
7680
for (String name : names) {
7781
// Search if we have an associated config:
7882
// - if default -> Default
@@ -91,13 +95,13 @@ public ConfigurationException get() {
9195
"You must at least configure `quarkus.redis." + name + ".hosts`.");
9296
}
9397
});
94-
clients.computeIfAbsent(name,
95-
x -> new RedisClientAndApi(name, VertxRedisClientFactory.create(name, vertx, actualConfig, tlsRegistry),
96-
metrics));
98+
clients.computeIfAbsent(name, x -> new RedisClientAndApi(name,
99+
VertxRedisClientFactory.create(name, vertx, actualConfig, tlsRegistry, proxyRegistry),
100+
metrics));
97101
} else if (DEFAULT_CLIENT_NAME.equalsIgnoreCase(name) && maybe.isPresent()) {
98-
clients.computeIfAbsent(name,
99-
x -> new RedisClientAndApi(name,
100-
VertxRedisClientFactory.create(DEFAULT_CLIENT_NAME, vertx, maybe.get(), tlsRegistry), metrics));
102+
clients.computeIfAbsent(name, x -> new RedisClientAndApi(name,
103+
VertxRedisClientFactory.create(DEFAULT_CLIENT_NAME, vertx, maybe.get(), tlsRegistry, proxyRegistry),
104+
metrics));
101105
}
102106
// Do not throw an error. We would need to check if the default redis client is used.
103107
}

extensions/redis-client/runtime/src/main/java/io/quarkus/redis/runtime/client/VertxRedisClientFactory.java

Lines changed: 25 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@
2121
import io.quarkus.arc.ArcContainer;
2222
import io.quarkus.arc.InjectableInstance;
2323
import io.quarkus.arc.InstanceHandle;
24+
import io.quarkus.proxy.ProxyConfiguration;
25+
import io.quarkus.proxy.ProxyConfigurationRegistry;
2426
import io.quarkus.redis.client.RedisHostsProvider;
2527
import io.quarkus.redis.client.RedisOptionsCustomizer;
2628
import io.quarkus.redis.runtime.client.config.NetConfig;
@@ -33,6 +35,7 @@
3335
import io.vertx.core.Vertx;
3436
import io.vertx.core.net.NetClientOptions;
3537
import io.vertx.core.net.ProxyOptions;
38+
import io.vertx.core.net.ProxyType;
3639
import io.vertx.redis.client.Redis;
3740
import io.vertx.redis.client.RedisClientType;
3841
import io.vertx.redis.client.RedisOptions;
@@ -51,7 +54,8 @@ private VertxRedisClientFactory() {
5154
// Avoid direct instantiation.
5255
}
5356

54-
public static Redis create(String name, Vertx vertx, RedisClientConfig config, TlsConfigurationRegistry tlsRegistry) {
57+
public static Redis create(String name, Vertx vertx, RedisClientConfig config, TlsConfigurationRegistry tlsRegistry,
58+
ProxyConfigurationRegistry proxyRegistry) {
5559
RedisOptions options = new RedisOptions();
5660

5761
Consumer<Set<URI>> configureOptions = new Consumer<Set<URI>>() {
@@ -113,7 +117,7 @@ public void accept(Set<URI> uris) {
113117
config.topology().ifPresent(options::setTopology);
114118
config.clusterTransactions().ifPresent(options::setClusterTransactions);
115119

116-
options.setNetClientOptions(toNetClientOptions(config));
120+
options.setNetClientOptions(toNetClientOptions(config, proxyRegistry));
117121
configureTLS(name, config, tlsRegistry, options.getNetClientOptions(), hosts);
118122

119123
options.setPoolName(name);
@@ -179,7 +183,7 @@ private static void customize(String name, RedisOptions options) {
179183
}
180184
}
181185

182-
private static NetClientOptions toNetClientOptions(RedisClientConfig config) {
186+
private static NetClientOptions toNetClientOptions(RedisClientConfig config, ProxyConfigurationRegistry proxyRegistry) {
183187
NetConfig tcp = config.tcp();
184188
NetClientOptions net = new NetClientOptions();
185189

@@ -193,7 +197,6 @@ private static NetClientOptions toNetClientOptions(RedisClientConfig config) {
193197
net.setReconnectInterval(config.reconnectInterval().toMillis());
194198

195199
tcp.localAddress().ifPresent(net::setLocalAddress);
196-
tcp.nonProxyHosts().ifPresent(net::setNonProxyHosts);
197200
if (tcp.proxyOptions().host().isPresent()) {
198201
ProxyOptions po = new ProxyOptions();
199202
po.setHost(tcp.proxyOptions().host().get());
@@ -202,6 +205,24 @@ private static NetClientOptions toNetClientOptions(RedisClientConfig config) {
202205
tcp.proxyOptions().username().ifPresent(po::setUsername);
203206
tcp.proxyOptions().password().ifPresent(po::setPassword);
204207
net.setProxyOptions(po);
208+
tcp.nonProxyHosts().ifPresent(net::setNonProxyHosts);
209+
} else {
210+
Optional<ProxyConfiguration> proxyConfig = proxyRegistry.get(tcp.proxyConfigurationName());
211+
proxyConfig.ifPresent(proxy -> {
212+
ProxyOptions po = new ProxyOptions();
213+
po.setHost(proxy.host());
214+
po.setPort(proxy.port());
215+
po.setUsername(proxy.username().orElse(null));
216+
po.setPassword(proxy.password().orElse(null));
217+
po.setConnectTimeout(proxy.proxyConnectTimeout().orElse(null));
218+
po.setType(switch (proxy.type()) {
219+
case HTTP -> ProxyType.HTTP;
220+
case SOCKS4 -> ProxyType.SOCKS4;
221+
case SOCKS5 -> ProxyType.SOCKS5;
222+
});
223+
net.setProxyOptions(po);
224+
proxy.nonProxyHosts().ifPresent(net::setNonProxyHosts);
225+
});
205226
}
206227
tcp.readIdleTimeout().ifPresent(d -> net.setReadIdleTimeout((int) d.toSeconds()));
207228
tcp.reconnectAttempts().ifPresent(net::setReconnectAttempts);

extensions/redis-client/runtime/src/main/java/io/quarkus/redis/runtime/client/config/NetConfig.java

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,14 +37,34 @@ public interface NetConfig {
3737
*/
3838
Optional<Duration> connectionTimeout();
3939

40+
/**
41+
* The name of the proxy configuration to use.
42+
* <p>
43+
* If {@code quarkus.redis.tcp.proxy-options.host} is set, the {@code quarkus.redis.tcp.proxy-options.*}
44+
* (and {@code quarkus.redis.tcp.non-proxy-hosts}) configuration is used and the {@code quarkus.proxy.*}
45+
* configuration is ignored.
46+
* <p>
47+
* Otherwise, if not set and the default proxy configuration is configured ({@code quarkus.proxy.*}), it is used.
48+
* If set to {@code none}, no proxy configuration is used.
49+
* If set to some other value, the configuration from {@code quarkus.proxy.<name>.*} is used.
50+
* If set but no proxy configuration with that name is found, an exception is thrown at runtime.
51+
*/
52+
Optional<String> proxyConfigurationName();
53+
4054
/**
4155
* Set a list of remote hosts that are not proxied when the client is configured to use a proxy.
56+
*
57+
* @deprecated use {@code quarkus.redis.tcp.proxy-configuration-name} and {@code quarkus.proxy.*}
4258
*/
59+
@Deprecated
4360
Optional<List<String>> nonProxyHosts();
4461

4562
/**
4663
* Set proxy options for connections via CONNECT proxy
64+
*
65+
* @deprecated use {@code quarkus.redis.tcp.proxy-configuration-name} and {@code quarkus.proxy.*}
4766
*/
67+
@Deprecated
4868
ProxyConfig proxyOptions();
4969

5070
/**

extensions/redis-client/runtime/src/main/java/io/quarkus/redis/runtime/client/config/ProxyConfig.java

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,30 +11,49 @@ public interface ProxyConfig {
1111

1212
/**
1313
* Set proxy username.
14+
* Honored only when {@code quarkus.redis.tcp.proxy-options.host} is set.
15+
*
16+
* @deprecated use {@code quarkus.redis.tcp.proxy-configuration-name} and {@code quarkus.proxy.*}
1417
*/
18+
@Deprecated
1519
Optional<String> username();
1620

1721
/**
1822
* Set proxy password.
23+
* Honored only when {@code quarkus.redis.tcp.proxy-options.host} is set.
24+
*
25+
* @deprecated use {@code quarkus.redis.tcp.proxy-configuration-name} and {@code quarkus.proxy.*}
1926
*/
27+
@Deprecated
2028
Optional<String> password();
2129

2230
/**
2331
* Set proxy port. Defaults to 3128.
32+
* Honored only when {@code quarkus.redis.tcp.proxy-options.host} is set.
33+
*
34+
* @deprecated use {@code quarkus.redis.tcp.proxy-configuration-name} and {@code quarkus.proxy.*}
2435
*/
2536
@WithDefault("3128")
37+
@Deprecated
2638
int port();
2739

2840
/**
2941
* Set proxy host.
42+
*
43+
* @deprecated use {@code quarkus.redis.tcp.proxy-configuration-name} and {@code quarkus.proxy.*}
3044
*/
45+
@Deprecated
3146
Optional<String> host();
3247

3348
/**
3449
* Set proxy type.
3550
* Accepted values are: {@code HTTP} (default), {@code SOCKS4} and {@code SOCKS5}.
51+
* Honored only when {@code quarkus.redis.tcp.proxy-options.host} is set.
52+
*
53+
* @deprecated use {@code quarkus.redis.tcp.proxy-configuration-name} and {@code quarkus.proxy.*}
3654
*/
3755
@WithDefault("http")
56+
@Deprecated
3857
ProxyType type();
3958

4059
}

0 commit comments

Comments
 (0)