为啥要写这么一个小程序?

作为互联网的原住民。

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 开发的斗图小程序后端+斗图小程序的更多相关文章

  1. Centos7.2下Nginx配置SSL支持https访问(站点是基于.Net Core2.0开发的WebApi)

    准备工作 1.基于nginx部署好的站点(本文站点是基于.Net Core2.0开发的WebApi,有兴趣的同学可以跳http://www.cnblogs.com/GreedyL/p/7422796. ...

  2. vue-calendar 基于 vue 2.0 开发的轻量,高性能日历组件

    vue-calendar-component 基于 vue 2.0 开发的轻量,高性能日历组件 占用内存小,性能好,样式好看,可扩展性强 原生 js 开发,没引入第三方库 Why Github 上很多 ...

  3. 一个基于Net Core3.0的WPF框架Hello World实例

    目录 一个基于Net Core3.0的WPF框架Hello World实例 1.创建WPF解决方案 1.1 创建Net Core版本的WPF工程 1.2 指定项目名称,路径,解决方案名称 2. 依赖库 ...

  4. 致远·面向人工智能-逐浪CMS v8.1.2全面发布[全球首个基于dotNET core3.0的中文CMS]

    原文:https://www.z01.com/down/3484.shtml 再远, 我都不会停息, 因为技术而生, 因为技术而强, 这是逐浪软件的命与根! 全新打造, 三百多项超级功能, 助你十分钟 ...

  5. WinSock2.0通信的一个例子(基于VC++6.0开发测试)

    实验目的: 掌握Winsock2.0套接字编程技术的基本方法. 实验要求: 运用TCP/IP Winsock2.0套接字编程技术,使用VC编写一个面向连接通信的服务端程序与客户端程序,服务器先与端口3 ...

  6. 在web开发中,为什么前端比后端更得到转行程序员的青睐?必看!

    1.Web开发分类与区别 人们通常将Web分为前端和后端,前端相关的职位有前端设计师(UI/UE),前端开发工程师,后端相关的有后端开发工程师. 2.技术栈区别 看各大招聘网站上,公司对前端开发工程师 ...

  7. 使用.net core3.0 正式版创建Winform程序

    前阵子一直期待.net core3.0正式版本的出来,以为这个版本出来,Winform程序又迎来一次新生了,不过9.23日出来的马上下载更新VS,创建新的.net core Winform项目,发现并 ...

  8. 如何让基于.NET 2.0的应用在高版本的系统上运行?

    我们的WinForm项目是基于.NET 2.0开发的,在部署时,发现有些机器没有.NET 2.0,但是即使这些机器有装.NET 2.0 以上的版本,也无法运行我们的程序.这就比较蛋疼了. 我们查了一下 ...

  9. (转)微信公众平台开发之基于百度 BAE3.0 的开发环境搭建(采用 Baidu Eclipse)

    原文传送门(http://blog.csdn.net/bingtianxuelong/article/details/17843111) 版本说明:     V1:         2014-2-13 ...

随机推荐

  1. 【Offer】[56-2] 【数组中唯一只出现一次的数字】

    题目描述 思路分析 测试用例 Java代码 代码链接 题目描述 在一个数组中除一个数字只出现一次之外,其他数字都出现了三次.请找出那个只出现一次的数字 [牛客网刷题地址]无 思路分析 如果一个数字出现 ...

  2. MYSQL之B+TREE索引原理

    1.什么是索引? 索引:加速查询的数据结构. 2.索引常见数据结构 顺序查找: 最基本的查询算法-复杂度O(n),大数据量此算法效率糟糕. 二叉树查找:(binary tree search): O( ...

  3. 史上最全Docker环境安装指南-让安装docker简单到爆

    一.思考❓❔ 1.什么是Docker? 装应用的容器 开发.测试.运维都偏爱的容器化技术 轻量级 扩展性 一次构建.多次分享.随处运行 2.安装Docker难不难? So easy! 此文看过之后,读 ...

  4. MySql(二)_NHibernateHelper管理会话工厂

    1.定义接口的好处: (1) 清楚的看到里面有哪些方法: ( 2 )  可以更换实现类:Nhibernate实现件可以更换: Manger文件夹(另外两个是Model.Mappings文件夹) 首先M ...

  5. 大数据平台搭建 - cdh5.11.1 - hive客户端安装

    一.简介 hive是基于hadoop的一种数据仓库工具,可以将结构化的文件映射成为数据库的一张表,并提供简单sql查询功能,底层实现是转化为MapReduce任务计算. 二.安装 (1)下载 从cdh ...

  6. 基于Arduino和Blynk平台的远程控制智能小车

    /------转载请附上本文链接 https://i.cnblogs.com/EditArticles.aspx?opt=1 -------啦啦啦我是快乐的分割线- ------------/ 小车图 ...

  7. 装系统 ------ 使用微PE 做系统盘

    1.什么是PE系统 pe系统是一种装系统的系统,也就是预装系统的系统,它是一种系统预装环境和工具. 可以放在U盘或光盘里随身携带,可以用来给电脑装系统 2.常见的制作pe 系统的工具 大白菜,U启动, ...

  8. python time.striptime模块用法

    python time模块中strptime用法 time.strptime(string[, format]) 其中string参数即为要深入的日期字符串.format为格式化的日期字符串. %Y ...

  9. [Scala]集合中List元素转Tuple元素的函数迭代写法

    ____ 本文链接: https://www.cnblogs.com/senwren/p/Scala-Lis-2-Tuple.html —— Scala没有提供相应写法, 但迭代写法仍然可以做到. 有 ...

  10. idea 安装 lombok插件

    一,前言 lombok是什么?lombak是一个工具,主要用来简化,减少代码的编写.使代码看起来更清晰,简洁. 而且lombok只是一个工具,不会打包到war中,不会增加任何消耗.只是在编译期中帮助我 ...