ASP.NET CORE API 使用Orleans

news2024/11/15 17:49:04

快速使用Monimal API 快速集成Orleans 微软官网地址如下:

https://learn.microsoft.com/zh-cn/dotnet/orleans/quickstarts/build-your-first-orleans-app?source=recommendations&tabs=visual-studio

当然它的存储grain存储采用的是内存级别存储,我缓存了mssql 存储。如果是内存存储使用如下代码就Ok

 siloBuilder.AddMemoryGrainStorage("urls");

我采用的是数据库存储:

siloBuilder.AddAdoNetGrainStorage("OrleansStorage", options =>
    {
        
        options.Invariant = "System.Data.SqlClient";
        options.ConnectionString = "Server=.;Database=OrleansStorage;Persist Security Info=True;User ID=sa;password=Sasa123;";
       
    });

当然这过程中需要引入的库如下:

Microsoft.Orleans.Persistence.AdoNet: ado.net存储

Microsoft.Orleans.Server :orleans 开启服务

System.Data.SqlClient :ado 操作数据库驱动程序,ado.net 开发使用库

Program.cs 完整代码如下:

using Microsoft.AspNetCore.Http.Extensions;
using Orleans.Runtime;
var builder = WebApplication.CreateBuilder(args);
builder.Host.UseOrleans(siloBuilder =>
{
    siloBuilder.UseLocalhostClustering();
    //siloBuilder.AddMemoryGrainStorage("urls");
    siloBuilder.AddAdoNetGrainStorage("OrleansStorage", options =>
    {
        
        options.Invariant = "System.Data.SqlClient";
        options.ConnectionString = "Server=.;Database=OrleansStorage;Persist Security Info=True;User ID=sa;password=Sasa123;";
       
    });

});

// Add services to the container.
// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();

var app = builder.Build();

// Configure the HTTP request pipeline.
if (app.Environment.IsDevelopment())
{
    app.UseSwagger();
    app.UseSwaggerUI();
}


app.MapGet("/", () => "Hello World!");

app.MapGet("/shorten/{*path}",
  async (IGrainFactory grains, HttpRequest request, string path) =>
  {
      // Create a unique, short ID
      var shortenedRouteSegment = Guid.NewGuid().GetHashCode().ToString("X");

      // Create and persist a grain with the shortened ID and full URL
      var shortenerGrain = grains.GetGrain<IUrlShortenerGrain>(shortenedRouteSegment);
      await shortenerGrain.SetUrl(path);

      // Return the shortened URL for later use
      var resultBuilder = new UriBuilder(request.GetEncodedUrl())
      {
          Path = $"/go/{shortenedRouteSegment}"
      };

      return Results.Ok(resultBuilder.Uri);
  });

app.MapGet("/go/{shortenedRouteSegment}",
    async (IGrainFactory grains, string shortenedRouteSegment) =>
    {
        // Retrieve the grain using the shortened ID and redirect to the original URL        
        var shortenerGrain = grains.GetGrain<IUrlShortenerGrain>(shortenedRouteSegment);
        var url = await shortenerGrain.GetUrl();

        return Results.Redirect(url);
    });

app.Run();




#region grain 粒度
/// <summary>
/// grain 接口 粒度
/// </summary>
public interface IUrlShortenerGrain : IGrainWithStringKey
{
    Task SetUrl(string fullUrl);
    Task<string> GetUrl();
}

public class UrlShortenerGrain : Grain, IUrlShortenerGrain
{
    private readonly IPersistentState<UrlDetails> _state;

    public UrlShortenerGrain(
            [PersistentState(stateName: "url",storageName: "urls")]
           IPersistentState<UrlDetails> state)
    {
        _state = state;
    }

    public async Task SetUrl(string fullUrl)
    {
        _state.State = new UrlDetails()
        {
            ShortenedRouteSegment = this.GetPrimaryKeyString(),
            FullUrl = fullUrl
        };
        await _state.WriteStateAsync();
    }

    public Task<string> GetUrl()
    {
        return Task.FromResult(_state.State.FullUrl);
    }
}

[GenerateSerializer]
public record UrlDetails
{
    public string FullUrl { get; set; }
    public string ShortenedRouteSegment { get; set; }
}

#endregion 

特别注意如果是需要数据库存储:除了加入上面包外,还需要执行相应脚本,脚本到微软官网地址找:

https://learn.microsoft.com/zh-cn/dotnet/orleans/host/configuration-guide/adonet-configuration 当然需要自己按数据库配置链接建立一个空库,然后执行对应SQL脚本。否则会运行报错

然后对应执行相应需要存储脚本:也就是官网对应的持久化,提醒、集群脚本。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/399600.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JVM调优面试题——参数命令专题

文章目录1、JVM参数有哪些&#xff1f;1.1、 标准参数1.2、-X参数1.3、 -XX参数1.4、 其他参数1.5、 查看参数1.6、 设置参数的常见方式1.7、 常用参数含义2、JVM常用命令有哪些&#xff1f;2.1、jps2.2、jinfo2.3、jstat2.4、jstack2.5、jmap3、你会估算GC频率吗?4、 内存溢出…

【unity3D】创建TextMeshPro(TMP)中文字体(解决输入中文乱码问题)

&#x1f497; 未来的游戏开发程序媛&#xff0c;现在的努力学习菜鸡 &#x1f4a6;本专栏是我关于游戏开发的学习笔记 &#x1f236;本篇是unity的TMP中文输入显示乱码的解决方式 创建 TextMeshPro 中文字体遇到的问题描述解决方式Font Asset Creator 面板扩展中文字体文本遇到…

深度学习零基础学习之路——第五章 个人数据集的制作

Python深度学习入门 第一章 Python深度学习入门之环境软件配置 第二章 Python深度学习入门之数据处理Dataset的使用 第三章 数据可视化TensorBoard和TochVision的使用 第四章 UNet-Family中Unet、Unet和Unet3的简介 第五章 个人数据集的制作 深度学习数据集的制作Python深度学…

MySQL 行锁

行锁 : 对表中行记录的锁 MySQL 的行锁 : 由各个引擎自己实现MyISAM 不支持行锁InnoDB 支持行锁 两阶段锁协议 : 行锁是在需要时才加上&#xff0c;要等到事务结束才释放 例子 : id 是表 t 的主键的 B 的 update 会阻塞&#xff0c;直到 A 执行 commit 后&#xff0c;B 才能…

Spring Cloud/Spring Cloud Alibaba核心知识总结

Spring Cloud核心知识总结 springCloud是一个服务治理平台&#xff0c;若干个框架的集合&#xff0c;提供了全套的分布式系统的解决方案。包含&#xff1a;服务注册与发现、配置中心、服务网关、智能路由、负载均衡、断路器、监控跟踪、分布式消息、分布式事务等等。 SpringC…

Python机器学习库scikit-learn在Anaconda中的配置

本文介绍在Anaconda环境中&#xff0c;安装Python语言scikit-learn模块的方法。 scikit-learn库&#xff08;简称sklearn&#xff09;是一个基于Python语言的机器学习库&#xff0c;提供了各种机器学习算法和相关工具&#xff0c;包括分类、回归、聚类、降维、模型选择和预处理…

TiDB Server

文章目录TiDB Server架构TiDB Server作用TiDB Server的进程SQL语句的解析和编译SQL读写相关模块在线DDL相关模块GC机制与相关模块TiDB Server的缓存热点小表缓存TiDB Server架构 Protocol Layer、Parse、Compile负责sql语句的解析编译和优化&#xff0c;然后生成sql语句执行计划…

易优cms attribute 栏目属性列表

attribute 栏目属性列表 attribute 栏目属性列表 [基础用法] 标签&#xff1a;attribute 描述&#xff1a;获取栏目的属性列表&#xff0c;或者单独获取某个属性值。 用法&#xff1a; {eyou:attribute typeauto} {$attr.name}&#xff1a;{$attr.value} {/eyou:attri…

iperf3主页官方信息

​ iPerf 是一款支持TCP,UDP和SCTP的高速协议测试工具 网络极限性能测试网络中立性检测 主页 下载iPerf安装包 公共的iPerf3服务器 iPerf用户手册 iPerf论坛—法语 联系我们 iPerf / iPerf3简介 iPerf3是一款用于对IP网络的最大带宽进行主动测试的工具。提供对和时间&…

地质灾害防治单位资质

地质灾害危险性评估&#xff0c;是指在地质灾害易发区进行工程建设或者编制地质灾害易发区内的国土空间规划时&#xff0c;对建设工程或者规划区遭受山体崩塌、滑坡、泥石流、地面塌陷、地裂缝、地面沉降等地质灾害的可能性和建设工程引发地质灾害的可能性作出评估&#xff0c;…

VUE3入门基础:input元素的type属性值说明

说明 在Vue 3中&#xff0c;<input>元素的type属性可以设置不同的类型&#xff0c;以适应不同的输入需求。 常见的type属性取值如下&#xff1a; text&#xff1a;默认值&#xff0c;用于输入文本。password&#xff1a;用于输入密码&#xff0c;输入内容会被隐藏。em…

System has not been booted with systemd as init system (PID 1). Can‘t operate.

今天想查看防火墙的状态&#xff0c;但是对防火墙的操作还不熟悉&#xff0c;网上搜到的命令是这样的systemctl status firewalld 结果输入之后出现了这样的错误&#xff1a; System has not been booted with systemd as init system (PID 1). Can’t operate. 然后接着去网上…

老马闲评数字化「4」做数字化会不会被供应商拿捏住

原文作者&#xff1a;行云创新CEO 马洪喜 导语 开年过后业务特别的繁忙&#xff0c;出差也比较多&#xff0c;所以有段时间没更新了&#xff0c;对不住大家&#xff01; 上一集&#xff08;您可以查看“行云创新”主页阅读原文&#xff09;咱们聊了数字化转型的“想转、急转、…

计算机网络:BGP协议

BGP协议 与其他AS的邻站BPG发言人交换信息。 交换的网络可达性信息&#xff0c;即要到达某一个网络所要经历的一系列AS 发生变化时&#xff0c;更新有变化的部分 BGP协议交换信息的过程&#xff1a;所交换的网络可达性信息就是要到达某一个网络所要经历的一系列AS&#xff…

Oracle 11g创建和删除数据库实例

一、创建数据库实例 1.点击“开始” -> “Oracle -OraDb11g_home1” -> “Database Configuration Assistant” 2.点击“下一步” 3.选择“创建数据库”&#xff0c;点击“下一步” 4.默认设置&#xff0c;不用更改&#xff0c;直接点击“下一步” 5.填写要创建的“实例…

【Java基础 下】 030 -- 网络编程

目录 一、什么是网络编程 1、常见的软件架构&#xff08;CS & BS&#xff09; ①、BS架构的优缺点 ②、CS架构的优缺点 2、小结 二、网络编程三要素 1、IP ①、IPv4 ②、IPv6 ③、小结 ④、IPv4的一些细节 ⑤、InetAddress的使用 2、端口号 3、协议 ①、TCP & UDP 三、…

【项目实战】基于netty-websocket-spring-boot-starter实现WebSocket服务器长链接处理

一、背景 项目中需要建立客户端与服务端之间的长链接&#xff0c;首先就考虑用WebSocket&#xff0c;再来SpringBoot原来整合WebSocket方式并不高效&#xff0c;因此找到了netty-websocket-spring-boot-starter 这款脚手架&#xff0c;它能让我们在SpringBoot中使用Netty来开发…

进程和进程的调度

今天,为大家带来进程和进程的调度的学习 1.认识计算机 2.什么是操作系统 3.什么是进程 4.进程管理 5.进程的属性 6.进程的调度 7.进程调度的过程 8.内存分配 1.认识计算机 计算机的组成有五大部分 1.CPU(是计算机的大脑,负责逻辑运算和控制) 2.内存 3.外存 4.输入…

你了解线程的状态转换吗

本文概述: 讲述线程的六种状态. 你可能已经了解了六种状态, 但是你知道 sleep 被唤醒之后, wait ()被 notify 之后进入了什么状态吗? 本文只是开胃小菜, 你看看下一篇文章对你有没有帮助. 一共有六种状态: New 新建状态Runnable 运行状态Blocked 阻塞状态Waiting 等待状态Tim…

项目实战-瑞吉外卖day02(B站)持续更新

瑞吉外卖-Day02课程内容完善登录功能新增员工员工信息分页查询启用/禁用员工账号编辑员工信息1. 完善登录功能1.1 问题分析前面我们已经完成了后台系统的员工登录功能开发&#xff0c;但是目前还存在一个问题&#xff0c;接下来我们来说明一个这个问题&#xff0c; 以及如何处理…