Add Support For Istio-Agent (#10567)
diff --git a/dubbo-dependencies-bom/pom.xml b/dubbo-dependencies-bom/pom.xml
index 2070914..34d116c 100644
--- a/dubbo-dependencies-bom/pom.xml
+++ b/dubbo-dependencies-bom/pom.xml
@@ -139,7 +139,7 @@
<tomcat_embed_version>8.5.69</tomcat_embed_version>
<jetcd_version>0.5.3</jetcd_version>
<nacos_version>2.1.0</nacos_version>
- <grpc.version>1.44.0</grpc.version>
+ <grpc.version>1.47.0</grpc.version>
<grpc_contrib_verdion>0.8.1</grpc_contrib_verdion>
<jprotoc_version>1.2.1</jprotoc_version>
<!-- Log libs -->
diff --git a/dubbo-xds/src/main/java/org/apache/dubbo/registry/xds/util/PilotExchanger.java b/dubbo-xds/src/main/java/org/apache/dubbo/registry/xds/util/PilotExchanger.java
index 15295fe..dbb30e7 100644
--- a/dubbo-xds/src/main/java/org/apache/dubbo/registry/xds/util/PilotExchanger.java
+++ b/dubbo-xds/src/main/java/org/apache/dubbo/registry/xds/util/PilotExchanger.java
@@ -67,7 +67,6 @@
if (CollectionUtils.isNotEmpty(listenerResult.getRouteConfigNames())) {
this.observeRouteRequest.set(createRouteObserve());
}
-
// Observe LDS updated
ldsProtocol.observeListeners((newListener) -> {
// update local cache
diff --git a/dubbo-xds/src/main/java/org/apache/dubbo/registry/xds/util/XdsChannel.java b/dubbo-xds/src/main/java/org/apache/dubbo/registry/xds/util/XdsChannel.java
index 4f4d8c7..9019d38 100644
--- a/dubbo-xds/src/main/java/org/apache/dubbo/registry/xds/util/XdsChannel.java
+++ b/dubbo-xds/src/main/java/org/apache/dubbo/registry/xds/util/XdsChannel.java
@@ -16,24 +16,27 @@
*/
package org.apache.dubbo.registry.xds.util;
+import io.grpc.ManagedChannel;
+import io.grpc.netty.shaded.io.netty.channel.epoll.EpollDomainSocketChannel;
+import io.grpc.netty.shaded.io.netty.channel.epoll.EpollEventLoopGroup;
+import io.grpc.netty.shaded.io.netty.channel.unix.DomainSocketAddress;
import org.apache.dubbo.common.URL;
import org.apache.dubbo.common.logger.Logger;
import org.apache.dubbo.common.logger.LoggerFactory;
+import org.apache.dubbo.common.url.component.URLAddress;
import org.apache.dubbo.registry.xds.XdsCertificateSigner;
-
import io.envoyproxy.envoy.service.discovery.v3.AggregatedDiscoveryServiceGrpc;
import io.envoyproxy.envoy.service.discovery.v3.DeltaDiscoveryRequest;
import io.envoyproxy.envoy.service.discovery.v3.DeltaDiscoveryResponse;
import io.envoyproxy.envoy.service.discovery.v3.DiscoveryRequest;
import io.envoyproxy.envoy.service.discovery.v3.DiscoveryResponse;
-import io.grpc.ManagedChannel;
import io.grpc.netty.shaded.io.grpc.netty.GrpcSslContexts;
import io.grpc.netty.shaded.io.grpc.netty.NettyChannelBuilder;
import io.grpc.netty.shaded.io.netty.handler.ssl.SslContext;
import io.grpc.netty.shaded.io.netty.handler.ssl.util.InsecureTrustManagerFactory;
import io.grpc.stub.StreamObserver;
-
-import javax.net.ssl.SSLException;
+import org.apache.dubbo.registry.xds.util.bootstrap.Bootstrapper;
+import org.apache.dubbo.registry.xds.util.bootstrap.BootstrapperImpl;
import java.io.ByteArrayInputStream;
import java.nio.charset.StandardCharsets;
@@ -41,22 +44,37 @@
private static final Logger logger = LoggerFactory.getLogger(XdsChannel.class);
+ private static final String USE_AGENT = "use-agent";
+
private final ManagedChannel channel;
protected XdsChannel(URL url) {
ManagedChannel managedChannel = null;
try {
- XdsCertificateSigner signer = url.getOrDefaultApplicationModel().getExtensionLoader(XdsCertificateSigner.class)
- .getExtension(url.getParameter("signer", "istio"));
- XdsCertificateSigner.CertPair certPair = signer.GenerateCert(url);
- SslContext context = GrpcSslContexts.forClient()
- .trustManager(InsecureTrustManagerFactory.INSTANCE)
- .keyManager(new ByteArrayInputStream(certPair.getPublicKey().getBytes(StandardCharsets.UTF_8)),
- new ByteArrayInputStream(certPair.getPrivateKey().getBytes(StandardCharsets.UTF_8)))
- .build();
- managedChannel = NettyChannelBuilder.forAddress(url.getHost(), url.getPort()).sslContext(context)
- .build();
- } catch (SSLException e) {
+ if(!url.getParameter(USE_AGENT,false)) {
+ XdsCertificateSigner signer = url.getOrDefaultApplicationModel().getExtensionLoader(XdsCertificateSigner.class)
+ .getExtension(url.getParameter("signer", "istio"));
+ XdsCertificateSigner.CertPair certPair = signer.GenerateCert(url);
+ SslContext context = GrpcSslContexts.forClient()
+ .trustManager(InsecureTrustManagerFactory.INSTANCE)
+ .keyManager(new ByteArrayInputStream(certPair.getPublicKey().getBytes(StandardCharsets.UTF_8)),
+ new ByteArrayInputStream(certPair.getPrivateKey().getBytes(StandardCharsets.UTF_8)))
+ .build();
+ managedChannel = NettyChannelBuilder.forAddress(url.getHost(), url.getPort()).sslContext(context)
+ .build();
+ }
+ else {
+ BootstrapperImpl bootstrapper = new BootstrapperImpl();
+ Bootstrapper.BootstrapInfo bootstrapInfo = bootstrapper.bootstrap();
+ URLAddress address =URLAddress.parse(bootstrapInfo.servers().get(0).target(),null, false);
+ EpollEventLoopGroup elg = new EpollEventLoopGroup();
+ managedChannel = NettyChannelBuilder.forAddress(new DomainSocketAddress("/" + address.getPath()))
+ .eventLoopGroup(elg)
+ .channelType(EpollDomainSocketChannel.class)
+ .usePlaintext()
+ .build();
+ }
+ } catch (Exception e) {
logger.error("Error occurred when creating gRPC channel to control panel.", e);
}
channel = managedChannel;
diff --git a/dubbo-xds/src/main/java/org/apache/dubbo/registry/xds/util/bootstrap/BootstrapInfoImpl.java b/dubbo-xds/src/main/java/org/apache/dubbo/registry/xds/util/bootstrap/BootstrapInfoImpl.java
index 4946166..a4e4451 100644
--- a/dubbo-xds/src/main/java/org/apache/dubbo/registry/xds/util/bootstrap/BootstrapInfoImpl.java
+++ b/dubbo-xds/src/main/java/org/apache/dubbo/registry/xds/util/bootstrap/BootstrapInfoImpl.java
@@ -23,7 +23,7 @@
import java.util.List;
import java.util.Map;
-final class BootstrapInfoImpl extends Bootstrapper.BootstrapInfo {
+public final class BootstrapInfoImpl extends Bootstrapper.BootstrapInfo {
private final List<Bootstrapper.ServerInfo> servers;
diff --git a/dubbo-xds/src/main/java/org/apache/dubbo/registry/xds/util/bootstrap/Bootstrapper.java b/dubbo-xds/src/main/java/org/apache/dubbo/registry/xds/util/bootstrap/Bootstrapper.java
index 68473be..5e018c4 100644
--- a/dubbo-xds/src/main/java/org/apache/dubbo/registry/xds/util/bootstrap/Bootstrapper.java
+++ b/dubbo-xds/src/main/java/org/apache/dubbo/registry/xds/util/bootstrap/Bootstrapper.java
@@ -32,8 +32,8 @@
throw new UnsupportedOperationException();
}
- abstract static class ServerInfo {
- abstract String target();
+ public abstract static class ServerInfo {
+ public abstract String target();
abstract ChannelCredentials channelCredentials();
@@ -50,9 +50,9 @@
}
public abstract static class BootstrapInfo {
- abstract List<ServerInfo> servers();
+ public abstract List<ServerInfo> servers();
- abstract Map<String, CertificateProviderInfo> certProviders();
+ public abstract Map<String, CertificateProviderInfo> certProviders();
public abstract Node node();
diff --git a/dubbo-xds/src/main/java/org/apache/dubbo/registry/xds/util/bootstrap/BootstrapperImpl.java b/dubbo-xds/src/main/java/org/apache/dubbo/registry/xds/util/bootstrap/BootstrapperImpl.java
index ce6490b..d9e2997 100644
--- a/dubbo-xds/src/main/java/org/apache/dubbo/registry/xds/util/bootstrap/BootstrapperImpl.java
+++ b/dubbo-xds/src/main/java/org/apache/dubbo/registry/xds/util/bootstrap/BootstrapperImpl.java
@@ -34,7 +34,7 @@
import java.util.List;
import java.util.Map;
-class BootstrapperImpl extends Bootstrapper {
+public class BootstrapperImpl extends Bootstrapper {
static final String BOOTSTRAP_PATH_SYS_ENV_VAR = "GRPC_XDS_BOOTSTRAP";
static String bootstrapPathFromEnvVar = System.getenv(BOOTSTRAP_PATH_SYS_ENV_VAR);
diff --git a/dubbo-xds/src/main/java/org/apache/dubbo/registry/xds/util/bootstrap/ServerInfoImpl.java b/dubbo-xds/src/main/java/org/apache/dubbo/registry/xds/util/bootstrap/ServerInfoImpl.java
index de0402e..001008a 100644
--- a/dubbo-xds/src/main/java/org/apache/dubbo/registry/xds/util/bootstrap/ServerInfoImpl.java
+++ b/dubbo-xds/src/main/java/org/apache/dubbo/registry/xds/util/bootstrap/ServerInfoImpl.java
@@ -36,7 +36,7 @@
}
@Override
- String target() {
+ public String target() {
return target;
}
diff --git a/dubbo-xds/src/test/java/org/apache/dubbo/registry/xds/util/bootstrap/BootstrapperTest.java b/dubbo-xds/src/test/java/org/apache/dubbo/registry/xds/util/bootstrap/BootstrapperTest.java
index e1a871d..180e260 100644
--- a/dubbo-xds/src/test/java/org/apache/dubbo/registry/xds/util/bootstrap/BootstrapperTest.java
+++ b/dubbo-xds/src/test/java/org/apache/dubbo/registry/xds/util/bootstrap/BootstrapperTest.java
@@ -16,6 +16,9 @@
*/
package org.apache.dubbo.registry.xds.util.bootstrap;
+import io.grpc.netty.shaded.io.netty.channel.unix.DomainSocketAddress;
+import org.apache.dubbo.common.URL;
+import org.apache.dubbo.common.url.component.URLAddress;
import org.apache.dubbo.registry.xds.XdsInitializationException;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
@@ -125,6 +128,14 @@
Bootstrapper.BootstrapInfo info = bootstrapper.bootstrap();
List<Bootstrapper.ServerInfo> serverInfoList = info.servers();
Assertions.assertEquals(serverInfoList.get(0).target(), "unix:///etc/istio/proxy/XDS");
+ URLAddress address =URLAddress.parse(serverInfoList.get(0).target(),null, false);
+ Assertions.assertEquals(new DomainSocketAddress(address.getPath()).path(), "etc/istio/proxy/XDS");
+ }
+
+ @Test
+ public void testUrl() {
+ URL url = URL.valueOf("dubbo://127.0.0.1:23456/TestService?useAgent=true");
+ Assertions.assertTrue(url.getParameter("useAgent", false));
}
private static BootstrapperImpl.FileReader createFileReader(final String rawData) {