RPC中服务路由简单功能的实现

背景

无论是开源的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);
    }
}

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容