前言
在微服务架构中,服务发现一直是一件比较复杂的事。而且服务发现式的架构处理不好,容易产生集中化。同时,微服务的提供,不可避免的需要一些负载均衡方案,实现服务的高可用和可扩展,这无疑增加了很多复杂度。
笔者认为,使用异步、基于消息的方式,可能更适合微服务架构。
基于消息的微服务架构,对于所有微服务的部署条件非常简单,只需要能访问到消息服务即可。同时微服务节点的移除和增加不会影响到服务的提供。相比服务发现的架构,简单太多了,简单即是美。
在这次实践中,使用到了seneca,一个nodejs 微服务框架。seneca,使用seneca-amqp-transport插件,可以轻松构建基于消息的微服务。
下面是架构图:
这是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!!
网友评论