基于 abp vNext 和 .NET Core 开发博客项目 - 终结篇之发布项目

系列文章

  1. 使用 abp cli 搭建项目

  2. 给项目瘦身,让它跑起来

  3. 完善与美化,Swagger登场

  4. 数据访问和代码优先

  5. 自定义仓储之增删改查

  6. 统一规范API,包装返回模型

  7. 再说Swagger,分组、描述、小绿锁

  8. 接入GitHub,用JWT保护你的API

  9. 异常处理和日志记录

  10. 使用Redis缓存数据

  11. 集成Hangfire实现定时任务处理

  12. 用AutoMapper搞定对象映射

  13. 定时任务最佳实战(一)

  14. 定时任务最佳实战(二)

  15. 定时任务最佳实战(三)

  16. 博客接口实战篇(一)

  17. 博客接口实战篇(二)

  18. 博客接口实战篇(三)

  19. 博客接口实战篇(四)

  20. 博客接口实战篇(五)

  21. Blazor实战系列(一)

  22. Blazor实战系列(二)

  23. Blazor实战系列(三)

  24. Blazor实战系列(四)

  25. Blazor实战系列(五)

  26. Blazor实战系列(六)

  27. Blazor实战系列(七)

  28. Blazor实战系列(八)

  29. Blazor实战系列(九)

  30. 终结篇之发布项目


    终于到了这一步了,开发了 API,紧接着又开发了 Blazor 版的博客项目,庆祝本系列文章完结撒花。????????????

    既然开发完成了,还是拿出来溜溜比较好,本篇是本系列文章的最后一篇了,准备将 API 部署到 Linux,把前端 Blazor 开发的博客部署到 GitHub Pages。

  • blog:https://blazor.meowv.com

  • api:https://api2.meowv.com

    先放地址,体验一下,要有点耐心,第一次访问会下载资源文件到本地浏览器,后面访问就贼快了。

    也是第一次使用 Blazor 开发项目,不管怎么说,这个实验性的带教学和宣传目的博客总算是搞出来了,自己用的话,完全可以,同时在开发过程中自己也有不少收获。

发布API

    发布自己写的后端API项目,必须要有属于自己的服务器,当然如果只是为了动动手玩玩就没啥必要了,因为 .NET Core 跨平台咱们可以任意选择,我这里演示将项目发布到 Linux 下。

    在这之前可以看一下我去年的一篇文章,基于.NET Core开发的个人博客发布至CentOS小记 ,简单了解下。

    我的机器是很久之前撸羊毛的渣渣配置服务器,1G内存,1核CPU,1M带宽,不过对于我们这种小站来说没啥访问量,照样用。????????

    首先肯定是需要安装 .NET Core 运行环境,直接安装最新的 .NET Core 3.1 即可。这一步大家根据微软官方文档来就可以了,https://docs.microsoft.com/zh-cn/dotnet/core/install/linux 。

    安装完成后可以使用 dotnet --list-runtimes 查看运行时。

    接着就可以去安装 Nginx ,高性能 Web 服务器,在这里使用它反向代理的功能,当然它的功能远不止于此。关于 Nginx 的安装我也不说了,如果你不懂,网上太多教程了。

    安装完成后可以使用 nginx -V 查看安装版本等信息。

    到这一步就可以把我们API项目部署上去了,直接利用 Visual Studio 将项目打包发布,appsettings.json配置文件信息填好,这一步不用多说吧,相信大家都会。

    利用 WinSCP 工具将发布好的代码上传至服务器,我这里新建了文件夹 qix/api2 方便自己管理,顺便提一句,WinSCP 是一个 Windows 环境下使用的 SSH 的开源图形化 SFTP 客户端。

    那么现在我们可以在终端中定位到API所在目录,cd /qix/api2,然后执行命令启动项目dotnet run Meowv.Blog.HttpApi.Hosting.dll这时候便会看到输出信息,我们就可以使用服务器IP+端口的方式访问到API了。

    如果只是这样肯定不是我想要的,这时候就引入了 Linux 下的守护进程,就类似于 Windows 下面的服务一样,让守护进程帮助我们运行项目,当关机、重启或者其它异常问题出现时,可以自动帮我们重启应用,就是自动执行dotnet run xxx.dll这句命令。

    关于守护进程用的比较多的,supervisor 与 pm2 ,前者基于Python开发的,后者是基于nodejs开发的。

    咱这里就选用 supervisor 了,当然 pm2 也不错也可以用用。

    在 centos 下安装 supervisor 也很简单,直接贴几行代码,照着执行即可。

yum install python-setuptoolseasy_install supervisormkdir /etc/supervisor
echo_supervisord_conf > /etc/supervisor/supervisord.conf

    安装成功后还需要花点时间去配置它,找到文件 /etc/supervisor/supervisord.conf 去掉文件最后的注释,可以改成向下面这样。

...
[include]
files = conf.d/*.ini

    这时候就可以监听到 conf.d 文件夹下面的 ini 配置文件了,在 /etc/supervisor/ 下新建文件夹 conf.d,conf.d 文件夹下新建一个配置文件 api2_meowv.conf 文件,名字随便起,内容如下:

[program:api2_meowv] # api2_meowv程序名称
command=dotnet Meowv.Blog.HttpApi.Hosting.dll # 执行的命令
directory=/qix/api2  # 命令执行的目录
environment=ASPNETCORE__ENVIRONMENT=Production # 环境变量
user=root
stopsignal=INT 
autostart=true # 是否自启动
autorestart=true # 是否自动重启
startsecs=3 # 自动重启时间间隔(s)
stderr_logfile=/var/log/api2.meowv.com.err.log #错误日志文件指向目录
stdout_logfile=/var/log/api2.meowv.com.out.log #输出日志文件指向目录

    每行都带有注释,很清楚知道是干啥用的,顺便贴几条常用的命令:

supervisorctl start program_name   #启动某个进程(program_name=配置的进程名称)
supervisorctl stop program_name    #停止某一进程
supervisorctl reload               #重新启动配置中的所有程序
supervisorctl stop all             #停止全部进程
supervisorctl update               #更新新的配置到supervisord
supervisorctl restart program_name #重启某一进程
supervisorctl                      #查看正在守候的进程

    使用上面命令成功启动项目,使用IP+端口的方式去访问API肯定是不友好的,这时候就需要一个域名了,我这里将新建一个二级域名 api2.meowv.com 执行新开发的API项目。

    关于域名的解析啥的不说了,配置完域名我顺便去申请了一个SSL证书,使用HTTPS的方式访问。

    这时可以去配置 Nginx 方向代理了。来到 nginx 安装目录,我这里是 /etc/nginx ,新建一个文件夹 ssl ,将申请的SSL证书放进去,然后再 conf.d 文件夹下新建一个 api2_meowv.conf 文件,写入下面的配置信息。

server {listen 443 ssl;server_name api2.meowv.com;ssl_certificate ssl/1_api2.meowv.com_bundle.crt; ssl_certificate_key ssl/2_api2.meowv.com.key; ssl_session_timeout 5m;ssl_protocols TLSv1 TLSv1.1 TLSv1.2;ssl_ciphers AESGCM:ALL:!DH:!EXPORT:!RC4:+HIGH:!MEDIUM:!LOW:!aNULL:!eNULL;ssl_prefer_server_ciphers on;location / {if ($request_method = 'OPTIONS') {add_header Access-Control-Allow-Headers 'Authorization,Content-Type';add_header Access-Control-Allow-Origin *;add_header Access-Control-Allow-Credentials true; add_header Access-Control-Allow-Methods GET,POST,PUT,DELETE,OPTIONS;return 204;}proxy_pass http://localhost:5009;proxy_set_header   X-Real-IP        $remote_addr;proxy_set_header   Host             $host;proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;client_max_body_size 20M;}
}server {listen 80;server_name api2.meowv.com;rewrite ^(.*)$ https://api2.meowv.com;
}

    关于配置信息大家可以自己去学习一下,我这里也是简单的使用,我这里监听的端口是 5009,这个端口在 API 项目中是可以自定义的,相信大家都知道。做好以上操作后,在终端执行 nginx -s reloa,刷新 nginx 配置使其生效,然后就大功告成了。

    关于项目中的数据库和Redis缓存,大家可以自行安装。数据库可以选择使用Sqlite,项目中已经做了一键切换数据库。安装Redis也很简单,相信大家可以自己完成,Redis可用可不用,可以直接关闭。

    现在API项目便发布成功,将其部署在Linux系统下面,有了线上正常运行的API,接下来把前端 Blazor 开发的博客也发一下。

发布Blog

    为了节省服务器资源,现在里面已经容纳了超级多的东西了,我准备将 Blog 部署在 GitHub Pages 上。

    使用 Blazor WebAssembly 发布后是纯静态的文件,所以啊,其实放在哪里都可以。无关乎环境,只要可以开启一个WEB服务即可。

    在GitHub上创建一个仓库来放我们的发布后的代码,关于创建仓库不会的看这里,https://pages.github.com 。

    接下来去发布 Blazor 项目,发布之前改一下API地址,当然这个也可以做成配置文件形式的。

    然后将创建好的仓库克隆下来,把博客静态文件拷贝进去,这时候还不能直接push到仓库中,为了适配 GitHub Pages 我们还要做几点改动。

    GitHub Pages 使用的是 Jekyll,以特殊字符开头的文件夹是不会被映射到路由中去的,我们发布的静态文件中刚好有以_开头的文件夹_framework,为了解决这个问题可以在仓库下面创建一个以.nojekyll命名的空文件即可。

    根据实际操作和踩坑,现在如果发布还是会报一个无法加载资源的错误The resource has been blocked.,然后在GitHub找到了解决办法,详见:https://github.com/dotnet/aspnetcore/issues/19907#issuecomment-600054113 。

    新建一个.gitattributes文件,写入内容:* binary,即可,现在将文件 push 到仓库。

    然后在仓库的settings下面开启 GitHub Pages 功能选项。

    我这里自定义了一个域名,如果你也想自定义域名可以在根目录添加一个名为CNAME的文件,里面的内容就是你的域名,我这里就是:blazor.meowv.com 。

    最后在去配置一下域名的 CNAME 解析即可,等待 DNS 生效,便可以用自定义域名访问了。

结束语

    本系列文章从零开始搭建了API,使用 Blazor 开发了一个简单的博客系统,功能不是很多。整体来说从无到有,自己也踩了一遍坑,也算有不少收获了。

    在这里再次感谢那些在公众号给我赞赏的人。????????????

    可能整体涉及到的东西不是很多,广度和深度都没有,只是很基础的用了用,在写之前我也已经说过,这些系列是用来记录自己的编码过程,因为大佬们都不愿意出来分享,所以我们渣渣只能做到这种程度。

    如果对你没啥帮助,权当看过笑过????????或者右上角点一下小叉叉❌❌,因为不管你做的如何,总有人喜欢说三道四~~

    如果对你有些许帮助,请多多推广哟。✨✨✨

    最后大家可以关注一下我的微信公众号:『阿星Plus』????????????

    因为疫情影响,今年高考推迟到7月份,每年高考便是我所在公司的业务高峰期,接下来实在太忙,估计也没时间创作了,正好准备休息一段时间,好好思考思考后面为大家带来更好的文章,有缘人下个系列见吧。????????????

    本系列文章代码开源地址:https://github.com/meowv/blog

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

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

相关文章

对 JsonConvert 的认识太肤浅了,终于还是遇到了问题

一:背景1. 讲故事在开始本文之前,真的好想做个问卷调查,到底有多少人和我一样,对 JsonConvert 的认识只局限在 SerializeObject 和 DeserializeObject 这两个方法上(┬_┬), 这样我也好结伴同行,不再孤单落…

.Net微服务实战之DevOps篇

技术只是基础该系列的两篇文章《.Net微服务实战之技术选型篇》和《.Net微服务实战之技术架构分层篇》都是以技术角度出发描述微服务架构的实施。如果技术选型篇叙述的是工具,那么架构分层篇讲的就是技巧,而本篇要讨论的就是原则。一直以来我会给身边向我…

阿里云挑战赛

文章目录第一题题目:题解:第二题题目题解第三题题目题解第四题题目:题解第五题题目题解第六题题目题解第七题题目:题解第八题题目:题解;题解赛后出第一题 题目: 【单选】filter 方法意图过滤传入的订单列…

使用C#编写STM32对接物联网平台IoTSharp发送遥测数据

在之前的文章中, 我们阐述了如何用C#在STM32上写第一个Hello world , 有朋友抱怨国内介绍文章, 都是一个 Hello world , 然后再也没有音讯, 写到这里我想提一下我的初心, 那就是告诉所有人C#无所不能&…

JavaMVC之JSON

JSON 8.1、什么是JSON? JSON(JavaScript Object Notation, JS 对象标记) 是一种轻量级的数据交换格式,目前使用特别广泛。采用完全独立于编程语言的文本格式来存储和表示数据。简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。易于人阅读和编写…

龙芯团队完成CoreCLR MIPS64移植,在github开源

国产龙芯的软件生态之中.NET不会缺席,毕竟 C# 与 .NetCore/Mono 也是全球几大主流的编程语言和运行平台之一,最近一段时间听到太多的鼓吹政务领域不支持.NET, 大家都明白这是某些人为了自己的利益打压使用.NET技术的公司,我今天写…

来谈一谈专注力的真相

这是头哥侃码的第205篇原创在日常生活(或工作)中,你有没有遇上过这样的情况?比如你正在跟小伙伴讨论一个技术方案,聊着聊着,突然小A脑袋一抽筋,问你:“老大,咱们这周五晚…

Java访问控制修饰符

访问控制修饰符 Java中,可以使用访问控制符来保护对类、变量、方法和构造方法的访问。 Java 支持 4 种不同的访问权限。 default (即默认,什么也不写): 在同一包内可见,不使用任何修饰符。 使用对象:类、接口、变量…

数据结构与算法专题——第三题 最长公共子序列

一:作用最长公共子序列的问题常用于解决字符串的相似度,是一个非常实用的算法,作为码农,此算法是我们的必备基本功。二:概念举个例子,cnblogs这个字符串中子序列有多少个呢?很显然有27个&#x…

Java实现两个递增有序链表合并成一个递增有序链表和两个非递减有序链表合成一个非递增有序链表

代码如下: package sjjgniub;import java.util.LinkedList; import java.util.Scanner;SuppressWarnings("all") public class LinkList {private class Node{int data;Node next;public Node(){}public Node(int data){this.data data;next null;}}Node head nu…

职场PUA到底有多可怕?

阅读本文大概需要 5.2分钟。“小张,好好干啊,明年一定给你加薪!” 。从小张入职这家公司起,这是老板对小张第三次这么说了。小张每天干到晚上12点,任劳任怨,虽然一直没涨过工资,但是老板的不断认…

数据结构与算法专题——第二题 优先队列

前段时间玩小爬虫的时候,我把url都是放在内存队列里面,有时我们在抓取url的时候,通过LCS之类的相似度比较,发现某些url是很重要的,需要后端解析服务器优先处理,针对这种优先级比较大的url,普通的…

数据结构与算法专题——第一题 Bitmap算法

在所有具有性能优化的数据结构中,我想大家使用最多的就是hash表,是的,在定位查找场景上具有O(1)的常量时间,多么的简洁优美,但是在特定的场合下:①:对10亿个不重复的整数进行排序。②&#xff1…

Telegraf和Grafana监控多平台上的SQL Server

问题SQL Server在很多企业中部署在多个平台上(Windows,Linux和Container),需要一种能支持多平台的解决方案用于收集和展示相关的监控指标。我选择企业中比较流行的监控展示工具Grafana和监控指标收集工具Telegraf进行实现。这也是为了方便与企业中已经在存在监控平台…

酸吗?28岁程序员财务自由宣布退休!

财务自由是我们这代人的共同追求,有程序员28岁就做到了。近期的一条新闻就直接刷屏了,28岁今日头条程序员手握上亿期权宣布退休,引发一片羡慕嫉妒恨。履历如下:2008-2012就读于暨南大学政治与行政管理专业,自学编程。2…

nuget 是如何还原包的

nuget 是如何还原包的Intro一直以来从来都只是简单的用 nuget 包,最近想折腾一个东西,需要自己搞一个 nuget 包的解析,用户指定 nuget 包的名称和版本,然后去解析对应的 nuget 包并添加引用到项目, 于是就想搞明白 nug…

使用Azure AD B2C为ASP.NET Core 设置登录/注册

一,引言上次关于Azure AD B2C 讲到一些概念,有介绍到,Azure AD B2C 也是一种身份验证的解决方案,但是它运行客户使用其首选的社交,企业或者本地账户标识对应用程序和API进行单一登录访问。同样,Azure AD B2…

使用 Azure Function 定时启动云 VM

点击上方蓝字关注“汪宇杰博客”导语微软 Azure 平台的 VM 可以做到定时自动关机,然而只有 DevTest Lab 服务中的 VM 能够定时开机,普通用途的 VM 还没有上线这个功能。但是没关系,我们可以曲线救国,通过最新版的 Azure Function …

文章目录 | .NET Core on K8s学习之旅 (更新至20200618)

.NET Core on K8s学习之旅更新记录:-- 20200511 增加Ingress & Nginx Ingress介绍-- 20200515 增加Ocelot API网关集成示例介绍-- 20200525 增加Ingress实现灰度发布示例介绍1关于这个系列文章自从2018年底离开工作了3年的M公司加入X公司之后,开始了…