Web Api 基于Zookeeper的服务注册与发现
2018-06-22 06:18:04来源:未知 阅读 ()
安装与差异
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
如有问题欢迎指正,求推荐
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
- Asp.net MVC SignalR来做实时Web聊天实例代码 2020-03-29
- Asp.Net中WebForm的生命周期 2020-03-29
- ASP.NET使用WebService实现天气预报功能 2020-01-20
- 浅谈ASP.Net Core WebApi几种版本控制对比 2019-12-10
- 详解Visual之Web Essentials的使用方法 2019-11-27
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash