基于.Net core3.0 开发的斗图小程序后端+斗图小程序
为啥要写这么一个小程序?
作为互联网的原住民。
90后程序员的我,从高中开始发QQ小表情。
到之后的熊猫头,蘑菇头。
可以说表情包陪伴我从学校到社会,从青少年到中年。。
多年来,混迹于各个qq群,收集表情包多达三千多个,终于,在去年的某个工地跑路的时候,忘了带走我的表情包。。。然后就再也找不到之前的经典表情了。。
虽然QQ里面提成了斗图的功能,但是微信没有提成QQ那种怼图的功能。而且对我来说,QQ提供的表情都太高清了。。不如模糊的小标签有灵魂。。。
于是决定自己做一个这样的斗图小程序。自用,也给其他的朋友们提供方便。
需要用到的技术栈
服务器端:
- 阿里云ubuntu1804最低配的的ECS一台
- MySQL8.0社区版数据库
- .Net Core 3.0
- Dapper
- HtmlAgilityPack
- Lucene+jieba.net
- 阿里云对象存储+阿里云CDN
小程序端:
- 直接使用微信官方的那一套就行,客户端没啥复杂的,我使用的是uniapp开发的小程序。
选好技术类型后,就开始我们的斗图小程序开发过程
1.爬取图片数据
百度搜搜表情包,会出现N个专门做表情包的网站。
我们使用HtmlAgilityPack来抓取图片地址和alt描述文字。
具体可以参考我的另一篇博文 【.Net Core下使用HtmlAgilityPack解析采集互联网数据】
爬取拿到图片地址后,使用HttpClient来下载图片,并上传到对象存储空间去,这里可以自己选择阿里云或者七牛云【不是广告,因为我最熟悉的就是阿里云和七牛云】
下载图片代码
var result = await new HttpClient().GetStreamAsync(imgUrl);
拿到流就可以直接下载了,然后上传了。
上传成功后,保存图片地址和图片的描述文字。
2.开发web服务器接口
在抓取完图片存到数据库后,我们手上已经有N多图片了。
然后就开发搜索图片的api。
第一步的时候,我们存储了图片地址和图片描述文字。我们搜索的就是这个描述文字。把搜索结果对应的图片列响应出去就好了。
假如你图片采集到几十万张。你单纯用like来搜索。一是慢的要死。二是搜索结果不尽人意。
有大佬估计会说直接上ElasticSearch或者Solr啊。。。
我的内心:服务器费用你给我出啊。我阿里云1h1g的机器,跑得起那玩意儿就怪了。。
这里我使用的是Lucene.Net 4.8+jieba.Net分词插件。
使用方式非常简单。把数据直接导入到Lucene就行了。【用Lucene的专业词语说叫添加到索引】
var AppLuceneVersion = LuceneVersion.LUCENE_48;
var indexLocation = Path.Combine(System.IO.Directory.GetCurrentDirectory(), "Indexs");
if (!System.IO.Directory.Exists(indexLocation))
{
System.IO.Directory.CreateDirectory(indexLocation);
}
var dir = FSDirectory.Open(indexLocation);
//create an analyzer to process the text
var analyzer = new JieBaAnalyzer(TokenizerMode.Search); //new StandardAnalyzer(AppLuceneVersion);
//create an index writer
var indexConfig = new IndexWriterConfig(AppLuceneVersion, analyzer);
using (var writer = new IndexWriter(dir, indexConfig))
{
//todo 加载数据过来var list = mysql.Query<BiaoQingSearchModel>(sql, new { time, now = nowTime }).ToList();
for (int i = ; i < list.Count(); i++)
{
var item = list[i];
var doc = new Document();
doc.Add(new StringField("url", item.Url, Field.Store.YES));
doc.Add(new TextField("Imgexplain", item.Imgexplain, Field.Store.YES));
writer.AddDocument(doc);
}
writer.Flush(triggerMerge: false, applyAllDeletes: false);
writer.Commit();
}
然后创建好索引之后,就可以在Indexs下看到一堆文件了。
大概就是如上图所示的样子。
然后就是搜索表情包的数据,数据搜索的时候,我们只搜索Lucene里面的图片描述列。
var AppLuceneVersion = LuceneVersion.LUCENE_48;
var indexLocation = Path.Combine(System.IO.Directory.GetCurrentDirectory(), "Indexs");
if (!System.IO.Directory.Exists(indexLocation))
{
System.IO.Directory.CreateDirectory(indexLocation);
}
var dir = FSDirectory.Open(indexLocation);
var analyzer = new JieBaAnalyzer(TokenizerMode.Search); QueryParser qp = new QueryParser(AppLuceneVersion, "Imgexplain", analyzer);
Query query = qp.Parse(key);
BooleanQuery b = new BooleanQuery();
b.Add(query, Occur.MUST); using (IndexReader reader = DirectoryReader.Open(dir))
{
var searcher = new IndexSearcher(reader);
TopDocs hits = searcher.Search(query, Size);
Console.WriteLine("一共:" + hits.TotalHits);
Count = hits.TotalHits;
var list = new List<BiaoQingSearchModel>();
foreach (var hit in hits.ScoreDocs)
{
var foundDoc = searcher.Doc(hit.Doc);
var model = new BiaoQingSearchModel();
model.Url = foundDoc.Get("url");
model.Imgexplain = foundDoc.Get("Imgexplain");
list.Add(model);
}
return list;
}
然后就能正确的搜索出我们需要的表情包了。
做好这一堆事情,基本上我们的服务器端开发工作完成了80%。
然后就是用asp.net core写一个简单的api然后调用Lucene的搜索方法,就完成了。
服务器部署工作
我使用的是Ubuntu1804,也推荐大家使用Ubuntu server。ubuntu比centos好用几条街。。有人说centos稳定,同样是Linux,为啥ubuntu server就不稳定了?
1. 在ubuntu服务器上使用apt命令安装好nginx,mysql,Supervisor三个软件
迁移本地采集的数据到ubuntu上的数据库。【迁移数据可以直接使用mysqldump出sql,然后到服务器上执行就行了】
2.申请域名和SSL证书,因为微信小程序要求必须https。【阿里云可以一条龙服务】
3.在nginx中绑定域名和https证书
server {
listen ssl;
server_name 你的域名
ssl on;
ssl_certificate /var/ssl/xxx.pem;
ssl_certificate_key /var/ssl/xxx.key;
ssl_session_timeout 5m;
ssl_protocols TLSv1 TLSv1. TLSv1.;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
ssl_prefer_server_ciphers on; location / {
proxy_pass http://localhost:5000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection keep-alive;
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
}
}
4.使用Supervisor以守护进程的模式启用.net core开发的webapi站点。
[program:doutuapp]
command=dotnet xxx.dll
directory=/var/www/
user=root
autostart=true
autorestart=true
startsecs=
stderr_logfile=/usr/log/doutu/err.log
stdout_logfile=/usr/log/doutu/out.log
5.启动站点服务
启用supervisor,使用supervisorctl reload 然后supervisorctl status查看守护进程状态
然后启动nginx,正常情况下,就可以通过你绑定的域名访问到你的webapi了。
6.性能优化建议【不是必须】
因为我们穷,买不起高配的服务器。所以只能通过做更多的功课来加速访问,提高我们的小水管服务器的性能。
把图片上传到oss去,保证我们的webapi只响应webapi的文本数据,这样1m的小水管,撑住20个人同时访问,压力还是不大的。
使用cdn加速访问。cdn是内容分发网络的简称。简单的理解就是用户访问距离他最近的节点就能获取到数据。举个栗子:你服务器在上海,你用户在新疆,如果你用户通过网线来找你的服务器上的图片,
如果不是直连的话,需要经过n个路由器和交换鸡。中间可能会找不到你的服务器,然后也许你就丢失了一个用户了!cdn就是帮我们分发图片到全国各大节点。然后无死角让你提升用户体验。
开启nginx的gzip,压缩你的数据包。之前10k一个数据包,压缩后2k,你服务器的并发性能瞬间提高几个档次【当然压缩需要消耗cpu,cpu不行就算求了】
以上内容虽然只是短短一篇文章,但是实际上消耗了我近两周的业余时间【还不算上备案域名的时间】,因为中间关于全文检索的知识点我也不太了解,踩了很多坑才爬上岸。
如果有大佬需要交流,或者想自己不想这么麻烦,想用现成的接口,也可以找我要api接口。联系方式:QQ群:545594312,也可以点击下边的链接进群。
接下来就是广告时间了!!!!,欢迎微信扫码体验!!!【转载请不要去掉我的广告,谢谢大佬们】
基于.Net core3.0 开发的斗图小程序后端+斗图小程序的更多相关文章
- Centos7.2下Nginx配置SSL支持https访问(站点是基于.Net Core2.0开发的WebApi)
准备工作 1.基于nginx部署好的站点(本文站点是基于.Net Core2.0开发的WebApi,有兴趣的同学可以跳http://www.cnblogs.com/GreedyL/p/7422796. ...
- vue-calendar 基于 vue 2.0 开发的轻量,高性能日历组件
vue-calendar-component 基于 vue 2.0 开发的轻量,高性能日历组件 占用内存小,性能好,样式好看,可扩展性强 原生 js 开发,没引入第三方库 Why Github 上很多 ...
- 一个基于Net Core3.0的WPF框架Hello World实例
目录 一个基于Net Core3.0的WPF框架Hello World实例 1.创建WPF解决方案 1.1 创建Net Core版本的WPF工程 1.2 指定项目名称,路径,解决方案名称 2. 依赖库 ...
- 致远·面向人工智能-逐浪CMS v8.1.2全面发布[全球首个基于dotNET core3.0的中文CMS]
原文:https://www.z01.com/down/3484.shtml 再远, 我都不会停息, 因为技术而生, 因为技术而强, 这是逐浪软件的命与根! 全新打造, 三百多项超级功能, 助你十分钟 ...
- WinSock2.0通信的一个例子(基于VC++6.0开发测试)
实验目的: 掌握Winsock2.0套接字编程技术的基本方法. 实验要求: 运用TCP/IP Winsock2.0套接字编程技术,使用VC编写一个面向连接通信的服务端程序与客户端程序,服务器先与端口3 ...
- 在web开发中,为什么前端比后端更得到转行程序员的青睐?必看!
1.Web开发分类与区别 人们通常将Web分为前端和后端,前端相关的职位有前端设计师(UI/UE),前端开发工程师,后端相关的有后端开发工程师. 2.技术栈区别 看各大招聘网站上,公司对前端开发工程师 ...
- 使用.net core3.0 正式版创建Winform程序
前阵子一直期待.net core3.0正式版本的出来,以为这个版本出来,Winform程序又迎来一次新生了,不过9.23日出来的马上下载更新VS,创建新的.net core Winform项目,发现并 ...
- 如何让基于.NET 2.0的应用在高版本的系统上运行?
我们的WinForm项目是基于.NET 2.0开发的,在部署时,发现有些机器没有.NET 2.0,但是即使这些机器有装.NET 2.0 以上的版本,也无法运行我们的程序.这就比较蛋疼了. 我们查了一下 ...
- (转)微信公众平台开发之基于百度 BAE3.0 的开发环境搭建(采用 Baidu Eclipse)
原文传送门(http://blog.csdn.net/bingtianxuelong/article/details/17843111) 版本说明: V1: 2014-2-13 ...
随机推荐
- Elasticsearch之更新
public class UpdateElasticAPI { private static RestClient restClient; static { restClient=RestClient ...
- 【学习笔记】第二章 python安全编程基础---python爬虫基础(urllib)
一.爬虫基础 1.爬虫概念 网络爬虫(又称为网页蜘蛛),是一种按照一定的规则,自动地抓取万维网信息的程序或脚本.用爬虫最大的好出是批量且自动化得获取和处理信息.对于宏观或微观的情况都可以多一个侧面去了 ...
- 基于Arduino和Blynk平台的远程控制智能小车
/------转载请附上本文链接 https://i.cnblogs.com/EditArticles.aspx?opt=1 -------啦啦啦我是快乐的分割线- ------------/ 小车图 ...
- Python3 爬虫之 Scrapy 框架安装配置(一)
博客地址:http://www.moonxy.com 基于 Python 3.6.2 的 Scrapy 爬虫框架使用,Scrapy 的爬虫实现过程请参照本人的另一篇博客:Python3 爬虫之 Scr ...
- 创建进程池与线程池concurrent.futures模块的使用
一.进程池. 当并发的任务数量远远大于计算机所能承受的范围,即无法一次性开启过多的任务数量就应该考虑去 限制进程数或线程数,从而保证服务器不会因超载而瘫痪.这时候就出现了进程池和线程池. 二.conc ...
- 关于W3Cschool定义的设计模式-常用的9种设计模式的介绍
一.设计模式 tip:每种设计模式,其实都是为了更高效的,更方便的解决在面对对象编程中所遇到的问题. 什么是设计模式: 是一套经过反复使用.多人知晓的.经过分类的.代码设计经验的总结 为什 ...
- Senparc.Weixin.MP SDK 微信公众平台开发教程(二十二):如何安装 Nuget(dll) 后使用项目源代码调试
最近碰到开发者问:我使用 nuget 安装了 Senparc.Weixin SDK,但是有一些已经封装好的过程想要调试,我又不想直接附加源代码项目,这样就没有办法同步更新了,我应该怎么办? 这其实是一 ...
- [Linux] Linux中重命名文件和文件夹的方法(mv命令和rename命令)
原文链接 在Linux下重命名文件或目录,可以使用mv命令或rename命令,这里分享下二者的使用方法. mv命令既可以重命名,又可以移动文件或文件夹. 例子:将目录A重命名为B mv A B 例子: ...
- js/jquery去掉空格,回车,换行
Jquery:$("#accuracy").val($("#accuracy").val().replace(/\ +/g,""));//去 ...
- 将maven项目导入到eclipse中
一,前言 本文来演示一下如何将一个新的maven项目到入到eclipse中. 在文章使用命令行创建maven web项目中我们使用maven命令行,创建了web工程,接下来为了开发方便我要将新建的工程 ...