前言
SOFARPC 最早源于阿里内部的 HSF, 是近期蚂蚁金服开源的一个高可扩展性, 高性能, 生产级的 Java RPC 框架. SOFA-RPC 在蚂蚁金服已经历了十多年的发展, 致力于简化应用之间的 RPC 调用. 为应用提供方便透明, 稳定高效的点对点远程服务调用方案.
为了用户和开发者方便的进行功能扩展, SOFA-RPC 提供了丰富的模型抽象和可扩展接口, 包括过滤器, 路由, 负载均衡等. 同时围绕 SOFA-RPC 框架及其周边组件提供丰富的微服务治理方案.
其他文章
蚂蚁金服 SOFA-Boot 整合 SOFA-RPC(上篇)
蚂蚁金服 SOFA-Boot 整合 SOFA-RPC(中篇)
蚂蚁金服 SOFA-Boot 整合 SOFA-RPC(下篇)
正文
1. 功能特性
透明化, 高性能的远程服务调用
支持多种服务路由及负载均衡策略
支持多种注册中心的集成
支持 bolt,rest,dubbo 等多种通信协议
支持同步, 单向, 回调, 泛化等多种调用方式
支持集群容错, 服务预热, 自动故障隔离
强大的扩展功能, 可以按需扩展各个功能组件
2. 实现原理
a. 服务发布
当一个 SOFARPC 的应用启动的时候, 如果发现当前应用需要发布 RPC 服务的话, 那么 SOFARPC 会将这些服务注册到服务注册中心上. 如图中 Service 指向 Registry.
b. 服务订阅
当引用这个服务的 SOFARPC 应用启动时, 会从服务注册中心订阅到相应服务的元数据信息. 服务注册中心收到订阅请求后, 会将发布方的元数据列表实时推送给服务引用方. 如图中 Registry 指向 Reference.
c. 服务调用
当服务引用方拿到地址以后, 就可以从中选取地址发起调用了. 如图中 Reference 指向 Service.
3. 快速开始
3.1. 引入 sofa-rpc 依赖
- <dependencies>
- <dependency>
- <groupId>com.alipay.sofa</groupId>
- <artifactId>sofa-rpc-all</artifactId>
- <version>5.3.1</version>
- </dependency>
- </dependencies>
复制代码
3.2. 编写服务接口和服务实现类
- HelloService.java
- public interface HelloService {
- String sayHello(String string);
- }
复制代码
- HelloServiceImpl.java
- public class HelloServiceImpl implements HelloService {
- @Override
- public String sayHello(String string) {
- System.out.println("Server receive:" + string);
- return "hello" + string + "!";
- }
- }
复制代码
3.3. 编写服务提供者启动类
- QuickStartServer.java
- public class QuickStartServer {
- public static void main(String[] args) {
- ServerConfig serverConfig = new ServerConfig()
- .setProtocol("bolt") // 设置一个协议, 默认 bolt
- .setPort(9696) // 设置一个端口, 默认 12200
- .setDaemon(false); // 非守护线程
- ProviderConfig<HelloService> providerConfig = new ProviderConfig<HelloService>()
- .setInterfaceId(HelloService.class.getName()) // 指定接口
- .setRef(new HelloServiceImpl()) // 指定实现
- .setServer(serverConfig); // 指定服务端
- providerConfig.export(); // 发布服务
- }
- }
复制代码
运行服务端提供方, 日志输出如下:
- Sofa-Middleware-Log SLF4J Warn : No log util is usable, Default app logger will be used.
- SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
- SLF4J: Defaulting to no-operation (NOP) logger implementation
- SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
- Sofa-Middleware-Log SLF4J Warn : No log util is usable, Default app logger will be used.
复制代码
3.4. 编写服务消费者启动类
- QuickStartClient.java
- public class QuickStartClient {
- public static void main(String[] args) {
- ConsumerConfig<HelloService> consumerConfig = new ConsumerConfig<HelloService>()
- .setInterfaceId(HelloService.class.getName()) // 指定接口
- .setProtocol("bolt") // 指定协议
- .setDirectUrl("bolt://127.0.0.1:9696"); // 指定直连地址
- HelloService helloService = consumerConfig.refer();
- while (true) {
- System.out.println(helloService.sayHello("world"));
- try {
- Thread.sleep(200);
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- }
- }
复制代码
运行服务端消费方, 调用服务提供方:
服务提供方日志输出如下:
- Server receive: world
- Server receive: world
- Server receive: world
- Server receive: world
复制代码
服务消费方日志输出如下:
- SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
- SLF4J: Defaulting to no-operation (NOP) logger implementation
- SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
- Sofa-Middleware-Log SLF4J Warn : No log util is usable, Default app logger will be used.
- Sofa-Middleware-Log SLF4J Warn : No log util is usable, Default app logger will be used.
- hello world !
- hello world !
- hello world !
- hello world !
复制代码
小结
这是一个快速入门的例子!
可以发现, 在使用上, SOFA-RPC 与淘宝的 Dubbo, 微博的 Motan 并无太大的区别. Dubbo 作为整套服务治理而存在, 而 SOFA-RPC 只是一款轻量级的 RPC 框架, 基于 HSF 框架改造, 提供更加完善, 强大的, 多样化 RPC 编程 API.
来源: https://juejin.im/post/5b8675fa6fb9a019b953ec5b