全部产品

常见问题

本文汇总了 SOFARPC 使用过程中的一些常见问题及其解决方案。


RPC 单次传输的数据量是否有限制

本身没有限制,考虑性能,建议 4k 以内。如果超过,在高并发场景下,可能出现一些 overflow 的问题,报错关键字为 maybe write overflow。建议通过以下系统参数计算实际需要的大小:

参数

默认值

-Dbolt.netty.buffer.low.watermark

32 * 1024

-Dbolt.netty.buffer.high.watermark

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 来实现限流,示例如下:

  1. 设计要拦截的接口方法,示例如下:

    @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;
    }
  2. 定义 bean,示例如下:

    <bean id="sampleRestFacadeRest" class="com.hula.sofa.demos.guardian.endpoint.impl.SampleRestFacadeRestImpl"/>
  3. 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>
  4. 限流界面配置,示例如下:限流界面配置.png