前言
上篇文章简单地介绍了 SOFA-Boot 的功能特性,对 Readiness 健康检查的配置举例说明。重点介绍了如何在 SOFA-Boot 中引入 SOFA-RPC 中间件,给出了基于 bolt、rest 和 dubbo 等不同协议通道的服务发布与消费的全流程。
本文将进一步介绍 SOFA-RPC 中间件提供的丰富而强大的功能,包括单向调用、同步调用、Future调用、回调,泛化调用,过滤器配置等。
正文
1. 调用方式
SOFA-RPC 提供单向调用、同步调用、异步调用和回调四种调用机制。为了区分四者的不同之处,这里给出 SOFA 官方提供的原理图。
下面给出详细阐述和配置说明:
1.1. 单向方式
当前线程发起调用后,不关心调用结果,不做超时控制,只要请求已经发出,就完成本次调用。目前支持 bolt 协议。
配置说明
使用单向方式需要在服务引用的时候通过 sofa:global-attrs
元素的 type
属性声明调用方式为 oneway
,这样使用该服务引用发起调用时就是使用的单向方式了。
<sofa:reference id="helloOneWayServiceReference" interface="com.ostenant.sofa.rpc.example.invoke.HelloOneWayService">
<sofa:binding.bolt>
<sofa:global-attrs type="oneway"/>
</sofa:binding.bolt>
</sofa:reference>
适用场景
单向调用不保证成功,而且发起方无法知道调用结果。因此通常用于可以重试,或者定时通知类的场景,调用过程是有可能因为网络问题,机器故障等原因,导致请求失败。业务场景需要能接受这样的异常场景,才可以使用。
1.2. 同步方式
当前线程发起调用后,需要在指定的超时时间内,等到响应结果,才能完成本次调用。如果超时时间内没有得到结果,那么会抛出超时异常。
配置说明
服务接口与实现类
SOFA-RPC 缺省采用的就是同步调用,可以省略 sofa:global-attrs
配置项。
服务端发布配置
<bean id="helloSyncServiceImpl" class="com.ostenant.sofa.rpc.example.invoke.HelloSyncServiceImpl"/>
<sofa:service ref="helloSyncServiceImpl" interface="com.ostenant.sofa.rpc.example.invoke.HelloSyncService">
<sofa:binding.bolt/>
</sofa:service>
客户端引用配置
<sofa:reference id="helloSyncServiceReference" interface="com.ostenant.sofa.rpc.example.invoke.HelloSyncService">
<sofa:binding.bolt/>
</sofa:reference>
服务端启动入口
SpringApplication springApplication = new SpringApplication(SyncServerApplication.class);
ApplicationContext applicationContext = springApplication.run(args);
客户端启动入口
SpringApplication springApplication = new SpringApplication(SyncClientApplication.class);
ApplicationContext applicationContext = springApplication.run(args);
客户端调用
HelloSyncService helloSyncServiceReference = (HelloSyncService) applicationContext.getBean("helloSyncServiceReference");
System.out.println(helloSyncServiceReference.saySync("sync"));
适用场景
同步调用是最常用的方式。注意要根据对端的处理能力,合理设置超时时间。
1.3. Future方式
Future 方式下,客户端发起调用后不会等待服务端的结果,继续执行后面的业务逻辑。服务端返回的结果会被 SOFA-RPC 缓存,当客户端需要结果的时候,需要主动获取。目前支持 bolt 协议。
配置说明
服务接口和实现类
HelloFutureService.java
public interface HelloFutureService {
String sayFuture(String future);
}
HelloFutureServiceImpl.java
public class HelloFutureServiceImpl implements HelloFutureService {
@Override
public String sayFuture(String future) {
return future;
}
}
服务端发布配置
<bean id="helloFutureServiceImpl" class="com.ostenant.sofa.rpc.example.invoke.HelloFutureServiceImpl"/>
<sofa:service ref="helloFutureServiceImpl" interface="com.oste