微服务(SOFAStack MicroService)主要是通过 SOFARPC 来实现服务的发布和引用,微服务中的其它模块也都围绕 SOFARPC 展开。本文以微服务本地开发到云端发布的整体流程为框架,让您了解 SOFARPC 如何在本地实现、如何发布到云端、如何在云端进行服务管控。在云端发布前,示例工程也支持直连的方式,让您在本地体验 SOFARPC 的服务发布和服务引用。
本地工程开发
SOFARPC 工程开发流程图
SOFARPC 示例代码演示视频
准备工作
搭建 SOFABoot 环境。具体操作,请参见 搭建环境。
重要暂时只支持 SpringBoot、SOFABoot 应用接入。
通过以下任一方式生成 2 个 SOFABoot Web 工程,分别作为服务发布方和引用方。
本地开发流程
引入依赖。
按步骤创建的工程默认已经引入该依赖,请忽略此步骤;直接下载的示例工程需在 2 个本地 SOFABoot 工程 Web 模块
pom.xml
中引入 SOFARPC 的 Maven 依赖。<dependency> <groupId>com.alipay.sofa</groupId> <artifactId>rpc-enterprise-sofa-boot-starter</artifactId> </dependency>
编写业务逻辑。
主要为服务发布和服务引用。本示例使用注解的方式配置 Bean,实现服务发布和引用。更多详情,请参见 使用注解方式。其它配置方式,请参见 使用 XML 配置 及 使用编程 API。
服务发布的业务逻辑
设计服务接口类
本示例类名称为
SampleService.java
,接口路径为com.alipay.samples.rpc.SampleService
。public interface SampleService{ public String hello(); }
编写服务实现类
本示例类名称为
SampleServiceImpl.java
,接口实现路径为com.alipay.samples.rpc.impl.SampleServiceImpl
。@Service @SofaService(interfaceType =SampleService.class,bindings =@SofaServiceBinding(bindingType ="bolt")) public class SampleServiceImpl implements SampleService{ private int count =0; @Override public String hello(){ return "Hello SOFARpc! times = "+ count++; } }
服务引用的业务逻辑
引用对象注入
本示例采用
ReferenceHolder
类对引用对象进行统一管理,示例如下:@Component public class ReferenceHolder { @SofaReference(interfaceType = SampleService.class, binding = @SofaReferenceBinding(bindingType = "bolt", directUrl = "127.0.0.1:12201")) private SampleService sampleService; public SampleService getSampleService() { return sampleService; } public void setSampleService(SampleService sampleService) { this.sampleService = sampleService; } }
说明directUrl="127.0.0.1:12201"
:注意端口号 12201 需要和myserver-app
Web 模块src/main/resources/config/application.properties
中的配置rpc.tr.port=12201
对应。引用对象
为了方便直观使用,本示例将引用服务逻辑放在
myclient-app
工程 Web 模块的com.alipay.mytestsofa.SOFABootWebSpringApplication
中,示例如下:@SpringBootApplication public class SOFABootWebSpringApplication{ private static final Logger logger =LoggerFactory.getLogger(SOFABootWebSpringApplication.class); public static void main(String[] args){ //*************** 注意 ******************// //本地同时启动 myserver-app 和 myclient-app 时,由于 tomcat 端口冲突问题,需要修改 myclient-app 的端口号为 8084。 //将 myserver-app 和 myclient-app 发布到云上环境时,由于默认健康检查端口是 8080,所以需要注释掉该行代码。 System.setProperty("server.port","8084"); //由于本地启动没有注册中心,所以使用本地直连的方式访问本地启动的 myserver-app,发布到线上的时候需要注释掉该行代码。 System.setProperty("run.mode","TEST"); //********************************// SpringApplication springApplication =new SpringApplication(SOFABootWebSpringApplication.class); ApplicationContext applicationContext = springApplication.run(args); if(logger.isInfoEnabled()){ printMsg("SofaRpc Application (myclient-app) started on 8084 port."); } //调用 SOFARPC 服务。 ReferenceHolder referenceHolder = applicationContext.getBean(ReferenceHolder.class); final SampleService sampleService = referenceHolder.getSampleService(); new Thread(new Runnable(){ @Override public void run(){ while(true){ try{ String response = sampleService.hello(); printMsg("Response from myserver-app: "+ response); }catch(Exception e){ e.printStackTrace(); }finally{ try{ TimeUnit.SECONDS.sleep(3); }catch(InterruptedException e){ } } } } }).start(); } private static void printMsg(String msg){ System.out.println(msg); if(logger.isInfoEnabled()){ logger.info(msg); } } }
配置包扫描。
@SpringBootApplication(scanBasePackages ={"com.alipay.mytestsofa","com.alipay.samples.rpc"}) public class SOFABootWebSpringApplication{ ... }
配置本地运行的端口。
在
myserver-app
Web 模块application.properties
文件中配置rpc.tr.port=12201
。rpc.tr.port
是 TR 端口号,默认为 12200;TR = TaobaoRemoting
是 RPC 使用的底层通信框架。云端发布时不需要该项配置。运行 Web 子模块中的
SOFABootWebSpringApplication
。运行后,框架会自动进行服务的发布。为了避免端口冲突,需要在该类中指定端口。
System.setProperty("server.port","8083");
重要将
myserver-app
发布至云上环境前,必须注释掉代码中对 8083 端口的配置。在
myclient-app
Web 模块application.properties
文件中配置rpc.tr.port=12202
。rpc.tr.port
是 TR 端口号,默认为 12200。云端发布时不需要该项配置。
配置
application.properties
。登录 SOFAStack 控制台。
在左侧导航栏选择 中间件 > 中间件总览。
instanceld(实例标识):应用实例在工作空间中的唯一标识。
在
application.properties
中对应的 key 为com.alipay.instanceid
。AntVIP endpoint:区域的唯一标识,每个区域一个地址。
在
application.properties
中对应的 key 为com.antcloud.antvip.endpoint
。Access Key ID:用于标识用户。单击 获取 AK 可前往 RAM 控制台获取。具体操作,请参见 创建AccessKey。
在
application.properties
中对应的 key 为com.antcloud.mw.access
。Access Key Secret:用于验证用户。单击 获取 SK 可前往 RAM 控制台获取。具体操作,请参见 创建AccessKey。
在
application.properties
中对应的 key 为com.antcloud.mw.secret
。
配置运行模式和运行环境,示例如下:
run.mode=NORMAL com.alipay.env=shared
将上述步骤获取的参数配置在
application.properties
文件中。
更多信息,请参见 引入 SOFA 中间件。
示例工程
下文以示例工程为例,对 SOFARPC 的实现原理进行说明。
示例概述
通过 IDEA 或 Eclipse 分别打开 rpc-demo 中的 myserver-app
和 myclient-app
工程。
示例工程关键信息
groupId:工程组织的唯一标识,示例工程为
com.alipay.mytestsofa
。artifactId:工程的构件标识符,示例工程为
myserver-app
或myclient-app
。version:版本号,默认为
1.0-SNAPSHOT
。package:应用包名,默认等同于 groupId,工程示例为
com.alipay.mytestsofa
。
示例工程 Bean 配置
Bean 的配置分为服务发布和服务引用 2 个类型:
服务发布示例
@SofaService(interfaceType =SampleService.class,bindings =@SofaServiceBinding(bindingType ="bolt"))
服务引用示例
@SofaReference(interfaceType =SampleService.class,binding =@SofaReferenceBinding(bindingType ="bolt",directUrl ="127.0.0.1:12201")) privateSampleService sampleService;
说明示例中,为了便于对所有待引用实例进行统一管理,创建了
ReferenceHolder
类,进行引用管理。
示例工程原理
在 2 个工程的 endpoint 模块中相同位置,提供相同的服务接口和实现,并通过注解发现服务。2 个工程通过相同接口实现关联。一个客户端,一个服务端,如果是本地工程,在引用时,通过配置 directUrl,以直连方式发现服务;如果是服务器上部署测试,则通过 DSR(Direct Server Return) 底座发现服务。
启动
myserver-app
Web 模块的SOFABootWebSpringApplication
可发布服务。启动
myclient-app
Web 模块的SOFABootWebSpringApplication
可引用服务。
示例工程服务验证
启动
myserver-app
Web 模块的SOFABootWebSpringApplication
发布服务。启动
myclient-app
Web 模块的SOFABootWebSpringApplication
引用服务。引用成功后,
myclient-app
控制台将输出:Response from myserver-app:HelloSOFARpc! times = xx
您也可通过日志来查看服务引用结果。在 Web 子模块路径
src/main/resources/config/application.properties
中,可设置日志路径。默认在logs/myweb-app/common-default.log
中查看服务引用结果。
应用打包和云端发布
打包本地应用。
操作步骤,请参见 本地运行。
发布应用。