Orleans-Hello World
Orleans-Hello World
http://www.rm5u.com/orleans/orleans-intro.html
什么是Orleans?
Orleans(奥尔良)是一个建立在.NET之上的,设计的目标是为了方便程序员开发需要大规模扩展的云服务。Orleans项目基本上被认为是并行计算模型Actor Model的分布式版本。
虽然已经存在Erlang 和Akka这样利用Actor Model的框架,用户仍然需要做很多工作来确保那些actors保持在线以及能够处理故障和恢复。Orleans框架着眼复杂项目和actor管理,让用户能够编写分布式项目而无需担心。
Orleans是微软的终极计算机小组(来自其它新闻的说法,这个项目我最开始看到是在微软研究院的页面上)近年来一直研发的项目。
主要特性:
特性
可扩展
低延迟
简化并发
从上述的简介可以看出Orleans就是为了分布式、并发而生,那么大并发、高用户量也可以得到解决。
官网:http://dotnet.github.io/orleans/
文档:http://dotnet.github.io/orleans/What's-new-in-Orleans
源码:https://github.com/dotnet/orleans
是否可靠?案例有哪些?
是否可靠我也不确定,但是案例还是很诱人的,特别是微软官方游戏:Halo4、Halo5(光环|光晕)的云服务全部由它来承载。当然还有其它的用户,不过我都不怎么认识,就不列出了,大伙可以去官网查看。
基于Orleans的应用部署图

核心角色
Grains(粮食、谷物、杂粮)
Grains可以理解为一个服务,类似:UserService、AccountService,是主要的业务逻辑实现与抽象。
Silos(筒仓)
Silos可以理为一台Server,里面主要用于存储Grains,也就是说Grains开发完成后需要注册到Silos中,然后等待调用。
支持的宿主
.NET Framework、Core CLR,也就是说可以进行跨平台部署。
Client(客户端)
具体的应用客户端,可以是控制台、Web应用程序(MVC——包含vNext、WebForms)、WindowService、WPF等一切.NET端技术。
第一个基于Orleans的应用程序
建立项目结构
新建2个控制台应用程序,和2个Windows类库,项目结构如下:

在”Sample.Implements“中添加对项目”Sample.Interfaces“的引用。
在”Client“项目中添加对项目”Sample.Interfaces“的引用。
在”Server“项目中添加对项目”Sample.Interfaces“,”Sample.Implements“的引用。
安装NuGet包“Microsoft.Orleans.Server”、”Microsoft.Extensions.DependencyInjection“到“Server”项目中。

安装NuGet包“Microsoft.Orleans.Client”到“Client”项目中。

安装NuGet包“Microsoft.Orleans.Core”到“Sample.Implements”和”Sample.Implements”项目中。


书写业务逻辑(Grains)
在”Sample.Interfaces“中新建一个IUserService,代码如下
using Orleans;
using System.Threading.Tasks; namespace Sample.Interfaces
{
public interface IUserService : IGrainWithIntegerKey
{
Task<bool> Exist(string mobileNumber);
}
}
用意非常简单,根据手机号码判断用户是否存在。
在”Sample.Implements“新建一个UserService实现IUserService接口,代码如下:
using Orleans;
using Sample.Interfaces;
using System.Threading.Tasks; namespace Sample.Implements
{
public class UserService : Grain, IUserService
{
#region Implementation of IUserService public Task<bool> Exist(string mobileNumber)
{
return Task.FromResult(mobileNumber == "13888888888");
} #endregion Implementation of IUserService
}
}
为服务端和客户端书写代码
在”Server“Program.cs入口点中写入如下代码:
using Orleans.Runtime.Host;
using System; namespace Server
{
internal class Program
{
private static void Main(string[] args)
{
using (var host = new SiloHost("Default"))
{
host.LoadOrleansConfig();
host.InitializeOrleansSilo();
host.StartOrleansSilo(); Console.WriteLine("已启动,按下任意键退出。");
Console.ReadLine(); host.StopOrleansSilo();
}
}
}
}
在”Client“Program.cs入口点中写入如下代码:
using Orleans;
using Sample.Interfaces;
using System; namespace Client
{
internal class Program
{
private static void Main(string[] args)
{
GrainClient.Initialize(); while (true)
{
Console.WriteLine("请输入用户的手机号码来判断是否存在:");
var mobileNumber = Console.ReadLine();
var userService = GrainClient.GrainFactory.GetGrain<IUserService>(0);
Console.WriteLine($"用户{mobileNumber},{(userService.Exist(mobileNumber).Result ? "已经存在" : "还不存在")}");
}
}
}
}
运行
首先运行”Server.exe“等待出现如下文字:

在运行”Client.exe“

Demo源码
本次的源码放在:https://github.com/majian159/Samples/tree/master/OrleansSamples/HelloWorld
总结
可以发现我们的客户端应用”Client“完全没有引用业务逻辑实现的项目”Sample.Implements“,也就是说业务逻辑的执行是在服务端”Server“执行的,本次Demo只用了一个服务端,大伙可以想象下如果服务端进行了集群,再通过一些协调服务进行管理分配,那么搭建一个”微服务“的架构变得异常轻松,通过一些手段动态切换客户端所需服务的服务端地址从而提供应用响应与容灾的支持。
本文转载自:http://www.cnblogs.com/ants/p/5122068.html
Orleans-Hello World的更多相关文章
- .NET的Actor模型:Orleans
Orleans是微软推出的类似Scala Akka的Actor模型,Orleans是一个建立在.NET之上的,设计的目标是为了方便程序员开发需要大规模扩展的云服务, 可用于实现DDD+EventSou ...
- 一种基于Orleans的分布式Id生成方案
基于Orleans的分布式Id生成方案,因Orleans的单实例.单线程模型,让这种实现变的简单,贴出一种实现,欢迎大家提出意见 public interface ISequenceNoGenerat ...
- ORLEANS REMOTE DEPLOYMENT
Orleans Remote Deployment Table of Contents Overview: 1 Prerequisites. 2 Deployment Steps. 2 Orleans ...
- Microsoft Orleans 之 入门指南
Microsoft Orleans 在.net用简单方法构建高并发.分布式的大型应用程序框架. 原文:http://dotnet.github.io/orleans/ 在线文档:http://dotn ...
- orleans/Documentation
福利 奥尔良的主要好处是︰开发人员工作效率,甚至为非专家程序员;和默认的透明可伸缩性与程序员没有特别努力.我们扩大每个下面这些好处. 开发人员的生产力 奥尔良的编程模型通过提供以下关键的抽象. 担保和 ...
- github.com/dotnet/orleans
Orleans is a framework that provides a straight-forward approach to building distributed high-scale ...
- 微软分布式云计算框架Orleans(1):Hello World
自从写了RabbitHub框架系列后的一段时间内一直在思索更加轻量简便,分布式高并发的框架(RabbitHub学习成本较高),无意间在网上级联看到了很多新框架:从helios到Akka.NET在到Or ...
- 微软分布式云计算框架Orleans(2):容灾与集群(1)
在上一篇:微软分布式云计算框架Orleans(1):Hello World,我们大概了解了Orleans如何运用,当然上一篇的例子可以说是简单且无效的,因为用了Orleans不可能只写一个Hello ...
- Orleans是什么 (一)
官网:http://dotnet.github.io/orleans/ 文档:http://dotnet.github.io/orleans/What's-new-in-Orleans 源码:http ...
- Orleans 高级特性-目录
这里将介绍一些Orleans的高级特性,适合对Orleans已经有不少了解的用户,先列出一个索引,博客文章慢慢补充 1.使用Immutable 优化复制 2.自定义序列化 (待完成) 3.可重入 Gr ...
随机推荐
- Duplicate entry '97112' for key 1
1.错误描写叙述 2014-07-08 10:27:13,939 ERROR(com.you.conn.JDBCConnection:104) -com.mysql.jdbc.exceptions.j ...
- iOS开发之第三方登录微信-- 史上最全最新第三方登录微信方式实现
项目地址 : https://github.com/zhonggaorong/weixinLoginDemo 最新版本的微信登录实现步骤实现: 1.在进行微信OAuth2.0授权登录接入之前,在 ...
- When to use HTML Helper?
HTML Helper Single or closely related HTML elements(template) Simpler,low level logic for displaying ...
- C# Best Practices - Accessing and Using Classes
References and Using Do: Take care when defining references References must be one way (or circular ...
- FreeCodeCamp:Truncate a string
要求: 用瑞兹来截断对面的退路! 截断一个字符串! 如果字符串的长度比指定的参数num长,则把多余的部分用...来表示. 切记,插入到字符串尾部的三个点号也会计入字符串的长度. 但是,如果指定的参数n ...
- lightOJ 1317 Throwing Balls into the Baskets
lightOJ 1317 Throwing Balls into the Baskets(期望) 解题报告 题目链接:http://acm.hust.edu.cn/vjudge/contest/ ...
- 阿里云部署 Flask + WSGI + Nginx 详解
抵不住朋友的诱惑,今天终于入手了一台阿里云服务器,是Ubuntu 1.4 32位版本,最初考虑是用来尝尝鲜只是买了个最低配的,价格算起来与在国外买个空间的价格相当吧(可能一年才贵100多),但用起来感 ...
- mysql innodb存储引擎的聚集索引
InnoDB聚集索引 MySQL有没有支持聚集索引,取决于采用哪种存储引擎. MySQL InnoDB一定会建立聚集索引,所谓聚集,指实际数据行和相关的键值保存在一块,这也决定了一个表只能有一个聚集索 ...
- Nginx 之三:nginx服务器模块、web请求处理机制及事件驱动模型、进程功能和进程间通信
一:Nginx的模块化结构设计: 1.核心模块:指的是nginx服务器运行当中必不可少的模块,这些模块提供了最基本最核心的服务,比如权限控制.进程管理.错误日志.事件驱动.正则表达式解析等,nginx ...
- kinect for windows - DepthBasics-D2D详解之一
Depth在kinect中经常被翻译为深度图,指的是图像到摄像头的距离,这些距离数据能让机器知道物理距离有多远.kinect通过两个红外摄像头来实现这个功能的.在这个例子里,就实现了深度图的提取和现实 ...