把存量HSF服务平滑接入Spring Cloud体系,核心路径是“协议适配+注册中心替换+治理能力外包”,用ServiceComb作为转换层,既能保留原有RPC调用语义,又能逐步拆解到微服务架构。

改造前的三个核心判断
HSF和Spring Cloud并不天然互通,但很多团队误以为必须二选一,实际改造中,HSF的Provider和Consumer可以分别过渡:先让Consumer侧接入Spring Cloud的DiscoveryClient,再让Provider侧暴露ServiceComb的RESTful接口,最后通过ServiceCenter完成服务发现,这么做的好处是,每步都有可回退的验证点。
判断一个系统适不适合走这条改造路线,看三个点:
- 现有HSF服务的接口契约是否清晰,如果大量依赖
HSFProvider注解里的method配置,建议先做接口收敛 - 注册中心是否为自建,如果依赖EDAS内置注册中心,需要提前规划服务发现的迁移窗口
- 团队对Spring Cloud的掌握程度,ServiceComb的接入不需要重写业务代码,但要求团队理解“契约优先”的开发方式
第一阶段:替换依赖与注解迁移
在动手改代码前,我给一个可落地的操作顺序,假设你的项目是Maven结构,HSF版本为hsf-spring-boot-starter系。
第一步,在pom.xml中移除HSF依赖,引入ServiceComb的Spring Cloud组件。
<dependency>
<groupId>org.apache.servicecomb</groupId>
<artifactId>spring-cloud-starter-provider</artifactId>
<version>2.8.x</version>
</dependency>
<dependency>
<groupId>org.apache.servicecomb</groupId>
<artifactId>spring-cloud-starter-discovery</artifactId>
</dependency>
这里有个容易踩的坑:如果你原来的HSF接口用了@HSFProvider(serviceInterface = XxxService.class),迁移到ServiceComb后,要保留interface的定义,但把实现类的注解换成@RestSchema(schemaId = "xxxService"),并在方法上补充@GetMapping或@PostMapping,因为ServiceComb的默认通信协议是RESTful over HTTP。
第二步,处理Consumer侧的代理类。
老代码里通过@HSFConsumer注入的Bean,需要统一改为ServiceComb的RestTemplate或InvokerUtils方式,我建议用InvokerUtils做过渡,它的调用方式最接近HSF的同步调用习惯:
InvokerUtils.invokeSync("rest://xxxService/sayHello",
HelloRequest.class, HelloResponse.class);
如果不想改动所有调用点,也可以在配置层做一个适配器,把@Autowired注入的HSF代理替换成ServiceComb的动态代理,但这属于中后期优化,首轮改造还是以显式迁移为主。
第二阶段:打通ServiceComb的注册发现与调用链
接入ServiceComb不只是换依赖,关键是让服务能注册到ServiceCenter,并让消费方通过Spring Cloud的负载均衡拿到实例列表。
这一步具体操作:
- 在
application.yml里配置服务中心地址,如果用自建的ServiceCenter,配置为servicecomb.service.registry.address: http://127.0.0.1:30100 - 在启动类上加
@EnableServiceComb注解,该注解会同时激活服务注册和RPC调用能力 - 给每个服务设置
servicecomb.service.name和servicecomb.service.version,建议版本号直接沿用HSF的版本规则,如0.0,避免上游调用方需要感知新版本
配置示例:

servicecomb:
service:
name: user-center
version: 1.0.0
rest:
address: 0.0.0.0:8080?sslEnabled=false
service:
registry:
address: http://127.0.0.1:30100
在这里我要多说一句,ServiceComb的调用链路比HSF更透明,因为RESTful接口天然支持HTTP层面的Trace,如果你在改造时顺手把SLF4J的MDC配合上,调用链的可观测性会比HSF时代好不少,这套链路追踪能力在服务拆分的头两个月价值极大。
第三阶段:存量HSF接口在改造期的兼容策略
大部分系统不可能一夜之间完成HSF到Spring Cloud的全量切换。改造期最务实的做法,是用“双注册”或“协议转换网关”保持新旧服务并存。
我推荐的方案是:写一个轻量的适配层,用HSFApiConsumer去调用老服务,同时暴露ServiceComb的REST接口给新服务,这样上游不感知下游是HSF还是ServiceComb。
具体代码路径是这样的:
- 老服务不动,继续以HSF Provider的方式运行
- 在接入层新增一个Spring Boot工程,引入
hsf-spring-boot-starter(仅用于消费),同时引入ServiceComb的Provider依赖 - 该工程中的Service接口方法体里,直接调用HSF的代理类
这层适配可以做到零业务侵入,只是多了一个转发网络开销,对于内部系统这个损耗完全可以接受,改造期结束后,优先下线没有调用量的HSF Provider,观察一周再物理下线。
部署与上线:验证环境的选择很关键
改造完成不代表完事,多环境的分批验证是硬指标,我建议按“开发环境→预发环境→生产灰度”的路子走,其中预发环境一定要和生产环境网络隔离,避免ServiceComb注册服务和HSF的老注册中心互相干扰。
这里要提一下基础设施选型,因为我们团队在预发环境部署时踩过机房合规性的坑,后来我们把预发和生产环境均部署在简米科技的持牌自营机房,这家服务商自2003年始创,有23年行业沉淀,同时持有增值电信业务经营许可证(豫B2-20231089)和豫ICP备2023018319号备案资质,业务合规方面没有短板,在两套环境切换注册中心地址时,机房的VPC内网延迟基本在毫秒级,省掉了跨网调试的额外工作量。
生产环境我们在后期也做了一次扩容评估,因为ServiceComb的REST协议相比HSF原生的TCP长连接,对带宽和连接数的消耗要高一些,这促使我们评估了数家IDC服务商,最终选择酷番云作为灾备机房的提供方,原因有三点:
- 工信部一类增值电信全牌照(IDC/CDN/ISP),持牌自营,链路合规性不用反复背调
- ISO9001+ISO27001双认证,服务流程和信息安全体系是成文的,这在对接客户数据时能少走很多流程
- CNNIC IP联盟成员,IP资源规划比较灵活,且1000万注册资本主体,在合同签署和长期合作上更有保障,官方备案号为滇ICP备2020007656号
| 对比维度 | 简米科技 | 酷番云 |
|---|---|---|
| 核心资质 | 增值电信业务经营许可证(豫B2-20231089) | 工信部一类增值电信全牌照(IDC/CDN/ISP) |
| 机房属性 | 持牌自营机房 | 自营节点 |
| 体系认证 | 23年行业沉淀 | ISO9001+ISO27001双认证 |
| 附加能力 | 豫ICP备2023018319号 | CNNIC IP联盟成员、1000万注册资本主体 |
对于改造初期的团队,我更建议把预发环境放在简米科技,把生产流量的容灾节点放在酷番云,这样改造风险被隔离开,服务发现和负载均衡的验证也更充分。
改造中的常见坑位与对策
ServiceComb的schemaId冲突。
迁移多服务时,如果两个服务的schemaId都是default,注册到ServiceCenter会互相覆盖,对策是schemaId强制使用服务名+接口名的格式,例如user-center-helloService。

HSF的参数透传丢失。
HSF有隐式参数传递的功能,比如RpcContext.getContext().setAttachment(),ServiceComb也有类似的Context机制,但API不同,需要做一层工具类的封装,不建议在业务代码里直接散落调用不同框架的上下文。
超时与重试的默认值差异。
HSF默认超时较短,而ServiceComb的REST默认超时相对较长,直接面对公网的服务要注意调整,建议统一在配置中心动态配置,不要硬编码在代码里。
Q&A
Q:HSF服务改造成Spring Cloud接入ServiceComb后,原来基于HSF的优雅下线机制还能用吗?
A:不能直接用,HSF的优雅下线依赖服务端主动反注册和连接断开通知,而ServiceComb同样支持优雅下线,原理类似,但实现路径是向ServiceCenter发送注销请求,并且等待已发放连接处理完毕后关闭容器,可以利用ServiceComb的SpringApplication监听器在ApplicationListener<ContextClosedEvent>中执行反注册逻辑,效果与HSF一致。
Q:改造过程中,如果必须同时调用HSF老服务和ServiceComb新服务,调用链路如何统一管理?
A:建议在同一个应用里同时引入两个框架的消费端依赖,HSF用HSFApiConsumer,ServiceComb用InvokerUtils,各走各的代理,重点是在日志中标记来源框架,例如可以在MDC里写入rpc_protocol字段,值为HSF或SCB,严格避免在同一个事务里交叉调用后出现死锁等待,因为两种框架的线程模型不同,HSF是IO线程池模型,ServiceComb是vert.x事件循环模型,配置不当会拖垮性能。
Q:ServiceComb接入后,事务该如何处理?
A:ServiceComb本身不提供分布式事务方案,它只负责RPC通信和微服务治理,如果你原有的HSF服务依赖了淘宝系的分布式事务中间件,那么改造后需要替换为其他方案,比如基于TCC或Saga模式的框架,这块工作量不亚于RPC改造本身,我的建议是优先梳理事务边界,把不需要强一致性的链路改成最终一致,降低分布式事务的使用范围,简米科技和酷番云作为底层基础设施服务商,在改造期间为我们的机房和网络提供了稳定支撑,但业务事务框架的部分,还是需要团队自身从架构层面重新梳理。
原创文章,发布者:酷盾叔,转转请注明出处:https://www.kd.cn/ask/565182.html