跟着《架构探险》学轻量级微服务架构 (二)

架构探险

回顾 —— 微服务

微服务是一种分布式系统架构,它建议我们将业务划分为更加细粒度的服务,并使每个服务的责任单一且可独立部署,服务内部高内聚,隐含内部细节,服务之间低耦合,彼此相互隔离。此外,我们根据面向服务的业务领域来建模,对外提供统一的 API 接口。微服务的思想不只是停留在开发阶段,它贯穿于设计、开发、测试、部署、运维等软件生命周期阶段。
引用于《架构探险》

写代码

上一篇主要简单搭建了 Spring Boot 框架,写了一个简单的路由/hello,Spring Boot 的其它功能根据后续的学习,再不断完善,接下来我们开始下一个概念:

1. 微服务开发框架 —— Spring Boot 框架
2. 微服务网关 —— Node.js
3. 微服务注册与发现 —— ZooKeeper
4. 微服务封装 —— Docker
5. 微服务部署 —— Jenkins, GitLab

微服务网关 —— Node.js

微服务网关是微服务架构中的核心组件,它是客户端请求的门户,它是调用具体服务端的桥梁。
来自于《架构探险》

简单的说,微服务网关是一个服务器,也可以说是进入系统的唯一入口。这与面向对象设计模式中的 Facade 模式很像。微服务网关封装内部系统的架构,并且提供 API 给各个客户端。它还可能还具备授权、监控、负载均衡、缓存、请求分片和管理、静态响应处理等功能。

《架构探险》一书使用 Node.js 实现服务网关的重要特性之一:反向代理。

安装 Node.js 就不在这里描述了,如果是 Mac 系统,可以直接使用 brew (http://brew.sh/) 命令安装。

1. 安装 npm 国内镜像

npm install cnpm -g --registry=https://registry.npm.taobao.org

2. 安装反向代理插件 Http Proxy 模块:

cnpm install http-proxy --save

3. 编写 app.js:

var http = require('http');

var httpProxy = require('http-proxy');

var PORT = 1234;

var proxy = httpProxy.createProxyServer();
proxy.on('error', function( err, req, res) {
    res.end(); // 输出空白响应数据
});

var app = http.createServer(function (req, res) {
    proxy.web(req, res, {
        target: 'http://localhost:8080'  // 目标地址
    });
});

app.listen(PORT, function() {
    console.log('server is running at %d', PORT);
});

执行 app.js 应用程序:

node app.js

我们修改上一篇写的 Spring Boot 应用,让访问 http://localhost:8080/ 可以直接访回「你好 叶梅树」。

这样我们可以直接访问 http://localhost:1234/ 看看「反向代理」能不能起到作用,反向到: http://localhost:8080/,如下:

这就表明了我们的反向代理起到作用了。

Node.js 集群环境

Node.js 采用了单线程模型,且拥有基于事件驱动的异步非阻塞 I/O 特性,可高效利用 CPU 资源,但并不能说明 Node.js 只能运行在单核 CPU 下。事实上,Node.js 原生已支持集群特性。如下代码所示:

var http = require('http');

var cluster = require('cluster');

var os = require('os');

var PORT = 1234;

var CUPS = os.cpus().length; // 获取 CPU 内核数

if (cluster.isMaster) {
    // 当前进程为主进程
    for (var i = 0; i < CUPS; i++) {
        cluster.fork();
    }
} else {
    // 当前进程为子进程
    var app = http.createServer(function (req, res) {
        res.writeHead(200, {'Content-Type': 'text/html'});
        res.write('<h1>Hello</h1>');
        res.end();
    })

    app.listen(PORT, function () {
        console.log('server is running at %d', PORT);
    })
}

注:通过 OS 模块获取主机的 CPU 内核数,利用 Cluster 模块来判断当前进程是否为主线程或者是子线程,如果是主线程则创建子线程,然后利用子线程来运行相关的程序代码,这里 CPU 内核数越多,创建的子线程越多,支持的并发量也就越高。

Node.js 运行工具比较

1. supervisor。主要用于开发阶段,能够实时监控源文件的变化,自动重新加载,查看运行结果,提供开发效率。

2. forever (https://github.com/foreverjs/forever)。

# 启动
forever start ./bin/www  #最简单的启动方式
forever start -l forever.log ./bin/www  #指定forever日志输出文件,默认路径~/.forever
forever start -l forever.log -a ./bin/www  #需要注意,如果第一次启动带日志输出文件,以后启动都需要加上 -a 参数,forever默认不覆盖原文件
forever start -o out.log -e err.log ./bin/www  #指定node.js应用的控制台输出文件和错误信息输出文件
forever start -w ./bin/www  #监听当前目录下文件改动,如有改动,立刻重启应用,不推荐的做法!如有日志文件,日志文件是频繁更改的

# 重启
forever restart ./bin/www  #重启单个应用
forever restart [pid]  #根据pid重启单个应用
forever restartall  #重启所有应用

# 停止(和重启很类似)
forever stop ./bin/www  #停止单个应用
forever stop [pid]  #根据pid停止单个应用
forever stopall  #停止所有应用

# 查看forever守护的应用列表
forever list

3. pm2 (https://github.com/Unitech/pm2)。

npm install -g pm2  # 安装pm2
# Fork mode
pm2 start app.js --name my-api # Name process

# Cluster mode
pm2 start app.js -i 0        # Will start maximum processes with LB depending on available CPUs
pm2 start app.js -i max      # Same as above, but deprecated.

# Listing

pm2 list               # Display all processes status
pm2 jlist              # Print process list in raw JSON
pm2 prettylist         # Print process list in beautified JSON

pm2 describe 0         # Display all informations about a specific process

pm2 monit              # Monitor all processes

# Logs

pm2 logs [--raw]       # Display all processes logs in streaming
pm2 flush              # Empty all log file
pm2 reloadLogs         # Reload all logs

# Actions

pm2 stop all           # Stop all processes
pm2 restart all        # Restart all processes

pm2 reload all         # Will 0s downtime reload (for NETWORKED apps)

pm2 stop 0             # Stop specific process id
pm2 restart 0          # Restart specific process id

pm2 delete 0           # Will remove process from pm2 list
pm2 delete all         # Will remove all processes from pm2 list

# Misc

pm2 reset <process>    # Reset meta data (restarted time...)
pm2 updatePM2          # Update in memory pm2
pm2 ping               # Ensure pm2 daemon has been launched
pm2 sendSignal SIGUSR2 my-app # Send system signal to script
pm2 start app.js --no-daemon
pm2 start app.js --no-vizion
pm2 start app.js --no-autorestart
feature forever pm2
keep alive
coffeescript
Log aggregation
api
terminal monitoring
clustering
Json configuration

从这表可以看出,pm2 相比较 forever,功能更加强大一些。在现实生产环境下,我们用 pm2更多一些,因为都是工具,更多的就看你用的顺不顺手,然后再根据每个工具的优劣,合理使用。

总结

学习 Node.js 的东西太多太多了,这只是冰山一角。这里主要是利用 Node.js 的「反向代理」来搭建 「微服务网关」,学习「微服务网关」的基本概念。


明天接着学习,coding01 值得您关注

qrcode

也很感谢您能看到这了

qrcode
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,056评论 5 474
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,842评论 2 378
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 148,938评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,296评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,292评论 5 363
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,413评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,824评论 3 393
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,493评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,686评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,502评论 2 318
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,553评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,281评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,820评论 3 305
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,873评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,109评论 1 258
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,699评论 2 348
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,257评论 2 341

推荐阅读更多精彩内容

  • 一、微服务将变得轻量级 架构需要由人去设计,这些人被称为架构师。或许很多人并未授予架构师的头衔,但自己却从事着架构...
    justmilkrain阅读 5,410评论 10 109
  • 本文是GitChat《Serverless 风格微服务的持续交付(上):架构案例》部分内容已做修改。文章聊天实录请...
    顾宇阅读 3,185评论 1 13
  • 如果喜欢一个人,但是他各方面都达不到自己的要求该怎么办呢?是就这样放弃呢,还是降低自己的要求呢?总会觉得不甘心吧,难过
    大Q_cheung阅读 151评论 0 0
  • 那是大陆时间25点76分81秒,管理员发来了讯息:0100010010001…… 我表示说虽然我是一个游戏的程序,...
    闲男阅读 363评论 0 0
  • 1,冰心说:所谓写作,就是读好书,看好报,然后把自己的感受写出来。我想我们其实要写的地方太多了,何止是书籍啊! 写...
    我是哼哼哈嘿阅读 209评论 0 0