98

Web Api 基于Zookeeper的服务注册与发现 - 释迦苦僧

 6 years ago
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.
neoserver,ios ssh client

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

安装与差异

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

  基于Nginx的服务提供和消费

  

333725-20171222091324021-1385185167.jpg

  基于zookeeper的服务注册和发现

  

333725-20171222091451506-618075652.jpg

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

服务端注册

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

    

333725-20171222092007771-53217561.png

    

333725-20171222100815912-1977697268.png

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;
        }
    }
333725-20171222093720365-1452698445.png

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);
            }
        }
    }

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

333725-20171222094421131-2000814937.png

4.将web api部署三套

333725-20171222094512662-1805053427.png

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

333725-20171222094623303-1024064467.png

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

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

333725-20171222094755803-1928532597.png

具体数据一致性可以参考

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;
        }
333725-20171222095754381-1465802534.png

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

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


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK