当前位置: 首页 > news >正文

29. 【.NET 8 实战--孢子记账--从单体到微服务】--项目发布

这是本专栏最后一篇文章了,在这片文章里我们不重点讲解如何配置服务器,重点讲如何发布服务,我们开始吧。

一、服务器配置

服务器配置包含:服务器的选择和项目运行环境的配置,下面我们分别来讲解一下。
在服务器选择上,最低的要求是2G2U,推荐的配置当然是越高越好,但是对于咱这个实战项目来说推荐配置4U8G即可。当然,你也可以选择在本地安装虚拟机,在虚拟机里发布我们的项目。推荐的操作系统是Ubuntu 24.04 LTS,因为24.04版本是带有.NET 8 的,我们只需执行命令把它安装上就可以了。
项目的运行环境我们需要安装aspnetcore-runtime-8.0,这个按照微软官网上的操作即可。我们还需要安装MySql 8RabbitMQ,这两个软件同样参照各自官网上的文档安装即可。

二、发布

在解决方案管理器中右键SporeAccounting选择发布
在这里插入图片描述
在打开的发布窗口点击显示所有设置后弹出发布配置框,配置选择Release,目标框架选择net8.0,部署模式选择框架依赖,目标运行时选择可移植。最后点击保存,再点击发布,既可将我们的项目发布出来了。

部署模式和目标运行时这两个选项有必要讲一下。在部署模式下拉中有两个选项:框架以来、独立,这两个的有什么区别呢?以框架依赖部署模式发布的应用程序依赖于目标机器上已安装的 .NET 运行时,应用程序本身不包含 .NET 运行时,只有应用程序代码和必要的库。因为不包含 .NET 运行时,发布包的大小较小,并且 多个应用程序可以共享同一个 .NET 运行时,节省磁盘空间。但是,目标机器上必须安装与应用程序兼容的 .NET 运行时版本,如果运行时版本不匹配,应用程序无法运行。以独立部署模式发布的应用程序包含 .NET 运行时和所有依赖项,因此不依赖于目标机器上已安装的任何 .NET 运行时。应用程序可以在没有预先安装 .NET 运行时的机器上运行,因为运行时已经包含在发布包中,同时应用程序使用发布时的 .NET 运行时版本,不受目标机器上其他 .NET 运行时版本的影响。但是,因为包含 .NET 运行时,发布包的大小较大,每个独立部署的应用程序都有自己的 .NET 运行时,可能会占用更多的磁盘空间。
目标运行时用于指定你希望应用程序在其上运行的操作系统和硬件平台。不同的目标运行时适用于不同的操作系统和硬件配置。
在这里插入图片描述
发布完成后,点击导航会自动打开发布目录,复制全部文件和文件夹上传到我们的服务器上。上传服务器后,并不是说就完事了,我们还需要设置一个监控服务,如果我们的账本服务因为某系原因挂了,这个监控服务就可以把它拉起来。我们来看一下如何做。
在Ubuntu系统上我们一般使用systemd服务来实现.NET 8 项目的自启动。首先在/etc/systemd/system/目录下创建一个新的服务文件,使用systemctl命令来生成一个基本的模板,或者直接手动创建一个都可以。命令如下:

sudo nano /etc/systemd/system/mywebapi.service

然后在打开的编辑器中,输入以下内容,根据应用程序进行相应的调整:

[Unit]
Description=My .NET 6 Web API
After=network.target
Wants=network-online.target[Service]
Type=simple
User=www-data
WorkingDirectory=/path/to/your/webapi
ExecStart=dotnet  /path/to/your/webapi.dll
Restart=always
RestartSec=10
Environment=ASPNETCORE_ENVIRONMENT=Production
Environment=DOTNET_PRINT_TELEMETRY_MESSAGE=false[Install]
WantedBy=multi-user.target 

在上面的代码中我们进行了一些必要的配置,具体字段的说明如下:

  • Description: 服务的描述。
  • After: 指定服务在哪个目标之后启动。
  • Wants: 指定服务依赖的另一个目标。
  • Type: 指定服务的类型,simple是最常见的类型。
  • User: 指定服务运行的用户。
  • WorkingDirectory: 指定服务的工作目录。
  • ExecStart: 启动服务时执行的命令。
  • Restart: 指定服务失败时是否自动重启。
  • RestartSec: 指定重启服务前的等待时间。
  • Environment: 设置环境变量。
  • WantedBy: 指定服务应该被哪个目标所需要。

配置完成后,我们保存并关闭服务文件后,并设置服务权限:

sudo chmod 644 /etc/systemd/system/mywebapi.service

接着我们重新加载systemd以识别新的服务:

sudo systemctl daemon-reload

最后使用以下命令来启动服务,并设置为开机自启:

sudo systemctl start mywebapi.service
sudo systemctl enable mywebapi.service

三、总结

本文是本专栏的最后一篇文章,聚焦于服务发布的关键步骤,而非详细的服务器配置。本篇内容从服务器配置到项目发布,再到服务自启动配置,帮助大家完整掌握发布流程。在服务器配置方面,推荐选择4U8G配置或本地虚拟机,运行环境则需要安装 aspnetcore-runtime-8.0、MySQL 8 和 RabbitMQ。在项目发布部分,我们通过解决方案管理器设置发布参数(如部署模式和目标运行时),并重点分析了框架依赖与独立部署两种模式的区别及适用场景。最后,文章讲解了如何在 Ubuntu 系统上使用 systemd 服务实现项目自启动,通过配置服务文件,实现项目的稳定运行和自动恢复。
至此,本专栏以实战为核心,从开发到部署,完成了一次完整的项目生命周期分享,希望能对大家的实际工作有所助益!

相关文章:

29. 【.NET 8 实战--孢子记账--从单体到微服务】--项目发布

这是本专栏最后一篇文章了,在这片文章里我们不重点讲解如何配置服务器,重点讲如何发布服务,我们开始吧。 一、服务器配置 服务器配置包含:服务器的选择和项目运行环境的配置,下面我们分别来讲解一下。 在服务器选择上…...

Langchain+讯飞星火大模型Spark Max调用

1、安装langchain #安装langchain环境 pip install langchain0.3.3 openai -i https://mirrors.aliyun.com/pypi/simple #灵积模型服务 pip install dashscope -i https://mirrors.aliyun.com/pypi/simple #安装第三方集成,就是各种大语言模型 pip install langchain-comm…...

TensorFlow实现逻辑回归模型

逻辑回归是一种经典的分类算法,广泛应用于二分类问题。本文将介绍如何使用TensorFlow框架实现逻辑回归模型,并通过动态绘制决策边界和损失曲线来直观地观察模型的训练过程。 数据准备 首先,我们准备两类数据点,分别表示两个不同…...

C++进阶课程第2期——排列与组合1

大家好,我是清墨,欢迎收看《C进阶课程——排列与组合》。 啊,上一期我们的情况啊也是非常好的,今天直接开始! 排列(Arrange) 与上期一样啊,我们先了解一下排列的概念。 排列是指将…...

C++17 std::variant 详解:概念、用法和实现细节

文章目录 简介基本概念定义和使用std::variant与传统联合体union的区别 多类型值存储示例初始化修改判断variant中对应类型是否有值获取std::variant中的值获取当前使用的type在variant声明中的索引 访问std::variant中的值使用std::get使用std::get_if 错误处理和访问未初始化…...

Leetcode::119. 杨辉三角 II

119. 杨辉三角 II 已解答 简单 相关标签 相关企业 给定一个非负索引 rowIndex,返回「杨辉三角」的第 rowIndex 行。 在「杨辉三角」中,每个数是它左上方和右上方的数的和。 示例 1: 输入: rowIndex 3 输出: [1,3,3,1]示例 2: 输入: rowIndex 0…...

多模态论文笔记——TECO

大家好,这里是好评笔记,公主号:Goodnote,专栏文章私信限时Free。本文详细解读多模态论文TECO(Temporally Consistent Transformer),即时间一致变换器,是一种用于视频生成的创新模型&…...

Ubuntu 16.04用APT安装MySQL

个人博客地址:Ubuntu 16.04用APT安装MySQL | 一张假钞的真实世界 安装MySQL 用以下命令安装MySQL: sudo apt-get install mysql-server 这个命令会安装MySQL服务器、客户端和公共文件。安装过程会出现两个要求输入的对话框: 输入MySQL root用户的密…...

Linux 4.19内核中的内存管理:x86_64架构下的实现与源码解析

在现代操作系统中,内存管理是核心功能之一,它直接影响系统的性能、稳定性和多任务处理能力。Linux 内核在 x86_64 架构下,通过复杂的机制实现了高效的内存管理,涵盖了虚拟内存、分页机制、内存分配、内存映射、内存保护、缓存管理等多个方面。本文将深入探讨这些机制,并结…...

JavaScript逆向高阶指南:突破基础,掌握核心逆向技术

JavaScript逆向高阶指南:突破基础,掌握核心逆向技术 JavaScript逆向工程是Web开发者和安全分析师的核心竞争力。无论是解析混淆代码、分析压缩脚本,还是逆向Web应用架构,掌握高阶逆向技术都将助您深入理解复杂JavaScript逻辑。本…...

嵌入式知识点总结 Linux驱动 (四)-中断-软硬中断-上下半部-中断响应

针对于嵌入式软件杂乱的知识点总结起来,提供给读者学习复习对下述内容的强化。 目录 1.硬中断,软中断是什么?有什么区别? 2.中断为什么要区分上半部和下半部? 3.中断下半部一般如何实现? 4.linux中断的…...

在ubuntu下一键安装 Open WebUI

该脚本用于自动化安装 Open WebUI,并支持以下功能: 可选跳过 Ollama 安装:通过 --no-ollama 参数跳过 Ollama 的安装。自动清理旧目录:如果安装目录 (~/open-webui) 已存在,脚本会自动删除旧目录并重新安装。完整的依…...

c语言网 1127 尼科彻斯定理

原题 题目描述 验证尼科彻斯定理&#xff0c;即&#xff1a;任何一个整数m的立方都可以写成m个连续奇数之和。 输入格式 任一正整数 输出格式 该数的立方分解为一串连续奇数的和 样例输入 13 样例输出 13*13*132197157159161163165167169171173175177179181 ​ #include<ios…...

Cloudflare通过代理服务器绕过 CORS 限制:原理、实现场景解析

第一部分&#xff1a;问题背景 1.1 错误现象复现 // 浏览器控制台报错示例 Access to fetch at https://chat.qwenlm.ai/api/v1/files/ from origin https://ocr.doublefenzhuan.me has been blocked by CORS policy: Response to preflight request doesnt pass access con…...

吴恩达深度学习——如何实现神经网络

来自吴恩达深度学习&#xff0c;仅为本人学习所用。 文章目录 神经网络的表示计算神经网络的输出激活函数tanh选择激活函数为什么需要非激活函数双层神经网络的梯度下降法 随机初始化 神经网络的表示 对于简单的Logistic回归&#xff0c;使用如下的计算图。 如果是多个神经元…...

《STL基础之vector、list、deque》

【vector、list、deque导读】vector、list、deque这三种序列式的容器&#xff0c;算是比较的基础容器&#xff0c;也是大家在日常开发中常用到的容器&#xff0c;因为底层用到的数据结构比较简单&#xff0c;笔者就将他们三者放到一起做下对比分析&#xff0c;介绍下基本用法&a…...

LockSupport概述、阻塞方法park、唤醒方法unpark(thread)、解决的痛点、带来的面试题

目录 ①. 什么是LockSupport? ②. 阻塞方法 ③. 唤醒方法(注意这个permit最多只能为1) ④. LockSupport它的解决的痛点 ⑤. LockSupport 面试题目 ①. 什么是LockSupport? ①. 通过park()和unpark(thread)方法来实现阻塞和唤醒线程的操作 ②. LockSupport是一个线程阻塞…...

Android开发基础知识

1 什么是Android&#xff1f; Android&#xff08;读音&#xff1a;英&#xff1a;[ndrɔɪd]&#xff0c;美&#xff1a;[ˈnˌdrɔɪd]&#xff09;&#xff0c;常见的非官方中文名称为安卓&#xff0c;是一个基于Linux内核的开放源代码移动操作系统&#xff0c;由Google成立…...

C++ Lambda 表达式的本质及原理分析

目录 1.引言 2.Lambda 的本质 3.Lambda 的捕获机制的本质 4.捕获方式的实现与底层原理 5.默认捕获的实现原理 6.捕获 this 的机制 7.捕获的限制与注意事项 8.总结 1.引言 C 中的 Lambda 表达式是一种匿名函数&#xff0c;最早在 C11 引入&#xff0c;用于简化函数对象的…...

《多线程基础之条件变量》

【条件变量导读】条件变量是多线程中比较灵活而且容易出错的线程同步手段&#xff0c;比如&#xff1a;虚假唤醒、为啥条件变量要和互斥锁结合使用&#xff1f;windows和linux双平台下&#xff0c;初始化、等待条件变量的api一样吗&#xff1f; 本文将分别为您介绍条件变量在w…...

21款炫酷烟花合集

系列专栏 《Python趣味编程》《C/C趣味编程》《HTML趣味编程》《Java趣味编程》 写在前面 Python、C/C、HTML、Java等4种语言实现18款炫酷烟花的代码。 Python Python烟花① 完整代码&#xff1a;Python动漫烟花&#xff08;完整代码&#xff09; ​ Python烟花② 完整…...

智能风控 数据分析 groupby、apply、reset_index组合拳

目录 groupby——分组 本例 apply——对每个分组应用一个函数 等价用法 reset_index——重置索引 使用前​编辑 注意事项 groupby必须配合聚合函数、 关于agglist 一些groupby试验 1. groupby对象之后。sum&#xff08;一个列名&#xff09; 2. groupby对象…...

Python网络自动化运维---用户交互模块

文章目录 目录 文章目录 前言 实验环境准备 一.input函数 代码分段解析 二.getpass模块 前言 在前面的SSH模块章节中&#xff0c;我们都是将提供SSH服务的设备的账户/密码直接写入到python代码中&#xff0c;这样很容易导致账户/密码泄露&#xff0c;而使用Python中的用户交…...

【JVM】调优

目的&#xff1a; 减少minor gc、full gc的次数&#xff0c;也就是减少STW的时间&#xff0c;因为java虚拟机在做后台垃圾收集线程的时候&#xff0c;会停掉其他线程&#xff0c;专门做垃圾收集&#xff0c;这样会影响网站的性能&#xff0c;以及用户的体验。 调优位置&#x…...

软件测试 —— jmeter(2)

软件测试 —— jmeter&#xff08;2&#xff09; HTTP默认请求头&#xff08;元件&#xff09;元件作用域和取样器作用域HTTP Cookie管理器同步定时器jmeter插件梯度压测线程组&#xff08;Stepping Thread Group&#xff09;参数解析总结 Response Times over TimeActive Thre…...

为什么LabVIEW适合软硬件结合的项目?

LabVIEW是一种基于图形化编程的开发平台&#xff0c;广泛应用于软硬件结合的项目中。其强大的硬件接口支持、实时数据采集能力、并行处理能力和直观的用户界面&#xff0c;使得它成为工业控制、仪器仪表、自动化测试等领域中软硬件系统集成的理想选择。LabVIEW的设计哲学强调模…...

【机器学习】自定义数据集 使用tensorflow框架实现逻辑回归并保存模型,然后保存模型后再加载模型进行预测

一、使用tensorflow框架实现逻辑回归 1. 数据部分&#xff1a; 首先自定义了一个简单的数据集&#xff0c;特征 X 是 100 个随机样本&#xff0c;每个样本一个特征&#xff0c;目标值 y 基于线性关系并添加了噪声。tensorflow框架不需要numpy 数组转换为相应的张量&#xff0…...

.NET Core缓存

目录 缓存的概念 客户端响应缓存 cache-control 服务器端响应缓存 内存缓存&#xff08;In-memory cache&#xff09; 用法 GetOrCreateAsync 缓存过期时间策略 缓存的过期时间 解决方法&#xff1a; 两种过期时间策略&#xff1a; 绝对过期时间 滑动过期时间 两…...

GA-CNN-LSTM-Attention、CNN-LSTM-Attention、GA-CNN-LSTM、CNN-LSTM四模型多变量时序预测一键对比

GA-CNN-LSTM-Attention、CNN-LSTM-Attention、GA-CNN-LSTM、CNN-LSTM四模型多变量时序预测一键对比 目录 GA-CNN-LSTM-Attention、CNN-LSTM-Attention、GA-CNN-LSTM、CNN-LSTM四模型多变量时序预测一键对比预测效果基本介绍程序设计参考资料 预测效果 基本介绍 基于GA-CNN-LST…...

git Bash通过SSH key 登录github的详细步骤

1 问题 通过在windows 终端中的通过git登录github 不再是通过密码登录了&#xff0c;需要本地生成一个密钥&#xff0c;配置到gihub中才能使用 2 步骤 &#xff08;1&#xff09;首先配置用户名和邮箱 git config --global user.name "用户名"git config --global…...