Sofa-RPC 是蚂蚁金服开源的一款基于 Java 实现的 RPC 服务框架,为应用之间提供远程服务调用能力
目录
一、Sofa-RPC介绍
2.1 简介
Sofa-RPC 是蚂蚁金服开源的一款基于 Java 实现的 RPC 服务框架,为应用之间提供远程服务调用能力,具有高可伸缩性,高容错性,目前蚂蚁金服所有的业务的相互间的 RPC 调用都是采用 SOFARPC。SOFARPC 为用户提供了负载均衡,流量转发,链路追踪,链路数据透传,故障剔除等功能。
SOFARPC 还支持不同的协议,目前包括 bolt,RESTful,dubbo,H2C 协议进行通信。其中 bolt 是蚂蚁金融服务集团开放的基于 Netty 开发的网络通信框架。
2.2 基本原理
- 当一个 SOFARPC 的应用启动的时候,如果发现当前应用需要发布 RPC 服务的话,那么 SOFARPC 会将这些服务注册到服务注册中心上。如图中 Service 指向 Registry。
- 当引用这个服务的 SOFARPC 应用启动时,会从服务注册中心订阅到相应服务的元数据信息。服务注册中心收到订阅请求后,会将发布方的元数据列表实时推送给服务引用方。如图中 Registry 指向 Reference。
- 当服务引用方拿到地址以后,就可以从中选取地址发起调用了。如图中 Reference 指向 Service。
2.3 与dubbo的区别
Dubbo 是阿里集团开源的一款非常优秀的RPC框架,高性能,具有良好的扩展性。Dubbo在国内开源界起步较早,使用者较多,开源生态更加丰富,目前已进入Apache基金会进行孵化。Dubbo最早在阿里巴巴B2B部门广泛使用。
SOFARPC 最早起源于阿里集团内部的 HSF,但是经过了蚂蚁金服集团内部多年的独立发展,目前脱离为一个独立的产品。SOFARPC 在协议,网络,路由,可扩展性等层面都进行了大量的改造和优化的工作,以满足蚂蚁金服大规模金融级的业务场景。在蚂蚁金服内部,SOFARPC 在蚂蚁中间件(SOFAStack)的生态下,有完善的微服务技术栈支持,包括微服务研发框架,RPC 框架,服务注册中心,分布式定时任务,限流/熔断框架,动态配置推送,分布式链路追踪,Metrics监控度量等等。
感觉二者功能上很类似,差异我的理解如下
- dubbo更加轻量级一点,sofa有HSF的基因,据说比较重
- dubbo是完全开源,sofa-rpc开源刚开始,生态还没完善。
二、Sofa-RPC服务运行实例
与dubbo基本一致
前置条件
- 运行soul-admin
- 开启zookeeper
运行步骤
- 网关管理打开sofa
- soul-bootstrap pom文件添加sofa依赖,启动soul-bootstrap
- 参考soul-test-sofa,引入依赖,yml配置
- 启动soul-test-sofa
- postman测试
三、webflux响应式编程语法介绍
3.1 spring mvc 和 webflux
从上图可以看出
- WebFlux 是Spring5以后推出的一款全新的响应式Web框架,是完全异步非阻塞。,SpringMVC是同步阻塞的
- 响应式一般用Netty或者Servlet 3.1的容器(因为支持异步非阻塞),而Servlet技术栈用的是Servlet容器
在微服务架构中,Spring MVC 和 WebFlux 可以混合使用,比如已经提到的,对于那些 IO 密集型服务(如网关),我们就可以使用 WebFlux 来实现。
3.2 简介
- 引入依赖
- WebFlux Reactor 发射器
WebFlux 内部使用的是响应式编程(Reactive Programming),以 Reactor 库为基础, 基于异步和事件驱动,可以让我们在不扩充硬件资源的前提下,提升系统的吞吐量和伸缩性。
Mono 实现了 org.reactivestreams.Publisher 接口,代表0到1个元素的发布者(Publisher)
Flux 同样实现了 org.reactivestreams.Publisher 接口,代表0到N个元素的发布者(Subscriber)
- Mono:发射0到1个元素的异步"发射器
@RequestMapping("/hellMono")
public Mono<String> hellMono(){
return Mono.just("Hello Mono");
}
- Flux:发射0到N个元素的异步"发射器
@RequestMapping("/hellFlux")
public Flux<String> hellFlux(){
return Flux.just("Hello Flux1", "Hello Flux2");
}
四、几个小插曲
- zookeeper的报错
bootstrap 和 soul-test-sofa 测试过程中报zookeeper连接错误,重启后解决,初步原因分析为待机时间过长,连接异常。
后来装了个zookeeper插件zookeeper 插件