|
|
51CTO旗下网站
|
|
移动端

2.3.5.1 编写Reliable Service 应用

《Microsoft Azure 管理与开发(下册)平台服务PaaS》本书由世纪互联蓝云Microsoft Azure 开发技术支持团队的资深工程师们编写,主要阐述MicrosoftAzure PaaS 服务的开发应用,涉及计算服务、集成认证服务、数据存储服务、大数据服务等方面的内容。本节为大家介绍编写Reliable Service 应用。

作者:世纪互联蓝云公司来源:电子工业出版社|2018-07-12 17:43

2.3.5.1 编写Reliable Service 应用

Azure 为开发者提供便捷开发Reliable Service 应用的工具,只要在Visual Studio 中安装Service Fabric SDK tools,就可以开始开发无状态服务和有状态服务。本章节将详细介绍如何使用Visual Studio 开发Service Fabric 的应用程序。

1. 创建无状态服务

无状态服务是Service Fabric 最基本的服务类型,该服务类型之所以被视为无状态,因为它不会将状态数据保存群集内,当实例关闭时,其内部状态也将随之消失。这种服务如果想要保存状态数据,必须借助于外部存储,如Azure SQL Database 或者Azure Table,才能实现高可用。

借助Visual Studio 可以很方便地开发Service Fabric 应用程序。首先,以管理员身份启动Visual Studio 2015 或者2017,创建第一个Service Fabric 无状态服务应用程序。

然后创建一个无状态服务项目。创建完成后,项目会包含两个项目,一个是应用程序的项目,包含应用程序的配置,以及部署脚本等;一个是无状态服务的项目,会在此项目中编写无状态服务的代码。接下来就编写服务代码,打开项目HelloWorldStateless.cs 文件。

该文件是服务实现的主要文件,服务接口定义了以下两个入口点。

(1) RunAsync 入口方法。当服务启动,该方法将被调用,并保持执行,直到执行完成或被取消。可以在此实现任何计算型的业务,例如后台任务。

(2) CreateServiceInstanceListeners 创建通信侦听器,例如ASP.net core。可以实现面向用户或者面向其他服务的接口。

Visual Studio 在默认情况下会创建如下的示例代码,在RunAsync 中实现一个计数的后台任务。服务会将每次计数结果计入iterations,该iterations 值只是保存在当前实例内的本地变量,当服务关闭后,该值就会被重置,并且,当有多个实例时,该值也不会同步。代码如下:

  1. protected override async Task RunAsync(CancellationToken cancellationToken)  
  2. {  
  3. long iterations = 0;  
  4. while (true)  
  5. {  
  6. cancellationToken.ThrowIfCancellationRequested();  
  7. ServiceEventSource.Current.ServiceMessage(this, " Working-{0} " ,  
  8. ++iterations);  
  9. await Task.Delay(TimeSpan.FromSeconds(1), cancellationToken);  
  10. }  

2. 创建有状态服务

Service Fabric 有状态服务将状态数据保存到可靠集合内,而无需借助外部的存储系统。这样,有状态服务在访问数据时,访问的都是本实例内的可靠集合数据,而不经过网络。这就免去了网络延迟,提高了访问效率。

在之前介绍了如何在无状态服务中实现计数器,但无状态服务并不能使计数值持久化。现在将实现有状态服务版的计数器,并将计数器存储到服务的可靠集合中,保证计数值高可用和持久化。

在Visual Studio 中创建有状态服务,通过右键选择Add-New Service Fabric Service,可以在之前的项目内添加新的服务,如图2.3.5-2 所示。

选择其中的有状态服务,并将其命名为 HelloWorldStateful,单击“确定”。创建完后,项目就有了两个服务,无状态服务HelloWorldStateless 和HelloWorldStateful。有状态服务和无状态服务有相同的入口,它们的主要区别是,有状态服务可以借助Reliable Collections存储状态数据,以供程序调用。

打开HelloWorldStateful.cs,默认Visual Studio 实现一个计数器示例,该示例就是有状态服务版的计数器实现,代码如下:

  1. protected override async Task RunAsync(CancellationToken cancellationToken)  
  2. {  
  3. var myDictionary = await this.StateManager.GetOrAddAsync  
  4. <IReliableDictionary<string, long>>("myDictionary");  
  5. while (true)  
  6. {  
  7. cancellationToken.ThrowIfCancellationRequested();  
  8. using (var tx = this.StateManager.CreateTransaction())  
  9. {  
  10. var result = await myDictionary.TryGetValueAsync(tx, "Counter");  
  11. ServiceEventSource.Current.ServiceMessage(this, " Current  
  12. Counter Value: {0}",  
  13. result.HasValue ? result.Value.ToString() : "Value does not  
  14. exist.");  
  15. await myDictionary.AddOrUpdateAsync(tx, " Counter " , 0, (key,  
  16. value) => ++value);  
  17. await tx.CommitAsync();  
  18. }  
  19. await Task.Delay(TimeSpan.FromSeconds(1), cancellationToken);  
  20. }  

RunAsync 方法跟无状态服务是类似的,只不过有状态服务在执行RunAsync 之前会确保服务、可靠状态管理器和可靠集合已经可以正常使用。有状态服务通过状态管理器来获取可靠集合,之后就可以使用可靠集合的方法来修改数据。例如:

  1. var myDictionary = await this.StateManager.GetOrAddAsync  
  2. <IReliableDictionary<string, long>>("myDictionary"); 

IReliableDictionary 是可靠集合的一种类型,后续会详细介绍该类型。状态管理器提供管理可靠集合的功能,也提供事务支持,可以让跨多个可靠集合的多个操作保持在同一个事务里。

开发完成后,就可以发布测试。在微软的Service Fabric 工具中,可以在本地模拟ServiceFabric 开发环境,这个环境基本和云上的Service Fabric 一样,在Visual Studio 中只需要使用F5 生成应用并运行即可,开发工具会自动将应用程序发布到本地模拟环境中。服务开始后,就可以通过“诊断事件”窗口浏览程序生成的Windows 事件跟踪(ETW)事件,如图2.3.5-3 所示。因为应用中包含一个无状态服务和有状态服务,所以事件中会包含两个服务的所有日志。可以通过点开事件来查看事件的具体内容,以判断此事件来自哪个服务。


喜欢的朋友可以添加我们的微信账号:

51CTO读书频道二维码


51CTO读书频道活动讨论群:365934973

【责任编辑:book TEL:(010)68476606】

回书目   上一节   下一节
点赞 0
分享:
大家都在看
猜你喜欢

读 书 +更多

Java网络编程精解

本书结合大量的典型实例,详细介绍了用Java来编写网络应用程序的技术。本书的范例都基于最新的JDK 1.5版本,书中内容包括:Java网络编程的...

订阅51CTO邮刊

点击这里查看样刊

订阅51CTO邮刊