全部产品

使用编程 API

更新时间:2020-02-21 11:27:11

SOFA 提供一套机制去存放各种组件的编程 API,并提供一套统一的方法,让您可以获取到这些 API。组件编程 API 的存放与获取均通过 SOFA 的 ClientFactory 类进行,通过这个 ClientFactory 类,可以获取到对应组件的编程 API。SOFA 提供两种方式获取 ClientFactory

使用 SOFA 组件编程相关的 API,请确保使用的模块里面已经添加了如下的依赖:

  1. <dependency>
  2. <groupId>com.alipay.sofa</groupId>
  3. <artifactId>rpc-enterprise-sofa-boot-starter</artifactId>
  4. </dependency>

获取 ClientFactory

实现 ClientFactoryAware 接口

第一种获取 ClientFactory 的方式是实现 ClientFactoryAware 接口,代码示例如下:

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

然后,将上面的 ClientFactoryBean 配置成一个 Spring Bean。

  1. <bean id="clientFactoryBean" class="com.alipay.test.ClientFactoryBean"/>

这样,ClientFactoryBean 就可以获取到 clientFactory 对象来使用了。

使用 @SofaClientFactory 注解

第二种获取 ClientFactory 的方式是使用 @SofaClientFactory 注解,代码示例如下:

  1. public class ClientAnnotatedBean {
  2. @SofaClientFactory
  3. private ClientFactory clientFactory;
  4. public ClientFactory getClientFactory() {
  5. return clientFactory;
  6. }
  7. }

只要在 ClientFactory 字段上加上 @SofaClientFactory 的注解,然后将 ClientAnnotatedBean 配置成一个 Spring Bean 即可。

  1. <bean id="clientAnnotatedBean" class="com.alipay.test.ClientAnnotatedBean"/>

这样,SOFA 框架就会自动将 ClientFactory 的实例注入到被 @SofaClientFactory 注解的字段上了。

不过,这样只是获取到 ClientFactory 这个对象。如果要获取特定的客户端,如 ServiceFactory,还需要调用 ClientFactorygetClient 方法。SOFA 对 @SofaClientFactory 的注解进行了增强,可以直接通过 @SofaClientFactory 来获取具体的 Client,代码示例如下:

  1. public class ClientAnnotatedBean {
  2. @SofaClientFactory
  3. private ServiceClient serviceClient;
  4. public ServiceClient getServiceClient() {
  5. return serviceClient;
  6. }
  7. }

@SofaClientFactory 直接使用在具体的 Client 对象上时,此注解可以直接将对应的 Client 对象注入到被注解的字段上。在上述例子中,@SofaClientFactory 是直接注解在类型为 ServiceClient 的字段上,SOFA 框架会直接将 ServiceClient 对象注入到这个字段上。只要是在 ClientFactory 中存在的对象,都可以通过此种方式来获得。

编程 API 示例

服务的发布与订阅不仅可以通过在 XML 中配置 Spring Bean 的方式在应用启动期静态加载,也可以采用编程 API 的方式在应用运行期动态执行,用法如下。

BOLT 服务发布

  1. ServiceClient serviceClient = clientFactory.getClient(ServiceClient.class);
  2. ServiceParam serviceParam = new ServiceParam();
  3. serviceParam.setInstance(sampleService);
  4. serviceParam.setInterfaceType(SampleService.class);
  5. serviceParam.setUniqueId(uniqueId);
  6. TrBindingParam trBinding = new TrBindingParam();
  7. // 对应 global-attrs 标签
  8. trBinding.setClientTimeout(5000);
  9. serviceParam.addBindingParam(trBinding);
  10. serviceClient.service(serviceParam);

BOLT 服务引用

  1. ReferenceClient referenceClient = clientFactory.getClient(ReferenceClient.class);
  2. ReferenceParam<SampleService> referenceParam = new ReferenceParam<SampleService>();
  3. referenceParam.setInterfaceType(SampleService.class);
  4. referenceParam.setUniqueId(uniqueId);
  5. TrBindingParam trBinding = new TrBindingParam();
  6. // 对应 global-attrs 标签
  7. trBinding.setClientTimeout(8000);
  8. // 对应 method 标签
  9. TrBindingMethodInfo trMethodInfo = new TrBindingMethodInfo();
  10. trMethodInfo.setName("helloMethod");
  11. trMethodInfo.setType("callback");
  12. // 对象必须实现 com.alipay.sofa.rpc.api.callback.SofaResponseCallback 接口
  13. trMethodInfo.setCallbackHandler(callbackHandler);
  14. trBinding.addMethodInfo(trMethodInfo);
  15. referenceParam.setBindingParam(trBinding);
  16. SampleService proxy = referenceClient.reference(referenceParam);

重要

  • 通过动态客户端创建 SOFA Reference 返回的对象是一个非常重的对象,在使用的时候不要频繁创建,自行做好缓存,否则可能存在内存溢出的风险。
  • 因为编程 API 的类不能轻易变化,类名为了兼容以前的用法,保持 TR 写法,但实际其中走的是 BOLT 协议。