SOFARPC 是一个高可扩展性、高性能、生产级的 Java RPC 框架。SOFARPC 致力于简化应用之间的 RPC 调用,为应用提供方便透明、稳定高效的点对点远程服务调用方案。为了用户和开发者方便的进行功能扩展,SOFARPC 提供了丰富的模型抽象和可扩展接口,包括过滤器、路由、负载均衡等等。同时围绕 SOFARPC 框架及其周边组件提供丰富的微服务治理方案。

功能特性

  • 透明化、高性能的远程服务调用
  • 支持多种服务路由及负载均衡策略
  • 支持多种注册中心的集成
  • 支持多种协议,包括 Bolt、Rest、Dubbo 等
  • 支持同步、单向、回调、泛化等多种调用方式
  • 支持集群容错、服务预热、自动故障隔离
  • 强大的扩展功能,可以按需扩展各个功能组件

项目中通过mvn依赖或gradle依赖引入sofa rpc包,使用mvn依赖:

<dependency>

<groupId>com.alipay.sofa</groupId>

<artifactId>sofa-rpc-all</artifactId>

<version>最新版本号</version>

</dependency>

gradle依赖方式:

compile group: 'com.alipay.sofa', name: 'sofa-rpc-all', version: '最新版本号'

服务发布

服务发布过程涉及到三个类 RegistryConfig ,ServerConfig ,ProviderConfig 。

1、RegistryConfig注册中心配置类

RegistryConfig registryConfig = new RegistryConfig().setProtocol("zookeeper").setAddress("127.0.0.1:2181")

RegistryConfig 表示注册中心。如上声明了服务注册中心的地址和端口是127.0.0.1:2181,协议是 Zookeeper 。

2、ServerConfig服务运行容器配置类

ServerConfig serverConfig = new ServerConfig().setPort(8803).setProtocol("bolt");

ServerConfig 表示服务运行容器。如上声明了一个使用8803端口和 bolt 协议的 server 。

3、ProviderConfig服务发布配置类

ProviderConfig<HelloWorldService> providerConfig = new ProviderConfig<HelloWorldService>().setInterfaceId(HelloWorldService.class.getName())    .setRef(new HelloWorldServiceImpl())    .setServer(serverConfig)  .setRegistry(registryConfig);
providerConfig.export();

ProviderConfig 表示服务发布,用来设置接口名称、接口实现类引用以及指定服务端配置;如上声明了服务的接口,实现和该服务运行的 server 。 最终通过 export 方法将这个服务发布出去了。

服务引用

服务引用涉及到两个类, RegistryConfig 和 ConsumerConfig 。

1、ConsumerConfig服务引用配置类

ConsumerConfig<HelloService> consumerConfig = new ConsumerConfig<HelloService>().setInterfaceId(HelloService.class.getName())       .setRegistry(registryConfig);
HelloService helloService = consumerConfig.refer();

ConsumerConfig 表示服务引用,如上声明了所引用服务的接口和服务注册中心。 最终通过 refer 方法将这个服务引用,获取到该服务的远程调用的代理。

SOFARPC服务引用支持如下特性:

(1)同一服务注册多个注册中心,构建多个RegistryConfig设置给 ConsumerConfig

List<RegistryConfig> registryConfigs = new ArrayList<RegistryConfig>();
registryConfigs.add(registryA);
registryConfigs.add(registryB);
consumerConfig.setRegistry(registryConfigs);

(2)提供MethodConfig进行方法级别参数设置,API方式使用相应的对象set法即可为其设置参数

MethodConfig methodConfigA = new MethodConfig();
MethodConfig methodConfigB = new MethodConfig();
List<MethodConfig> methodConfigs = new ArrayList<MethodConfig>();
methodConfigs.add(methodConfigA);
methodConfigs.add(methodConfigB);
consumerConfig.setMethods(methodConfigs);  //客户端设置

下面我们写一个简单的例子来说明一下

编写服务端实现

第一步:创建接口

/*** Quick Start demo interface*/
public interface HelloService {String sayHello(String string);
}

第二步:创建接口实现

/*** Quick Start demo implement*/
public class HelloServiceImpl implements HelloService {@Overridepublic String sayHello(String string) {System.out.println("Server receive: " + string);return "hello " + string + " !";}
}

第三步:编写服务端代码

/*** Quick Start Server*/
public class QuickStartServer {public static void main(String[] args) {ServerConfig serverConfig = new ServerConfig().setProtocol("bolt") // 设置一个协议,默认bolt.setPort(12200) // 设置一个端口,默认12200.setDaemon(false); // 非守护线程ProviderConfig<HelloService> providerConfig = new ProviderConfig<HelloService>().setInterfaceId(HelloService.class.getName()) // 指定接口.setRef(new HelloServiceImpl()) // 指定实现.setServer(serverConfig); // 指定服务端providerConfig.export(); // 发布服务}
}

编写客户端实现

第一步:拿到服务端接口

一般服务端会通过jar的形式将接口类提供给客户端。而在本例中,由于服务端和客户端在一个工程所以跳过。

第二步:编程客户端代码

/*** Quick Start client*/
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:12200"); // 指定直连地址// 生成代理类HelloService helloService = consumerConfig.refer();while (true) {System.out.println(helloService.sayHello("world"));try {Thread.sleep(2000);} catch (Exception e) {}}}
}

运行结果

分别启动服务端和客户端,观察运行效果。

服务端将打印:

Server receive: world

客户端将打印:

hello world !

参考:

https://blog.csdn.net/qq924862077/article/details/81915213

https://www.jianshu.com/p/47816d0f1317

sofa rpc入门相关推荐

  1. SOFA RPC 详细介绍

    简介   SOFA 作为蚂蚁金服自主研发的分布式的系统中间件,包含金融级云原生的架构所需要的各种组件,其中包括微服务的研发框架.RPC调用框架.服务的注册中心.分布式定时任务.限流/熔断机制.动态配置 ...

  2. 为什么SOFA RPC调用30s还不超时?

    简介:为什么SOFA RPC调用30s还不超时? 1. 背景 最近帮客户处理了一个诡异的RPC调用问题,想跟大家分享一下.关于SOFA RPC,请参考官网[1]. 2. 问题现象 客户使用 REST ...

  3. SOFA Boot 整合SOFA RPC 、SOFA Registry

    参考资料 https://www.wenjiangs.com/doc/dc7xvpxh https://www.sofastack.tech/projects/sofa-rpc/getting-sta ...

  4. spider RPC入门指南

    请访问https://git.oschina.net/zhjh256/io-spider获取最新更新. 本部分将介绍使用spider RPC开发分布式应用的客户端和服务端. spider RPC中间件 ...

  5. RPC入门总结(一)RPC定义和原理

    转载:深入浅出 RPC - 浅出篇 转载:RPC框架与Dubbo完整使用 转载:深入浅出 RPC - 深入篇 转载:远程调用服务(RPC)和消息队列(Message Queue)对比及其适用/不适用场 ...

  6. Soul网关发布里程碑的2.3.0版本,新增支持GRPC,Tars,Sofa协议

    距离上一次发布长达半年之久,在这半年的时间里,我与我的社区小伙伴们,做了太多太多的事情.完成了将近200 多次PR,发表了将近300 篇文章的源码解析,新增贡献者 120 多位,晋升了 7位commi ...

  7. SOFA 源码分析 — 链路数据透传

    前言 SOFA-RPC 支持数据链路透传功能,官方解释: 链路数据透传功能支持应用向调用上下文中存放数据,达到整个链路上的应用都可以操作该数据. 使用方式如下,可分别向链路的 request 和 re ...

  8. SOFA 源码分析 — 连接管理器

    前言 RPC 框架需要维护客户端和服务端的连接,通常是一个客户端对应多个服务端,而客户端看到的是接口,并不是服务端的地址,服务端地址对于客户端来讲是透明的. 那么,如何实现这样一个 RPC 框架的网络 ...

  9. C/C++:Windows编程—Windows RPC 传递自定义数据类型、自定义数据类型数组、指针数组

    前言 该篇博文不是讲Windows rpc入门的.是笔者在实际使用Windows RPC时 所遇到的问题,以及解决方法. 笔者有这样的需求,需要从RPC Server获取大量数据,而且该数据是动态分配 ...

最新文章

  1. asp用于取代什么技术_ASP是不是已经被淘汰了?
  2. Scala闭包特性的一个测试
  3. phalcon: 缓存片段,文件缓存,memcache缓存
  4. 一个追求高效的学习者手机里装有哪些APP?(转)
  5. 黄学长模拟day1 球的序列
  6. Delphi INI文件保存与读取
  7. J2EE--Mybatis基础知识题
  8. opencv 物体形状匹配
  9. 输出结果为16的python表达式_第一周作业(rayco)
  10. 冰点下载器手机版apk_冰点下载器安卓版下载
  11. H5常用代码:页面框架
  12. 数据处理与分析|涵盖七大分析方法
  13. 微型计算机键盘ins代表,微型计算机技术69124.ppt
  14. 基于朴素贝叶斯算法的新闻分类
  15. java新手初次面试要注意的事项
  16. hlg2146【多维背包】
  17. ANSYS Workbench仿真(ADD):应力奇异点VS应力集中
  18. P2P“点融网”凭什么拿得2.07亿美元融资?
  19. pix2pixHD:High-Resolution Image Synthesis and Semantic Manipulation with Conditional GANs
  20. 逻辑 - 联言命题,选言命题

热门文章

  1. 为云而生,云原生数据库TDSQL-C技术突破与演进
  2. IronMCC 多媒体展厅中控系统
  3. 计算机系统招标范围,信息化系统招标文件(2015.09.16最终稿1).doc
  4. linux中文件权限 组,linux中文件权限格式与chmod命令以及用户和用户组的管理
  5. 网络爬虫--requests、post、解密、Cookie、Session、IP代理
  6. Qt识别文件类型的正确姿势
  7. ThinkPadE540重装系统
  8. 苹果CEO乔布斯在斯坦福大学的演讲稿[中英]
  9. 浅谈图像处理与深度学习
  10. C++删除目录,包括该目录下所有子目录和文件