Web Api 基於Zookeeper的服務註冊與發現

lu_s發表於2018-11-18

差異

基於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("111");
            result.Add("222");
            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(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);
            }
        }
    }
複製程式碼

監聽分 資料變化和節點變化

Web Api 基於Zookeeper的服務註冊與發現

4.將web api部署三套

Web Api 基於Zookeeper的服務註冊與發現

5.利用ZooInspector工具檢視Zookeeper節點資訊

Web Api 基於Zookeeper的服務註冊與發現

此時服務地址已經註冊上去了

如果我們將IIS應用程式池停止或者網站停止,響應的臨時節點也會刪掉

Web Api 基於Zookeeper的服務註冊與發現

具體資料一致性可以參考www.cnblogs.com/leesf456/p/…

客戶端服務發現

  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" />
複製程式碼

加群895244712,免費獲取架構師進階學習資料

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;
      }
複製程式碼
Web Api 基於Zookeeper的服務註冊與發現


相關文章