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

liujun pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/dubbo-samples.git


The following commit(s) were added to refs/heads/master by this push:
     new 0b58483f feat: Support extensibility router task (#739)
0b58483f is described below

commit 0b58483f814f806690650ce0bc289189417c5236
Author: Pin Xiong <pinxiong...@gmail.com>
AuthorDate: Fri Feb 17 21:36:31 2023 +0800

    feat: Support extensibility router task (#739)
    
    refer to issue #716
---
 10-task/dubbo-samples-extensibility/deploy/All.yml |  55 ++++++++++-
 .../deploy/router/Deployment.yml                   |  65 +++++++++++++
 .../pom.xml                                        |  21 ++--
 .../router/api/ExtensibilityRouterService.java     |  22 +++++
 .../pom.xml                                        | 108 +++++++++++++++++++++
 .../ExtensibilityRouterConsumerApplication.java    |  27 ++++++
 .../consumer/ExtensibilityRouterConsumerTask.java  |  33 +++++++
 .../consumer/router/StickFirstStateRouter.java     |  81 ++++++++++++++++
 .../router/StickFirstStateRouterFactory.java       |  28 ++++++
 ...bbo.rpc.cluster.router.state.StateRouterFactory |   1 +
 .../src/main/resources/application.properties      |  26 +++++
 .../pom.xml                                        | 107 ++++++++++++++++++++
 .../ExtensibilityRouterProviderApplication.java    |  29 ++++++
 .../provider/ExtensibilityRouterServiceImpl.java   |  29 ++++++
 .../src/main/resources/application.properties      |  27 ++++++
 10-task/dubbo-samples-extensibility/pom.xml        |   3 +
 16 files changed, 649 insertions(+), 13 deletions(-)

diff --git a/10-task/dubbo-samples-extensibility/deploy/All.yml 
b/10-task/dubbo-samples-extensibility/deploy/All.yml
index d49c8b92..b58643a3 100644
--- a/10-task/dubbo-samples-extensibility/deploy/All.yml
+++ b/10-task/dubbo-samples-extensibility/deploy/All.yml
@@ -85,7 +85,7 @@ spec:
       targetPort: 9848
 ---
 
-# Provider
+# Filter Provider
 apiVersion: apps/v1
 kind: Deployment
 metadata:
@@ -111,7 +111,7 @@ spec:
               protocol: TCP
 ---
 
-# Consumer
+# Filter Consumer
 apiVersion: apps/v1
 kind: Deployment
 metadata:
@@ -131,6 +131,57 @@ spec:
         - name: consumer
           image: 
apache/dubbo-demo:dubbo-samples-extensibility-filter-consumer_0.0.1
           imagePullPolicy: Always
+          ports:
+            - name: dubbo
+              containerPort: 20880
+              protocol: TCP
+---
+# Router Provider
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+  name: dubbo-samples-extensibility-router-provider
+  namespace: dubbo-demo
+spec:
+  replicas: 2
+  selector:
+    matchLabels:
+      app: dubbo-samples-extensibility-router-provider
+  template:
+    metadata:
+      labels:
+        app: dubbo-samples-extensibility-router-provider
+    spec:
+      containers:
+        - name: consumer
+          image: 
apache/dubbo-demo:dubbo-samples-extensibility-router-provider_0.0.1
+          imagePullPolicy: Always
+          ports:
+            - name: dubbo
+              containerPort: 20880
+              protocol: TCP
+---
+
+# Router Consumer
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+  name: dubbo-samples-extensibility-router-consumer
+  namespace: dubbo-demo
+spec:
+  replicas: 1
+  selector:
+    matchLabels:
+      app: dubbo-samples-extensibility-router-consumer
+  template:
+    metadata:
+      labels:
+        app: dubbo-samples-extensibility-router-consumer
+    spec:
+      containers:
+        - name: consumer
+          image: 
apache/dubbo-demo:dubbo-samples-extensibility-router-consumer_0.0.1
+          imagePullPolicy: Always
           ports:
             - name: dubbo
               containerPort: 20880
diff --git a/10-task/dubbo-samples-extensibility/deploy/router/Deployment.yml 
b/10-task/dubbo-samples-extensibility/deploy/router/Deployment.yml
new file mode 100644
index 00000000..097d5fbb
--- /dev/null
+++ b/10-task/dubbo-samples-extensibility/deploy/router/Deployment.yml
@@ -0,0 +1,65 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Provider
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+  name: dubbo-samples-extensibility-router-provider
+  namespace: dubbo-demo
+spec:
+  replicas: 2
+  selector:
+    matchLabels:
+      app: dubbo-samples-extensibility-router-provider
+  template:
+    metadata:
+      labels:
+        app: dubbo-samples-extensibility-router-provider
+    spec:
+      containers:
+        - name: consumer
+          image: 
apache/dubbo-demo:dubbo-samples-extensibility-router-provider_0.0.1
+          imagePullPolicy: Always
+          ports:
+            - name: dubbo
+              containerPort: 20880
+              protocol: TCP
+---
+
+# Consumer
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+  name: dubbo-samples-extensibility-router-consumer
+  namespace: dubbo-demo
+spec:
+  replicas: 1
+  selector:
+    matchLabels:
+      app: dubbo-samples-extensibility-router-consumer
+  template:
+    metadata:
+      labels:
+        app: dubbo-samples-extensibility-router-consumer
+    spec:
+      containers:
+        - name: consumer
+          image: 
apache/dubbo-demo:dubbo-samples-extensibility-router-consumer_0.0.1
+          imagePullPolicy: Always
+          ports:
+            - name: dubbo
+              containerPort: 20880
+              protocol: TCP
\ No newline at end of file
diff --git a/10-task/dubbo-samples-extensibility/pom.xml 
b/10-task/dubbo-samples-extensibility/dubbo-samples-extensibility-router-api/pom.xml
similarity index 71%
copy from 10-task/dubbo-samples-extensibility/pom.xml
copy to 
10-task/dubbo-samples-extensibility/dubbo-samples-extensibility-router-api/pom.xml
index 02617715..6cc7399e 100644
--- a/10-task/dubbo-samples-extensibility/pom.xml
+++ 
b/10-task/dubbo-samples-extensibility/dubbo-samples-extensibility-router-api/pom.xml
@@ -18,20 +18,19 @@
 <project xmlns="http://maven.apache.org/POM/4.0.0";
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";
          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
http://maven.apache.org/xsd/maven-4.0.0.xsd";>
+    <parent>
+        <groupId>org.apache</groupId>
+        <artifactId>apache</artifactId>
+        <version>23</version>
+        <relativePath/>
+    </parent>
     <modelVersion>4.0.0</modelVersion>
 
     <groupId>org.apache.dubbo.samples</groupId>
-    <artifactId>dubbo-samples-extensibility</artifactId>
-    <packaging>pom</packaging>
-    <version>1.0-SNAPSHOT</version>
+    <artifactId>dubbo-samples-extensibility-router-api</artifactId>
+    <version>0.0.1-SNAPSHOT</version>
 
-    <name>Extensibility Task</name>
-    <description>Dubbo Samples Extensibility Task</description>
-
-    <modules>
-        <module>dubbo-samples-extensibility-filter-api</module>
-        <module>dubbo-samples-extensibility-filter-provider</module>
-        <module>dubbo-samples-extensibility-filter-consumer</module>
-    </modules>
+    <name>Dubbo Extensibility Router Task - API</name>
+    <description>Dubbo Extensibility Router Task - API</description>
 
 </project>
\ No newline at end of file
diff --git 
a/10-task/dubbo-samples-extensibility/dubbo-samples-extensibility-router-api/src/main/java/org/apache/dubbo/samples/extensibility/router/api/ExtensibilityRouterService.java
 
b/10-task/dubbo-samples-extensibility/dubbo-samples-extensibility-router-api/src/main/java/org/apache/dubbo/samples/extensibility/router/api/ExtensibilityRouterService.java
new file mode 100644
index 00000000..842e422a
--- /dev/null
+++ 
b/10-task/dubbo-samples-extensibility/dubbo-samples-extensibility-router-api/src/main/java/org/apache/dubbo/samples/extensibility/router/api/ExtensibilityRouterService.java
@@ -0,0 +1,22 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.dubbo.samples.extensibility.router.api;
+
+public interface ExtensibilityRouterService {
+
+    String sayHello(String name);
+}
\ No newline at end of file
diff --git 
a/10-task/dubbo-samples-extensibility/dubbo-samples-extensibility-router-consumer/pom.xml
 
b/10-task/dubbo-samples-extensibility/dubbo-samples-extensibility-router-consumer/pom.xml
new file mode 100644
index 00000000..82e2c0e9
--- /dev/null
+++ 
b/10-task/dubbo-samples-extensibility/dubbo-samples-extensibility-router-consumer/pom.xml
@@ -0,0 +1,108 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+  -->
+<project xmlns="http://maven.apache.org/POM/4.0.0";
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
http://maven.apache.org/xsd/maven-4.0.0.xsd";>
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <groupId>org.springframework.boot</groupId>
+        <artifactId>spring-boot-starter-parent</artifactId>
+        <version>3.0.0</version>
+        <relativePath/> <!-- lookup parent from repository -->
+    </parent>
+
+    <groupId>org.apache.dubbo.samples</groupId>
+    <artifactId>dubbo-samples-extensibility-router-consumer</artifactId>
+    <version>0.0.1-SNAPSHOT</version>
+
+    <name>Dubbo Extensibility Router Task - Consumer</name>
+    <description>Dubbo Extensibility Router Task - Consumer</description>
+
+    <properties>
+        <java.version>17</java.version>
+        <dubbo.version>3.2.0-beta.4</dubbo.version>
+        <nacos.version>2.2.0</nacos.version>
+    </properties>
+
+    <dependencies>
+        <!-- common api -->
+        <dependency>
+            <groupId>org.apache.dubbo.samples</groupId>
+            <artifactId>dubbo-samples-extensibility-router-api</artifactId>
+            <version>0.0.1-SNAPSHOT</version>
+        </dependency>
+
+        <!-- registry dependency -->
+        <dependency>
+            <groupId>com.alibaba.nacos</groupId>
+            <artifactId>nacos-client</artifactId>
+            <version>${nacos.version}</version>
+        </dependency>
+
+        <!-- dubbo dependency-->
+        <dependency>
+            <groupId>org.apache.dubbo</groupId>
+            <artifactId>dubbo-spring-boot-starter</artifactId>
+            <version>${dubbo.version}</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-test</artifactId>
+            <scope>test</scope>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.graalvm.buildtools</groupId>
+                <artifactId>native-maven-plugin</artifactId>
+            </plugin>
+            <plugin>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+            </plugin>
+            <plugin>
+                <groupId>com.google.cloud.tools</groupId>
+                <artifactId>jib-maven-plugin</artifactId>
+                <version>3.2.1</version>
+                <configuration>
+                    <to>
+                        
<image>apache/dubbo-demo:dubbo-samples-extensibility-router-consumer_0.0.1</image>
+                    </to>
+                    <container>
+                        <jvmFlags>
+                            
<jvmFlag>-Dnacos.address=nacos.dubbo-system.svc</jvmFlag>
+                        </jvmFlags>
+                        <ports>
+                            <port>20881</port>
+                            <port>20991</port>
+                        </ports>
+                    </container>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+
+</project>
\ No newline at end of file
diff --git 
a/10-task/dubbo-samples-extensibility/dubbo-samples-extensibility-router-consumer/src/main/java/org/apache/dubbo/samples/extensibility/router/consumer/ExtensibilityRouterConsumerApplication.java
 
b/10-task/dubbo-samples-extensibility/dubbo-samples-extensibility-router-consumer/src/main/java/org/apache/dubbo/samples/extensibility/router/consumer/ExtensibilityRouterConsumerApplication.java
new file mode 100644
index 00000000..3223cd4c
--- /dev/null
+++ 
b/10-task/dubbo-samples-extensibility/dubbo-samples-extensibility-router-consumer/src/main/java/org/apache/dubbo/samples/extensibility/router/consumer/ExtensibilityRouterConsumerApplication.java
@@ -0,0 +1,27 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.dubbo.samples.extensibility.router.consumer;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+public class ExtensibilityRouterConsumerApplication {
+    public static void main(String[] args) {
+        SpringApplication.run(ExtensibilityRouterConsumerApplication.class, 
args);
+    }
+}
\ No newline at end of file
diff --git 
a/10-task/dubbo-samples-extensibility/dubbo-samples-extensibility-router-consumer/src/main/java/org/apache/dubbo/samples/extensibility/router/consumer/ExtensibilityRouterConsumerTask.java
 
b/10-task/dubbo-samples-extensibility/dubbo-samples-extensibility-router-consumer/src/main/java/org/apache/dubbo/samples/extensibility/router/consumer/ExtensibilityRouterConsumerTask.java
new file mode 100644
index 00000000..785bb569
--- /dev/null
+++ 
b/10-task/dubbo-samples-extensibility/dubbo-samples-extensibility-router-consumer/src/main/java/org/apache/dubbo/samples/extensibility/router/consumer/ExtensibilityRouterConsumerTask.java
@@ -0,0 +1,33 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.dubbo.samples.extensibility.router.consumer;
+
+import org.apache.dubbo.config.annotation.DubboReference;
+import 
org.apache.dubbo.samples.extensibility.router.api.ExtensibilityRouterService;
+import org.springframework.boot.CommandLineRunner;
+import org.springframework.stereotype.Component;
+
+@Component
+public class ExtensibilityRouterConsumerTask implements CommandLineRunner {
+    @DubboReference
+    private ExtensibilityRouterService extensibilityRouterService;
+
+    @Override
+    public void run(String... args) {
+        System.out.println("Dubbo Remote Return ======> " + 
this.extensibilityRouterService.sayHello("dubbo"));
+    }
+}
diff --git 
a/10-task/dubbo-samples-extensibility/dubbo-samples-extensibility-router-consumer/src/main/java/org/apache/dubbo/samples/extensibility/router/consumer/router/StickFirstStateRouter.java
 
b/10-task/dubbo-samples-extensibility/dubbo-samples-extensibility-router-consumer/src/main/java/org/apache/dubbo/samples/extensibility/router/consumer/router/StickFirstStateRouter.java
new file mode 100644
index 00000000..632d9fd0
--- /dev/null
+++ 
b/10-task/dubbo-samples-extensibility/dubbo-samples-extensibility-router-consumer/src/main/java/org/apache/dubbo/samples/extensibility/router/consumer/router/StickFirstStateRouter.java
@@ -0,0 +1,81 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.dubbo.samples.extensibility.router.consumer.router;
+
+import org.apache.dubbo.common.URL;
+import org.apache.dubbo.common.config.configcenter.ConfigChangeType;
+import org.apache.dubbo.common.config.configcenter.ConfigChangedEvent;
+import org.apache.dubbo.common.config.configcenter.ConfigurationListener;
+import org.apache.dubbo.common.logger.ErrorTypeAwareLogger;
+import org.apache.dubbo.common.logger.LoggerFactory;
+import org.apache.dubbo.common.utils.CollectionUtils;
+import org.apache.dubbo.common.utils.Holder;
+import org.apache.dubbo.rpc.Invocation;
+import org.apache.dubbo.rpc.Invoker;
+import org.apache.dubbo.rpc.RpcException;
+import org.apache.dubbo.rpc.cluster.router.RouterSnapshotNode;
+import org.apache.dubbo.rpc.cluster.router.state.AbstractStateRouter;
+import org.apache.dubbo.rpc.cluster.router.state.BitList;
+
+public class StickFirstStateRouter<T> extends AbstractStateRouter<T> 
implements ConfigurationListener {
+    public StickFirstStateRouter(URL url) {
+        super(url);
+    }
+
+    public static final String NAME = "STICK_FIRST_ROUTER";
+    private static final ErrorTypeAwareLogger logger = 
LoggerFactory.getErrorTypeAwareLogger(StickFirstStateRouter.class);
+    private volatile BitList<Invoker<T>> firstInvokers;
+
+    @Override
+    protected BitList<Invoker<T>> doRoute(BitList<Invoker<T>> invokers, URL 
url, Invocation invocation, boolean needToPrintMessage, 
Holder<RouterSnapshotNode<T>> routerSnapshotNodeHolder, Holder<String> 
messageHolder) throws RpcException {
+        if (CollectionUtils.isEmpty(invokers)) {
+            if (needToPrintMessage) {
+                messageHolder.set("Directly Return. Reason: Invokers from 
previous router is empty.");
+            }
+            return invokers;
+        }
+        BitList<Invoker<T>> copy = invokers.clone();
+        if (CollectionUtils.isEmpty(copy)) {
+            this.firstInvokers = new BitList<>(BitList.emptyList());
+            this.firstInvokers.add(copy.get(0));
+        } else {
+            this.firstInvokers = copy.and(invokers);
+            if(CollectionUtils.isEmpty(this.firstInvokers)){
+                this.firstInvokers.add(copy.get(0));
+            }
+        }
+        return this.firstInvokers;
+    }
+
+    @Override
+    public void process(ConfigChangedEvent event) {
+        if (logger.isDebugEnabled()) {
+            logger.debug("Notification of tag rule, change type is: " + 
event.getChangeType() + ", raw rule is:\n " +
+                    event.getContent());
+        }
+        // Reset
+        if (event.getChangeType().equals(ConfigChangeType.DELETED)) {
+            this.firstInvokers = null;
+        }
+    }
+
+    @Override
+    public void stop() {
+        super.stop();
+        this.firstInvokers = null;
+    }
+}
diff --git 
a/10-task/dubbo-samples-extensibility/dubbo-samples-extensibility-router-consumer/src/main/java/org/apache/dubbo/samples/extensibility/router/consumer/router/StickFirstStateRouterFactory.java
 
b/10-task/dubbo-samples-extensibility/dubbo-samples-extensibility-router-consumer/src/main/java/org/apache/dubbo/samples/extensibility/router/consumer/router/StickFirstStateRouterFactory.java
new file mode 100644
index 00000000..5b9553eb
--- /dev/null
+++ 
b/10-task/dubbo-samples-extensibility/dubbo-samples-extensibility-router-consumer/src/main/java/org/apache/dubbo/samples/extensibility/router/consumer/router/StickFirstStateRouterFactory.java
@@ -0,0 +1,28 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.dubbo.samples.extensibility.router.consumer.router;
+
+import org.apache.dubbo.common.URL;
+import org.apache.dubbo.rpc.cluster.router.state.StateRouter;
+import org.apache.dubbo.rpc.cluster.router.state.StateRouterFactory;
+
+public class StickFirstStateRouterFactory implements StateRouterFactory {
+    @Override
+    public <T> StateRouter<T> getRouter(Class<T> interfaceClass, URL url) {
+        return new StickFirstStateRouter<>(url);
+    }
+}
diff --git 
a/10-task/dubbo-samples-extensibility/dubbo-samples-extensibility-router-consumer/src/main/resources/META-INF/dubbo/org.apache.dubbo.rpc.cluster.router.state.StateRouterFactory
 
b/10-task/dubbo-samples-extensibility/dubbo-samples-extensibility-router-consumer/src/main/resources/META-INF/dubbo/org.apache.dubbo.rpc.cluster.router.state.StateRouterFactory
new file mode 100644
index 00000000..fd9ad9f6
--- /dev/null
+++ 
b/10-task/dubbo-samples-extensibility/dubbo-samples-extensibility-router-consumer/src/main/resources/META-INF/dubbo/org.apache.dubbo.rpc.cluster.router.state.StateRouterFactory
@@ -0,0 +1 @@
+stickfirst=org.apache.dubbo.samples.extensibility.router.consumer.router.StickFirstStateRouterFactory
\ No newline at end of file
diff --git 
a/10-task/dubbo-samples-extensibility/dubbo-samples-extensibility-router-consumer/src/main/resources/application.properties
 
b/10-task/dubbo-samples-extensibility/dubbo-samples-extensibility-router-consumer/src/main/resources/application.properties
new file mode 100644
index 00000000..702c2bbc
--- /dev/null
+++ 
b/10-task/dubbo-samples-extensibility/dubbo-samples-extensibility-router-consumer/src/main/resources/application.properties
@@ -0,0 +1,26 @@
+#   Licensed to the Apache Software Foundation (ASF) under one or more
+#   contributor license agreements.  See the NOTICE file distributed with
+#   this work for additional information regarding copyright ownership.
+#   The ASF licenses this file to You under the Apache License, Version 2.0
+#   (the "License"); you may not use this file except in compliance with
+#   the License.  You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+#   Unless required by applicable law or agreed to in writing, software
+#   distributed under the License is distributed on an "AS IS" BASIS,
+#   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+#   See the License for the specific language governing permissions and
+#   limitations under the License.
+
+# Specify the application name of Dubbo
+dubbo.application.name=extensibility-filter-consumer
+
+# Enable token verification for each invocation
+dubbo.provider.token=true
+
+# Specify the registry address
+dubbo.registry.address=nacos://localhost:8848?username=nacos&password=nacos
+# 
dubbo.registry.address=nacos://${nacos.address:localhost}:8848?username=nacos&password=nacos
+
+dubbo.consumer.router=stickfirst
\ No newline at end of file
diff --git 
a/10-task/dubbo-samples-extensibility/dubbo-samples-extensibility-router-provider/pom.xml
 
b/10-task/dubbo-samples-extensibility/dubbo-samples-extensibility-router-provider/pom.xml
new file mode 100644
index 00000000..28c9f387
--- /dev/null
+++ 
b/10-task/dubbo-samples-extensibility/dubbo-samples-extensibility-router-provider/pom.xml
@@ -0,0 +1,107 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+  -->
+<project xmlns="http://maven.apache.org/POM/4.0.0";
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
http://maven.apache.org/xsd/maven-4.0.0.xsd";>
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <groupId>org.springframework.boot</groupId>
+        <artifactId>spring-boot-starter-parent</artifactId>
+        <version>3.0.0</version>
+        <relativePath/> <!-- lookup parent from repository -->
+    </parent>
+
+    <groupId>org.apache.dubbo.samples</groupId>
+    <artifactId>dubbo-samples-extensibility-router-provider</artifactId>
+    <version>0.0.1-SNAPSHOT</version>
+
+    <name>Dubbo Extensibility Router Task - Provider</name>
+    <description>Dubbo Extensibility Router Task - Provider</description>
+
+    <properties>
+        <java.version>17</java.version>
+        <dubbo.version>3.2.0-beta.4</dubbo.version>
+        <nacos.version>2.2.0</nacos.version>
+    </properties>
+
+    <dependencies>
+        <!-- common api -->
+        <dependency>
+            <groupId>org.apache.dubbo.samples</groupId>
+            <artifactId>dubbo-samples-extensibility-router-api</artifactId>
+            <version>0.0.1-SNAPSHOT</version>
+        </dependency>
+
+        <!-- registry dependency -->
+        <dependency>
+            <groupId>com.alibaba.nacos</groupId>
+            <artifactId>nacos-client</artifactId>
+            <version>${nacos.version}</version>
+        </dependency>
+
+        <!-- dubbo dependency-->
+        <dependency>
+            <groupId>org.apache.dubbo</groupId>
+            <artifactId>dubbo-spring-boot-starter</artifactId>
+            <version>${dubbo.version}</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-test</artifactId>
+            <scope>test</scope>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.graalvm.buildtools</groupId>
+                <artifactId>native-maven-plugin</artifactId>
+            </plugin>
+            <plugin>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+            </plugin>
+            <plugin>
+                <groupId>com.google.cloud.tools</groupId>
+                <artifactId>jib-maven-plugin</artifactId>
+                <version>3.2.1</version>
+                <configuration>
+                    <to>
+                        
<image>apache/dubbo-demo:dubbo-samples-extensibility-router-provider_0.0.1</image>
+                    </to>
+                    <container>
+                        <jvmFlags>
+                            
<jvmFlag>-Dnacos.address=nacos.dubbo-system.svc</jvmFlag>
+                        </jvmFlags>
+                        <ports>
+                            <port>20881</port>
+                            <port>20991</port>
+                        </ports>
+                    </container>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+</project>
\ No newline at end of file
diff --git 
a/10-task/dubbo-samples-extensibility/dubbo-samples-extensibility-router-provider/src/main/java/org/apache/dubbo/samples/extensibility/router/provider/ExtensibilityRouterProviderApplication.java
 
b/10-task/dubbo-samples-extensibility/dubbo-samples-extensibility-router-provider/src/main/java/org/apache/dubbo/samples/extensibility/router/provider/ExtensibilityRouterProviderApplication.java
new file mode 100644
index 00000000..c83b2d1e
--- /dev/null
+++ 
b/10-task/dubbo-samples-extensibility/dubbo-samples-extensibility-router-provider/src/main/java/org/apache/dubbo/samples/extensibility/router/provider/ExtensibilityRouterProviderApplication.java
@@ -0,0 +1,29 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.dubbo.samples.extensibility.router.provider;
+
+import org.apache.dubbo.config.spring.context.annotation.EnableDubbo;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@EnableDubbo
+@SpringBootApplication
+public class ExtensibilityRouterProviderApplication {
+    public static void main(String[] args) {
+        SpringApplication.run(ExtensibilityRouterProviderApplication.class, 
args);
+    }
+}
\ No newline at end of file
diff --git 
a/10-task/dubbo-samples-extensibility/dubbo-samples-extensibility-router-provider/src/main/java/org/apache/dubbo/samples/extensibility/router/provider/ExtensibilityRouterServiceImpl.java
 
b/10-task/dubbo-samples-extensibility/dubbo-samples-extensibility-router-provider/src/main/java/org/apache/dubbo/samples/extensibility/router/provider/ExtensibilityRouterServiceImpl.java
new file mode 100644
index 00000000..fd9111b3
--- /dev/null
+++ 
b/10-task/dubbo-samples-extensibility/dubbo-samples-extensibility-router-provider/src/main/java/org/apache/dubbo/samples/extensibility/router/provider/ExtensibilityRouterServiceImpl.java
@@ -0,0 +1,29 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.dubbo.samples.extensibility.router.provider;
+
+import org.apache.dubbo.config.annotation.DubboService;
+import 
org.apache.dubbo.samples.extensibility.router.api.ExtensibilityRouterService;
+
+@DubboService
+public class ExtensibilityRouterServiceImpl implements 
ExtensibilityRouterService {
+
+    @Override
+    public String sayHello(String name) {
+        return "Hello, " + name;
+    }
+}
diff --git 
a/10-task/dubbo-samples-extensibility/dubbo-samples-extensibility-router-provider/src/main/resources/application.properties
 
b/10-task/dubbo-samples-extensibility/dubbo-samples-extensibility-router-provider/src/main/resources/application.properties
new file mode 100644
index 00000000..630d6438
--- /dev/null
+++ 
b/10-task/dubbo-samples-extensibility/dubbo-samples-extensibility-router-provider/src/main/resources/application.properties
@@ -0,0 +1,27 @@
+#   Licensed to the Apache Software Foundation (ASF) under one or more
+#   contributor license agreements.  See the NOTICE file distributed with
+#   this work for additional information regarding copyright ownership.
+#   The ASF licenses this file to You under the Apache License, Version 2.0
+#   (the "License"); you may not use this file except in compliance with
+#   the License.  You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+#   Unless required by applicable law or agreed to in writing, software
+#   distributed under the License is distributed on an "AS IS" BASIS,
+#   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+#   See the License for the specific language governing permissions and
+#   limitations under the License.
+
+# Specify the application name of Dubbo
+dubbo.application.name=extensibility-router-provider
+
+# Enable token verification for each invocation
+dubbo.provider.token=true
+
+# Specify the registry address
+dubbo.registry.address=nacos://localhost:8848?username=nacos&password=nacos
+# 
dubbo.registry.address=nacos://${nacos.address:localhost}:8848?username=nacos&password=nacos
+
+# Specify the port of Dubbo protocol
+dubbo.protocol.port=20881
\ No newline at end of file
diff --git a/10-task/dubbo-samples-extensibility/pom.xml 
b/10-task/dubbo-samples-extensibility/pom.xml
index 02617715..c24b6ca8 100644
--- a/10-task/dubbo-samples-extensibility/pom.xml
+++ b/10-task/dubbo-samples-extensibility/pom.xml
@@ -32,6 +32,9 @@
         <module>dubbo-samples-extensibility-filter-api</module>
         <module>dubbo-samples-extensibility-filter-provider</module>
         <module>dubbo-samples-extensibility-filter-consumer</module>
+        <module>dubbo-samples-extensibility-router-api</module>
+        <module>dubbo-samples-extensibility-router-provider</module>
+        <module>dubbo-samples-extensibility-router-consumer</module>
     </modules>
 
 </project>
\ No newline at end of file


---------------------------------------------------------------------
To unsubscribe, e-mail: notifications-unsubscr...@dubbo.apache.org
For additional commands, e-mail: notifications-h...@dubbo.apache.org


Reply via email to