.NET 云原生架构师训练营(基于 OP Storming 和 Actor 的大型分布式架构三)–学习笔记

目录

  • 为什么我们用 Orleans
  • Dapr VS Orleans
  • Actor 模型
  • Orleans 的核心概念
  • 结合 OP Storming 的实践

结合 OP Storming 的实践

  • 业务模型
  • 设计模型
  • 代码实现

代码实现

  • HelloOrleans.Host
  • Orleans.Providers.MongoDB
  • HelloOrleans.Contract
  • HelloOrleans.BlazorWeb

Orleans.Providers.MongoDB

接下来我们把它改为 MongoDB:Orleans.Providers.MongoDB: https://github.com/OrleansContrib/Orleans.Providers.MongoDB

引入 negut 包

<PackageReference Include="Orleans.Providers.MongoDB" Version="3.4.1" /> 

配置 MongoDB

builder.Host.UseOrleans(silo => {     silo.UseLocalhostClustering();     // silo.AddMemoryGrainStorage("hello-orleans");     silo.UseMongoDBClient("mongodb://localhost")         .AddMongoDBGrainStorage("hello-orleans", options =>         {             options.DatabaseName = "hello-orleans";             options.CollectionPrefix = "";         }); }); 

我们启动项目测试一下

Create 方法入参

{ 	"title": "第一个职位", 	"description": "第一个职位" } 

.NET 云原生架构师训练营(基于 OP Storming 和 Actor 的大型分布式架构三)--学习笔记

可以看到方法调用成功,返回的 job 里面包含了 identity

{     "title": "第一个职位",     "description": "第一个职位",     "location": null,     "identity": "c83725f2-44da-45e0-bc2d-d849563cf924" } 

接着我们打开 MongoDB

.NET 云原生架构师训练营(基于 OP Storming 和 Actor 的大型分布式架构三)--学习笔记

可以看到 JobGrain 中有对应的 identity 的记录

因此我们可以看到 Storage 的切换是不会影响代码的

HelloOrleans.Contract

持久化之后我们再给它改变一下模式,现在我们是 silo 内模式,客户端和服务端是放到一起的

我们可以把它改变成 silo 外模式,客户端和服务端分开

创建一个类库项目 HelloOrleans.Contract

接着把 Contract 目录下的文件都搬到 HelloOrleans.Contract 项目中

添加 Orleans 的 nuget 包,它不需要添加 Server 的包

<ItemGroup>     <PackageReference Include="Microsoft.Orleans.Core" Version="3.6.5" />     <PackageReference Include="Microsoft.Orleans.CodeGenerator.MSBuild" Version="3.6.5" /> </ItemGroup> 

接着在 Host 项目中添加 Contract 的项目引用,即可生成成功

HelloOrleans.BlazorWeb

创建一个 Blazor Server 项目 HelloOrleans.BlazorWeb

添加 Orleans 的 nuget 包

<PackageReference Include="Microsoft.Orleans.Client" Version="3.6.5" /> 

在 Program 中添加 Orleans 客户端的配置

var builder = WebApplication.CreateBuilder(args);  var clientBuilder = new ClientBuilder(); clientBuilder.UseLocalhostClustering(); 

和服务端一样使用 UseLocalhostClustering

通过单例将 client 配置进去

var builder = WebApplication.CreateBuilder(args);  var clientBuilder = new ClientBuilder(); clientBuilder.UseLocalhostClustering(); builder.Services.AddSingleton(sp => {     var client = clientBuilder.Build();     client.Connect().Wait();     return client; }); 

接着在 Blazor 的 Index Page 尝试获取我们刚刚保存的 Job,需要添加 Contract 的项目引用

@page "/" @using Orleans @using HelloOrleans.Host.Contract.Entity @using HelloOrleans.Host.Contract.Grain  <PageTitle>Index</PageTitle>  <h1>Hello, world!</h1>  Welcome to your new app.  <SurveyPrompt Title="How is Blazor working for you?" />  职位标题:@Model.Title <br/> 职位描述:@Model.Description  @code {     [Inject]     public IClusterClient ClusterClient { get; set; }      public Job Model { get; set; } = new Job();      protected override async Task OnInitializedAsync()     {         var jobId = "c1eb55ff-74bc-4747-a782-5786cc3cdf80";         var jobGrain = ClusterClient.GetGrain<IJobGrain>(jobId);         Model = await jobGrain.Get();     } } 

相当于获取 Job,然后将 Job 的相关信息展现在页面上

接着我们测试一下,先启动 Host,再启动 Blazor

.NET 云原生架构师训练营(基于 OP Storming 和 Actor 的大型分布式架构三)--学习笔记

可以看到我们已经获取到了职位的信息

源码链接:https://github.com/MingsonZheng/HelloOrleans

.NET 云原生架构师训练营(基于 OP Storming 和 Actor 的大型分布式架构三)--学习笔记

本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。

欢迎转载、使用、重新发布,但务必保留文章署名 郑子铭 (包含链接: http://www.cnblogs.com/MingsonZheng/ ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。

如有任何疑问,请与我联系 (MingsonZheng@outlook.com) 。

发表评论

相关文章