首页 > 其他分享 >SPI学习记录

SPI学习记录

时间:2023-02-19 20:22:57浏览次数:30  
标签:记录 private class 学习 SPI new final 加载

SPI学习记录

场景

采用Netty实现一个RPC框架,对于其中的服务发现机制,我们希望具有较强的扩展性,因此采用SPI机制来实现。

  1. 首先定义一个SPI注解,所有带有SPI注解的类支持SPI机制。
SPI注解类
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface SPI {
}
服务发现接口
@SPI
public interface ServiceDiscovery {
    /**
     * lookup service by rpcServiceName
     *
     * @param rpcRequest rpc service pojo
     * @return service address
     */
    InetSocketAddress lookupService(RpcRequest rpcRequest);
}
  1. 定义扩展加载类
    其中包含3个static final修饰的类变量,分别对应服务发现的目录、扩展类加载器缓存、扩展类缓存。
    对于每个类加载器实例对象,需要维护3个信息:目标加载类class对象(对应接口类)、目标加载类的实例对象(这里用holder封装了一层)、目标加载类的class对象(对应实际加载类)
扩展加载类
public final class ExtensionLoader<T> {

    private static final String SERVICE_DIRECTORY = "META-INF/extensions/";
    private static final Map<Class<?>, ExtensionLoader<?>> EXTENSION_LOADERS = new ConcurrentHashMap<>();
    private static final Map<Class<?>, Object> EXTENSION_INSTANCES = new ConcurrentHashMap<>();

    private final Class<?> type;
    private final Map<String, Holder<Object>> cachedInstances = new ConcurrentHashMap<>();
    private final Holder<Map<String, Class<?>>> cachedClasses = new Holder<>();
  1. 通过类加载器ExtensionLoader,加载指定的类即可直接使用
客户端加载服务发现机制
public NettyRpcClient() {
        // initialize resources such as EventLoopGroup, Bootstrap
        eventLoopGroup = new NioEventLoopGroup();
        bootstrap = new Bootstrap();
        bootstrap.group(eventLoopGroup)
                .channel(NioSocketChannel.class)
                .handler(new LoggingHandler(LogLevel.INFO))
                //  The timeout period of the connection.
                //  If this time is exceeded or the connection cannot be established, the connection fails.
                .option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 5000)
                .handler(new ChannelInitializer<SocketChannel>() {
                    @Override
                    protected void initChannel(SocketChannel ch) {
                        ChannelPipeline p = ch.pipeline();
                        // If no data is sent to the server within 15 seconds, a heartbeat request is sent
                        p.addLast(new IdleStateHandler(0, 5, 0, TimeUnit.SECONDS));
                        p.addLast(new RpcMessageEncoder());
                        p.addLast(new RpcMessageDecoder());
                        p.addLast(new NettyRpcClientHandler());
                    }
                });
        this.serviceDiscovery = ExtensionLoader.getExtensionLoader(ServiceDiscovery.class).getExtension("zk");
        this.unprocessedRequests = SingletonFactory.getInstance(UnprocessedRequests.class);
        this.channelProvider = SingletonFactory.getInstance(ChannelProvider.class);
    }

标签:记录,private,class,学习,SPI,new,final,加载
From: https://www.cnblogs.com/houlixie/p/17135483.html

相关文章

  • 学习ASP.NET Core Blazor编程系列二十六——登录(5)
    学习ASP.NETCoreBlazor编程系列文章之目录学习ASP.NETCoreBlazor编程系列一——综述学习ASP.NETCoreBlazor编程系列二——第一个Blazor应用程序(上)学习A......
  • PHP学习笔记(一谦四益)
    前言上一篇文章​​ PHP学习笔记(观隅反三)​​介绍了PHP中的数组,这篇文章接着学习数组以及通过PHP实现一些常见的排序算法和查找算法。算法效率​​算法效率​​​分为两......
  • #yyds干货盘点 react笔记之学习之完成添加功能
    前言我是歌谣我有个兄弟巅峰的时候排名c站总榜19叫前端小歌谣曾经我花了三年的时间创作了他现在我要用五年的时间超越他今天又是接近兄弟的一天人生难免坎坷大不了从......
  • #yyds干货盘点 react笔记之学习之完成删除功能
    前言我是歌谣我有个兄弟巅峰的时候排名c站总榜19叫前端小歌谣曾经我花了三年的时间创作了他现在我要用五年的时间超越他今天又是接近兄弟的一天人生难免坎坷大不了从......
  • 嵌入式开发学习之--点亮LED灯(上)
    1、前言  在嵌入式学习里,点亮LED灯的地位就如同编程语言学习里的“helloworld”,是每个初学者都必须经历的一关,因为点亮了LED灯,至少可以说明几件事:    1.开发环境没......
  • 【查找算法】解析学习四大常用的计算机查找算法 | C++
    第二十二章四大查找算法:::hljs-center目录第二十二章四大查找算法●前言●查找算法●一、顺序查找法1.什么是顺序查找法?2.案例实现●二、二分查找法1......
  • 嵌入式开发学习之--点亮LED灯(下)
    1、前言  上篇《嵌入式开发学习之--点亮LED灯(上)》我们主要学习的是环境搭建和实际操作,这篇详细记录一下整个思考的过程。2、LED点亮的原理  首先,我们需要想一个问题,......
  • 实现输出100以内质数的两种方式-----笔试题记录
    质数指只能被1和自己本身相除的数,1不是质数一、方式一:用for循环嵌套循环实现思路:定义空列表,遍历2到100的整数,判断如果不能被1和该整数外的其他整数整除时,把整数写入......
  • JavaWeb开发过程中小问题记录
    今天想复习一下开学考试的内容上手做的时候很顺利的连接了数据库写了封装建立了servlet写了第一个add界面但是在servlet中却出现了问题具体如下图  而下方我在......
  • HTML学习与模板套用
    HTML语法用两个空格来代替制表符(tab)–这是唯一能保证在所有环境下获得一致展现的方法。嵌套元素应当缩进一次(即两个空格)。对于属性的定义,确保全部使用双引号,绝......