微服务-网关-node.js by 大雄daysn
目录 序言 一、node.js入门
1.1 下载并安装
1.2 从helloworld到一个web应用
1.3 Express框架
二、node.js搭建网关
三、node.js集群搭建
序言
首先一个问题。我们用网关做什么?
假如说,微服务部署在不同的ip不同的端口,前端调用的时候就必须知道后端的部署位置,那么能不能说我们前端不知道后端的细节,统一去调用服务?所以这就是我们需要的api网关。
而且事实上,服务网关的路由这个过程我们叫反向代理,说白了就是请求不会直接到目的地有个家伙过来转发,一般这家伙是nginx或者node
其次,反向代理有nginx等,我这里用node.js,为什么我这里用node.js?因为node.js性能不亚于nginx,扩展性远远高于nginx,我们可以动态地制定被代理的目标地址,但是nginx配置的目标地址是静态的,而这个对于服务的发现很重要!
一、node.js入门
1.1 下载并安装
https://nodejs.org/en/download/
下个windows64位的一般就ok了。然后无脑安装。
用node --version 可以看到版本就安装正确了,注意哦,是 --version,有两个“-”号不是-version
如果没有出现的话把安装路径放到环境变量Path后面就可以了。
1.2 从helloworld到一个web应用
a.helloworld
新建一个helloworld.js然后敲代码。

node命令一跑完事,和java py什么的差不多。

node还有交互式的解释器REPL,有点像在linux敲python命令(退出用两次ctrl+c)
输入node进入解释器REPL,打我们刚才的代码

啊列怎么出了个undefined。。不过是正常的耶,继续。待会再问度娘。
b.node.js的web应用
我们改一下刚刚的应用
//console.log("hello world")
//node.js内置的require函数引入http模块
var http = require('http');
var port = ;
//创建app对象,毁掉函数包含req请求参数以及res响应参数
var app = http.createServer(function (req,res){
res.writeHead(,{'Content-Type':'text/html'});
res.write("<p>Hello</p>");
//必须用end函数才能结束http请求与响应的过程
res.end();
});
//用于启动
app.listen(port,function(){
console.log("应用已运行于"+port+"端口")}
)

在使用vue开发的时候,npm run start,一改代码马上就生效,node为了保证高性能,启动服务时候把代码加入到了内存。影响到开发阶段的效率但提高了运行阶段的效率。为了在修改源文件的时候node.js自动加载,我们使用Supervisor。顺带一提,node.js安装的时候npm顺便安装了/
npm install supervisor -g
以后用supervisor xx.js命令启动就可以随时更新源代码调试了。上面-g参数为全局安装,表示可以通过命令行运行该程序。现在我们跑一跑这个程序。改一下代码刷新页面很快就会变化。

现在我们处理一下请求。,建多一个index.html;

修改一下刚刚的程序
//console.log("hello world")
//node.js内置的require函数引入http模块
var http = require('http');
//引入内置的fs模块,这样才能读取文件
var fs = require('fs')
var _dirname = "index.html"
var port = ;
//创建app对象
var app = http.createServer(function (req,res){
var path = _dirname + req.url;
fs.readFile(path,function(err,data){
if(err){
console.log('error')
res.end();
return;
}
res.write(data.toString());
res.end();
});
});
app.listen(port,function(){
console.log("应用已运行于"+port+"端口")}
)
访问一下就有了。

C.Express框架的应用
上面那个程序的话还不能很好处理图片啊css啊js这些静态资源,用Express这个框架搞一搞。
首先下载
npm install express
代码
//require函数加载express对象
var express = require('express');
var PORT = ;
//创建app对象
var app = express();
//app对象的use函数加载static中间件,处理所有静态资源,"."表示当前路径
app.use(express.static('.'));
//express对象的启动也是listen函数
app.listen(PORT,function(){
console.log('server is runnning at',PORT)
})
一访问就有

而express对错误处理也比较好。

接下来我们使用express的路由功能,在代码末尾加上这段,输入/hello就可以访问到hello页面。
app.get('/hello',function(req,res){
res.send('hello......')
})

二、node.js搭建网关
首先我们使用如下命令安装HTTPProxy模块
npm install http-proxy
新建一个proxy.js
var http = require('http');
var httpProxy = require('http-proxy')
var PORT = ;
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:1234'}
);
});
app.listen(PORT, function(){
console.log('server is running at ',PORT)
})
一起启动

测试一下,被代理的明明白白的。

ok,有关微服务网关的部分基本到这里了
微服务-网关-node.js by 大雄daysn的更多相关文章
- 微服务-开发框架之springboot by 大雄daysn
目录 一.关于springboot 二.springboot的实践 2.1发布一个rest的api 2.2端点 2.3健康检查 2.4远程监控 一.关于springboot 由来:spring1.0- ...
- 使用 Node.js 搭建微服务网关
目录 Node.js 是什么 安装 node.js Node.js 入门 Node.js 应用场景 npm 镜像 使用 Node.js 搭建微服务网关 什么是微服务架构 使用 Node.js 实现反向 ...
- 8. 使用Zuul构建微服务网关
使用Zuul构建微服务网关 8.1. 为什么要使用微服务网关 8.2. Zuul简介 8.3. 编写Zuul微服务网关 8.4. Zuul的路由端点 8.5. Zuul ...
- 王院生:Apache APISIX 微服务网关极致性能架构解析
2019 年 10 月 27 日,又拍云联合 Apache APISIX 社区举办 API 网关与高性能服务最佳实践丨Open Talk 杭州站活动,Apache APISIX PPMC 成员王院生做 ...
- 微服务架构学习与思考(10):微服务网关和开源 API 网关01-以 Nginx 为基础的 API 网关详细介绍
微服务架构学习与思考(10):微服务网关和开源 API 网关01-以 Nginx 为基础的 API 网关详细介绍 一.为什么会有 API Gateway 网关 随着微服务架构的流行,很多公司把原有的单 ...
- Bumblebee微服务网关的部署和扩展
Bumblebee是.netcore下开源基于BeetleX.FastHttpApi扩展的HTTP微服务网关组件,它的主要作用是针对WebAPI集群服务作一个集中的转发和管理:作为应用网关它提供了应用 ...
- springcloud使用Zuul构建微服务网关入门
为什么要使用微服务网关 不同的微服务一般会经过不同的网络地址,而外部客户端可能需要调用多个服务的接口才能完成一个业务需求. 如果让客户端直接与各个微服务通信,会有以下的问题: 客户端会多次请求不同的微 ...
- 解决微服务网关Ocelot使用AddStoreOcelotConfigurationInConsul后请求404问题
一个小插曲,最近研究 netcore 微服务网关,在使用AddStoreOcelotConfigurationInConsul将配置存到consul后,任何经过网关的请求都出现404,并且没有任何有用 ...
- springcloud(十)-Zuul微服务网关
为什么要使用微服务网关 前面的文章我们介绍了,Eureka用于服务的注册于发现,Feign支持服务的调用以及均衡负载,Hystrix处理服务的熔断防止故障扩散,Spring Cloud Config服 ...
随机推荐
- 一:window环境,LaTex快速安装(简单易懂)
一. 下载 清华开源软件镜像:点我下载 在线安装很容易失败,所以咱们选择ISO的~ 二. 安装 解压texlive2018.iso文件,并使用管理员权限打开install-tl-windo ...
- XML DOM 节点类型(Node Types)
节点类型 下面的表格列出了不同的 W3C 节点类型,以及它们可拥有的子元素: 节点类型 描述 子元素 Document 表示整个文档(DOM 树的根节点) Element (max. one) Pro ...
- 中文WebFont解决方案Font-Spider(字蛛)
我们在日常需求中,经常会碰到视觉设计师对某个中文字体效果非常坚持的情况,因为页面是否高大上,字体选择是很重要的一个因素,选择合适的字体可以让页面更优雅.面对这种问题,我们通常以下方式来进行设计还原: ...
- 使用 Docker 搭建 Java Web 运行环境(转)
原文 http://www.importnew.com/21798.html Docker 是 2014 年最为火爆的技术之一,几乎所有的程序员都听说过它.Docker 是一种“轻量级”容器技术,它几 ...
- <转>jmeter(十八)关联之XPath Extractor
本博客转载自:http://www.cnblogs.com/imyalost/category/846346.html 个人感觉不错,对jmeter讲解非常详细,担心以后找不到了,所以转发出来,留着慢 ...
- 内置函数_map、filter
1.map #循环帮你调用函数 map(makir,dir_names) #生成器,结果是一个内存地址.为了节省内存,每次循环时,就按照定义的规则去生成一个数据,循环一次释放一次生成的数 ...
- MySQL插入更新_ON DUPLICATE KEY UPDATE
前提:操作的表具有主键或唯一索引 INSERT INTO:表中不存在对应的记录,则插入:若存在对应的记录,则报错: INSERT INTO IGNORE:表中不存在对应的记录,则插入:若存在对应的记录 ...
- RabbitMQ详解(三)------RabbitMQ的五种模式
RabbitMQ详解(三)------RabbitMQ的五种模式 1.简单队列(模式) 上一篇文章末尾的实例给出的代码就是简单模式. 一个生产者对应一个消费者!!! pom.xml 必须导入Rab ...
- Excel 表格查找重复数据,去重复统计
找出表格是否有重复数据: =IF(AND(G20=G19,D20=D19),"是","否") 筛选移除[重复的数据]然后开始统计 =SUBTOTAL(9,E2: ...
- lnmp或者lamp环境一键安装
参考网址:https://lnmp.org/install.html 下载并安装LNMP一键安装包: 您可以选择使用下载版(推荐美国及海外VPS或空间较小用户使用)或者完整版(推荐国内VPS使用,国内 ...