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());
+ }
+}