由SOFARPC示例介绍基本流程和基础源码

由SOFARPC示例介绍基本流程和基础源码
摘要由CSDN通过智能技术生成

由SOFARPC示例介绍基本流程和基础源码

1. Server

先看 Server 端测试方法:

public class QuickStartServer {
   

    public static void main(String[] args) {
   
        ServerConfig serverConfig = new ServerConfig()
            .setProtocol("bolt") // 设置一个协议,默认bolt
            .setPort(12200) // 设置一个端口,默认12200
            .setDaemon(false); // 非守护线程

        ProviderConfig<HelloService> providerConfig = new ProviderConfig<HelloService>()
            .setInterfaceId(HelloService.class.getName()) // 指定接口
            .setRef(new HelloServiceImpl()) // 指定实现
            .setServer(serverConfig); // 指定服务端

        providerConfig.export(); // 发布服务
    }
}

ProviderConfig类中,获得一个服务提供者启动类,负责发布服务。

public synchronized void export() {
   
    if (providerBootstrap == null) {
   
        providerBootstrap = Bootstraps.from(this);
    }
    providerBootstrap.export();
}

com.alipay.sofa.rpc.bootstrap.Bootstraps#from(com.alipay.sofa.rpc.config.ProviderConfig)

这里看一下Bootstraps#from方法,构造一个发布服务的包装类。

public static <T> ProviderBootstrap<T> from(ProviderConfig<T> providerConfig) {
   
    String bootstrap = providerConfig.getBootstrap();
    if (StringUtils.isEmpty(bootstrap)) {
   
        // Use default provider bootstrap
        bootstrap = RpcConfigs.getStringValue(RpcOptions.DEFAULT_PROVIDER_BOOTSTRAP);
        providerConfig.setBootstrap(bootstrap);
    }
    ProviderBootstrap providerBootstrap = ExtensionLoaderFactory
        .getExtensionLoader(ProviderBootstrap.class) // 从工厂拿到一个Loader
        .getExtension(bootstrap, new Class[] {
    ProviderConfig.class }, new Object[] {
    providerConfig }); // 得到一个扩展实例
    return (ProviderBootstrap<T>) providerBootstrap;
}

先学习一下ExtensionLoadeFactory的工厂方法的写法:

/**
 * All extension loader {Class : ExtensionLoader}
 * ConcurrentHashMap
 */
private static final ConcurrentMap<Class, ExtensionLoader> LOADER_MAP = new ConcurrentHashMap<Class, ExtensionLoader>();

/**
 * Get extension loader by extensible class with listener
 */
public static <T> ExtensionLoader<T> getExtensionLoader(Class<T> clazz, ExtensionLoaderListener<T> listener) {
   
    ExtensionLoader<T> loader = LOADER_MAP.get(clazz);
    if (loader == null) {
    // a
        synchronized (ExtensionLoaderFactory.class) {
   
            loader = LOADER_MAP.get(clazz);
            if (loader == null) {
   
                loader = new ExtensionLoader<T>(clazz, listener); // b
                LOADER_MAP.put(clazz, loader);
            }
        }
    }
    return loader;
}

/**
 * Get extension loader by extensible class without listener
 */
public static <T> ExtensionLoader<T> getExtensionLoader(Class<T> clazz) {
   
    return getExtensionLoader(clazz, null);
}

因为 b 处产生的 loader 一定在被初始化后才会被放进 map 中,所以不存在双重检查锁定的因指令重排导致的问题。

再看看获得实例的getExtension方法:

public T getExtension(String alias, Class[] argTypes, Object[] args) {
   
    ExtensionClass<T> extensionClass = getExtensionClass(alias);
    if 
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值