Orleans初体验
Orleans:
- 是一个跨平台框架,用于构建可靠且可缩放的分散式应用。 分布式应用定义为跨多个进程的应用,通常使用对等通信来超越硬件边界。
- 从单个本地服务器扩展到了云中数千个分布式、高度可用的应用。
- 将熟悉的概念和 C# 习语扩展到了多服务器环境。
- 在设计上可弹性缩放。 当主机加入群集时,它可以接受新的激活。 当主机退出群集时,该主机上的先前激活将根据需要在其余主机上重新激活。 主机可能会因纵向缩减或计算机故障而退出群集。 Orleans 群集可以纵向缩减为单个主机。 用于启用弹性缩放的相同属性会启用容错。 群集可自动检测故障并快速从故障中恢复。
- 通过提供一组常见的模式和 API,简化分布式应用开发的复杂性。
- 熟悉单一服务器应用开发的开发人员可以改为构建可复原、可缩放的云原生服务和分布式应用。
- 有时称为“分布式 .NET”。
- 构建云原生应用时选择的框架。
- 可以在支持 .NET 的任意位置运行。 这包括将它托管在 Linux、Windows 和 macOS 上。
- 应用可以部署到 Kubernetes、虚拟机和 PaaS 服务,例如 Azure 应用服务和 Azure 容器应用。
这是官方的解释,不熟悉相关的概念看起来会一脸愣逼,实践才是王道,下面我们就来个初体验:
1、打开VS2022,新建一个ASP.NET Core WebAPI项目;
2、输入项目名称和选择文件夹位置,然后选择以下选项:
.NET Aspire是因为我在解决方案中配了Aspire,可选可不选。
3、安装Microsoft.Orleans.Server Nuget包,如图:
4、用如下代码替换Programs.cs:


1 // <configuration>
2 using Orleans.Runtime;
3
4 var builder = WebApplication.CreateBuilder(args);
5
6 builder.Host.UseOrleans(static siloBuilder =>
7 {
8 siloBuilder.UseLocalhostClustering();
9 siloBuilder.AddMemoryGrainStorage("urls");
10 });
11
12 using var app = builder.Build();
13 // </configuration>
14
15 // <endpoints>
16 app.MapGet("/", static () => "Welcome to the URL shortener, powered by Orleans!");
17
18 app.MapGet("/shorten",
19 static async (IGrainFactory grains, HttpRequest request, string url) =>
20 {
21 var host = $"{request.Scheme}://{request.Host.Value}";
22
23 // Validate the URL query string.
24 if (string.IsNullOrWhiteSpace(url) &&
25 Uri.IsWellFormedUriString(url, UriKind.Absolute) is false)
26 {
27 return Results.BadRequest($"""
28 The URL query string is required and needs to be well formed.
29 Consider, ${host}/shorten?url=https://www.microsoft.com.
30 """);
31 }
32
33 // Create a unique, short ID
34 var shortenedRouteSegment = Guid.NewGuid().GetHashCode().ToString("X");
35
36 // Create and persist a grain with the shortened ID and full URL
37 var shortenerGrain =
38 grains.GetGrain<IUrlShortenerGrain>(shortenedRouteSegment);
39
40 await shortenerGrain.SetUrl(url);
41
42 // Return the shortened URL for later use
43 var resultBuilder = new UriBuilder(host)
44 {
45 Path = $"/go/{shortenedRouteSegment}"
46 };
47
48 return Results.Ok(resultBuilder.Uri);
49 });
50
51 app.MapGet("/go/{shortenedRouteSegment:required}",
52 static async (IGrainFactory grains, string shortenedRouteSegment) =>
53 {
54 // Retrieve the grain using the shortened ID and url to the original URL
55 var shortenerGrain =
56 grains.GetGrain<IUrlShortenerGrain>(shortenedRouteSegment);
57
58 var url = await shortenerGrain.GetUrl();
59
60 // Handles missing schemes, defaults to "http://".
61 var redirectBuilder = new UriBuilder(url);
62
63 return Results.Redirect(redirectBuilder.Uri.ToString());
64 });
65
66 app.Run();
67 // </endpoints>
68
69 // <graininterface>
70 public interface IUrlShortenerGrain : IGrainWithStringKey
71 {
72 Task SetUrl(string fullUrl);
73
74 Task<string> GetUrl();
75 }
76 // </graininterface>
77
78 // <grain>
79 public sealed class UrlShortenerGrain(
80 [PersistentState(
81 stateName: "url",
82 storageName: "urls")]
83 IPersistentState<UrlDetails> state)
84 : Grain, IUrlShortenerGrain
85 {
86 public async Task SetUrl(string fullUrl)
87 {
88 state.State = new()
89 {
90 ShortenedRouteSegment = this.GetPrimaryKeyString(),
91 FullUrl = fullUrl
92 };
93
94 await state.WriteStateAsync();
95 }
96
97 public Task<string> GetUrl() =>
98 Task.FromResult(state.State.FullUrl);
99 }
100
101 [GenerateSerializer, Alias(nameof(UrlDetails))]
102 public sealed record class UrlDetails
103 {
104 [Id(0)]
105 public string FullUrl { get; set; } = "";
106
107 [Id(1)]
108 public string ShortenedRouteSegment { get; set; } = "";
109 }
110 // </grain>
5、设为启动项目,按F5运行。可以看到启动后自动打开了浏览器访问swagger出错,没关系,我们将网址路径都删掉,保留根目录,回车可看下如下内容:
这说明已经成功运行。
然后我们测试一下功能,如下图我们访问shorten附加一个博客网址,提交后返回了一个缩短的网址:
然后我们访问缩短网址,即跳转到我们之前附加的网址:
第一个奥尔良项目就成功运行了。
如果想了解更多内容,可以访问微软官方文档深入学习:
Orleans 概述 - .NET | Microsoft Learn (https://learn.microsoft.com/zh-cn/dotnet/orleans/overview)
Orleans初体验的更多相关文章
- .NET平台开源项目速览(15)文档数据库RavenDB-介绍与初体验
不知不觉,“.NET平台开源项目速览“系列文章已经15篇了,每一篇都非常受欢迎,可能技术水平不高,但足够入门了.虽然工作很忙,但还是会抽空把自己知道的,已经平时遇到的好的开源项目分享出来.今天就给大家 ...
- Xamarin+Prism开发详解四:简单Mac OS 虚拟机安装方法与Visual Studio for Mac 初体验
Mac OS 虚拟机安装方法 最近把自己的电脑升级了一下SSD固态硬盘,总算是有容量安装Mac 虚拟机了!经过心碎的安装探索,尝试了国内外的各种安装方法,最后在youtube上找到了一个好方法. 简单 ...
- Spring之初体验
Spring之初体验 Spring是一个轻量级的Java Web开发框架,以IoC(Inverse of Control 控制反转)和 ...
- Xamarin.iOS开发初体验
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAKwAAAA+CAIAAAA5/WfHAAAJrklEQVR4nO2c/VdTRxrH+wfdU84pW0
- 【腾讯Bugly干货分享】基于 Webpack & Vue & Vue-Router 的 SPA 初体验
本文来自于腾讯bugly开发者社区,非经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/57d13a57132ff21c38110186 导语 最近这几年的前端圈子,由于 ...
- 【Knockout.js 学习体验之旅】(1)ko初体验
前言 什么,你现在还在看knockout.js?这货都已经落后主流一千年了!赶紧去学Angular.React啊,再不赶紧的话,他们也要变out了哦.身旁的90后小伙伴,嘴里还塞着山东的狗不理大蒜包, ...
- 在同一个硬盘上安装多个 Linux 发行版及 Fedora 21 、Fedora 22 初体验
在同一个硬盘上安装多个 Linux 发行版 以前对多个 Linux 发行版的折腾主要是在虚拟机上完成.我的桌面电脑性能比较强大,玩玩虚拟机没啥问题,但是笔记本电脑就不行了.要在我的笔记本电脑上折腾多个 ...
- 百度EChart3初体验
由于项目需要在首页搞一个订单数量的走势图,经过多方查找,体验,感觉ECharts不错,封装的很细,我们只需要看自己需要那种类型的图表,搞定好自己的json数据就OK.至于说如何体现出来,官网的教程很详 ...
- Python导出Excel为Lua/Json/Xml实例教程(二):xlrd初体验
Python导出Excel为Lua/Json/Xml实例教程(二):xlrd初体验 相关链接: Python导出Excel为Lua/Json/Xml实例教程(一):初识Python Python导出E ...
- Docker初体验
## Docker初体验 安装 因为我用的是mac,所以安装很简单,下载dmg下来之后拖拽安装即可完成. 需要注意的就是由于之前的docker是基于linux开发,不支持mac,所以就出现了docke ...
随机推荐
- 高级前端开发需要知道的 25 个 JavaScript 单行代码
1. 不使用临时变量来交换变量的值 例如我们想要将 a 于 b 的值交换 let a = 1, b = 2; // 交换值 [a, b] = [b, a]; // 结果: a = 2, b = 1 这 ...
- BST-Treap名次树指针实现板子 Ver2.1
为了更好的阅读体验,请点击这里 这里只有板子没有原理QWQ 可实现 1.插入 x 数 2.删除 x 数(若有多个相同的数,只删除一个) 3.查询 x 数的排名(排名定义为比当前数小的数的个数 +1) ...
- 为什么不推荐使用Linq?
相信很多.NETer看了标题,都会忍不住好奇,点进来看看,并且顺便准备要喷作者! 这里,首先要申明一下,作者本人也非常喜欢Linq,也在各个项目中常用Linq. 我爱Linq,Linq优雅万岁!!!( ...
- Java 将Markdown文件转换为Word和PDF文档
Markdown 凭借其简洁易用的特性,成为创建和编辑纯文本文档的常用选择.但某些时候我们需要更加精致的展示效果,例如在专业分享文档或打印成离线使用的纸质版时,就需要将Markdown文件以其他固定的 ...
- Salt安装部署
Salt安装部署 一:salt简介 早期运维人员会根据自己的生产环境来写特定脚本完成大量重复性工作,这些脚本复杂且难以维护.系统管理员面临的问题主要是1.系统配置管理,2.远程执行命令,因此诞生了 ...
- 静态 top tree 入门
理论 我们需要一个数据结构维护树上的问题,仿照序列上的问题,我们需要一个方法快速的刻画出信息. 比如说线段树就通过分治的方式来通过将一个区间划分成 \(\log n\) 个区间并刻画出这 \(\log ...
- win10 VMware 关闭虚拟机失败导致再打开时显示连接不上虚拟机的一种解决方法
VMware关闭虚拟机失败,强行关闭后,再次打开VMware,打开虚拟机时提示连接不上虚拟机,没有访问权限. 先试了退出后,用管理员权限打开,无果. 然后从网上查资料,cmd->services ...
- Simple WPF: WPF 自定义按钮外形
最新内容优先发布于个人博客:小虎技术分享站,随后逐步搬运到博客园. WPF的按钮提供了Template模板,可以通过修改Template模板中的内容对按钮的样式进行自定义,完整代码Github自取. ...
- Solo 开发者周刊 (第6期):仅需一个动作,秒变时间管理大师?
这里会整合 Solo 社区每周推广内容.产品模块或活动投稿,每周五发布.在这期周刊中,我们将深入探讨开源软件产品的开发旅程,分享来自一线独立开发者的经验和见解.本杂志开源,欢迎投稿. 产品推荐 1. ...
- SQL SERVER根据数据表的某个栏位查询另一个数据表符合条件的某个栏位的值,如果多行则合并为一张字符串形式
SQL SERVER根据数据表的某个栏位查询另一个数据表符合条件的某个栏位的值,如果多行则合并为一张字符串形式 要在 SQL Server 中根据一个数据表的某个列查询另一个数据表符合条件的某个列的值 ...