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

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


The following commit(s) were added to refs/heads/master by this push:
     new 2c8ecb8  Add a new Router class for making requests targeted at 
specified ip and port (#7756)
2c8ecb8 is described below

commit 2c8ecb8051d49d4bc13bb41b0753ac74be9cb5c9
Author: 张志勇 <[email protected]>
AuthorDate: Wed May 19 22:06:51 2021 +0800

    Add a new Router class for making requests targeted at specified ip and 
port (#7756)
---
 .../dubbo/rpc/cluster/router/address/Address.java  | 41 +++++++++++++++
 .../router/address/AddressInvokersSelector.java    | 58 ++++++++++++++++++++++
 .../router/address/AddressRouterFactory.java       | 37 ++++++++++++++
 .../org.apache.dubbo.rpc.cluster.RouterFactory     |  1 +
 .../dubbo/rpc/cluster/router/MockInvoker.java      |  6 +++
 .../cluster/router/address/AddressRouterTest.java  | 50 +++++++++++++++++++
 6 files changed, 193 insertions(+)

diff --git 
a/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/router/address/Address.java
 
b/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/router/address/Address.java
new file mode 100644
index 0000000..69e26fa
--- /dev/null
+++ 
b/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/router/address/Address.java
@@ -0,0 +1,41 @@
+/*
+ * 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.rpc.cluster.router.address;
+
+import java.io.Serializable;
+
+public class Address implements Serializable {
+
+    private final String ip;
+
+    private final int port;
+
+    public Address(String ip, int port) {
+        this.ip = ip;
+        this.port = port;
+    }
+
+    public String getIp() {
+        return ip;
+    }
+
+    public int getPort() {
+        return port;
+    }
+
+}
diff --git 
a/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/router/address/AddressInvokersSelector.java
 
b/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/router/address/AddressInvokersSelector.java
new file mode 100644
index 0000000..a75e6d1
--- /dev/null
+++ 
b/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/router/address/AddressInvokersSelector.java
@@ -0,0 +1,58 @@
+/*
+ * 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.rpc.cluster.router.address;
+
+import org.apache.dubbo.common.URL;
+import org.apache.dubbo.common.utils.CollectionUtils;
+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.AbstractRouter;
+
+import java.util.List;
+import java.util.Optional;
+import java.util.stream.Collectors;
+
+public class AddressInvokersSelector extends AbstractRouter {
+
+    public static final String NAME = "ADDRESS_ROUTER";
+
+    private static final int ADDRESS_INVOKERS_DEFAULT_PRIORITY = 180;
+
+    public AddressInvokersSelector() {
+        this.priority = ADDRESS_INVOKERS_DEFAULT_PRIORITY;
+    }
+
+    @Override
+    public <T> List<Invoker<T>> route(final List<Invoker<T>> invokers,
+                                      URL url, final Invocation invocation) 
throws RpcException {
+        if (CollectionUtils.isEmpty(invokers)) {
+            return invokers;
+        }
+
+        if (invocation.getObjectAttachments() != null) {
+            Address address = 
Address.class.cast(invocation.getObjectAttachment(AddressRouterFactory.NAME));
+            if (Optional.ofNullable(address).isPresent()) {
+                
invocation.getObjectAttachments().remove(AddressRouterFactory.NAME);
+                return invokers.stream().filter(it -> 
it.getUrl().getIp().equals(address.getIp()) && (it.getUrl().getPort() == 
address.getPort()) && it.isAvailable()).collect(Collectors.toList());
+            }
+        }
+        return invokers;
+    }
+
+
+}
diff --git 
a/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/router/address/AddressRouterFactory.java
 
b/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/router/address/AddressRouterFactory.java
new file mode 100644
index 0000000..b6d57f2
--- /dev/null
+++ 
b/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/router/address/AddressRouterFactory.java
@@ -0,0 +1,37 @@
+/*
+ * 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.rpc.cluster.router.address;
+
+import org.apache.dubbo.common.URL;
+import org.apache.dubbo.common.extension.Activate;
+import org.apache.dubbo.rpc.cluster.Router;
+import org.apache.dubbo.rpc.cluster.RouterFactory;
+
+/**
+ * AddressRouterFactory
+ */
+@Activate(value = AddressRouterFactory.NAME)
+public class AddressRouterFactory implements RouterFactory {
+
+    public static final String NAME = "address";
+
+    @Override
+    public Router getRouter(URL url) {
+        return new AddressInvokersSelector();
+    }
+
+}
diff --git 
a/dubbo-cluster/src/main/resources/META-INF/dubbo/internal/org.apache.dubbo.rpc.cluster.RouterFactory
 
b/dubbo-cluster/src/main/resources/META-INF/dubbo/internal/org.apache.dubbo.rpc.cluster.RouterFactory
index 9416bcc..62bcf91 100644
--- 
a/dubbo-cluster/src/main/resources/META-INF/dubbo/internal/org.apache.dubbo.rpc.cluster.RouterFactory
+++ 
b/dubbo-cluster/src/main/resources/META-INF/dubbo/internal/org.apache.dubbo.rpc.cluster.RouterFactory
@@ -4,3 +4,4 @@ 
service=org.apache.dubbo.rpc.cluster.router.condition.config.ServiceRouterFactor
 app=org.apache.dubbo.rpc.cluster.router.condition.config.AppRouterFactory
 tag=org.apache.dubbo.rpc.cluster.router.tag.TagRouterFactory
 mock=org.apache.dubbo.rpc.cluster.router.mock.MockRouterFactory
+address=org.apache.dubbo.rpc.cluster.router.address.AddressRouterFactory
\ No newline at end of file
diff --git 
a/dubbo-cluster/src/test/java/org/apache/dubbo/rpc/cluster/router/MockInvoker.java
 
b/dubbo-cluster/src/test/java/org/apache/dubbo/rpc/cluster/router/MockInvoker.java
index 1285c95..934d387 100644
--- 
a/dubbo-cluster/src/test/java/org/apache/dubbo/rpc/cluster/router/MockInvoker.java
+++ 
b/dubbo-cluster/src/test/java/org/apache/dubbo/rpc/cluster/router/MockInvoker.java
@@ -38,6 +38,12 @@ public class MockInvoker<T> implements Invoker<T> {
         this.available = available;
     }
 
+    public MockInvoker(URL url, boolean available) {
+        super();
+        this.url = url;
+        this.available = available;
+    }
+
     @Override
     public Class<T> getInterface() {
         return null;
diff --git 
a/dubbo-cluster/src/test/java/org/apache/dubbo/rpc/cluster/router/address/AddressRouterTest.java
 
b/dubbo-cluster/src/test/java/org/apache/dubbo/rpc/cluster/router/address/AddressRouterTest.java
new file mode 100644
index 0000000..93617f4
--- /dev/null
+++ 
b/dubbo-cluster/src/test/java/org/apache/dubbo/rpc/cluster/router/address/AddressRouterTest.java
@@ -0,0 +1,50 @@
+/*
+ * 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.rpc.cluster.router.address;
+
+import org.apache.dubbo.common.URL;
+import org.apache.dubbo.rpc.Invocation;
+import org.apache.dubbo.rpc.Invoker;
+import org.apache.dubbo.rpc.RpcInvocation;
+import org.apache.dubbo.rpc.cluster.Router;
+import org.apache.dubbo.rpc.cluster.router.MockInvoker;
+
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.Test;
+
+import java.util.ArrayList;
+import java.util.List;
+
+
+public class AddressRouterTest {
+
+
+    @Test
+    public void testAddressRouteSelector() {
+        Router router = new 
AddressRouterFactory().getRouter(URL.valueOf("url"));
+        List<Invoker<String>> invokers = new ArrayList<Invoker<String>>();
+        invokers.add(new MockInvoker<>(new URL("dubbo", "129.34.56.7", 8809), 
true));
+        invokers.add(new MockInvoker<>(new URL("dubbo", "129.34.56.8", 8809), 
true));
+        invokers.add(new MockInvoker<>(new URL("dubbo", "129.34.56.9", 8809), 
true));
+        Invocation invocation = new RpcInvocation();
+        Address address = new Address("129.34.56.9", 8809);
+        invocation.setObjectAttachment("address", address);
+        List<Invoker<String>> list = router.route(invokers, 
URL.valueOf("url"), invocation);
+        Assertions.assertEquals(address.getIp(), 
list.get(0).getUrl().getHost());
+    }
+}

Reply via email to