服务部署

服务的概念

我们一直说,服务器给用户提供服务,可什么是服务呢?

其实没什么特别的,它就是一个一直在运行、在监听的程序而已,有编程基础的各位早就写过类似的东西了。比如下面这个 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. 把打包好的代码丢到服务器上(用 sshftpgit 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 + ddetach 命令)。你会发现你关闭了你的虚拟窗口。 4. 直接关掉窗口。

要确认所有窗口,可以使用 screen -ls。想要重新回到一个窗口,使用 screen -r <窗口编号>screen -ls 的每一行第一个数字就是这个窗口的编号。