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

Posted dotNET跨平台

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了.NET 云原生架构师训练营(基于 OP Storming 和 Actor 的大型分布式架构三)--学习笔记...相关的知识,希望对你有一定的参考价值。

 点击上方“DotNet NB”关注公众号

回复“1”获取开发者路线图

学习分享 丨作者 / 郑 子 铭    

这是DotNet NB 公众号的第204篇原创文章

目录

  • 为什么我们用 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": "第一个职位"

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


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

接着我们打开 MongoDB

可以看到 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

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

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

推荐阅读:
.NET 那些年我们用过的组件-结构化日志组件 Serilog
C# 多线程并行编程篇之结构化

.NET性能优化-使用RecyclableMemoryStream替代MemoryStream
.NET周报【12月第4期 2022-12-31】

一款统计摸鱼时长的开源项目

dotnet 世界猜测 随机数的小测试
点击下方卡片关注DotNet NB
一起交流学习


▲ 点击上方卡片关注DotNet NB,一起交流学习

请在公众号后台
回复 【路线图】获取.NET 2021开发者路线图
回复 【原创内容】获取公众号原创内容
回复 【峰会视频】获取.NET Conf开发者大会视频
回复 【个人简介】获取作者个人简介
回复 【年终总结】获取作者年终总结
回复 【加群】加入DotNet NB 交流学习群


长按识别下方二维码,或点击阅读原文。和我一起,交流学习,分享心得。

以上是关于.NET 云原生架构师训练营(基于 OP Storming 和 Actor 的大型分布式架构三)--学习笔记...的主要内容,如果未能解决你的问题,请参考以下文章

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

.NET 云原生架构师训练营(KestrelServer源码分析)--学习笔记

.NET云原生架构师训练营讲什么,怎么讲,讲多久

.NET 云原生架构师训练营(权限系统 代码实现 WebApplication)--学习笔记

.NET 云原生架构师训练营(系统架构)--学习笔记

.NET 云原生架构师训练营(Identity Server)--学习笔记