众所周知,easyswoole作为常驻内存的框架,修改代码并不能直接生效,而是需要重启服务,那么,当你的easyswoole项目上线之后,该如何保证旧请求的同时去更新代码呢?

nginx reload和restart

首先,我们需要了解到nginx reload和restart的区别.

reload

nginx 执行reload命令后,将会重新加载一次配置文件,并且给其他worker进程发送信号,进程收到信号之后,将不再接收新请求,当旧请求执行完毕后,将会自动销毁.

同时,如果reload加载的配置文件出错,nginx将会自动回滚到正常时候的配置,并不会造成服务中断.

restart

restart= stop+start,当nginx执行restart命令后,将会先中断服务,不再接收请求.

同时,当配置文件出错时,restart将会无法正常start,服务将一直中断.

更新线上easyswoole代码.

easyswoole reload

easyswoole本身自带reload代码,可实现关于worker进程的重启,但由于easyswoole的task进程是通过自定义进程实现,无法实现重启.

所以理论上,我们依然需要直接stop+start

那么,如何才能使得stop+start依然不中断服务呢?

反向代理

在上一篇文章中,我们了解到了nginx反向代理,负载均衡的实现.nginx实现负载均衡,同时,easyswoole 服务,理应跟nginx反向代理配合使用:

首先,我们创建一个测试的easyswole服务,并且在index控制器中写入以下测试方法:

1
2
3
4
5
6
7
8
9
10
11
public function index()
{
    $this->response()->write('<h1>test 1</h1>');
    go(function(){
        //假设每次请求进来,都将投递一个异步任务
        TaskManager::getInstance()->async(function (){
            echo 1;
            \co::sleep(1); 
        });
    });
}

启动服务后,通过nginx 反向代理.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
upstream test.cn {
     server 127.0.0.1:9501;
}
  
server {
    root /data/wwwroot/;
    server_name local.swoole.com;
    location / {
        proxy_http_version 1.1;
        proxy_set_header Connection "keep-alive";
        proxy_set_header X-Real-IP $remote_addr;
        if (!-f $request_filename) {
             proxy_pass http://test.cn;
        }
    }
}

在这个时候,我们已经启动了一个正在运行的服务:

新增测试脚本,测试请求

为了便于测试,我们新增一个测试脚本:

1
2
3
4
5
6
7
8
9
10
11
12
<?php
/**
 * Created by PhpStorm.
 * User: 10671
 * Date: 2020/5/25 0025
 * Time: 21:33
 */
while(1){
   $test =  file_get_contents("http://1.cn");
   var_dump($test);
   usleep(100000);
}

此脚本将会一直请求1.cn,并且打印数据.

更新代码

那么,假设现在我们需要更新代码,该怎么使得线上生效呢?首先,我们重新创建一个文件夹.

1
cp -r 1.cn/ 2.cn/

修改 dev.php端口改为 9502:

假设修改代码为test2:

1
2
3
4
5
6
7
8
9
10
11
public function index()
{
    $this->response()->write('<h1>test 2</h1>');
    go(function(){
        //假设每次请求进来,都将投递一个异步任务
        TaskManager::getInstance()->async(function (){
            echo 1;
            \co::sleep(1);
        });
    });
}

启动该服务.并测试是否启动成功.

1
2
[root@localhost 2.cn]# curl http://127.0.0.1:9502
<h1>test 2</h1>[root@localhost 2.cn]#

此时,服务器运行了2个服务:  9501为旧版本服务,9502为新版本服务

注意,此例子为测试例子,在实际中,请使用git等版本控制工具更新代码.

此时9501正在一直接收请求,并且不断的在投递异步任务:

1
2
3
4
5
6
7
8
9
10
11
12
[root@localhost 1.cn]# php easyswoole task status
┌─────────┬─────────┬──────┬───────┬─────────────┐
│ running │ success │ fail │  pid  │ workerIndex │
├─────────┼─────────┼──────┼───────┼─────────────┤
│ 20      │ 71      │ 0    │ 36212 │ 0           │
├─────────┼─────────┼──────┼───────┼─────────────┤
│ 20      │ 70      │ 0    │ 36213 │ 1           │
├─────────┼─────────┼──────┼───────┼─────────────┤
│ 20      │ 70      │ 0    │ 36214 │ 2           │
├─────────┼─────────┼──────┼───────┼─────────────┤
│ 20      │ 70      │ 0    │ 36215 │ 3           │
└─────────┴─────────┴──────┴───────┴─────────────┘

修改nginx代理,并reload 重载配置

此时,我们修改nginx的配置,改为代理9502:

1
2
3
upstream test.cn {
     server 127.0.0.1:9502;
}

同时热重启nginx:

查看task任务状态

此时,nginx的新请求已经进入新服务.9501服务此时并没有中断,用于处理还未完成的task异步任务:

直到处理完成,才可关闭9501服务.

此时,线上版本已经更新成功,服务并没有中断.

easyswoole实现线上更新代码的更多相关文章

  1. 分享下使用 svn,测试服务器代码自动更新、线上服务器代码手动更新的配置经验

    分享下使用 svn,测试服务器代码自动更新.线上服务器代码手动更新的配置经验 利用SVN的POST-COMMIT钩子自动部署代码 Linux SVN 命令详解 Linux SVN 命令详解2 使用sv ...

  2. 使用git克隆项目、从dev分支上更新代码以及将代码提交到Coding(或GitHub)上面

    本教程的目的: 这是个crm项目中,有两个分支一个是master 和 dev ,master主分支,不允许提交代码,我要拉去dev分支上最新的代码,并将修改后的项目,在推送到dev分支上. 一. 1. ...

  3. 如何使用Fiddler调试线上JS代码

    大家平时肯定都用过火狐的Firebug或者谷歌的调试工具来调试JS,但遗憾的是我们不能像编辑html,css那样来直接新增或者删除JS代码. 虽然可以通过调试工具的控制台来动态执行JS代码,但有时候却 ...

  4. IDEA 在SVN上更新代码错误: Error:Server SSL certificate rejected

    在IDEA中更新代码到SVN中 ,出现了   Error:Server SSL certificate rejected    ---服务器的SSL证书  的错误 之前在网上有找过一些相关的做法,但是 ...

  5. Django线上部署代码修改失效问题

    记一次django项目的线上部署维护问题,django+nginx 关于nginx反向代理服务器的介绍这里有一篇博客介绍的比较好:nginx的相关介绍 以及当一次客户端请求发出后,uwsig以及uWS ...

  6. 使用Fiddler调试线上JS代码

    在下面的命令框输入“select script”回车来筛选js请求 将HTTP请求重定向到本地的文件,进行web调试.这种调试方式不需要发布到线上再验证,避免了修改不成功.对用户造成影响的风险 左边一 ...

  7. Mac php7本地安装mongodb扩展以适配使用mongo扩展的线上老代码

    从https://pecl.php.net/package/mongodb官网下载压缩包(不懂事的我下载了1.5.1版本) 解压安装包 tar -zxvf mongodb-1.5.1.tgz 进入解压 ...

  8. 在Linux上git pull线上仓库代码时,出现error: Your local changes to the following files would be overwritten by merge

    在Windows上工作时未出现过该问题,于是通过命令: git diff 查看差异,得到结果: diff --git a/start_crons.sh b/start_crons.sh old mod ...

  9. 不停机替换线上代码? 你没听错,Arthas它能做到

    写在前边 有没有这样一种感受,自己写的代码在开发.测试环境跑的稳得一笔,可一到线上就抽风,不是缺这个就是少那个反正就是一顿报错,线上调试代码又很麻烦,让人头疼得很.阿里巴巴出了一款名叫Arthas的工 ...

随机推荐

  1. 第六章 XaaS和IT服务标准

    从云计算(Cloud Computing)谈起 云计算是一种按使用量付费的模式,这种模式提供可用的.便捷的.按需的网络访问,进入可配置的计算资源共享池(资源包括网络,服务器,存储,应用软件,服务),这 ...

  2. USB NCM介绍

    ​1 功能概述 USB NCM,属于USB-IF定义的CDC(Communication Device Class)下的一个子类:Network Control Model,用于Host和Device ...

  3. 【Azure 事件中心】azure-spring-cloud-stream-binder-eventhubs客户端组件问题, 实践消息非顺序可达

    问题描述 查阅了Azure的官方文档( 将事件发送到特定分区: https://docs.azure.cn/zh-cn/event-hubs/event-hubs-availability-and-c ...

  4. win7 32位系统 安装node.js最新版本遇到的问题

    win7   32位是安装不了10.0以上版本的node.js的 ,因为10.0以上版本的node.js已经不对win7 32位的电脑进行维护更新了,如果你的电脑是win7 32位系统的话,只能下载安 ...

  5. python报错“AttributeError: 'set' object has no attribute 'items'“

    作为才开始学爬虫的萌新,遇到了一个这样的错,很懵逼 后面到网络到处查看大佬的解决方法,才发现headers的请求头部信息有错误,headers是一个字典,不是字符串,所以报错了 原代码 headers ...

  6. opentack - 本地化

    目录 1 Openstack minimal component 1 组件与功能 2 集群数据存储 2 neutron控制端和计算节点 2.1 SDN网络实现方式 2.2 安全组实现 2.3 虚拟机内 ...

  7. Go语言流程控制02--选择结构之switch

    package main import "fmt" /* @星座诊所2(switch) 根据用户输入的出生月份猜测其星座: ·白羊(4) 金牛(5) 双子(6) 巨蟹(7) 狮子( ...

  8. 大规模数据处理Apache Spark开发

    大规模数据处理Apache Spark开发 Spark是用于大规模数据处理的统一分析引擎.它提供了Scala.Java.Python和R的高级api,以及一个支持用于数据分析的通用计算图的优化引擎.它 ...

  9. CEVA引入新的可配置传感器集线器DSP架构

    CEVA引入新的可配置传感器集线器DSP架构 CEVA introduces new configurable sensor hub DSP architecture 在一个将多个传感器设计成几乎所有 ...

  10. Java面试必知必会:基础

    面试考察的知识点多而杂,要完全掌握需要花费大量的时间和精力.但是面试中经常被问到的知识点却没有多少,你完全可以用 20% 的时间去掌握 80% 常问的知识点. 一.基础 包括: 杂七杂八 面向对象 数 ...