最近接到一个需求,需求中需要通过服务的ip+port在注册中心中指定服务来处理请求。
实现方式为:
1、重新实现ProxyFactory类,增加isSpecified属性、unresolvedSocketAddress属性,
增加初始化这两个属性的方法isSpecified,初始化前面两个属性的值;
dispatcher方法增加对isSpecified属性的判断,如果是指定ip的进入新创建的Dispatcher
实现类来处理;
2、新增一个Dispatcher实现类,继承AbstractDispatcher类,将select类里的软负载均衡改为指定。
具体代码如下:
/*
* Copyright (c) 2015 The Jupiter Project
*
* Licensed 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.jupiter.rpc.consumer;
import java.util.Collections;
import java.util.List;
import org.jupiter.common.util.JConstants;
import org.jupiter.common.util.Lists;
import org.jupiter.common.util.Proxies;
import org.jupiter.common.util.Requires;
import org.jupiter.common.util.Strings;
import org.jupiter.rpc.DispatchType;
import org.jupiter.rpc.InvokeType;
import org.jupiter.rpc.JClient;
import org.jupiter.rpc.ServiceProvider;
import org.jupiter.rpc.consumer.cluster.ClusterInvoker;
import org.jupiter.rpc.consumer.dispatcher.CiccOmsDispatcher;
import org.jupiter.rpc.consumer.dispatcher.DefaultBroadcastDispatcher;
import org.jupiter.rpc.consumer.dispatcher.DefaultRoundDispatcher;
import org.jupiter.rpc.consumer.dispatcher.Dispatcher;
import org.jupiter.rpc.consumer.invoker.AsyncInvoker;
import org.jupiter.rpc.consumer.invoker.AutoInvoker;
import org.jupiter.rpc.load.balance.LoadBalancerFactory;
import org.jupiter.rpc.load.balance.LoadBalancerType;
import org.jupiter.rpc.model.metadata.ClusterStrategyConfig;
import org.jupiter.rpc.model.metadata.MethodSpecialConfig;
import org.jupiter.rpc.model.metadata.ServiceMetadata;
import org.jupiter.serialization.SerializerType;
import org.jupiter.transport.*;
/**
* Proxy factory
*
* Consumer对象代理工厂, [group, providerName, version]
*
* jupiter
* org.jupiter.rpc.consumer
*
* @author wangjp
*/
public class ProxyFactory<I> {
// 接口类型
private final Class<I> interfaceClass;
// 服务组别
private String group;
// 服务名称
private String providerName;
// 服务版本号, 通常在接口不兼容时版本号才需要升级
private String version;
// jupiter client
private JClient client;
// 序列化/反序列化方式
private SerializerType serializerType = SerializerType.getDefault();
// 软负载均衡类型
private LoadBalancerType loadBalancerType = LoadBalancerType.getDefault();
// 基于ExtSpiLoadBalancerFactory扩展的负载均衡可以选择指定名字, 可以利用名字作为唯一标识扩展多种类型的负载均衡
private String extLoadBalancerName;
// provider地址
private List<UnresolvedAddress> addresses;
// 调用方式 [同步, 异步]
private Invo