- 新建集群
import com.alibaba.dubbo.rpc.Invoker; import com.alibaba.dubbo.rpc.RpcException; import com.alibaba.dubbo.rpc.cluster.Cluster; import com.alibaba.dubbo.rpc.cluster.Directory; public class IpRouteCluster implements Cluster { public final static String NAME = "iproute"; @Override public <T> Invoker<T> join(Directory<T> directory) throws RpcException { return new IpRouteClusterInvoker<T>(directory); } }
- 新建集群调用者
import com.alibaba.dubbo.common.logger.Logger; import com.alibaba.dubbo.common.logger.LoggerFactory; import com.alibaba.dubbo.rpc.Invocation; import com.alibaba.dubbo.rpc.Invoker; import com.alibaba.dubbo.rpc.Result; import com.alibaba.dubbo.rpc.RpcException; import com.alibaba.dubbo.rpc.cluster.Directory; import com.alibaba.dubbo.rpc.cluster.LoadBalance; import com.alibaba.dubbo.rpc.cluster.support.AbstractClusterInvoker; import com.alibaba.dubbo.rpc.cluster.support.FailoverClusterInvoker; import lombok.extern.slf4j.Slf4j; import java.util.List; @Slf4j public class IpRouteClusterInvoker<T> extends AbstractClusterInvoker<T> { private FailoverClusterInvoker<T> failoverClusterInvoker; private static final Logger logger = LoggerFactory.getLogger(IpRouteClusterInvoker.class); public IpRouteClusterInvoker(Directory<T> directory) { super(directory); failoverClusterInvoker = new FailoverClusterInvoker<>(directory); } @Override protected Result doInvoke(Invocation invocation, List<Invoker<T>> invokers, LoadBalance loadbalance) throws RpcException { // TODO 筛选策略 // Failover Cluster 失败自动切换,当出现失败,重试其它服务器。通常用于读操作,但重试会带来更长延迟。 // Failfast Cluster 快速失败,只发起一次调用,失败立即报错。通常用于非幂等性的写操作,比如新增记录。 // Failsafe Cluster 失败安全,出现异常时,直接忽略。通常用于写入审计日志等操作。 // Failback Cluster 失败自动恢复,后台记录失败请求,定时重发。通常用于消息通知操作。 // Forking Cluster 并行调用多个服务器,只要一个成功即返回。通常用于实时性要求较高的读操作,但需要浪费更多服务资源。 // Broadcast Cluster 广播调用所有提供者,逐个调用,任意一台报错则报错。通常用于通知所有提供者更新缓存或日志等本地资源信息。 return failoverClusterInvoker.doInvoke(invocation,invokers,loadbalance); } }
- 在/resrouces/META-INF/dubbo/目录新建com.alibaba.dubbo.rpc.cluster.Cluster配置文件
iproute=com.zjy.iot.smart.gateway.framework.handler.IpRouteCluster
- 在Consumer端配置Cluster
<dubbo:consumer cluster="iproute"/>