当前位置:   article > 正文

使用.NET自托管 Garnet 服务

使用.NET自托管 Garnet 服务

Garnet 是 Microsoft Research 推出的一个新的远程缓存存储,旨在实现极快、可扩展和低延迟.Garnet 可在单个节点内进行线程扩展.它还支持分片集群执行,包括复制、检查点、故障转移和事务.它可以在主内存以及分层存储(例如 SSD 和 Azure 存储)上运行.Garnet 支持丰富的 API 图面和强大的扩展性模型.

更多的细节以及和 Redis 的性能对比,可以参考 InCerry 大佬的公众号文章.也可以通过我分享的转载进行查看.本文不再赘述之前的那么多东西了.这里主要介绍我们如何自定义自己的 Garnet 服务.

要使用 Garnet 服务,我们可以利用微软提供的镜像或者别的方式.但是有时候我们希望自己对其进行更多的配置和扩展.这个时候我们就可以利用 Nuget 包的加入到我们的程序来自托管我们的服务.

  • 首先创建一个空白的控制台应用程序,为了减少截图,这里我是用命令行的方式.

 
 
  1. # 创建解决方案文件
  2. dotnet new sln -n GarnetServer
  3. # 创建一个控制台应用程序
  4. dotnet new console -n GarnetServer
  5. # 将项目“GarnetServer\GarnetServer.csproj”添加到解决方案中
  6. dotnet sln add ./GarnetServer
  7. # 为控制台项目添加Microsoft.Garnet依赖包.
  8. dotnet add ./GarnetServer/GarnetServer.csproj package Microsoft.Garnet
  • 通过上面的命令,我们即可成功创建好项目.接下来使用 VS 或者 VS Code 打开项目.将 Program.cs 文件修改为如下内容.

 
 
  1. using Garnet;
  2. // 重命名终端显示的名字
  3. Console.Title = "GarnetServer";
  4. try
  5. {
  6. using var server = new GarnetServer(args);
  7. server.Start();
  8. Thread.Sleep(Timeout.Infinite);
  9. }
  10. catch (Exception ex)
  11. {
  12. Console.WriteLine($"Unable to initialize server due to exception: {ex.Message}");
  13. }
  • 可以看到这里和我们在官方的文档中看到的内容一样,我们并不需要调整其中的代码.接下来我们在项目跟目录添加 garnet.conf 文件.

  • 该文件将作为我们的配置文件,格式为 JSON 格式.当然也可以是其他的名字,但是为了规范我们采用和官方一样的名称.为了简单,这里我们仅使用一个配置项来作为例子.

  • 这里有个小坑,由于配置文件是 JSON 格式,所以其中不能有注释,JSON 本身就不支持注释.添加注释会导致启动失败.

 
 
  1. {
  2. "Port": 8848
  3. }
  • 同时我们需要调整一下 GarnetServer.csproj 将其中 garnet.conf 相关的部分调整为更新则复制到输出目录.这是为了让该文件在发布后也能被复制到发布目录.

 
 
  1. <ItemGroup>
  2. <None Update="garnet.conf">
  3. <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
  4. </None>
  5. </ItemGroup>
  • 完成这些后我们便可以发布项目并通过命令行进行启动.

 
 
GarnetServer.exe --config-import-path ./garnet.conf

但是作为跨平台应用程序,我们肯定不希望仅运行在 Windows 端,所以我们还需要添加 Linux 相关的内容,同时每次都通过命令启动实在是有点不优雅.作为一个喜欢优雅的人来说,这不太符合我的风格,所以我打算为他添加一些启动脚本,这样我们不需要每次都用命令行启动.

Windows 端

在 Windows 上使用任何程序都非常简单,微软在用户操作的体验上是真的没什么可说的,并且作为微软力推的.NET 平台的应用更是没有话说.在 Windows 上我们可以利用批处理命令的方式进行程序的启动.所以我在项目根目录创建一个 start.bat 文件.使用 Notepad++打开后添加如下内容.

 
 
GarnetServer.exe --config-import-path ./garnet.conf

同样我们需要将这个文件的属性调整为更新的时候复制,方便发布后,该脚本也在发布的目录中.

 
 
  1. <ItemGroup>
  2. <None Update="start.bat">
  3. <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
  4. </None>
  5. </ItemGroup>

Linux 端

在 Linux 端我们也可以通过 Linux 的脚本命令进行程序的启动,所以我们再在根目录创建一个名为 start.sh 的文件,同样使用 Notepad++打开编辑,写入如下内容:

 
 
  1. #!/bin/bash
  2. # 为GarnetServer添加可执行权限
  3. sudo chmod +x ./GarnetServer
  4. ./GarnetServer --config-import-path ./garnet.conf

Linux 的脚本需要注意一下.需要利用 Notepad++将文件格式改为 Unix 格式,并且将字符编码调整为 UTF-8. 同样我们需要将这个文件的属性调整为更新的时候复制,方便发布后,该脚本也在发布的目录中.最终我们的 csproj 文件应该是如下内容.若是我们后期还需要添加其他东西,如 SSL 证书等,也可以通过这种方式.将文件复制进去.

 
 
  1. <Project Sdk="Microsoft.NET.Sdk">
  2. <PropertyGroup>
  3. <OutputType>Exe</OutputType>
  4. <TargetFramework>net9.0</TargetFramework>
  5. <ImplicitUsings>enable</ImplicitUsings>
  6. <Nullable>enable</Nullable>
  7. <DockerDefaultTargetOS>Linux</DockerDefaultTargetOS>
  8. </PropertyGroup>
  9. <ItemGroup>
  10. <PackageReference Include="Microsoft.Garnet" Version="1.0.0" />
  11. <!--这里的容器工具库,后面我们添加Docker支持的时候会自动加入-->
  12. <PackageReference Include="Microsoft.VisualStudio.Azure.Containers.Tools.Targets" Version="1.20.0-Preview.2" />
  13. </ItemGroup>
  14. <!--我们新增的三个文件,均需要在较新的时候复制到输出目录-->
  15. <ItemGroup>
  16. <None Update="garnet.conf">
  17. <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
  18. </None>
  19. <None Update="start.bat">
  20. <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
  21. </None>
  22. <None Update="start.sh">
  23. <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
  24. </None>
  25. </ItemGroup>
  26. </Project>

Docker 支持

在 VS 中我们可以很方便的对应用程序添加 Docker 支持.我们仅需在项目上点击鼠标右键,即可选择添加 Docker 支持.选择 Linux 和 Dockerfile 的选项即可.VS 会自动创建好我们的 Dockerfile,在 WebApi 的项目中,我们不需要做任何更改即可利用这个文件生成 docker 镜像,但是这里不行,因为我们的服务并没有导出端口.所以我们需要调整下 Dockerfile 的内容.

最终的 Dockerfile 的内容应该如下.

 
 
  1. #See https://aka.ms/customizecontainer to learn how to customize your debug container and how Visual Studio uses this Dockerfile to build your images for faster debugging.
  2. FROM mcr.microsoft.com/dotnet/runtime:9.0-preview AS base
  3. USER app
  4. WORKDIR /app
  5. # 导出端口,根据我们的配置项进行调整.
  6. EXPOSE 8848
  7. FROM mcr.microsoft.com/dotnet/sdk:9.0-preview AS build
  8. ARG BUILD_CONFIGURATION=Release
  9. WORKDIR /src
  10. COPY ["GarnetServer/GarnetServer.csproj", "GarnetServer/"]
  11. RUN dotnet restore "./GarnetServer/GarnetServer.csproj"
  12. COPY . .
  13. WORKDIR "/src/GarnetServer"
  14. RUN dotnet build "./GarnetServer.csproj" -c $BUILD_CONFIGURATION -o /app/build
  15. FROM build AS publish
  16. ARG BUILD_CONFIGURATION=Release
  17. RUN dotnet publish "./GarnetServer.csproj" -c $BUILD_CONFIGURATION -o /app/publish /p:UseAppHost=false
  18. FROM base AS final
  19. WORKDIR /app
  20. COPY --from=publish /app/publish .
  21. # 调整启动命令,添加配置文件路径启动参数
  22. ENTRYPOINT ["dotnet", "GarnetServer.dll", "--config-import-path", "./garnet.conf"]

然后我们即可使用 PowerShell 脚本利用 docker 来打包镜像.后面代码我会开源,这里暂时不对文件路径方面做出详细描述.

 
 
  1. # 这里是你的镜像仓库的配置,别和我一样.
  2. $base="dygood/" ;
  3. $name="garnet" ;
  4. $tag=":latest" ;
  5. $imagename =$base + $name + $tag ;
  6. $imagename ;
  7. docker build -f ./GarnetServer/Dockerfile -t $imagename . ;

最后可以使用推送脚本将镜像推送到我们自己的镜像仓库.

 
 
  1. $base="dygood/" ;
  2. $name="garnet" ;
  3. $tag=":latest" ;
  4. $imagename =$base + $name + $tag ;
  5. $imagename ;
  6. docker push $imagename ;

到这里我们的 Linux,Windows 和 Docker 的打包发布就完成.接下来讲解下如何运行项目.


通过 VS 的 GUI 窗口我们可以很轻松的对不同平台进行打包发布.在项目上点击鼠标右键,一路点击发布到文件夹即可.可以独立框架发布也可以选依赖框架发布,这里不对这个东西做过多讲解,我用的独立发布.这样文件夹会小一点,稍后传到 Linux 电脑上方便点.

Windows
  • 至于怎么发布.NET 程序我就不过多讲解了,不知道的建议 Bing 学习下,这是基础的内容.

  • 进入发布目录中,双击 start.bat 文件即可启动服务.会产生如下输出内容.

 
 
  1. _________
  2. /_||___||_\ Garnet 1.0.0 64 bit; standalone mode
  3. '. \ / .' Port: 8848
  4. '.\ /.' https://aka.ms/GetGarnet
  5. '.'
  6. * Ready to accept connections
Linux

在 Linux 中由于权限的问题,所以相对来说还需要对可执行文件进行授权.

首先将发布后的文件上传到我们的 Linux 操作系统中.

 
 
  1. # 进入目录
  2. cd ./linux-x64
  3. # 授予start.sh文件的可执行权限.
  4. sudo chmod +x ./start.sh
  5. # 接下来即可运行脚本.
  6. ./start.sh
  • 会得到和 Windows 一样的输出内容.

  • 在 Linux 中我们还可以将该命令的路径添加到环境变量中,即可在任意位置运行程序.也可以用 systemd 的方式进行服务的托管.

Docker

Docker 的话,这里也是很简单通过一行命令启动即可.

 
 
docker run --name garnet -p 8848:8848 -d --rm -it dygood/garnet

至此本文所有内容完结,至于其他的集群配置,以及更多的配置内容可以查看微软官方的配置文件.来进行调整.最后贴上本文中代码地址.

Github 仓库: https://github.com/joesdu/GarnetServer

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/AllinToyou/article/detail/399365
推荐阅读
相关标签
  

闽ICP备14008679号