Skip to content

Commit 417bf3b

Browse files
Client respects DNS TTL.
1 parent c5b3f19 commit 417bf3b

File tree

5 files changed

+336
-5
lines changed

5 files changed

+336
-5
lines changed

core/src/main/java/com/linecorp/armeria/client/proxy/ConnectProxyConfig.java

+27-1
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,9 @@
1818

1919
import java.net.InetSocketAddress;
2020
import java.util.Objects;
21+
import java.util.concurrent.Executors;
22+
import java.util.concurrent.ScheduledExecutorService;
23+
import java.util.function.BiConsumer;
2124

2225
import com.google.common.base.MoreObjects;
2326

@@ -29,7 +32,11 @@
2932
*/
3033
public final class ConnectProxyConfig extends ProxyConfig {
3134

32-
private final InetSocketAddress proxyAddress;
35+
private final ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor();
36+
37+
private long lastUpdateTime = System.currentTimeMillis();
38+
39+
private InetSocketAddress proxyAddress;
3340

3441
@Nullable
3542
private final String username;
@@ -43,11 +50,30 @@ public final class ConnectProxyConfig extends ProxyConfig {
4350

4451
ConnectProxyConfig(InetSocketAddress proxyAddress, @Nullable String username,
4552
@Nullable String password, HttpHeaders headers, boolean useTls) {
53+
this(proxyAddress, username, password, headers, useTls, -1);
54+
}
55+
56+
ConnectProxyConfig(InetSocketAddress proxyAddress, @Nullable String username,
57+
@Nullable String password, HttpHeaders headers, boolean useTls,
58+
long refreshInterval) {
4659
this.proxyAddress = proxyAddress;
4760
this.username = username;
4861
this.password = password;
4962
this.headers = headers;
5063
this.useTls = useTls;
64+
65+
if (refreshInterval > 0) {
66+
final BiConsumer<InetSocketAddress, Long> callback = (newProxyAddress, updateTime) -> {
67+
this.proxyAddress = newProxyAddress;
68+
this.lastUpdateTime = updateTime;
69+
};
70+
71+
ProxyConfig.reserveDNSUpdate(callback,
72+
proxyAddress.getHostName(),
73+
proxyAddress.getPort(),
74+
refreshInterval,
75+
scheduler);
76+
}
5177
}
5278

5379
@Override

core/src/main/java/com/linecorp/armeria/client/proxy/HAProxyConfig.java

+56-2
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,9 @@
2020

2121
import java.net.InetSocketAddress;
2222
import java.util.Objects;
23+
import java.util.concurrent.Executors;
24+
import java.util.concurrent.ScheduledExecutorService;
25+
import java.util.function.BiConsumer;
2326

2427
import com.google.common.base.MoreObjects;
2528

@@ -31,21 +34,72 @@
3134
*/
3235
public final class HAProxyConfig extends ProxyConfig {
3336

34-
private final InetSocketAddress proxyAddress;
37+
private final ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor();
38+
39+
private long lastUpdateTime = System.currentTimeMillis();
40+
41+
private InetSocketAddress proxyAddress;
3542

3643
@Nullable
37-
private final InetSocketAddress sourceAddress;
44+
private InetSocketAddress sourceAddress;
3845

3946
HAProxyConfig(InetSocketAddress proxyAddress) {
47+
this(proxyAddress, -1);
48+
}
49+
50+
HAProxyConfig(InetSocketAddress proxyAddress, long refreshInterval) {
4051
this.proxyAddress = proxyAddress;
4152
sourceAddress = null;
53+
54+
if (refreshInterval > 0) {
55+
final BiConsumer<InetSocketAddress, Long> callback = (newProxyAddress, updateTime) -> {
56+
this.proxyAddress = newProxyAddress;
57+
this.lastUpdateTime = updateTime;
58+
};
59+
60+
ProxyConfig.reserveDNSUpdate(callback,
61+
proxyAddress.getHostName(),
62+
proxyAddress.getPort(),
63+
refreshInterval,
64+
scheduler);
65+
}
4266
}
4367

4468
HAProxyConfig(InetSocketAddress proxyAddress, InetSocketAddress sourceAddress) {
69+
this(proxyAddress, sourceAddress, -1);
70+
}
71+
72+
HAProxyConfig(InetSocketAddress proxyAddress, InetSocketAddress sourceAddress, long refreshInterval) {
4573
checkArgument(sourceAddress.getAddress().getClass() == proxyAddress.getAddress().getClass(),
4674
"sourceAddress and proxyAddress should be the same type");
4775
this.proxyAddress = proxyAddress;
4876
this.sourceAddress = sourceAddress;
77+
78+
if (refreshInterval > 0) {
79+
final BiConsumer<InetSocketAddress, Long> callback = (newProxyAddress, updateTime) -> {
80+
this.proxyAddress = newProxyAddress;
81+
this.lastUpdateTime = updateTime;
82+
};
83+
84+
ProxyConfig.reserveDNSUpdate(callback,
85+
proxyAddress.getHostName(),
86+
proxyAddress.getPort(),
87+
refreshInterval,
88+
scheduler);
89+
}
90+
91+
if (refreshInterval > 0) {
92+
final BiConsumer<InetSocketAddress, Long> callback = (newSourceAddress, updateTime) -> {
93+
this.sourceAddress = newSourceAddress;
94+
this.lastUpdateTime = updateTime;
95+
};
96+
97+
ProxyConfig.reserveDNSUpdate(callback,
98+
sourceAddress.getHostName(),
99+
sourceAddress.getPort(),
100+
refreshInterval,
101+
scheduler);
102+
}
49103
}
50104

51105
@Override

0 commit comments

Comments
 (0)