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

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

时间:2023-01-16 21:56:56浏览次数:57  
标签:Orleans -- MongoDB Host Contract HelloOrleans Storming var 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": "第一个职位"
}

可以看到方法调用成功,返回的 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

知识共享许可协议

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

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

如有任何疑问,请与我联系 ([email protected]) 。

标签:Orleans,--,MongoDB,Host,Contract,HelloOrleans,Storming,var,Actor
From: https://www.cnblogs.com/MingsonZheng/p/17056386.html

相关文章

  • 银行家算法中安全检查算法正确性证明
    符号说明\(<_{\forall}\):如果两个同维行向量\(A\)、\(B\)中,\(A\)中任意一个元素都小于\(B\)中对应位置上的元素,则\(A<_{\forall}B\)为真。\(<_{\exist}\):如果两......
  • 16 Jan 1813. 句子相似性 III(每日一题)
    16Jan1813.句子相似性III(每日一题)一个句子是由一些单词与它们之间的单个空格组成,且句子的开头和结尾没有多余空格。比方说,"HelloWorld","HELLO","helloworldhello......
  • BST二叉平衡树
    BST树称为【二叉搜索树(BinarySearchTree)】或者【二叉排序树(BinarySortTree)】,它或者是一颗空树,或者是具有如下性质的二叉树:若左子树不为空,则左子树上所有节点的值......
  • 使用事务码 SAT 比较传统的 SELECT SQL 语句和 OPEN / FETCH CURSOR 分块读取 ABAP 数
    从77开始的连续三篇文章,我们了解ABAP程序中变量占用内存空间的话题。通过一位读者朋友向我咨询过的实际问题,介绍了使用OPENCURSOR和FETCHNEXTCURSOR这组ABAP......
  • win10 锁屏失效 windows+L
    注册表项修改值为0 https://answers.microsoft.com/zh-hans/windows/forum/all/windows-10/e41b3f4f-39b1-4146-87ce-a0f3fd91f3ad  请在小娜中搜索Regedit,打开......
  • 为什么生产MES系统对工厂管理如此重要?
    随着生产业务、计算机技术的发展,MES管理系统的定义也是在不断的变化。但是,计划调度、质量管理、生产执行以及数据(设备,产品信息)采集,一直都是MES的核心功能。工业物联网,对于......
  • 安装完Git鼠标右键不显示或者打不开Git Bash Here和Git GUI Here的问题
    问题:安装完Git后,右键(WIN11中右键后还需要点击->显示更多选项)发现缺少/打不开GitBashHere和GitGUIHere,或是其中之一。解决:①win+r打开运行,输入:regedit②按图片......
  • Stack 容器
    Stack容器介绍Stack栈容器,是Vector的一个子类,它实现了一个标准的后进先出(LIFO:LastInFristOut)的栈。Stack特点是后进先出。它通过5个操作方法对Vector进行......
  • adg3304使用注意事项
    1.常见的电平转换芯片有74LVC4245,74LVC8T245,这两个芯片有方向和使能控制引脚。 ADG3304有使能脚,但是没有方向选择脚。2.3304不用的引脚不允许悬空,必须接vcc或者gnd。3.......
  • 机票的价格
     packagecom.fqs.demo;importjava.util.Scanner;publicclassChongZ{//5-10月份属于旺季机票原价给个值,头等舱的价格9折;经济舱的价格8.5折......