安裝與差異 Zookeeper安裝請參考我上篇文章 http://www.cnblogs.com/woxpp/p/7700368.html 基於Nginx的服務提供和消費 基於zookeeper的服務註冊和發現 zk的負載均衡是可以調控,nginx只是能調權重,其他需要可控的都需要自己寫插件;但是n ...
安裝與差異
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
如有問題歡迎指正,求推薦