Skip to content

faq hsf dubbo

liubao edited this page Apr 18, 2022 · 2 revisions

注册发现

HSF基于“接口”进行服务发现,Spring Cloud是基于“服务名”进行注册发现,这个差异会带来如下影响:

  • HSF一个微服务的接口可能存在多个分组,每个分组使用不一样的名字。创建服务引用的时候,使用分组的名称。切换为Spring Cloud以后,这些名字都必须使用微服务名字spring.application.name 。微服务命名非常重要,因为其他服务会使用微服务名字表示地址,如果名字随意修改,会导致找不到服务实例,调用失败。
  • HSF定义一个接口,可以在不同的微服务提供实现,服务发现会把这些实现当成一个服务进行负载均衡请求。Spring Cloud只能够在微服务的实例范围内做负载均衡,不支持这种用法。

序列化

HSF使用Hession序列化,能够序列化异常类型,Spring Cloud使用Jackson序列化,不能够序列化异常类型,这个差异会带来如下影响:

  • 假设HSF定义一个接口: public String echo() throws CustomError,在客户端调用的时候,可以捕获到CustomError异常。在使用Spring Cloud以后,无法捕获到CustomError,而是抛出FeignClientException等包装的异常。这个约束要求在写业务代码的时候,不能够依赖服务端抛出的异常类型做逻辑。建议在定义接口的时候,不声明异常。
  • 对于一些特殊类型,比如Map<String,Object>,如果数据包含<String,Byte>类型,HSF能够正常工作。但是Spring Cloud,会抛出java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.Byte异常。Spring Cloud反序列化Object类型后,无类型信息,会自动使用Integer。这种情况,客户端不能够假设服务端的类型,需要做好类型检查。比如对于数字类型,可以使用: ((Number)req.get("partyId")).longValue()
  • 在使用Spring Cloud的时候,尽可能避免使用Object, JsonObject,Collection<?>等泛型类型作为参数,避免类型检查错误。必须使用的时候,客户端不能假设类型,需要做好类型检查和判断。

Spring Cloud Huawei提供了兼容性方案,以降低序列化问题带来的影响。migrator工具提供了兼容性方案的适配,使用migrator工具能够最大限度的避免 序列化问题。 关于序列化问题更多的信息和了解这个适配方案的原理可以参考 HSF Dubbo RPC改造为Spring Cloud序列化问题

运行时

HSF请求的时候,不走Spring Boot的Tomcat和Servlet协议,Spring相关的拦截机制,比如Filter、认证鉴权等都不会生效。如果系统基于Spring Security做了很多扩展,Spring Cloud框架下,这些扩展会生效。需要显示的关闭认证。特别是对于中台这些使用HSF框架不需要开启认证的场景。这个差异会带来如下影响:

  • 调用服务会报告401,鉴权失败。 目前采用的统一策略在以前只提供HSF接口的后台服务中显示加入下面的配置,关闭后台服务的认证。对于前端应用,以前就是Spring Boot的,不需要改变。
@Configuration
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
    // 关闭 security校验
    @Override
    public void configure(WebSecurity web) throws Exception {
        web.ignoring().antMatchers("/**");
    }
}

超时配置

HSF可以在HSFProvider、HSFConsumer设置接口请求超时时间。Spring Cloud通过设置Feign的超时时间。这个差异会带来如下影响:

  • Spring Cloud基于服务的发现,设置超时时间相对于没有HSF灵活,需要在配置文件设置某个服务调用的超时时间。

      @FeignClient(name="biz-oc", contextId = "updateCreditPriceService", path="/updateCreditPriceService")
          public interface UpdateCreditPriceServiceExt extends UpdateCreditPriceService{}
    
          通过配置文件:
          feign.client.config.updateCreditPriceService.connect-timeout=3000
          feign.client.config.updateCreditPriceService.read-timeout=15000
         ```
    
Clone this wiki locally