好习惯
- 养成好习惯 每次打包都clean一下
总结几种退出
-
tmux 挂起: ctrl+d
-
docker 容器 挂起: ctrl+p ctrl+q 关闭: ctrl+d
-
服务器 挂起: logout 关闭: 云服务器控制台
-
tmux
-
top q 退出
ctrl+c 撤回刚刚操作
tmux a 刚刚连接的pane
ctrl+a s 选择历史任务
ctrl+a " 上下
ctrl+a % 左右
ctrl+d 关闭当前pane
我的名字
AcTerminal
server1
springboot
Git
springboot_server
springboot
linux命令
cat 路径/文件 获取文件内容
rm 文件名1 文件名2 重命名
vim
d删除当前行
u撤销
ctrl+r 取消撤销
gg dG删除全部内容
指示点
大家以后不要考虑一台服务器部署两个项目
瓶颈不在服务器上 大家会发现 一个项目啊 一个服务器都跑不起来
并不会说 我一个服务器不够用 我项目很多
大家以后不要考虑把多个不同的项目放到一台服务器上
没有任何必要 一个服务器的80 端口和443端口都是唯一的 https默认都是443端口
不同项目放到服务器上 端口还要特殊处理 比较麻烦 而且没有必要
去阿里云上看一看 两核两G的服务器和两台一核两G的服务器比起来 还要贵一些
所以没有必要 所以分开放到服务器上就可以了
传文件可以用fftp 但是推荐gitbash(使用经典的工具 学的越少越好 )
图形化界面没法批量操作 命令的话可以批量化操作(害 够用就行 不多学)
写一个循环 传到1000台服务器上 命令很快 图形化点一千次
提高效率最好命令来操作
现在项目比较小 可以自己搭建一个 如果用户特别大 直接租赁阿里或者腾讯云的mysql
安装->启动->设密码就可以了
source不是执行 而是mysql里边只能执行sql语句
尽量适应一下非图形化界面 尽管也可以试一下idea链接云端的mysql
如果没有用命令行的话效率会非常低啊 因为一个东西一旦能用命令行来做
大家就可以把命令放到文件里边 未来需要重复操作的时候 直接.-
执行就可以了
只有命令行才可以提高生产力
理解
- 注意
0.0.0.0:80->80/tcp, :::80->80/tcp, 0.0.0.0:3000-3002->3000-3002/tcp, :::3000-3002->3000-3002/tcp, 8000/tcp, 0.0.0.0:20000->22/tcp, :::20000->22/tcp
查看以后 3000-3002说明是3000下的3002映射 :::应该代表ssh
接入了用户名第三方登录 就可以获取用户名和头像了
删除多余文件
rm -r dist
rm *.jar
rm 文件名
我们的路径在 /home/acs/kob/web
所以需要把dist里的东西移动到
web下 在web路径下 使用mv dist/* .
就可以把dist删掉了rm dist/ -r
exception during pool initialization
提示报错
google发现数据库配置错误 在backend>main>rourses
更改一下前端页面
的api因为后端都加入了
ctrl+shift+F/H 127.0.0.1
更改为配好的云端的路径
https://app.acapp.acwing.com.cn/api/
替换为http**3000
这里api映射的就是3000 ws
没有api 前边的https更改为wss
http->https
ws->wss
wss://acapp.acwing.com.cn/websocket/${store.state.user.token}
更改完之后 查询acapp
关键字都保存一下 然后启动vue 查看是否有错 编译通过
这时登录报错跨域问题
打包前端 vue项目管理器停掉 选build 运行就可以了
有警告没有管 在web/dist新出现文件 将dist文件夹打包上传到
scp -r dist springboot:kob/web
改前边
先绑定ip地址和域名(备案和https证书)(20天)
先用Y总分配的 应用->创建应用->服务器ip 保存
配置Nginx 普通域名是http的会提示不安全
点击应用->key+pem
配置Nginx
cd /etc/nginx/
sudo mkdir cert
cd cert
i ->shift+ins 保存一下
配置完key pem
进入家目录cd
sudo cp .bashrc .vimrc .tmux.conf /root
将祖传配置文件放到root下
cd -
返回上级目录
ggdG
全部删除
:set paste
进入粘贴模式 然后按i shift+ins 站过来
然后记得修改一下编号
启动nginx(在nginx下) sudo /etc/init.d/nginx start
重载sudo /etc/init.d/nginx reload
如果fali的话 去 cd /var/log/nginx/
看看那里错了
直接cat error.log
会报错 应该sudo cat error.log
进入vim粘贴一定要 :set paste
要不然粘贴不成功
自己的域名绑定到服务器要自己百度(需要自己绑定dns)
- ggdG删除全部内容 gg:光标跳转到该文件的行首;
dG:删除光标行及其以下行的全部内容。(注:d为删除,G为光标跳转到末尾行)
传到云服务器
上传jar包
gitbashHere
scp backend-0.0.1-SNAPSHOT.jar springboot:
共三个
云端 创建文件夹
mkdir kob
cd kob
mkdir backendcloud
mkdir web
mkdir acapp
cd backendcloud
cp ~/*.jar .
启动三个分屏 ctrl+a "
第一个分屏 java -jar back (3000服务)
java -jar mat (3001)
java -jar botr
xswl
输入成功的话 我们可以发现这个包里边有个很恶心的地方 就是它每一秒钟会输出一个 match players看着很烦
对吧 我们可以先把这个matchplayer删掉啊 看着太烦了啊 先全局搜索一下 ctrl+shift+f 把这句话删了啊 太恶心了啊
别让他输出那些恶心的调试信息了啊
然后再把第二个项目重新打包一下 生命周期 clean一下
這個項目占用的並不多 400M内存是mysql(free -h)(top查看详细的)
重新上传scp matchingsystem-0.0.1-SNAPSHOT.jar springboot:kob/backendcloud/
竟然可以指定路径
ctrl+c停止运行
上传后端
在pom.xml中添加配置 三个子的项目 pom
在artifactId下(同位置)添加packaging
打包的类型
<packaging>jar<packaging>
然后添加dependencies
下的一个build的配置(复制讲义)//把它构建成什么东西
然后修改一下指定位置的main类名mainClass
右键BackendApplication->复制路径/引用->复制引用(com开头)
开始打包
打开maven bakcendcloud(我们的总项目 )
点一下->生命周期->clean->package->return 0就成功了
成功的文件在子项目对应的target的 *.jar 文件
我们项目需要的所有文件所有的配置文件 java代码 都打包好了
养成好习惯 每次打包都clean一下
(把运行的中间的文件都删掉)
测试报错
这个信息在Test set: com.example.backend.BackendApplicationTests的txt里边
路径\KOBB\backendcloud\backend\target\surefire-reports
Please refer to E:\KOBB\backendcloud\backend\target\surefire-reports for the individual test results.
Please refer to dump files (if any exist) [date].dump, [date]-jvmRun[N].dump and [date].dumpstream.
javax.websocket.server.ServerContainer not available
Error creating bean with name 'serverEndpointExporter'
在测试类主函数(backendTest)添加上
@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
或者添加依赖
api统一格式
在面向前端的controller里边 pk有两个是面向后端的不用考虑
方便处理Nginx api都加上api前缀
记得在config里边也放行一下
前端暂放
前端
加上v-if判断user.id和pk.a_id/b_id
<div class="user-color" v-if="$store.state.pk.status==='playing'&& parseInt($store.state.user.id)
=== parseInt($store.state.pk.a_id)">左下角</div>
<div class="user-color" v-if="$store.state.pk.status==='playing'&& parseInt($store.state.user.id)
=== parseInt($store.state.pk.b_id)">右上角</div>
类似的简单逻辑都在前端就可以完成了
这个只在PkView里加 不要加在组件里边 因为回放也会调用 但是没有分的必要
但是可以标记一下哪个用户
后端
Supplier<Integer> botInterface= Reflect.compile(//自带的api
"com.kob.botrunningsystem.utils.Bot"+uid,
addUid(bot.getBotCode(),uid)
).create().get();
File file=new File("input.txt");//创建一个文件 在本地
try(PrintWriter fout=new PrintWriter(file)){//报错 添加catch语句
fout.println(bot.getInput());
fout.flush();//清空一下缓冲区 要不然又可能读不到文件
} catch (FileNotFoundException e) {
throw new RuntimeException(e);
}
Integer direction=botInterface.get();//函数不能传参
utils下bot
接入 public class Bot implements java.util.function.Supplier<Integer>
实现方法 get 原来的@override删除
public Integer get() {
File file=new File("input.txt");
try {
Scanner sc=new Scanner(file);//添加try环绕
return nextMove(sc.next());//读入一个字符串
} catch (FileNotFoundException e) {
throw new RuntimeException(e);
}
}
同时改一下调用的接口
int k=code.indexOf(" implements java.util.function.Supplier<Integer>");
本地修改/完善项目
//先改后端 再改前端
文件都是传入参数botInterface.nextMove(bot.getInput())
我们在docker里用沙箱进行评测
在沙箱里边一般是通过文件 传参数 更加灵活 很容易支持多门语言 java如何调用c++语言 (这里指的是bot)
bot代码 扩容 一旦换成文件操作 我们都可以通过文件输入 每一部分会更加独立 更容易扩展
这里把函数参数的传递方式换成文件
把输入写到一个文件 然后在文件里动态的把文件里的输入读出来
botrunnigsystem->consumer
查看后端
这样就把 调用函数的传入入方式换成了文件
2 名单
把名单改成10 想一想逻辑实现的位置
在backend的impl->GetRanklistServiceImpl
3.匹配成功之后不知道自己是谁
4.api没有统一格式
安装java8
sudo apt-get install openjdk-8-jdk
Y
java -version 查看版本 1.8*就安装成功了
安装mysql并建表
通过git进入本地
链接springboot
安装mysql(tmux里装)
tmux a 查看最近任务
tmux
sudo apt-get install mysql-server
(fixMissing)
先执行以下更新
sudo apt-get update
然后再装一遍
方向键 sudo apt-get install mysql-server
启动Mysql
sudo service mysql start
输入 top 查看所有进程
如果看到mysqld-safe 和mysqld 就成功了
直接输入q/ctrl+c就可以退出top指令
登录mysql
sudo mysql -u root
ALTER USER 'root'@'localhost' IDENTIFIED WITH caching_sha2_password BY '123456';
链接
sudo mysql -u root -p
输入密码
先创建一个数据库kob
create database kob;
把三个表传上去
idea图形界面没法用了(在云端)
那么在数据库界面 右键表(表)->SQL脚本->将DDL生成到剪贴板
tmux另外一半
创建一个脚本 vim create_table.sql
进入粘贴模式 :set paste按下i进入编辑模式
出现insert(paste) shift ins :wq
pwd查看现在所处路径
在mysql里边执行一下脚本
source /home/acs/create_table.sql;
再配置本地终端
再把免密配置再在本地配置一遍
打开一个gitbash 在家目录下(cd
//进入家目录) 进入.shh
(如果没有的话)新建一个文件夹mkdir .shh
ls
看一下有没有密钥公钥(id_rsa id_rsa.pub
) 没有的话ssh-keygen.exe
生成以下
如果有的话 vim config
配置一下 Host HostName User
配置免密登录 ssh-copy-id springboot_server
->yes
注意点
配置容器免密登录 (AcTerminal)
vim .ssh/config Docker配置过这里不再配置只跟换一个名称
ssh-copy-id spring_docker
yes 密码
但是新的容器 需要配置新的密码 这时候 每次新建一个的话
都要重新配置免密登录 因为新的容器没有AcTerminal的公钥
Linux判定是不能有同一个 地址UserPort的 (我们可能可以改变用户来切换容器)
或者更换过一个名称发送公钥之后 登录同一个名称 对接不同的容器(这两个想法以后再试试)
在本地配置免密登录(springboot_server下)
vim config/注意还在~/.ssh下
Host springboot
HostName
User
Port 20000
ssh-copy-id springboot
只是比较麻烦 不是说项目完全不能放
在云端配置终端 配置了很多功能 镜像 作业 省区配环境了
本地配置终端是因为 未来传项目需要 项目都在本地
Acwing的会有带宽限制 超过1MB会自动关掉
发送祖传文件
AcTerminal
scp .bashrc .vimrc .tmux.conf springboot:
使用Django框架课的镜像
cd /var/lib/acwing/docker/images
scp django_lesson_1_0.tar 别名:
必须在AcTerminal里的 发送祖传文件/发送镜像
解压镜像docker load -i django_lesson_1_0.tar
解压完之后 查看一下有没有解压出来docker images
运行docker镜像
docker run -p 20000:22 -p 80:80 -p 3000:3000 -p 3001:3001 -p 3002:3002 -itd --name kob_server django_lesson:1.0
这里已经存在了 20000端口(Docker分配的服务器) 只需要停掉就可以了
大家以后不要考虑一台服务器部署两个项目 只需要停掉一个容器 让另外一个容器的端口可以运行就可以了
这意味着我们部署两个docker容器 两个网站是不能同时被访问的
进入容器 docker attach kob_server
创建子用户
adduser acs 密码 Y
usermod -aG sudo acs
ctrl p+ctrl q// 不要ctrl d 就把容器关了
去云平台管理安全组
更多(查看详情)->防火墙->打开端口 22 20000 80(http) 443(https)
3000 3001 3002是服务器内部访问 外部不需要访问
22一定要打开 如果不打开ssh登录不上
补完Docker教程
来了
准备好了域名和https证书
项目跑在doker容器里 而不是云服务器了
因为这样跑起来很方便 未来换一个服务商的话 直接把doker的镜像导出来 备个份
就是一个文件 一个压缩包 换到另一台装载docker的服务器上 解压出来就可以了
已有的配置服务器流程:针对sp-9的讲义
配置服务器 别名 免密登录 tmux 等:Linux课讲义
tmux里装Docker
sp-0128-9
项目上线
表头
Idea操 作 指 南:https://www.acwing.com/blog/content/25456/
每次都要点击的网址:https://www.acwing.com/blog/content/28250/
G i t B a s h : https://www.acwing.com/blog/content/22768/
WindowsIdea :https://www.acwing.com/blog/content/23868/
本节课讲义https://www.acwing.com/file_system/file/content/whole/index/content/6481274/