前言
之前单独在旧的帖子下面更新的时候,码字码了1000多字的时候电脑蓝了,重启什么东西都没有,我红了。平台上面的自动保存是针对新文章的。
这周因为隔壁有项目要验收了,我的好大哥就把我派过去配合赶进度了,还体验了一下单休,yysy,双休和单休就是不一样,周日一从床上爬起来就想,咦,怎么明天又上班了,还是双休好啊,虽然事情有点多,但还是腾出时间记录和学习了一些新知识,java的docker部署走了一遍后,自己做的flask+VUE3也走了一遍,今天就总结一下。
利用现有微服务框架软件熟悉docker部署以及微服务部署
之前好大哥不是给我公司的服务器上划了一块linux虚拟机给我吗,我就想哥们这老东西笔记本跑oa,还得在自己的电脑安个虚拟机跑windows跑这些,不如挪去服务器上。(没错笔者一开始蠢蠢的用了windows虚拟机跑这些,实际上后来在服务器是用linux搞了一遍,又在linux上用docker实现了一遍。。。。😅)(给个建议,远程连接就最好用Xshell之类带有Xftp的可视化的文件传输平台,可以直接在本机软件打开更改(比如vscode,直接ctrl+s保存)不用vim等指令在linux里修改配置,虽然有点倒反天罡,但用多了确实很香)
这周接触的就是docker,公司oa的微服务架构MySQL+redis+rabbitmq+nacos,使用公司的服务器上的linux系统部署docker,注意,使用docker的部署将会比传统的安装占用更大的物理空间,因为docker在进行打包的时候会一致打包所需要的环境,而且不同容器的环境相互独立。但这也有一个好处,他能让这些打包后的容器转移至其他地方仍然还能正常运行。
因为我不可能将公司的文件发出,使用我这里推荐使用若依RuoYi的前后端分离项目,或者是微服务框架来尝试部署docker训练,我也通过若依的前后端分离项目实现了一次docker部署和打包上传云仓库,微服务框架的若依项目估计和我之前接触的公司项目差不多,先部署好nacos,在java配置好网关(nacos),在nacos写好相应的配置文件,估计微服务框架的application不用更改,每个项目都有readme.md文件有相关的内容。微服务框架教程,没用过可以看一看的教程,不过推荐自己上网看看相关的
(建议做好redis数据库的选用和mysql数据库的命名,以防出现不必要的数据复用)
docker国内镜像可能的解决方法以及安装过程
首先,就是docker的安装只看源和github的源(个人认为CloudFlare可以更换为阿里云的私人仓库实现,本人没有尝试)。下面的第一个链接可以实现大部分人的需求,重要组件可以考虑设置为开机自启动。
docker||不行试试这个mysql||不行试试这个Nacos||不行试试这个redis
出现这个就是安装成功了
mysql的docker安装过程中error1045但不是密码问题
在使用mysql安装时,出现了我设的密码MySQL不认我这个密码,尝试密码很多次后,发现mysql就是不认这个密码,重安好多次发现mysql就是不认密码。解决方法:需要提前准备配置文件写入后进行映射,上面有链接那个(mysql的链接中有相关内容)。
ERROR 1045 (28000): Access denied for user ‘root‘@‘localhost‘ (using password: YES)
其他转移mysql数据库出现的情况
不同版本的MySQL安装使用,也会可能存在意料之外的错误,docker容器的mysql版本为8.7,原运行环境的MySQL为8+,运行后出现错误,因为5.7有更严格的规则,输入的数字没经过强制转换可能会报错,而8+版本看起来是自动将数字从字符转为了数值。
打包为docker容器
无论打包什么文件为docker容器,打包的过程都需要docker软件的支持,但是可以先准备配置文件,转移至有docker软件/组件的环境中打包。docker的配置文件就是dockerfile。
dockerfile各个参数
python(因为笔者一开始做了py+VUE3的小项目,所以一起做了)
先说打包python,建议下载pipreqs库,再进行requirement的所需环境输出,否则直接打印requirement表会输出当前环境的所有库。
`pipreqs` 是一个自动扫描 Python 项目并生成项目所依赖的第三方库列表的工具。这个库可以帮助开发者快速生成 `requirements.txt` 文件,确保在不同环境中重现相同的依赖关系,从而保证项目的可移植性和一致性。### 如何安装 `pipreqs`:
你可以通过 Python 的包管理器 pip 来安装 `pipreqs`。打开命令行工具,输入以下命令:
```
pip install pipreqs
```### 如何使用 `pipreqs`:
使用 `pipreqs` 生成依赖文件的基本命令格式如下:
```
pipreqs /path/to/project
```
这会在指定的项目目录下生成 `requirements.txt` 文件。你还可以指定输出文件的名称,排除特定依赖库,以及指定 Python 解析版本等。例如:
- 指定输出文件:```pipreqs /path/to/project --output-file requirements.txt```
- 排除特定依赖:```pipreqs /path/to/project --exclude package_name```
- 指定 Python 版本:```pipreqs /path/to/project --python 3.6```
- 生成包含版本号的依赖文件:```pipreqs /path/to/project --use-wheel```### 注意事项:
- `pipreqs` 会分析项目的 `import` 语句来找出所需的依赖库,确保不会遗漏任何必要的库 。
- 如果在生成依赖文件时遇到编码问题,比如在 Windows 系统上,可以使用 `--encoding=utf-8` 参数来指定编码格式 。
- 使用 `pipreqs` 生成的 `requirements.txt` 比直接使用 `pip freeze` 更为精确,因为它只会包含项目中实际使用到的库 。使用 `pipreqs` 生成依赖列表后,你可以使用以下命令来安装这些依赖:
```
pip install -r requirements.txt
```这是一个非常实用的工具,可以大大节省管理项目依赖的时间,并且减少手动管理依赖时可能出现的错误。
我的python文件左右3kb,所需库只有4个,在经过docker打包后变成1G多,如果你不喜欢下一个小小的pipreqs库,也
对时间和内存没什么太大了留恋的话,你就让他去吧。
关于过大的python打包,下面的这个教程也有拆分打包的方法。
这里是python文件的打包教程,
这里是jar的打包过程
这里是java文件的打包教程。
c++打包(9/4补充)
笔者在4月5月左右自己敲了一个简易漏风没什么技术含量的c++原生的服务器,支持多线程,但也就充其量是一个前端url请求的转发。
然后了呢,这几天在公司这边帮忙进行压力测试和一些url请求的测试(虽然我感觉就是打发我找点事做,但他们刚做出来的一些功能涉及部分数据库的增删改查有点问题,还是测得出来的)。
就想着拿jmeter能不能试一试之前的项目,把他搬到公司服务器上。(一开始还和工友说jmeter不是和postman差不多吗,用过才发现在进行压力测试这方面jmeter真的好用,可以设计爆发式访问端口,可以测试服务器与数据库的访问压力,可以自定义设计的地方很多,还可以设计测试的数据导入进行压力访问)
有点偏题了,当时想,c++的程序跑完之后不是有编译后的可执行程序吗,那我直接拿过来不就行了,还打什么包啊?我真聪明!
结果我的原先的linux是ubuntu的22.04版本的,而公司服务器上的是centos7,运行的时候直接就回报了环境依赖版本不匹配,版本过低。我想导师给我的服务器上也没有什么别的东西,干脆就升个级吧,结果centos没有这些高版本的依赖升级。👉🤡
这就是docker的魅力时刻了,盲目的更新依赖可能导致旧的软件不能使用,打包docker就不用考虑这些麻烦事了,那么docker的c++打包也其实和上面类似,我们都需要准备好打包docker的配置文件就是dockerfile,在里面做好相关的设置,上网一看,大多都是对原文件的打包,那么就没有对编译后文件的打包吗,docker打包更像是一个虚拟环境将所需的环境克隆在这个虚拟空间里一起打包,那么对编译后的文件进行打包那肯定也是没问题的,再在上网找了一圈,找到了相关的内容。
c++相关打包教程 进阶就是可执行文件打包
在那个环境下运行的程序,最好在那个环境打包,这就意味着你需要在那个环境部署docker,当然在上面的教程中,你也可以使用docker下载相应的编译器,通过编译器容器环境编译你的原代码再进行打包。
部署多个前端网页跳转的nginx配置
这里是nginx部署多个服务的方法。
注意,无论是docker部署,nginx的转发配置,都需要关注端口
这是docker运行指定端口的样式,注意一定要规划好宿主机的端口,不然你会很痛苦的。
docker run -d -p 5000:5000 test02#这将启动一个后台容器,并将容器的 5000 端口映射到宿主机的 5000 端口。如果你的应用使用了不同的端口,请相应地更改端口号。
docker容器内的ip地址相关不大清楚目前,不知道容器具体的通讯方式,估计也是桥接。在flask的开放ip设置为0.0.0.0,一开始设置为宿主机ip结果无效,前端无法通过预留端口连接容器。
if __name__ == "__main__":app.run(debug=True,host='0.0.0.0' ,port=5000)#别摁抄啊
利用阿里云创建私有仓库上传docker
python的打包过程非常的慢,java非常迅速,出来的python容器成品也非常大,然后尝试上传私有云。还是这个 我估摸这这个也可以使用上面那位赛博仙人的方法,摆脱使用第三方库。(也就是使用CloudFlare,也可以尝试CloudFlare上传个人容器)
可以用不同版本分割为不同的容器。除了云上传,也可以尝试打包为tar文件,具体问问ai吧。
实现效果
像怎么开机自启啊,相关的docker指令也要了解一下,linux的相关帮助文档都可以 -h调出,实在不行就去问ai吧。
python一个看起来简单小小的项目,花费了非常长的时间和空间,那1.17G就是打包后的
(8/26日记)
补充(9/1)若依的数据监控密码以及所带来的思考
在回顾和熟悉若依服务的时候,发现若依网页之中有一个数据监控模块,可是点进去发现需要密码,而他并不是通用密码。
这里是他的密码,而我这里并不是只想说这个的。我当时的思考过程是这样的,用户以及管理员的密码都是通过数据库进行存储,那么是否我可以通过数据库的表单直接获取用户的账号和密码,这是否意味着,如果有人通过服务器漏洞获取到数据,用户的数据将会遇到极大的风险,甚至通过加入不存在的用户和密码制造特权账户。
然而我们在mysql中,会看到这个(数据库部署在服务器上了,只能给大家火看这个哩)
其中的29开头以及8e开头那个很长的字符串,就是密码,这显然不是通过明码保存的密码(你也可以放置粘贴试试),这说明密码进行了加密,继续猜测大佬写代码的时候是国际化的写法😅,通过搜索username以及password。
我们可以发现是前端对用户的密码进行了加密的操作。(仔细一想,如果前端在传输数据过程中被人截胡,确实会直接暴露密码,而在前端过程就对数据加密,安全性也更高)
通过追踪decrypt函数的调用,我们来到了这个页面,我们可以看到是对数据用公钥加密,解密用私钥,通过的是RSA非对称的密钥生产加密,但我想总感觉怪怪的,为什么前端放置的是公钥和密钥,一般是,前端数据通过公钥加密,在传输到后端跳转的过程中利用私钥解密,在进行与数据库对比,但是这样虽然保证了他人不能通过前端文件获取到公钥密钥,但是这样也要求了服务器将需要存放原始密码(数据安全这一块到底算前端的锅还是后端的锅?),需要保证数据库的安全要高?
这一块对于我来说是盲区,毕竟这两种方法各有优缺,服务器存放原始密码可以避免忘记密码无法更改的尴尬,但是服务器存放加密密码可以减轻加密负担,在传输过程中不会出现明码传输,但是后端的私钥方案可以有更高的灵活性,但在服务器到数据库的过程中将以明码形式传输,有风险。
望大佬指教。