Web Api 基于Zookeeper的服务注册与发现 - 释迦苦僧
source link: http://www.cnblogs.com/woxpp/p/8084676.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
Web Api 基于Zookeeper的服务注册与发现
安装与差异
Zookeeper安装请参考我上篇文章 http://www.cnblogs.com/woxpp/p/7700368.html
基于Nginx的服务提供和消费
基于zookeeper的服务注册和发现
zk的负载均衡是可以调控,nginx只是能调权重,其他需要可控的都需要自己写插件;但是nginx的吞吐量比zk大很多,可以根据业务选择用哪种方式。
服务端注册
1.创建WEB API 程序,使用NuGet下载ZookeeperNet安装包
2.WEB API 我只提供了一个测试方法
public class DataIndexController : ApiController { [HttpGet] public List<string> GetList() { List<string> result = new List<string>(); result.Add("111"); result.Add("222"); return result; } }
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(0, 0, 0, CONST_TIMEOUT), new Watcher());
创建Zookeeper临时节点和永久节点
if (index == lt.Count - 1) { ///叶节点设置临时节点 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); } } }
监听分 数据变化和节点变化
4.将web api部署三套
5.利用ZooInspector工具查看Zookeeper节点信息
此时服务地址已经注册上去了
如果我们将IIS应用程序池停止或者网站停止,响应的临时节点也会删掉
具体数据一致性可以参考
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 > 0) { Random random = new Random(); int index = random.Next(0, childData.Count); result = childData[index]; } } } catch (Exception e) { throw e; } return result; }
本文来自 释迦苦僧 http://www.cnblogs.com/woxpp/p/8084676.html
如有问题欢迎指正,求推荐
Recommend
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK