SOFABoot 为 RPC 服务的发布和引用提供了一套编程 API 方式,方便直接在代码中发布和引用 RPC 服务,与 Spring 的 ApplicationContextAware 类似,为使用编程 API 方式,首先需要实现 ClientFactoryAware 接口获取编程组件 API:

    1. public class ClientFactoryBean implements ClientFactoryAware {
    2. private ClientFactory clientFactory;
    3. @Override
    4. public void setClientFactory(ClientFactory clientFactory) {
    5. this.clientFactory = clientFactory;
    6. }
    7. }

    以 DirectService 为例,看下如何使用 clientFactory 通过编程 API 方式发布 RPC 服务:

    1. ServiceClient serviceClient = clientFactory.getClient(ServiceClient.class);
    2. ServiceParam serviceParam = new ServiceParam();
    3. serviceParam.setInterfaceType(DirectService.class);
    4. serviceParam.setInstance(new DirectServiceImpl());
    5. List<BindingParam> params = new ArrayList<BindingParam>();
    6. BindingParam serviceBindingParam = new BoltBindingParam();
    7. params.add(serviceBindingParam);
    8. serviceParam.setBindingParams(params);
    9. serviceClient.service(serviceParam);

    上面的代码中

    • 首先通过 clientFactory 获得 ServiceClient 对象
    • 然后构造 ServiceParam 对象,ServiceParam 对象包含发布服务所需参数,通过 setInstance 方法来设置需要被发布成 RPC 服务的对象,setInterfaceType 来设置服务的接口
    • 最后,调用 ServiceClient 的 service 方法,发布一个 RPC 服务通过编程 API 方式引用 RPC 服务的代码也是类似的:
    1. ReferenceClient referenceClient = clientFactory.getClient(ReferenceClient.class);
    2. ReferenceParam<DirectService> referenceParam = new ReferenceParam<DirectService>();
    3. referenceParam.setInterfaceType(DirectService.class);
    4. BindingParam refBindingParam = new BoltBindingParam();
    5. referenceParam.setBindingParam(refBindingParam);
    6. DirectService proxy = referenceClient.reference(referenceParam);
    7. proxy.sayDirect("hello");

    同样,引用一个 RPC 服务只需从 ClientFactory 中获取一个 ReferenceClient ,然后和发布一个服务类似,构造出一个 ReferenceParam,然后设置好服务的接口,最后调用 ReferenceClient 的 reference 方法即可。