服务部署
服务的概念
我们一直说,服务器给用户提供服务,可什么是服务呢?
其实没什么特别的,它就是一个一直在运行、在监听的程序而已,有编程基础的各位早就写过类似的东西了。比如下面这个 sum.py:
user_input = None
total = 0
while True:
user_input = input('请输入一个正整数: ')
if not user_input.isdigit():
continue
total += int(user_input)
print("当前的和是:{}".format(total))
当你用 python sum.py 运行这个脚本,input 会一直监听用户输入,一旦获得了输入,马上进行加和操作,输出结果后马上监听下一次输入。我们把它抽象成以下伪代码:
重复以下直到永远 {
1. 尝试接收用户输入 (用户的键盘输入)
2. 接收到输入,进行处理
2.1 是正整数的话,就累加
2.2 不是的话,返回步骤 1
3. 输出消息
}
其实,一个服务也不过是这样:
重复以下直到永远 {
1. 尝试接收用户输入 (用户发出的 HTTP 消息)
2. 接收到输入,进行处理 (计算、数据库交互...)
2.1 ...
2.2 ...
3. 输出消息 (返回一个 HTTP 消息给用户)
}
用代码写出来,可能和 sum.py 结构一样。假设这个脚本的名字叫 serve.py,你需要在一台电脑上运行 python serve.py,并且让它一直一直运行下去。
所以,服务说白了就是一个一直在运行的程序而已。
用 SpringBoot 开发的东西也一样。打包好后,可能叫做 service.jar。于是,在服务器上,你需要运行 java -jar service.jar,让程序运行起来,然后你就可以使用你的服务了。
服务的部署
服务器一般是不关机的,它可以一直一直跑一个脚本,为用户提供服务。
要在服务器上部署一个服务,你需要做以下事情:
1. 写好代码,然后打包。
2. 把打包好的代码丢到服务器上(用 ssh,ftp,git clone 甚至 wget 都可以,各显神通啦)。
3. 服务程序的代码里一定有指定服务端口的地方,我们需要去云服务提供商那里,通过安全组设置,把这个服务端口开放。我们以 8123 端口为例。
4. ssh 上服务器,运行程序。
5. 注意,如果此时关闭了 ssh 的连接,那么程序就会停止运行。有很多办法可以让程序在关掉 ssh 之后继续跑,我们推荐使用 screen。
Screen 的使用
screen 可以在命令行里创建虚拟窗口(就像 windows 里面开多个窗口一样的概念)。并且,你可以 detach 一个窗口,这样你关掉这个命令行窗口的时候,这个 detach 掉的窗口不会受影响。具体用法请阅读 screen 文档。
要运行一个程序并保证退出命令行时它不受影响:
1. 在服务器上,打 screen,创建一个新的虚拟窗口()
2. 使用命令运行程序 python xxx.py 或者 java -jar xxx.jar。
3. 按下 ctrl + a(这会让 screen 准备好接受命令。使用 bitvise 的话是不行的,换个终端重新上 ssh 连接吧),然后按下 ctrl + d(detach 命令)。你会发现你关闭了你的虚拟窗口。
4. 直接关掉窗口。
要确认所有窗口,可以使用 screen -ls。想要重新回到一个窗口,使用 screen -r <窗口编号>。screen -ls 的每一行第一个数字就是这个窗口的编号。