背景
无论是开源的RPC框架,还是自己动手来实现远程服务的调用,都面临着共同的问题:服务的上下线引起的服务调用地址的变化
本文就针对这一小功能点,做一个小小的实现。
其实本文隶属于 Copy-on-Write模式 中的 一个应用,单独拆分出来
直接上代码吧:
public class RouterTable {
/**
* 保存服务名称与服务地址映射关系
*/
private ConcurrentMap<String, CopyOnWriteArraySet<Router>> rt = new ConcurrentHashMap<>();
/**
* 根据服务名称获取服务集合
*
* @param iface
* @return
*/
public Set<Router> get(String iface) {
return rt.get(iface);
}
/**
* 上线新的服务地址
*
* @param router
*/
public void add(Router router) {
Objects.requireNonNull(router);
Set<Router> routers = this.get(router.getIface());
routers.add(router);
}
/**
* 下线服务地址
*
* @param router
* @return
*/
public boolean remove(Router router) {
Objects.requireNonNull(router);
return this.get(router.getIface()).remove(router);
}
}
final class Router {
private final String ip;
private final Integer port;
private final String iface;
public String getIp() {
return ip;
}
public Integer getPort() {
return port;
}
public String getIface() {
return iface;
}
public Router(String ip, Integer port, String iface) {
this.ip = ip;
this.port = port;
this.iface = iface;
}
@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (o == null || getClass() != o.getClass()) {
return false;
}
Router router = (Router) o;
return ip.equals(router.getIp()) && port.equals(router.getPort()) && iface.equals(router.getIface());
}
@Override
public int hashCode() {
return Objects.hash(ip, port, iface);
}
}