全部产品
云市场

开始使用 SOFARPC

更新时间:2020-01-10 16:47:09

本文主要介绍 RPC 的实现原理,并教您如何通过示例工程快速上手 SOFARPC,实现服务发布、引用,以及应用部署和服务查询。

RPC 实现原理

SOFARPC 服务涉及到三方:发布方(提供方)、注册中心和引用方(消费方),流程如下图所示:

  1. 发布方 Service -> 向注册中心 Config server 注册;
  2. 引用方 Reference -> 从注册中心 Config server 引用;
  3. 最终实现 引用方 Reference -> 调用了 发布方 Service 提供的服务。

SOFARPC 原理流程图SOFARPC 原理流程图

示例工程下载

点击下载示例工程

示例工程打开方式

下载完成后,建议您通过 IDEA 或 Eclipse,选择 open,将 rpc-demo 中的 2 个工程 myserver-app 和 myclient-app,分别独立打开。

示例工程服务验证

  • 首先启动 myserver-app web 模块的 SOFABootWebSpringApplication 发布服务;
  • 然后启动 myclient-app web 模块的 SOFABootWebSpringApplication 引用服务;

引用成功后,myclient-app 控制台将输出:hello SOFARPC!

也可通过日志来查看服务引用结果:在 Web 子模块路径:src/main/resources/config/application.properties 中,可设置日志路径。默认在 logs/myweb-app/common-default.log 中查看服务引用结果。

其它本地编译方式,参考 本地编译运行

自定义入门工程创建步骤

上述示例工程,也可以通过下述步骤完成创建,您可以通过修改相关项,实现个性化配置。

建议您登录阿里云账户,前往 脚手架 控制台,完成下述准备工作:

  1. 工程环境的配置:
    • Java 版本:Java 1.8(默认)或 Java 1.7
    • SOFABoot 版本:2.3.4(默认)或 2.4.0
    • 工程类型:Web(默认)或 Core,本入门教程以 Web 工程为例
  2. SOFABoot 工程创建和下载:可参考 SOFABoot 快速入门
    创建 2 个 SOFABoot Web 工程,分别作为客户端和服务端。示例工程使用下述信息,您可以按需求进行修改:

    • groupId: com.alipay.mytestsofa
    • artifactId:myclient-app or myserver-app
    • version: 使用默认值 1.0-SNAPSHOT,不需要输入
    • package: 使用默认值 com.alipay.mytestsofa,不需要输入
  3. 在 2 个本地 SOFABoot 工程 web 模块 pom.xml 中引入 SOFARPC 的 Maven 依赖。

    1. <dependency>
    2. <groupId>com.alipay.sofa</groupId>
    3. <artifactId>rpc-enterprise-sofa-boot-starter</artifactId>
    4. </dependency>
  4. 在上述创建的工程 endpoint 模块相同位置添加服务接口及实现,参考示例工程。
  5. 在 2 个工程的 endpoint 模块添加服务发布和引用配置信息:在 src/main/resources/META-INF/myserver-app/myserver-app-endpoint.xml 中添加服务发布的配置信息;在 src/main/resources/META-INF/myclient-app/myclient-app-endpoint.xml 中添加服务引用的配置信息。
  6. 启动 myserver-app web 模块的 SOFABootWebSpringApplication,发布服务。
  7. 启动 myclient-app web 模块的 SOFABootWebSpringApplication,引用服务。

示例工程说明

示例工程关键信息

  • groupId: com.alipay.mytestsofa
  • artifactId:myserver-app or myclient-app
  • version: 1.0-SNAPSHOT
  • package: com.alipay.mytestsofa

示例工程配置

SOFARPC 的服务发布与引用配置均需要写到 Spring 的 XML 文件中。以 Web 工程为例,Spring XML 文件的默认路径示例如下:

endpoint 子模块为:
src/main/resources/META-INF/myserver-app/myserver-app-endpoint.xml

src/main/resources/META-INF/myclient-app/myclient-app-endpoint.xml

示例工程原理

  • 在 2 个工程的 endpoint 模块中相同位置,提供相同的服务接口和实现,并通过 xml 配置发现服务。2 个工程通过相同接口实现关联。一个客户端,一个服务端,如果是本机,通过 xml 中配置 testurl 发现服务;如果是服务器上部署测试,走 dsr 底座发现服务。
  • 启动 myserver-app web 模块的 SOFABootWebSpringApplication,发布服务。
  • 启动 myclient-app web 模块的 SOFABootWebSpringApplication,引用服务。

服务发布

服务发布包含四个步骤,以 endpoint 子模块为例:

  1. 设计服务接口类 SampleService.java,代码如下:
    接口路径为:com.alipay.samples.rpc.SampleService

    1. /**
    2. * 服务接口类
    3. */
    4. public interface SampleService {
    5. public String hello();
    6. }


  2. 编写服务实现类 SampleServiceImpl.java, 代码如下:
    接口实现路径为:com.alipay.samples.rpc.impl.SampleServiceImpl
    1. /**
    2. ** 实现服务接口:SampleService
    3. */
    4. public class SampleServiceImpl implements SampleService{
    5. @Override
    6. public String hello() {
    7. return "hello SOFARPC!";
    8. }
    9. }
  3. 在 Spring XML 中配置服务发布的相关参数:

    • 可以新增 xml,配置的相关参数;
    • 也可以直接在已有的 XML 中新增以下配置:使用 SOFABoot 原型 Web 工程时,可以在src/main/resources/META-INF/myserver-app/myserver-app-endpoint.xml 中新增下述配置:
    1. <!-- 声明服务的实现对象,以下类全名和接口全名,请根据自己的包名进行指定 -->
    2. <bean id="sampleService" class="com.alipay.samples.rpc.impl.SampleServiceImpl"/>
    3. <!-- 发布 RPC 服务 -->
    4. <sofa:service ref="sampleService" interface="com.alipay.samples.rpc.SampleService">
    5. <sofa:binding.bolt/>
    6. </sofa:service>

    说明:上述新增配置中的 <sofa:binding.bolt/> 在 SOFABoot 2.2.3 之前的版本中,默认为 <sofa:binding.tr/>,请根据自己的项目情况进行配置。

  4. 运行 web 子模块中的 SOFABootWebSpringApplication,框架会自动进行服务的发布。为了避免端口冲突,需要在该类中指定端口,示例如下:

    1. //下面这一行只有在本地同时启动客户端和服务端的时候需要,正式环境不可以写
    2. System.setProperty("server.port", "8083");

服务引用

通过在 XML 中配置参数和引用对象注入,即可实现服务引用。

配置参数
  • 可以新增 xml,配置的相关参数;
  • 也可以直接在已有的 XML 中新增以下配置:使用 SOFABoot 原型 Web 工程时,可以在src/main/resources/META-INF/myserver-app/myclient-app-endpoint.xml 中新增下述配置:

    1. <!-- 以下接口名请根据服务提供方的接口全名来指定 -->
    2. <sofa:reference id="sampleServiceRef" interface="com.alipay.samples.rpc.SampleService">
    3. <sofa:binding.bolt>
    4. <!-- 等待配置中心返回地址的时间,如果在 5000 ms 内有地址返回的话,等待过程会立马结束 -->
    5. <sofa:global-attrs address-wait-time="5000" test-url="127.0.0.1:12201"/>
    6. </sofa:binding.bolt>
    7. </sofa:reference>

    说明

    • 上述新增配置中的 <sofa:binding.bolt/> 在 SOFABoot 2.2.3 之前的版本中,默认为 <sofa:binding.tr/>,请根据自己的项目情况进行配置。
    • test-url=”127.0.0.1:12201”,注意端口号12201 需要和 myserver-app web 模块 src/main/resources/config/application.properties 中配置 rpc.tr.port=12201 进行对应
引用对象注入

为了方便直观使用,我们将引用服务,放在 RPC 服务引用类,即 Web 子模块的 com.alipay.mytestsofa.SOFABootWebSpringApplication 中,示例如下:

  1. @ImportResource({"classpath*:META-INF/demo/*.xml"})
  2. @org.springframework.boot.autoconfigure.SpringBootApplication
  3. public class SOFABootWebSpringApplication {
  4. private static final Logger logger = LoggerFactory.getLogger(SOFABootWebSpringApplication.class);
  5. public static void main(String[] args) {
  6. //1. 端口配置:
  7. //下面这一行只有在本地同时启动客户端和服务端的时候需要,正式环境不可以写
  8. System.setProperty("server.port", "8084");
  9. SpringApplication springApplication = new SpringApplication(SOFABootWebSpringApplication.class);
  10. ApplicationContext applicationContext = springApplication.run(args);
  11. if (logger.isInfoEnabled()) {
  12. logger.info("application start");
  13. }
  14. //2. 获取服务对象:
  15. SampleService sampleService = (SampleService) applicationContext.getBean("sampleServiceRef");
  16. //3. 调用服务功能
  17. String resp = sampleService.hello();
  18. //5. 控制台输出响应结果:
  19. System.out.println(resp);
  20. //4. 日志输出服务响应结果:
  21. if (logger.isInfoEnabled()) {
  22. logger.info("the resp data is " + resp);
  23. }
  24. }
  25. }

注意:

  • 本地测试中,如果客户端和服务端同时在本地启动,需要修改客户端的端口,防止端口冲突,示例如下:
    在 myserver-app web 模块 src/main/resources/config/application.properties 中配置 rpc.tr.port=12201在 myclient-app web 模块 src/main/resources/config/application.properties 中配置 rpc.tr.port=12202
  • rpc_tr_port 是 TR 端口号,默认为12200。

  • 如果用户在云上,但无法在自己电脑上,连接云上的服务注册中心,可以将 run.mode 设置为 TEST,进行直连调用。在 src/main/resources/config/application.properties 中配置run.mode=TESTrun.mode 是 RPC 运行模式,默认为空,其它配置详见 系统配置参数

部署应用

将应用发布在 SOFAStack 上,发布流程参见 发布部署应用

服务查询

微服务控制台提供已注册服务的查询功能,可以查询已经注册的服务的提供者与消费者的具体信息。

登录微服务平台后,点击 微服务 > 服务管控

查询实例下所有的服务

通过关键字可以模糊查询已经发布或订阅的服务。例如,通过 ElasticService 关键字可以搜索到服务类名或包名中含 ElasticService 的所有服务。无条件查询可以匹配该实例下所有的服务,也可以输入 IP 进行精确查询,如输入 11.165.199.35,可以查询这个 IP 节点发布或订阅的所有服务。

服务查询

有关 RPC 服务管控的更多信息,请参见 服务管控 > 查看及管理 RPC 服务