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初体验的更多相关文章

  1. .NET平台开源项目速览(15)文档数据库RavenDB-介绍与初体验

    不知不觉,“.NET平台开源项目速览“系列文章已经15篇了,每一篇都非常受欢迎,可能技术水平不高,但足够入门了.虽然工作很忙,但还是会抽空把自己知道的,已经平时遇到的好的开源项目分享出来.今天就给大家 ...

  2. Xamarin+Prism开发详解四:简单Mac OS 虚拟机安装方法与Visual Studio for Mac 初体验

    Mac OS 虚拟机安装方法 最近把自己的电脑升级了一下SSD固态硬盘,总算是有容量安装Mac 虚拟机了!经过心碎的安装探索,尝试了国内外的各种安装方法,最后在youtube上找到了一个好方法. 简单 ...

  3. Spring之初体验

                                     Spring之初体验 Spring是一个轻量级的Java Web开发框架,以IoC(Inverse of Control 控制反转)和 ...

  4. Xamarin.iOS开发初体验

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAKwAAAA+CAIAAAA5/WfHAAAJrklEQVR4nO2c/VdTRxrH+wfdU84pW0

  5. 【腾讯Bugly干货分享】基于 Webpack & Vue & Vue-Router 的 SPA 初体验

    本文来自于腾讯bugly开发者社区,非经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/57d13a57132ff21c38110186 导语 最近这几年的前端圈子,由于 ...

  6. 【Knockout.js 学习体验之旅】(1)ko初体验

    前言 什么,你现在还在看knockout.js?这货都已经落后主流一千年了!赶紧去学Angular.React啊,再不赶紧的话,他们也要变out了哦.身旁的90后小伙伴,嘴里还塞着山东的狗不理大蒜包, ...

  7. 在同一个硬盘上安装多个 Linux 发行版及 Fedora 21 、Fedora 22 初体验

    在同一个硬盘上安装多个 Linux 发行版 以前对多个 Linux 发行版的折腾主要是在虚拟机上完成.我的桌面电脑性能比较强大,玩玩虚拟机没啥问题,但是笔记本电脑就不行了.要在我的笔记本电脑上折腾多个 ...

  8. 百度EChart3初体验

    由于项目需要在首页搞一个订单数量的走势图,经过多方查找,体验,感觉ECharts不错,封装的很细,我们只需要看自己需要那种类型的图表,搞定好自己的json数据就OK.至于说如何体现出来,官网的教程很详 ...

  9. Python导出Excel为Lua/Json/Xml实例教程(二):xlrd初体验

    Python导出Excel为Lua/Json/Xml实例教程(二):xlrd初体验 相关链接: Python导出Excel为Lua/Json/Xml实例教程(一):初识Python Python导出E ...

  10. Docker初体验

    ## Docker初体验 安装 因为我用的是mac,所以安装很简单,下载dmg下来之后拖拽安装即可完成. 需要注意的就是由于之前的docker是基于linux开发,不支持mac,所以就出现了docke ...

随机推荐

  1. idea设置jdk和设置文件编码格式utf-8

    1.idea设置jdk 2.idea设置文件编码格式utf-8 create utf-8 files with NO BOM 不要更改,否则编译会出错误.

  2. 如何更改.NET中的默认时区?

    除了"在操作系统中修改时区信息,然后重启.NET应用程序,使其生效"之外.如何在不修改操作系统时区的前提下,修改.NET中的默认时区呢? 这是一位 同学兼同事 于5月21日在技术群 ...

  3. 通过 源码 安装 python

    为了vim PYTHON="3.4.1" tget () { #try wget filename=`basename $1` echo "Downloading [${ ...

  4. js脚本化css

    脚本化CSS 我们刚讲过如何获取和设置行内样式的值,但是我们开发不会所有样式都写在行内,同时js没法获取内嵌样式表和外部样式表中的值. 事实上DOM提供了可靠的API,得到计算后的样式. 1. 获取计 ...

  5. Linux上快速安装 RabbitMQ

    1.默认安装最新版,安装erlang apt-get install erlang 2.安装最新版 rabbitmq sudo apt-get update sudo apt-get install ...

  6. 韦东山freeRTOS系列教程之【第八章】事件组(event group)

    目录 系列教程总目录 概述 8.1 事件组概念与操作 8.1.1 事件组的概念 8.1.2 事件组的操作 8.2 事件组函数 8.2.1 创建 8.2.2 删除 8.2.3 设置事件 8.2.4 等待 ...

  7. “古剑山”初赛Misc 幸运饼干

    "古剑山"初赛Misc 幸运饼干 考点:Chrome的Cookies解密 赛中思路 bandzip极限压缩hint.jpg后打明文攻击 压缩包密码:sv@1v3z ┌──(root ...

  8. 机器学习策略篇:详解数据分布不匹配时,偏差与方差的分析(Bias and Variance with mismatched data distributions)

    详解数据分布不匹配时,偏差与方差的分析 估计学习算法的偏差和方差真的可以帮确定接下来应该优先做的方向,但是,当训练集来自和开发集.测试集不同分布时,分析偏差和方差的方式可能不一样,来看为什么. 继续用 ...

  9. 内网穿透的高性能的反向代理应用FRP-自定义404错误页【实践可行版】

    frp简介 frp 是一个专注于内网穿透的高性能的反向代理应用,支持 TCP.UDP.HTTP.HTTPS 等多种协议.可以将内网服务以安全.便捷的方式通过具有公网 IP 节点的中转暴露到公网. 为什 ...

  10. ArkTS基础知识

    [习题]ArkTS基础知识 及格分85/ 满分100   判断题 1. 循环渲染ForEach可以从数据源中迭代获取数据,并为每个数组项创建相应的组件. 正确(True)错误(False) 回答正确 ...