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只用了一个服务端,大伙可以想象下如果服务端进行了集群,再通过一些协调服务进行管理分配,那么搭建一个”微服务“的架构变得异常轻松,通过一些手段动态切换客户端所需服务的服务端地址从而提供应用响应与容灾的支持。