Web Api 基于Zookeeper的服务注册与发现

时间:2022-03-06 15:09:57

安装与差异

  Zookeeper安装请参考我上篇文章 http://www.cnblogs.com/woxpp/p/7700368.html

  基于Nginx的服务提供和消费

  Web Api 基于Zookeeper的服务注册与发现

  基于zookeeper的服务注册和发现

  Web Api 基于Zookeeper的服务注册与发现

zk的负载均衡是可以调控,nginx只是能调权重,其他需要可控的都需要自己写插件;但是nginx的吞吐量比zk大很多,可以根据业务选择用哪种方式。

服务端注册

1.创建WEB API 程序,使用NuGet下载ZookeeperNet安装包

    Web Api 基于Zookeeper的服务注册与发现

    Web Api 基于Zookeeper的服务注册与发现

2.WEB API 我只提供了一个测试方法

    public class DataIndexController : ApiController
{
[HttpGet]
public List<string> GetList()
{
List<string> result = new List<string>();
result.Add("");
result.Add("");
return result;
}
}

Web Api 基于Zookeeper的服务注册与发现

3.WEB API Global文件中注册服务地址到Zookeeper

  public class WebApiApplication : System.Web.HttpApplication
{ protected void Application_Start()
{
GlobalConfiguration.Configure(WebApiConfig.Register);
GlobalConfiguration.Configuration.Formatters.XmlFormatter.SupportedMediaTypes.Clear();
CreateZkNode();
}
/// <summary>
/// 注册服务节点
/// </summary>
private void CreateZkNode()
{
ZkHelper zk = new ZkHelper(); string node = AppSettingsHelper.GetStringValue("ServiceNode");
///创建节点
zk.CreateNode(node, "data");
}
}
<add key="ServiceNode" value="/mysteel/dataindex/localhost:8550" />
<add key="ZkConnect" value="192.168.20.90:4181" />

ZkHelper核心代码如下

连接ZooKeeper并创建监听

zk = new ZooKeeper(ZkConnectString, new TimeSpan(, , , CONST_TIMEOUT), new Watcher());

创建Zookeeper临时节点和永久节点

 if (index == lt.Count - )
{
///叶节点设置临时节点
zk.Create(path, "".GetBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.Ephemeral);
}
else
{
///父节点设置永久节点
zk.Create(path, "".GetBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.Persistent);
}

创建Zookeeper监听类

   public class Watcher : IWatcher
{
public void Process(WatchedEvent @event)
{
if (@event.Type == EventType.NodeDataChanged)
{
Console.WriteLine(@event.Path);
}
if (@event.Type == EventType.NodeChildrenChanged)
{
Console.WriteLine(@event.Path);
}
}
}

监听分 数据变化和节点变化

Web Api 基于Zookeeper的服务注册与发现

4.将web api部署三套

Web Api 基于Zookeeper的服务注册与发现

5.利用ZooInspector工具查看Zookeeper节点信息

Web Api 基于Zookeeper的服务注册与发现

此时服务地址已经注册上去了

如果我们将IIS应用程序池停止或者网站停止,响应的临时节点也会删掉

Web Api 基于Zookeeper的服务注册与发现

具体数据一致性可以参考

Zookeeper与Paxos:https://www.cnblogs.com/leesf456/p/6012777.html

客户端服务发现

  static void Main(string[] args)
{
string result = string.Empty;
string strService = ZKService.Instanc.GetNode(ZKService.zkNode);
if (!string.IsNullOrEmpty(strService))
{
result = WebHelper.Get(string.Format("http://{0}//api/dataindex/getlist", strService));
}
System.Console.WriteLine(result);
System.Console.Read();
}
 <add key="zkNode" value="/mysteel/dataindex" />
<add key="ZkConnect" value="192.168.20.90:4181" />

ZkHelper核心代码

   public string GetNode(string path)
{
string result = string.Empty;
try
{
var stat = zk.Exists(path, true);
if (stat != null)
{
//取得/root节点下的子节点名称,返回List<String>
var childData = zk.GetChildren(path, true).OrderBy(l => l).ToList(); if (childData.Count > )
{
Random random = new Random();
int index = random.Next(, childData.Count);
result = childData[index];
}
}
}
catch (Exception e)
{
throw e;
} return result;
}

Web Api 基于Zookeeper的服务注册与发现

本文来自  释迦苦僧 http://www.cnblogs.com/woxpp/p/8084676.html

如有问题欢迎指正,求推荐