- 为什么我们用 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/ ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。
如有任何疑问,请与我联系 (MingsonZheng@outlook.com) 。