Service Fabric学习-从helloworld开始(无状态服务)
原先做服务器程序, 都是部署在xx云上, 也没理解云是个啥, 不就是个服务器(虚拟机)租赁商吗? 好吧, 其实这个是IaaS, 而接下来要学习的ServiceFabric(以下简称SF)是PaaS.
首先SF和Orleans类似, 都是基于actor模型, 然后编程方式也很像, 大概就是定义公开接口, 然后后端服务实现接口, 前端调用接口这样.
这里说的前后端着实不够严谨, 其实是指服务器上的前后端, 前端是服务的前端并非服务器对应的客户端. 如果有web(asp.net)或是其他无状态类似网关的服务在前面接收客户端消息并调用服务接口, 那就是服务的使用者也就是这里语义上的前端了(语死早).
服务根据其是否有状态分为: 无状态服务和有状态服务.
无状态服务很容易理解, 一个helloword, echo示例, 计算器示例, 只处理用户输入本身不保存状态, 那就是无状态服务. 无状态服务的扩展很简单, 增加节点既是.
然而如计算器这种服务, 如果需要保存一些数据等待用户下次使用, 那就需要变成有状态服务了. 当然也可以引入第三方存储来规避状态, 继续使用无状态服务(伪), 因为此时的状态已经托付给第三方存储了.
当然上述做法使得结构又复杂起来了, 也可能造成额外的调用等待, 不如使用有状态服务.
而服务有了状态, 那又涉及到状态的落地, 容灾, 同步, 锁...这些东西烦扰了我整个编程生涯. 据说可以在SF中找到答案.
官网的文档入门案例太复杂了, 引入了angular等加高门槛搅脑汁的东西, 而我今天不打算学太多, 先做一个helloworld消化下. 最后的功能是能通过一个console程序调用服务接口, 然后接收返回的字符串helloworld.
一 安装必须工具
毫无疑问, visual studio是必须的, 我选择目前最新的vs2017社区免费版.
然后安装sdk
二 创建无状态服务
打开vs->新建项目->Visual C#->cloud->Serivce Fabric Application, 名称为HelloWorldApplication
选择无状态服务(stateless service), 名称为HelloWorldService
三 定义接口
创建接口, IHelloWorldService.cs
定义方法Task SayHello(string msg);
为了能远程调用, 使用nuget安装包Microsoft.ServiceFabric.Services.Remoting
此时打开"编辑项目文件csproj", 会看到如下的包引用
<ItemGroup>
<PackageReference Include="Microsoft.ServiceFabric.Services" Version="3.1.301" />
<PackageReference Include="Microsoft.ServiceFabric.Services.Remoting" Version="3.1.301" />
</ItemGroup>
编辑IHelloWorldService, 继承自IService(在刚才安装的remoting包中, 需要添加引用)
最后如下
using Microsoft.ServiceFabric.Services.Remoting;
using System;
using System.Collections.Generic;
using System.Text;
using System.Threading.Tasks; namespace HelloWorldService
{
public interface IHelloWorldService : IService
{
Task<string> SayHello(string msg);
}
}
这里的返回值是Task类型. 老实说我初次接触SF并不清楚其是否和Orleans一样将消息接收和处理异步开来, 同时通过task的同步调用使服务处理不用担心多线程问题. 但我猜自家产品没有理由不采用同样先进的方式吧?
四 实现接口
编辑HelloWorldService.cs文件, 继承IHelloWorldService接口, 实现SayHello方法.
删除原先存在的StartAsync方法. (Azure Cloud Service方式的延续?)
最后代码如下
internal sealed class HelloWorldService : StatelessService, IHelloWorldService
{
public HelloWorldService(StatelessServiceContext context)
: base(context)
{ } public Task<string> SayHello(string msg)
{
return Task.FromResult($"hello world! {msg}");
}/// <summary>
/// 可选择性地替代以创建侦听器(如 TCP、HTTP),从而使此服务副本可以处理客户端或用户请求。
/// </summary>
/// <returns>侦听器集合。</returns>
protected override IEnumerable<ServiceInstanceListener> CreateServiceInstanceListeners()
{
//return new ServiceInstanceListener[0];
return this.CreateServiceRemotingInstanceListeners();
}
}
服务到此就创建完毕了.
五 发布到本地集群
右键HelloWorldApplication项目, 然后发布, 选择LocalNode配置, 然后发布.
经历漫长的等待之后, 右下角出现了一个SF的橘黄色图标, 右键Manage local cluster, 可以查看和管理已经发布的applicaiton, 以及具体运行的node.
注意, 忘记说了, vs需要用管理员打开...
六 接下来创建客户端.
新建项目, console application, 任意, 我选择.net Core Console Application.
nuget获取包
<ItemGroup>
<PackageReference Include="Microsoft.ServiceFabric.Services" Version="3.1.301" />
<PackageReference Include="Microsoft.ServiceFabric.Services.Remoting" Version="3.1.301" />
</ItemGroup>
添加现有项, 将刚才的IHelloWorldService.cs添加进去(注意可以选择添加链接文件保持同步)
保持接口同步的还有一个方法是另建一个类库项目, 引用同一个类库(如同Orleans示例中一样)
修改Program中的main函数
static void Main(string[] args)
{
var client = ServiceProxy.Create<IHelloWorldService>(new Uri("fabric:/HelloWorldApplication/HelloWorldService"));
string msg = Console.ReadLine();
var result = client.SayHello(msg).Result;
Console.WriteLine(result);
Console.ReadKey();
}
F5运行客户端, 查看结果.
同上示例, 还可以拓展为计算器服务.
纠错: 上面说接口返回是Task可能是因为内部维持序列同步调用的关系, 其实是错误的. SF还有actor模型, 才和Orleans一样, 普通的有状态服务仍会异步调用.
Service Fabric学习-从helloworld开始(无状态服务)的更多相关文章
- 这个知识点不错,,学习一下先。。。无状态服务(stateless service)(转)
这样的应用,显得高级一些哟~~:) +================== http://kyfxbl.iteye.com/blog/1831869 ========================= ...
- 无状态服务(stateless service)
一.定义 无状态服务(stateless service)对单次请求的处理,不依赖其他请求,也就是说,处理一次请求所需的全部信息,要么都包含在这个请求里,要么可以从外部获取到(比如说数据库),服务器本 ...
- 无状态服务 VS 有状态服务
无状态服务 VS 有状态服务 https://blog.csdn.net/mysee1989/article/details/51381435 对服务器程序来说,究竟是有状态服务,还是无状态服务,其判 ...
- kubernetes的无状态服务和有状态服务介绍
无状态服务 1)是指该服务运行的实例不会在本地存储需要持久化的数据,并且多个实例对于同一个请求响应的结果是完全一致的 2)多个实例可以共享相同的持久化数据.例如: nginx实例和tomcat实例 3 ...
- Shiro学习(20)无状态Web应用集成
在一些环境中,可能需要把Web应用做成无状态的,即服务器端无状态,就是说服务器端不会存储像会话这种东西,而是每次请求时带上相应的用户名进行登录.如一些REST风格的API,如果不使用OAuth2协议, ...
- ServiceFabric极简文档-5.0 Service Fabric有状态与无状态
Service Fabric 应用程序方案 2017/08/14 作者 Edward Chen Jack Zeng Azure Service Fabric提供了一个可靠而灵活的平台,可用于编写和运行 ...
- 微服务框架之微软Service Fabric
常见的微服务架构用到的软件&组件: docker(成熟应用) spring boot % spring cloud(技术趋势) Service Fabric(属于后起之秀 背后是微软云的驱动) ...
- 转:微服务框架之微软Service Fabric
常见的微服务架构用到的软件&组件: docker(成熟应用) spring boot % spring cloud(技术趋势) Service Fabric(属于后起之秀 背后是微软云的驱动) ...
- 人人都可以开发高可用高伸缩应用——论Azure Service Fabric的意义
今天推荐的文章其实是微软的一篇官方公告,宣布其即将发布的一个支撑高可用高伸缩云服务的框架--Azure Service Fabric. 前两天,微软Azure平台的CTO Mark Russinovi ...
随机推荐
- SVN previous operation has not finished
svn提交遇到恶心的问题,可能是因为上次cleanup中断后,进入死循环了. 错误如下: 解决方法:清空svn的队列 1.下载sqlite3.exe 2.找到你项目的.svn文件,查看是否存在wc.d ...
- HDU 5468 Puzzled Elena (dfs + 莫比乌斯反演)
题意:给定一棵带权树,求每个点与其子树结点的权值互质的个数. 析:首先先要进行 dfs 遍历,len[i] 表示能够整除 i 的个数,在遍历的前和遍历后的差值就是子树的len值,有了这个值,就可以使用 ...
- CodeForces 916C Jamie and Interesting Graph (构造)
题意:给定两个数,表示一个图的点数和边数,让你构造出一个图满足 1- n 的最短路是素数,并且最小生成树也是素数. 析:首先 1 - n 的最短路,非常好解决,直接 1 连 n 就好了,但是素数尽量 ...
- highcharts x轴中文刻度太长换行
xAxis: { type: 'category', title:null, gridLineWidth: 1, lineColor: "#50ae93", labels: { s ...
- VB网络编程中Winsock的使用
原文链接:http://tech.163.com/06/0407/14/2E46BB930009159S.html 如同上面的内容所描述的,不论您使用UDP协议或是TCP协议,Winsock控件都可以 ...
- MySQL修改root密码的3种方法
方法1: 用SET PASSWORD命令 mysql -u rootmysql> SET PASSWORD FOR 'root'@'localhost' = PASSWORD('newpass' ...
- POJ2594 Treasure Exploration(最小路径覆盖)
Treasure Exploration Time Limit: 6000MS Memory Limit: 65536K Total Submissions: 8550 Accepted: 3 ...
- kmp小记
以下转载自Matrix67 ************************************************************************************** ...
- 数字证书管理工具openssl和keytool的区别
1. 用SSL进行双向身份验证意思就是在客户机连接服务器时,链接双方都要对彼此的数字证书进行验证,保证这是经过授权的才能够连接(我们链接一般的SSL时采用的是单向验证,客户机只验证服务器的证书,服务器 ...
- 5.Django高级
管理静态文件 项目中的CSS.图片.js都是静态文件 配置静态文件 在settings 文件中定义静态内容 STATIC_URL = '/static/' STATICFILES_DIRS = [ o ...