You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@dubbo.apache.org by al...@apache.org on 2021/09/02 08:24:06 UTC

[dubbo] 01/02: Merge branch 'apache-3.0' into 3.0-multi-instances

This is an automated email from the ASF dual-hosted git repository.

albumenj pushed a commit to branch 3.0-multi-instances
in repository https://gitbox.apache.org/repos/asf/dubbo.git

commit ffaa0072699c0c49bdf86110bd6bdb4eda919a64
Merge: ccdc691 b8de0a7
Author: Albumen Kevin <jh...@gmail.com>
AuthorDate: Thu Sep 2 15:46:34 2021 +0800

    Merge branch 'apache-3.0' into 3.0-multi-instances
    
    # Conflicts:
    #	dubbo-common/src/main/java/org/apache/dubbo/common/URLBuilder.java
    #	dubbo-common/src/main/java/org/apache/dubbo/common/url/component/ServiceConfigURL.java
    #	dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/ReferenceConfigTest.java
    #	dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/ServiceDiscoveryRegistryDirectory.java
    #	dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/integration/RegistryDirectory.java
    #	dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/integration/RegistryProtocol.java

 .../org/apache/dubbo/rpc/cluster/RouterChain.java  |  14 +-
 .../cluster/support/wrapper/AbstractCluster.java   |   4 +
 .../support/wrapper/MockClusterWrapper.java        |   5 +-
 .../apache/dubbo/rpc/cluster/RouterChainTest.java  |  52 ++
 .../support/wrapper/AbstractClusterTest.java       | 106 ++++
 .../support/wrapper/DemoClusterFilter.java}        |  27 +-
 ...g.apache.dubbo.rpc.cluster.filter.ClusterFilter |   1 +
 dubbo-common/pom.xml                               |  14 +
 .../java/org/apache/dubbo/common/URLBuilder.java   |  17 +
 .../url/component/DubboServiceAddressURL.java      |   1 +
 .../common/url/component/ServiceConfigURL.java     |   2 +
 .../apache/dubbo/rpc/model/MethodDescriptor.java   | 166 ++++++-
 .../apache/dubbo/descriptor/DescriptorService.java |  65 +++
 .../dubbo/descriptor/MethodDescriptorTest.java     | 157 +++++-
 .../org/apache/dubbo/config/ReferenceConfig.java   |   5 +-
 .../org/apache/dubbo/config/ServiceConfig.java     |  12 +-
 .../apache/dubbo/config/ReferenceConfigTest.java   | 179 ++++++-
 ...gistryCenterExportMetadataExporterListener.java |  32 +-
 ...egistryCenterExportMetadataIntegrationTest.java | 207 ++++++++
 ...ultipleRegistryCenterExportMetadataService.java |  11 +-
 ...pleRegistryCenterExportMetadataServiceImpl.java |  14 +-
 ...egistryCenterExportMetadataServiceListener.java |  29 +-
 .../org.apache.dubbo.config.ServiceListener        |   1 +
 .../services/org.apache.dubbo.rpc.ExporterListener |   1 +
 .../registrycenter/AbstractRegistryCenter.java     |   4 +-
 .../java/org/apache/dubbo/demo/TripleService.java  |   6 +-
 .../dubbo-demo-xml/dubbo-demo-xml-consumer/pom.xml |   4 +
 .../apache/dubbo/demo/consumer/Application.java    |  17 +
 .../src/main/resources/spring/dubbo-consumer.xml   |   3 +
 .../dubbo-demo-xml/dubbo-demo-xml-provider/pom.xml |   4 +
 .../dubbo/demo/provider/TripleServiceImpl.java     |  11 +-
 .../src/main/resources/spring/dubbo-provider.xml   |   4 +
 .../dubbo/registry/client/InstanceAddressURL.java  |   2 +
 .../registry/client/ServiceDiscoveryRegistry.java  |   6 +-
 .../client/ServiceDiscoveryRegistryDirectory.java  |  17 +-
 .../client/migration/MigrationInvoker.java         |   8 +
 .../registry/integration/DynamicDirectory.java     |  75 ++-
 .../InterfaceCompatibleRegistryProtocol.java       |   1 +
 .../registry/integration/RegistryDirectory.java    |  21 +-
 .../registry/integration/RegistryProtocol.java     |  18 +-
 ...est.java => CacheableFallbackRegistryTest.java} |  31 +-
 .../registry/ListenerRegistryWrapperTest.java      |  84 ++++
 .../dubbo/registry/RegistryFactoryWrapperTest.java |   2 +-
 .../dubbo/registry/RegistryServiceListener1.java   |   2 +-
 .../dubbo/registry/RegistryServiceListener2.java   |   2 +-
 .../client/migration/MigrationRuleHandlerTest.java |   2 +-
 .../CountRegistryProtocolListener.java}            |  31 +-
 .../DemoService.java}                              |   4 +-
 .../registry/integration/DynamicDirectoryTest.java | 173 +++++++
 .../registry/integration/RegistryProtocolTest.java | 550 +++++++++++++++++++++
 ...o.registry.integration.RegistryProtocolListener |   1 +
 .../dubbo/rpc/protocol/grpc/GrpcProtocolTest.java  |  22 +
 .../protocol/grpc/support/DubboGreeterGrpc.java    |   3 +-
 dubbo-rpc/dubbo-rpc-triple/pom.xml                 |  10 +
 .../dubbo/rpc/protocol/tri/AbstractStream.java     |  58 +--
 .../dubbo/rpc/protocol/tri/ExceptionUtils.java     |   8 +-
 .../apache/dubbo/rpc/protocol/tri/GrpcStatus.java  |   9 +-
 .../rpc/protocol/tri/ServerTransportObserver.java  |   4 +-
 .../dubbo/rpc/protocol/tri/TripleHeaderEnum.java   |   3 +-
 .../dubbo/rpc/protocol/tri/TripleProtocol.java     |  11 +
 .../dubbo/rpc/protocol/tri/UnaryClientStream.java  |  60 +--
 .../protocol/tri/service/HealthStatusManager.java  |  74 +++
 .../protocol/tri/service/TriBuiltinService.java    |  86 ++++
 .../rpc/protocol/tri/service/TriHealthImpl.java    | 145 ++++++
 .../dubbo-rpc-triple/src/main/proto/health.proto   |  66 +++
 .../dubbo/rpc/protocol/tri/TripleProtocolTest.java |  21 +-
 .../dubbo/rpc/protocol/tri/support/IGreeter.java   |  11 +
 .../rpc/protocol/tri/support/IGreeterImpl.java     |   9 +
 pom.xml                                            |   1 +
 69 files changed, 2520 insertions(+), 286 deletions(-)

diff --cc dubbo-common/src/main/java/org/apache/dubbo/common/URLBuilder.java
index 24ea293,83a2dab..21e114f
--- a/dubbo-common/src/main/java/org/apache/dubbo/common/URLBuilder.java
+++ b/dubbo-common/src/main/java/org/apache/dubbo/common/URLBuilder.java
@@@ -205,11 -207,6 +210,12 @@@ public final class URLBuilder extends S
      }
  
      @Override
 +    public URLBuilder setScopeModel(ScopeModel scopeModel) {
 +        this.attributes.put(SCOPE_MODEL, scopeModel);
 +        return this;
 +    }
 +
++    @Override
      public URLBuilder addParameterAndEncoded(String key, String value) {
          if (StringUtils.isEmpty(value)) {
              return this;
diff --cc dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/ReferenceConfigTest.java
index f8214ef,9f13ce3..ed45fda
--- a/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/ReferenceConfigTest.java
+++ b/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/ReferenceConfigTest.java
@@@ -27,7 -30,12 +27,11 @@@ import org.apache.dubbo.config.annotati
  import org.apache.dubbo.config.annotation.Reference;
  import org.apache.dubbo.config.api.DemoService;
  import org.apache.dubbo.config.bootstrap.DubboBootstrap;
 -import org.apache.dubbo.config.context.ConfigManager;
  import org.apache.dubbo.config.provider.impl.DemoServiceImpl;
+ 
+ import org.apache.dubbo.metadata.report.MetadataReport;
+ import org.apache.dubbo.metadata.report.MetadataReportInstance;
+ import org.apache.dubbo.registry.client.migration.MigrationInvoker;
  import org.apache.dubbo.rpc.Exporter;
  import org.apache.dubbo.rpc.ProxyFactory;
  import org.apache.dubbo.rpc.listener.ListenerInvokerWrapper;
@@@ -108,11 -123,9 +113,12 @@@ public class ReferenceConfigTest 
          int zkServerPort = NetUtils.getAvailablePort(NetUtils.getRandomPort());
          this.zkServer = new TestingServer(zkServerPort, true);
          this.zkServer.start();
-         this.registryUrl = "zookeeper://localhost:" + zkServerPort;
+         this.zkUrl = "zookeeper://localhost:" + zkServerPort;
+         this.registryUrl = "registry://localhost:" + zkServerPort+"?registry=zookeeper";
 -        ApplicationModel.getConfigManager();
 +
 +        // preload
 +        ReferenceConfig preloadReferenceConfig = new ReferenceConfig();
 +        ApplicationModel.defaultModel().getApplicationConfigManager();
          DubboBootstrap.getInstance();
      }
  
@@@ -473,19 -547,160 +479,162 @@@
          Assertions.assertEquals("value1", url.getParameter("key1"));
          Assertions.assertEquals("value2", url.getParameter("key2"));
  
 +        dubboBootstrap.stop();
++
+         applicationModelMockedStatic.closeOnDemand();
+         metadataReportInstanceMockedStatic.closeOnDemand();
+     }
+ 
 -
+     /**
+      * Verify the configuration of the registry protocol for remote reference
+      */
+     @Test
+     public  void testCreateInvokerForRemoteRefer(){
+ 
+         ReferenceConfig<DemoService> referenceConfig = new ReferenceConfig<>();
+         referenceConfig.setGeneric(Boolean.FALSE.toString());
+         referenceConfig.setProtocol("dubbo");
+         referenceConfig.setInit(true);
+         referenceConfig.setLazy(false);
+         referenceConfig.setInjvm(false);
+ 
+         DubboBootstrap.getInstance()
+             .application("application1")
+             .initialize();
+         referenceConfig.setBootstrap(DubboBootstrap.getInstance());
+ 
+         ApplicationConfig applicationConfig = new ApplicationConfig();
+         applicationConfig.setName("application1");
+         Map<String, String> parameters = new HashMap<>();
+         parameters.put("key1", "value1");
+         parameters.put("key2", "value2");
+         applicationConfig.setParameters(parameters);
+ 
+         ConfigManager configManager = mock(ConfigManager.class);
+         Environment environment = mock(Environment.class);
+         CompositeConfiguration compositeConfiguration = mock(CompositeConfiguration.class);
+         Configuration dynamicGlobalConfiguration = mock(Configuration.class);
+         ServiceRepository serviceRepository = mock(ServiceRepository.class);
+         ConsumerModel consumerModel = mock(ConsumerModel.class);
+ 
+         when(configManager.getApplicationOrElseThrow()).thenReturn(applicationConfig);
+ 
+         MockedStatic<ApplicationModel> applicationModelMockedStatic = Mockito.mockStatic(ApplicationModel.class);
+         applicationModelMockedStatic.when(ApplicationModel::getConfigManager).thenReturn(configManager);
+         applicationModelMockedStatic.when(ApplicationModel::getEnvironment).thenReturn(environment);
+         applicationModelMockedStatic.when(ApplicationModel::getServiceRepository).thenReturn(serviceRepository);
+         when(environment.getConfiguration()).thenReturn(compositeConfiguration);
+         when(environment.getDynamicGlobalConfiguration()).thenReturn(dynamicGlobalConfiguration);
+         when(compositeConfiguration.convert(Boolean.class, ENABLE_CONFIGURATION_LISTEN, true))
+             .thenReturn(true);
+ 
+         MockedStatic<MetadataReportInstance> metadataReportInstanceMockedStatic =
+             Mockito.mockStatic(MetadataReportInstance.class);
+ 
+         MetadataReport metadataReport = mock(MetadataReport.class);
+         metadataReportInstanceMockedStatic.when(() -> MetadataReportInstance.getMetadataReport("default"))
+             .thenReturn(metadataReport);
+ 
+ 
+         when(serviceRepository.lookupReferredService("org.apache.dubbo.config.api.DemoService"))
+             .thenReturn(consumerModel);
+ 
+         referenceConfig.refreshed.set(true);
+         referenceConfig.setInterface(DemoService.class);
+         referenceConfig.getInterfaceClass();
+         referenceConfig.setCheck(false);
+         RegistryConfig registry = new RegistryConfig();
+         registry.setAddress(zkUrl);
+         applicationConfig.setRegistries(Collections.singletonList(registry));
+         applicationConfig.setRegistryIds(registry.getId());
+ 
+         referenceConfig.setRegistry(registry);
+ 
+         referenceConfig.init();
+         Assertions.assertTrue(referenceConfig.getInvoker() instanceof MigrationInvoker);
+ 
+         applicationModelMockedStatic.closeOnDemand();
+         metadataReportInstanceMockedStatic.closeOnDemand();
      }
  
+     /**
+      * Verify that the registry url is directly configured for remote reference
+      */
+     @Test
+     public  void testCreateInvokerWithRegistryUrlForRemoteRefer(){
+ 
+         ReferenceConfig<DemoService> referenceConfig = new ReferenceConfig<>();
+         referenceConfig.setGeneric(Boolean.FALSE.toString());
+         referenceConfig.setProtocol("dubbo");
+         referenceConfig.setInit(true);
+         referenceConfig.setLazy(false);
+         referenceConfig.setInjvm(false);
+ 
+         DubboBootstrap.getInstance()
+             .application("application1")
+             .initialize();
+         referenceConfig.setBootstrap(DubboBootstrap.getInstance());
+ 
+         ApplicationConfig applicationConfig = new ApplicationConfig();
+         applicationConfig.setName("application1");
+         Map<String, String> parameters = new HashMap<>();
+         parameters.put("key1", "value1");
+         parameters.put("key2", "value2");
+         applicationConfig.setParameters(parameters);
+ 
+         ConfigManager configManager = mock(ConfigManager.class);
+         Environment environment = mock(Environment.class);
+         CompositeConfiguration compositeConfiguration = mock(CompositeConfiguration.class);
+         Configuration dynamicGlobalConfiguration = mock(Configuration.class);
+         ServiceRepository serviceRepository = mock(ServiceRepository.class);
+         ConsumerModel consumerModel = mock(ConsumerModel.class);
+ 
+         when(configManager.getApplicationOrElseThrow()).thenReturn(applicationConfig);
+ 
+         MockedStatic<ApplicationModel> applicationModelMockedStatic = Mockito.mockStatic(ApplicationModel.class);
+         applicationModelMockedStatic.when(ApplicationModel::getConfigManager).thenReturn(configManager);
+         applicationModelMockedStatic.when(ApplicationModel::getEnvironment).thenReturn(environment);
+         applicationModelMockedStatic.when(ApplicationModel::getServiceRepository).thenReturn(serviceRepository);
+         when(environment.getConfiguration()).thenReturn(compositeConfiguration);
+         when(environment.getDynamicGlobalConfiguration()).thenReturn(dynamicGlobalConfiguration);
+         when(compositeConfiguration.convert(Boolean.class, ENABLE_CONFIGURATION_LISTEN, true))
+             .thenReturn(true);
+ 
+         MockedStatic<MetadataReportInstance> metadataReportInstanceMockedStatic =
+             Mockito.mockStatic(MetadataReportInstance.class);
+ 
+         MetadataReport metadataReport = mock(MetadataReport.class);
+         metadataReportInstanceMockedStatic.when(() -> MetadataReportInstance.getMetadataReport("default"))
+             .thenReturn(metadataReport);
+ 
+ 
+         when(serviceRepository.lookupReferredService("org.apache.dubbo.config.api.DemoService"))
+             .thenReturn(consumerModel);
+ 
+         referenceConfig.refreshed.set(true);
+         referenceConfig.setInterface(DemoService.class);
+         referenceConfig.getInterfaceClass();
+         referenceConfig.setCheck(false);
+ 
+         referenceConfig.setUrl(registryUrl);
+         referenceConfig.init();
+         Assertions.assertTrue(referenceConfig.getInvoker() instanceof MigrationInvoker);
+ 
+         applicationModelMockedStatic.closeOnDemand();
+         metadataReportInstanceMockedStatic.closeOnDemand();
+     }
+ 
++
      @Test
      @Disabled("Disabled due to Github Actions environment")
      public void testInjvm() throws Exception {
          ApplicationConfig application = new ApplicationConfig();
          application.setName("test-protocol-random-port");
          application.setEnableFileCache(false);
 -        ApplicationModel.getConfigManager().setApplication(application);
 +        ApplicationModel.defaultModel().getApplicationConfigManager().setApplication(application);
  
          RegistryConfig registry = new RegistryConfig();
-         registry.setAddress(registryUrl);
+         registry.setAddress(zkUrl);
  
          ProtocolConfig protocol = new ProtocolConfig();
          protocol.setName("dubbo");
@@@ -526,10 -741,10 +675,10 @@@
          ApplicationConfig application = new ApplicationConfig();
          application.setName("test-reference-retry");
          application.setEnableFileCache(false);
 -        ApplicationModel.getConfigManager().setApplication(application);
 +        ApplicationModel.defaultModel().getApplicationConfigManager().setApplication(application);
  
          RegistryConfig registry = new RegistryConfig();
-         registry.setAddress(registryUrl);
+         registry.setAddress(zkUrl);
          ProtocolConfig protocol = new ProtocolConfig();
          protocol.setName("injvm");
  
diff --cc dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/ServiceDiscoveryRegistryDirectory.java
index 108292a,5792693..6e12519
--- a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/ServiceDiscoveryRegistryDirectory.java
+++ b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/ServiceDiscoveryRegistryDirectory.java
@@@ -55,15 -54,17 +55,18 @@@ import static org.apache.dubbo.rpc.mode
  public class ServiceDiscoveryRegistryDirectory<T> extends DynamicDirectory<T> {
      private static final Logger logger = LoggerFactory.getLogger(ServiceDiscoveryRegistryDirectory.class);
  
-     // instance address to invoker mapping.
-     private volatile Map<String, Invoker<T>> urlInvokerMap; // The initial value is null and the midway may be assigned to null, please use the local variable reference
+     /**
+      * instance address to invoker mapping.
+      * The initial value is null and the midway may be assigned to null, please use the local variable reference
+      */
+     private volatile Map<String, Invoker<T>> urlInvokerMap;
 -    private final static ConsumerConfigurationListener CONSUMER_CONFIGURATION_LISTENER = new ConsumerConfigurationListener();
 +    private final ConsumerConfigurationListener consumerConfigurationListener;
      private volatile ReferenceConfigurationListener referenceConfigurationListener;
      private volatile boolean enableConfigurationListen = true;
-     private volatile List<URL> originalUrls = null; // initial for null
+     private volatile List<URL> originalUrls = null;
      private volatile Map<String, String> overrideQueryMap;
      private volatile Map<String, String> consumerFirstQueryMap;
 +    private final ApplicationModel applicationModel;
  
      public ServiceDiscoveryRegistryDirectory(Class<T> serviceType, URL url) {
          super(serviceType, url);
@@@ -185,8 -180,8 +186,8 @@@
      }
  
      private InstanceAddressURL overrideWithConfigurator(InstanceAddressURL providerUrl) {
-         // override url with configurator from configurator from "app-name.configurators"
+         // override url with configurator from "app-name.configurators"
 -        providerUrl = overrideWithConfigurators(CONSUMER_CONFIGURATION_LISTENER.getConfigurators(), providerUrl);
 +        providerUrl = overrideWithConfigurators(consumerConfigurationListener.getConfigurators(), providerUrl);
  
          // override url with configurator from configurators from "service-name.configurators"
          if (referenceConfigurationListener != null) {
diff --cc dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/integration/RegistryDirectory.java
index 7797d10,82058af..4fa1f76
--- a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/integration/RegistryDirectory.java
+++ b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/integration/RegistryDirectory.java
@@@ -87,15 -86,19 +87,20 @@@ import static org.apache.dubbo.rpc.mode
  public class RegistryDirectory<T> extends DynamicDirectory<T> {
      private static final Logger logger = LoggerFactory.getLogger(RegistryDirectory.class);
  
 -    private static final ConsumerConfigurationListener CONSUMER_CONFIGURATION_LISTENER = new ConsumerConfigurationListener();
 +    private final ConsumerConfigurationListener consumerConfigurationListener;
      private ReferenceConfigurationListener referenceConfigurationListener;
  
-     // Map<url, Invoker> cache service url to invoker mapping.
-     // The initial value is null and the midway may be assigned to null, please use the local variable reference
+     /**
+      * Map<url, Invoker> cache service url to invoker mapping.
+      * The initial value is null and the midway may be assigned to null, please use the local variable reference
+      */
      protected volatile Map<URL, Invoker<T>> urlInvokerMap;
-     // The initial value is null and the midway may be assigned to null, please use the local variable reference
+ 
+     /**
+      * The initial value is null and the midway may be assigned to null, please use the local variable reference
+      */
      protected volatile Set<URL> cachedInvokerUrls;
 +    private final ApplicationModel applicationModel;
  
      public RegistryDirectory(Class<T> serviceType, URL url) {
          super(serviceType, url);
@@@ -411,8 -411,8 +415,8 @@@
          // override url with configurator from "override://" URL for dubbo 2.6 and before
          providerUrl = overrideWithConfigurators(this.configurators, providerUrl);
  
-         // override url with configurator from configurator from "app-name.configurators"
+         // override url with configurator from "app-name.configurators"
 -        providerUrl = overrideWithConfigurators(CONSUMER_CONFIGURATION_LISTENER.getConfigurators(), providerUrl);
 +        providerUrl = overrideWithConfigurators(consumerConfigurationListener.getConfigurators(), providerUrl);
  
          // override url with configurator from configurators from "service-name.configurators"
          if (referenceConfigurationListener != null) {
diff --cc dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/integration/RegistryProtocol.java
index e687ff7,a4af51b..dea9fd8
--- a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/integration/RegistryProtocol.java
+++ b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/integration/RegistryProtocol.java
@@@ -728,9 -694,9 +728,9 @@@ public class RegistryProtocol implement
              //The current, may have been merged many times
              URL currentUrl = exporter.getInvoker().getUrl();
              //Merged with this configuration
-             URL newUrl = getConfigedInvokerUrl(configurators, originUrl);
-             newUrl = getConfigedInvokerUrl(getProviderConfigurationListener(originUrl).getConfigurators(), newUrl);
-             newUrl = getConfigedInvokerUrl(serviceConfigurationListeners.get(originUrl.getServiceKey())
+             URL newUrl = getConfiguredInvokerUrl(configurators, originUrl);
 -            newUrl = getConfiguredInvokerUrl(providerConfigurationListener.getConfigurators(), newUrl);
++            newUrl = getConfiguredInvokerUrl(getProviderConfigurationListener(originUrl).getConfigurators(), newUrl);
+             newUrl = getConfiguredInvokerUrl(serviceConfigurationListeners.get(originUrl.getServiceKey())
                  .getConfigurators(), newUrl);
              if (!currentUrl.equals(newUrl)) {
                  if (newUrl.getParameter(Constants.NEED_REEXPORT, true)) {
diff --cc dubbo-rpc/dubbo-rpc-grpc/src/test/java/org/apache/dubbo/rpc/protocol/grpc/GrpcProtocolTest.java
index 798ed37,d5118d9..2c3ea35
--- a/dubbo-rpc/dubbo-rpc-grpc/src/test/java/org/apache/dubbo/rpc/protocol/grpc/GrpcProtocolTest.java
+++ b/dubbo-rpc/dubbo-rpc-grpc/src/test/java/org/apache/dubbo/rpc/protocol/grpc/GrpcProtocolTest.java
@@@ -79,8 -82,28 +81,28 @@@ public class GrpcProtocolTest 
          HelloReply hello = serviceImpl.sayHello(HelloRequest.newBuilder().setName("World").build());
          Assertions.assertEquals("Hello World", hello.getMessage());
  
+         ListenableFuture<HelloReply> future = serviceImpl.sayHelloAsync(HelloRequest.newBuilder().setName("World").build());
+         Assertions.assertEquals("Hello World", future.get().getMessage());
+ 
+         serviceImpl.sayHello(HelloRequest.newBuilder().setName("World").build(), new StreamObserver<HelloReply>() {
+ 
+             @Override
+             public void onNext(HelloReply helloReply) {
+                 Assertions.assertEquals("Hello World", helloReply.getMessage());
+             }
+ 
+             @Override
+             public void onError(Throwable throwable) {
+                 throwable.printStackTrace();
+             }
+ 
+             @Override
+             public void onCompleted() {
+                 System.out.println("onCompleted");
+             }
+         });
          // resource recycle.
 -        ApplicationModel.getServiceRepository().destroy();
 +        ApplicationModel.defaultModel().getApplicationServiceRepository().destroy();
      }
  
      class MockReferenceConfig extends ReferenceConfigBase {
diff --cc dubbo-rpc/dubbo-rpc-triple/src/test/java/org/apache/dubbo/rpc/protocol/tri/TripleProtocolTest.java
index c21e2f2,0db41e3..af49f3e
--- a/dubbo-rpc/dubbo-rpc-triple/src/test/java/org/apache/dubbo/rpc/protocol/tri/TripleProtocolTest.java
+++ b/dubbo-rpc/dubbo-rpc-triple/src/test/java/org/apache/dubbo/rpc/protocol/tri/TripleProtocolTest.java
@@@ -55,10 -55,28 +56,28 @@@ public class TripleProtocolTest 
  
          protocol.export(proxy.getInvoker(serviceImpl, IGreeter.class, url));
          serviceImpl = proxy.getProxy(protocol.refer(IGreeter.class, url));
-          Thread.sleep(1000);
+         Thread.sleep(1000);
          Assertions.assertEquals("hello world", serviceImpl.echo("hello world"));
+         // fixme will throw exception
+         // Assertions.assertEquals("hello world", serviceImpl.echoAsync("hello world").get());
+         serviceImpl.serverStream("hello world", new StreamObserver<String>() {
+             @Override
+             public void onNext(String data) {
+                 Assertions.assertEquals("hello world",data);
+             }
+ 
+             @Override
+             public void onError(Throwable throwable) {
+                 throwable.printStackTrace();
+             }
+ 
+             @Override
+             public void onCompleted() {
+                 System.out.println("onCompleted");
+             }
+         });
  
          // resource recycle.
 -        ApplicationModel.getServiceRepository().destroy();
 +        ApplicationModel.defaultModel().getApplicationServiceRepository().destroy();
      }
  }