Nodejs 实现服务发现 - zookeeper

  • 2019-05-27 06:46:33
  • 370
  • 0



安装Express 


npm install express -save



编写一个简单ajax请求,请求发送到服务网关,在 请求头 header 里面传递一个Service-Name


新建public 文件夹,把jquery.js放进去。


index.html


<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
 <HEAD>
  <TITLE> Node js 服务发现测试文件</TITLE>
  <META NAME="Generator" CONTENT="EditPlus">
  <META NAME="Author" CONTENT="">
  <META NAME="Keywords" CONTENT="">
  <META NAME="Description" CONTENT="">
<script src="./jquery-1.11.3.min.js"></script>
 </HEAD>
 <BODY>
<div id="main"></div>
<script>
$(function(){
    alert(12);
 $.ajax({
    method:'GET',
    url:'/nodehello',
    headers:{
    'Service-Name':'nodehelloService'
    },
    success:function(data){
    $('#main').text(data);
    }
 });
});
</script>
 </BODY>
</HTML>


nodaapp.js 


var express = require('express');
var PORT = 1234;
var app = express();
app.use(express.static('public'));
app.all('*',function(req,res){
//过滤图标请求
if(req.path == '/favicon.ico'){
res.end();
return;
}
//获取请求的服务名称
var serviceName = req.get('Service-Name');
console.log('ServiceName:%s',serviceName);
if(!serviceName){
console.log('未包含请求头信息 ServiceName');
res.end();
return;
}
});
app.listen(PORT,function(){
console.log('服务启动成功,端口号是:%d',PORT);
});


启动:

node nodaapp.js


浏览器访问:

http://localhost:1234




如图,成功的获取到serviceName ,接下来编写zookeeper 连接代码。


安装node-zookeeper-client:


npm install node-zookeeper-client -save


安装http-proxy 反向代理

npm install http-proxy -save

连接zookeeper :nodeAppZook.js

var express = require('express');
var zookeeper = require('node-zookeeper-client');
var PORT = 1234;
//zookeeper 服务器地址
var CONNECTION_STRING = "127.0.0.1:2181";
//跟路径
var REGISTER_ROOT = "/registryRoot";
//连接zookeeper
var zk = zookeeper.createClient('CONNECTION_STRING');
zk.connect();

//创建代理服务器对象
var proxy = httpProxy.createProxyServer();
proxy.on('error',function(err,req,res){
   res.end();
})

//启动web服务器
var app = express();
app.use(express.static('public'));
app.all('*',function(req,res){
//过滤图标请求
if(req.path == '/favicon.ico'){
    res.end();
    return;
}
//获取请求的服务名称
var serviceName = req.get('Service-Name');
console.log('ServiceName:%s',serviceName);
if(!serviceName){
    console.log('未包含请求头信息 ServiceName');
    res.end();
    return;
}
//获取服务路径
var servicePath = REGISTER_ROOT  "/"   serviceName;
console.log('未包含请求头信息 servicePath:%s',servicePath);
 //获取服务器路径下的地址节点
zk.getChildren(servicePath,function(error,addressNodes){
    if(error){
       console.log(error.stack);
        res.end();
        return;
   }
var size = addressNodes.length;
if(size == 0){
  console.log('节点不存在');
  res.end();
  return;
}

//生成地址路径
var addressPath = servicePath  "/";
if(size == 1){
    //只有一个地址,直接获取
    addressPath  =addressNodes[0];
}else{
    //多个地址随机获取
   addressPath  = addressNodes[parseInt(Math.random()*size)];
}

console.log('addressPath:%s' addressPath);
//获取服务地址
zk.getData(addressPath,function(error,serviceAddress){
    if(error){
        console.log(error.stack);
        res.end();
        return;
    }
  console.log('serviceAddress:%s' serviceAddress);
  if(!serviceAddress){
    console.log('节点不存在');
    res.end();
    return;
  }
  
   //执行反向代理
   proxy.web(req,res,{
	target:'http://' serviceAddress 
   });
  
});
  })
});

app.listen(PORT,function(){
console.log('服务启动成功,端口号是:%d',PORT);

});


运行:

node nodeAppZook.js


浏览器访问:

http://localhost:1234






回复
举报
全部回复(0)

参与讨论