安装与差异

  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("");
result.Add("");
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(, , , CONST_TIMEOUT), new Watcher());

创建Zookeeper临时节点和永久节点

 if (index == lt.Count - )
{
///叶节点设置临时节点
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 > )
{
Random random = new Random();
int index = random.Next(, childData.Count);
result = childData[index];
}
}
}
catch (Exception e)
{
throw e;
} return result;
}

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

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

Web Api 基于Zookeeper的服务注册与发现的更多相关文章

  1. 【转帖】基于Zookeeper的服务注册与发现

    http://www.techweb.com.cn/network/hardware/2015-12-25/2246973.shtml 背景 大多数系统都是从一个单一系统开始起步的,随着公司业务的快速 ...

  2. 基于ZooKeeper的服务注册中心

    本文介绍基于ZooKeeper的Dubbo服务注册中心的原理. 1.ZooKeeper中的节点 ZooKeeper是一个树形结构的目录服务,支持变更推送,因此非常适合作为Dubbo服务的注册中心. 注 ...

  3. 一个故事,一段代码告诉你如何使用不同语言(Golang&C#)提供相同的能力基于Consul做服务注册与发现

    目录 引言 什么是微服务 传统服务 微服务 什么是服务注册与服务发现 为什么要使用不同的语言提供相同的服务能力 服务协调器 服务注册 Golang C#(.NetCore3.1) 服务发现 通过Htt ...

  4. 简单RPC框架-基于Consul的服务注册与发现

    *:first-child { margin-top: 0 !important; } body>*:last-child { margin-bottom: 0 !important; } /* ...

  5. SpringCloud用Zookeeper做服务注册与发现中心代码实现

    一:Zookeeper用的是3.5.5版本,SpringBoot用的是2.1.6版本,SpringCloud用的是Greenwich.SR2版本,JDK用的是1.8: 服务提供者product-ser ...

  6. 基于ZooKeeper实现简单的服务注册于发现

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明.本文链接:https://blog.csdn.net/Shaun_luotao/article/ ...

  7. Zookeeper服务注册与发现原理浅析

    了解Zookeeper的我们都知道,Zookeeper是一种分布式协调服务,在分布式应用中,主要用来实现分布式服务的注册与发现以及分布式锁,本文我们简单介绍一下Zookeeper是如何实现服务的注册与 ...

  8. 微服务框架SpringCloud(Dalston版)学习 (一):Eureka服务注册与发现

    eureka-server eureka服务端,提供服务的注册与发现,类似于zookeeper 新建spring-boot工程,pom依赖: <dependency> <groupI ...

  9. SpringCloud微服务(01):Eureka组件,管理服务注册与发现

    本文源码:GitHub·点这里 || GitEE·点这里 一.Eureka基本架构 1.Eureka简介 Eureka是Netflix开发的服务发现框架,本身是一个基于REST的服务,SpringCl ...

随机推荐

  1. Android 开发笔记___textvieww__跑马灯效果

    <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android=&quo ...

  2. 大家好,我是ZCDHJ

    大家好,我是ZCDHJ.CJ C2017级的一名Oier.

  3. js数组元素的添加和删除

    简单测试例子: var arr = new Array(); arr[0] = "aaa"; arr[1] = "bbb"; arr[2] = "cc ...

  4. 浅谈postgresql的GIN索引(通用倒排索引)

    1.倒排索引原理 倒排索引来源于搜索引擎的技术,可以说是搜索引擎的基石.正是有了倒排索引技术,搜索引擎才能有效率的进行数据库查找.删除等操作.在详细说明倒排索引之前,我们说一下与之相关的正排索引并与之 ...

  5. 【机器学习实战】第14章 利用SVD简化数据

    第14章 利用SVD简化数据 SVD 概述 奇异值分解(SVD, Singular Value Decomposition): 提取信息的一种方法,可以把 SVD 看成是从噪声数据中抽取相关特征.从生 ...

  6. sql 1.1 1.1.1 1.10.1 排序

    解决思路:计算每位的权重,得到序号完整的权重值,使用权重值进行排序! 创建sql 函数如下: ALTER FUNCTION [dbo].[SequenceToOrderNum] ( @Sequence ...

  7. mapbox-gl象形文字字体glyph生成

    简介 mapbox-gl可以对文字显示各种字体(依赖ttf文件),内部采用的是读取protobuf文件 环境条件 硬件:mac.网络 软件:nodejs.npm 创建mapbox-gl可用的字体pro ...

  8. KODExplorer可道云-轻松搭建属于自己/团队的私有云网盘服务

    如今国内各大网盘关停的也快差不多,百度网盘限速严重.国外大牌的如 Dropbox 或 Google Drive又在长城之外,在各种VPN都被封禁的大背景下,科学上网也困难重重,麻烦到要死.那么,除了购 ...

  9. Winform C# 简单实现子窗口显示进度条

    主窗口代码 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data ...

  10. ASP.NET Core 认证与授权[5]:初识授权

    经过前面几章的姗姗学步,我们了解了在 ASP.NET Core 中是如何认证的,终于来到了授权阶段.在认证阶段我们通过用户令牌获取到用户的Claims,而授权便是对这些的Claims的验证,如:是否拥 ...