资讯专栏INFORMATION COLUMN

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

Jiavan / 874人阅读

摘要:差异基于的服务提供和消费基于的服务注册和发现的负载均衡是可以调控,只是能调权重,其他需要可控的都需要自己写插件但是的吞吐量比大很多,可以根据业务选择用哪种方式。

差异

基于Nginx的服务提供和消费

 
 

基于zookeeper的服务注册和发现

  

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

服务端注册

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

    

    

 

2.WEB API 我只提供了一个测试方法

public class DataIndexController : ApiController
    {
        [HttpGet]
        public List GetList()
        {
            List result = new List();
            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();
        }
        /// 
        /// 注册服务节点
        /// 
        private void CreateZkNode()
        {
            ZkHelper zk = new ZkHelper();
 
            string node = AppSettingsHelper.GetStringValue("ServiceNode");
            ///创建节点
            zk.CreateNode(node, "data");
        }
    }

    

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应用程序池停止或者网站停止,响应的临时节点也会删掉

具体数据一致性可以参考https://www.cnblogs.com/leesf...

客户端服务发现
  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();
        }
 
    

加群895244712,免费获取架构师进阶学习资料

ZkHelper核心代码

public string GetNode(string path)
      {
          string result = string.Empty;
          try
          {
              var stat = zk.Exists(path, true);
              if (stat != null)
              {
                  //取得/root节点下的子节点名称,返回List 
                  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;
      }

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/72251.html

相关文章

  • PowerDotNet平台化软件架构设计实现系列(04):服务治理平台

    摘要:的服务治理平台发源于早期的个人项目。客户端发现模式要求客户端负责查询注册中心,获取服务提供者的列表信息,使用负载均衡算法选择一个合适的服务提供者,发起接口调用请求。系统和系统之间,少不了数据的互联互通。随着微服务的流行,一个系统内的不同应用进行互联互通也是常态。 PowerDotNet的服务治理平台发源于早期的个人项目Power.Apix。这个项目借鉴了工作过的公司的服务治理方案,站在...

    reclay 评论0 收藏0
  • 2021 年最新基于 Spring Cloud 服务架构分析

    摘要:是一个相对比较新的微服务框架,年才推出的版本虽然时间最短但是相比等框架提供的全套的分布式系统解决方案。提供线程池不同的服务走不同的线程池,实现了不同服务调用的隔离,避免了服务器雪崩的问题。通过互相注册的方式来进行消息同步和保证高可用。 Spring Cloud 是一个相对比较新的微服务框架,...

    cikenerd 评论0 收藏0
  • Dubbo Cloud Native 之路实践思考

    摘要:可简单地认为它是的扩展,负载均衡自然成为不可或缺的特性。是基于开发的服务代理组件,在使用场景中,它与和整合,打造具备服务动态更新和负载均衡能力的服务网关。类似的特性在项目也有体现,它是另一种高性能代理的方案,提供服务发现健康和负载均衡。 摘要: Cloud Native 应用架构随着云技术的发展受到业界特别重视和关注,尤其是 CNCF(Cloud Native Computing Fo...

    niceforbear 评论0 收藏0
  • 从容器到容器编排

    摘要:从容器到容器编排平台以及周边生态系统包含很多工具来管理容器的生命周期。终止运行中的容器。发现在由运行于多个主机上的容器组成的分布式部署容器发现至关重要。类似的,当容器崩溃时,编排工具可以启动替换。 从容器到容器编排 Docker平台以及周边生态系统包含很多工具来管理容器的生命周期。例如,Docker Command Line Interface(CLI)支持下面的容器活动: 从注册表...

    Hydrogen 评论0 收藏0
  • Dubbo Cloud Native 实践思考

    摘要:可简单地认为它是的扩展,负载均衡自然成为不可或缺的特性。类似的特性在项目也有体现,它是另一种高性能代理的方案,提供服务发现健康和负载均衡。 Dubbo Cloud Native 实践与思考 分享简介 Cloud Native 应用架构随着云技术的发展受到业界特别重视和关注,尤其是 CNCF(Cloud Native Computing Foundation)项目蓬勃发展之际。Dubbo...

    邱勇 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<