本文汇总了 SOFARPC 使用过程中的一些常见问题及其解决方案。
RPC 单次传输的数据量是否有限制
本身没有限制,考虑性能,建议 4k 以内。如果超过,在高并发场景下,可能出现一些 overflow 的问题,报错关键字为 maybe write overflow
。建议通过以下系统参数计算实际需要的大小:
参数 | 默认值 |
---|---|
| 32 * 1024 |
| 64 * 1024 |
RPC-02306: Cannot get the service address of service
现象
dev 环境 rpc 调用出错,用户调用时,middleware_error.log
报错找不到服务地址
原因
属性配置中打开了直连开关,而代码中配置的 url 与实际 RPC 服务地址不符。
application-dev.properties
中配置run.mode=test
。代码中配置
test-url=“${servicename_tr_service_ur}”
。servicename_tr_service_ur
指向的地址与实际的 RPC 服务地址不符。RPC provider 与 consumer 工程的 SOFABoot 版本不一致。
示例如下:
解决方案
在 application-dev.properties
中注释掉 run.mode=test
,或者将 RPC provider 与 consumer 工程的 SOFABoot 版本升级至同一版本。参见 SOFABoot 版本说明。
每次 RPC 调用都耗时很长,明显超时却不报超时异常
现象
SOFA RPC 使用 REST 接口触发 RPC 的泛化调用,每次触发都需要 30 秒的时间,且不超时。
从业务日志来看,开始处理业务和结束业务之间确实花了 30 秒。
原因
可能由于 DNS 配置错误,导致超时。
解决方案
在 /etc/hosts
中添加 IP 与主机名的映射,尝试解决该问题。
RPC 注册不成功
现象
如题
原因
application.properties
文件中的 run.mode
设置成了 dev
。
解决方案
删除 run.mode
配置或者将其设置成 normal
。
RPC 应用启动报错:Can’t find BindingConverter of type binding.tr
现象
出现如下报错:
Causedby: org.springframework.beans.factory.BeanCreationException:Error creating bean with name 'secretFacade':Invocation of init method failed; nested exception is com.alipay.sofa.runtime.api.ServiceRuntimeException:Can't find BindingConverter of type binding.tr
原因
rpc-enterprise-sofa-boot-starter
被注释掉了。而这个 jar 包提供了如下 binding:
rpc-enterprise-sofa-boot/3.2.2/rpc-enterprise-sofa-boot-3.2.2.jar!/com/alipay/boot/sofarpc/converter/TrBindingConverter.class
rpc-sofa-boot/3.2.2/rpc-sofa-boot-3.2.2.jar!/com/alipay/sofa/rpc/boot/runtime/converter/BoltBindingConverter.class
解决方案
引入 rpc-enterprise-sofa-boot-starter
jar 包。
Tr 接口找不到服务地址
现象
如题
原因
仅客户端迁移至了共享中间件,服务端并未迁移。
解决方案
将服务端迁移到共享中间件。
限流支持哪些客户端场景?
目前主要支持下述几种客户端:
Spring MVC
代码侵入:无
限流方法:Web URL
SOFA RPC Bolt
代码侵入:无
限流方法:接口方法
普通 Spring Bean
代码侵入:结合 AOP
限流方法:接口方法
不支持以下客户端:
SOFA RPC REST
代码侵入:无
限流方法:接口方法 / Web URL
SOFA REST(RESTEASY)
代码侵入:无
限流方法:接口方法 / Web URL
当前,对于SOFA REST,只能通过 AOP 的方式去拦截 REST 对应的 bean 来实现限流,示例如下:
设计要拦截的接口方法,示例如下:
@Path(URLConstants.REST_API_PEFFIX +"/users") @Consumes(RestConstants.DEFAULT_CONTENT_TYPE) @Produces(RestConstants.DEFAULT_CONTENT_TYPE) public interface SampleRestFacade{ @GET @Path("/{userName}") public RestSampleFacadeResp<DemoUserModel> userInfo(@PathParam("userName") String userName)throws CommonException; }
定义 bean,示例如下:
<bean id="sampleRestFacadeRest" class="com.hula.sofa.demos.guardian.endpoint.impl.SampleRestFacadeRestImpl"/>
AOP 配置,示例如下:
<import resource="classpath:META-INF/spring/guardian-sofalite.xml"/> <bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator"> <property name="interceptorNames"> <list> <value>guardianExtendInterceptor</value> </list> </property> <property name="beanNames"> <list> <!-- 配置需要被拦截的 bean --> <value>sampleRestFacadeRest</value> </list> </property> <!-- 如要使用 CGLIB 代理,取消下面这行的注释 --> <!-- <property name="optimize" value="true" /> --> </bean>
限流界面配置,示例如下:
在文档使用中是否遇到以下问题
更多建议
匿名提交