zoukankan      html  css  js  c++  java
  • 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

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

  • 相关阅读:
    android webview内存泄露解决方法
    使用adb安装遇到的一些坑
    androidstudio在创建new project时,窗口太大,看不到下面确定按钮的解决方法
    android切换前后台状态监听
    android设置系统横屏方案
    android判断adb调试是否打开及代码跳转到开发者选项界面
    xml布局解析报错的可能原因
    Android:防止过快点击造成多次事件 问题
    android Information:Gradle tasks [:dl_version:generateDebugSources, :dl_version:generateDebugAndroidTestSources导致无法实现Preview功能
    Android定位服务关闭和定位(悬浮)等权限拒绝的判断
  • 原文地址:https://www.cnblogs.com/woxpp/p/8084676.html
Copyright © 2011-2022 走看看