docker+jenkins+seneca构建去集中化微服务架构

作者: luax | 来源:发表于2017-10-10 11:28 被阅读943次

    前言

    在微服务架构中,服务发现一直是一件比较复杂的事。而且服务发现式的架构处理不好,容易产生集中化。同时,微服务的提供,不可避免的需要一些负载均衡方案,实现服务的高可用和可扩展,这无疑增加了很多复杂度。

    笔者认为,使用异步、基于消息的方式,可能更适合微服务架构。

    基于消息的微服务架构,对于所有微服务的部署条件非常简单,只需要能访问到消息服务即可。同时微服务节点的移除和增加不会影响到服务的提供。相比服务发现的架构,简单太多了,简单即是美。

    在这次实践中,使用到了seneca,一个nodejs 微服务框架。seneca,使用seneca-amqp-transport插件,可以轻松构建基于消息的微服务。

    下面是架构图:

    image.png

    这是pipeline的特性,可以可视化看到各个阶段的执行情况,算是不小的进步吧。

    访问私有Registy的API,就可以看到生成的tag。

    curl http://192.168.99.1:5000/v2/seneca-listener/tags/list

    最后一步,试试我们的程序

    在宿主机发布消息:

    $ git clone https://github.com/luaxlou/micro-service-practice.git
    

    seneca-clinet 代码是接口层代码的示意,可以根据自己的喜好封装。
    同时直接发送了命令代码用于测试。

    进入seneca-clinet 目录

    $  AMQP_URL=192.168.99.1:5672 node index.js
    

    这个程序会每隔两秒发送一个命令:

    #!/usr/bin/env node
    'use strict';
    
    const client = require('seneca')()
        .use('seneca-amqp-transport')
        .client({
            type: 'amqp',
            pin: 'cmd:salute',
            url: process.env.AMQP_URL
        });
    
    setInterval(function() {
        client.act('cmd:salute', {
            name: 'World',
            max: 100,
            min: 25
        }, (err, res) => {
            if (err) {
                throw err;
            }
            console.log(res);
    });
    }, 2000);
    

    虽然一直在发命令,你很快就会发现命令全部超时了。这是因为还没有消费者,当然这些命令也没有丢失,只不过接口层没有得到及时返回。如果应用层支持异步的模式,每个command都有独立的id,可以保留id后,以后再过来取。这就很灵活了,一切看需求去封装接口层即可。

    进入node2

    $ docker run 192.168.99.1:5000/seneca-listener:latest
    0|seneca-l | {"kind":"notice","notice":"hello seneca fwunhukrcmzn/1507605332382/16/3.4.2/-","level":"info","seneca":"fwunhukrcmzn/1507605332382/16/3.4.2/-","when":1507605332661}
    

    启动后,回到seneca-clinet,发现之前超时的命令,全部接收到了。

    { id: 86,
      message: 'Hello World!',
      from: { pid: 16, file: 'index.js' },
      now: 1507605332699 }
    { id: 44,
      message: 'Hello World!',
      from: { pid: 16, file: 'index.js' },
      now: 1507605332701 }
    { id: 56,
      message: 'Hello World!',
      from: { pid: 16, file: 'index.js' },
      now: 1507605332703 }
    { id: 57,
      message: 'Hello World!',
      from: { pid: 16, file: 'index.js' },
      now: 1507605332706 }
    { id: 58,
      message: 'Hello World!',
      from: { pid: 16, file: 'index.js' },
      now: 1507605332707 }
    

    至此,完整架构已经构建完毕。

    一些未完的事项

    1.自动集成,只需要配置webhook即可。
    2.自动部署,因为docker运转的方式,当服务升级时需要重启docker进程。方式有很多,比较粗暴的是直接控制宿主机,或者类似salt这样的工具。
    目前来说,没有找到太好的开源方案。个人倾向于自己开发agent,发布有限的API,用于常规的部署或者其他任务,以及可以定时收集服务器的信息,用于监控。这可能会是笔者的下一个开源项目。

    总结

    这篇文章算是一个新的里程碑,实践的成果将用于后期的架构。docker让我从传统的架构模式中脱离出来,同时也让我吃了不少苦头。但这一切都是值得的。

    同时也是一个新的开始,终于从之前的公司出来。未来何去何从,有很多的未知,但我相信都是美好的。

    这也许就是人生的魅力。

    Hello World!!

    相关文章

      网友评论

        本文标题:docker+jenkins+seneca构建去集中化微服务架构

        本文链接:https://www.haomeiwen.com/subject/aaymdxtx.html