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("");
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的服务注册与发现的更多相关文章
- 【转帖】基于Zookeeper的服务注册与发现
http://www.techweb.com.cn/network/hardware/2015-12-25/2246973.shtml 背景 大多数系统都是从一个单一系统开始起步的,随着公司业务的快速 ...
- 基于ZooKeeper的服务注册中心
本文介绍基于ZooKeeper的Dubbo服务注册中心的原理. 1.ZooKeeper中的节点 ZooKeeper是一个树形结构的目录服务,支持变更推送,因此非常适合作为Dubbo服务的注册中心. 注 ...
- 一个故事,一段代码告诉你如何使用不同语言(Golang&C#)提供相同的能力基于Consul做服务注册与发现
目录 引言 什么是微服务 传统服务 微服务 什么是服务注册与服务发现 为什么要使用不同的语言提供相同的服务能力 服务协调器 服务注册 Golang C#(.NetCore3.1) 服务发现 通过Htt ...
- 简单RPC框架-基于Consul的服务注册与发现
*:first-child { margin-top: 0 !important; } body>*:last-child { margin-bottom: 0 !important; } /* ...
- SpringCloud用Zookeeper做服务注册与发现中心代码实现
一:Zookeeper用的是3.5.5版本,SpringBoot用的是2.1.6版本,SpringCloud用的是Greenwich.SR2版本,JDK用的是1.8: 服务提供者product-ser ...
- 基于ZooKeeper实现简单的服务注册于发现
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明.本文链接:https://blog.csdn.net/Shaun_luotao/article/ ...
- Zookeeper服务注册与发现原理浅析
了解Zookeeper的我们都知道,Zookeeper是一种分布式协调服务,在分布式应用中,主要用来实现分布式服务的注册与发现以及分布式锁,本文我们简单介绍一下Zookeeper是如何实现服务的注册与 ...
- 微服务框架SpringCloud(Dalston版)学习 (一):Eureka服务注册与发现
eureka-server eureka服务端,提供服务的注册与发现,类似于zookeeper 新建spring-boot工程,pom依赖: <dependency> <groupI ...
- SpringCloud微服务(01):Eureka组件,管理服务注册与发现
本文源码:GitHub·点这里 || GitEE·点这里 一.Eureka基本架构 1.Eureka简介 Eureka是Netflix开发的服务发现框架,本身是一个基于REST的服务,SpringCl ...
随机推荐
- rsync服务精讲 -- 视频
rsync服务 开源数据同步工具rsync视频(老男孩分享) 浏览网址 01-rsync基础介绍 http://oldboy.blog.51cto.com/2561410/1216550 11-rsy ...
- 关于史考特证券(scottrade Inc)资金转出的手续费问题
投资美股账户的朋友可能开始的时候并没有关心史考特账户转出的费用,其实,仔细算一下这个费用还是蛮贵的,根据官网的文档可以明确知道,转出史考特账户资金到国内银行的费用由以下几项组成: 1. 国际电汇资金费 ...
- 解决Cordova安装Cannot find module 'bplist-parser'问题
安装完cordova出现找不到必须的模块 出现原因不明,不过如果出现这个问题,我们遇到缺什么模块就安装什么模块就可以了.如图所示
- 圆形border渐变加载
自己遇到的一个需求,圆形的border加载.初听大家一定认为很简单,确实很简单,但是突然又加了一个需求,就是border的颜色要进行渐变,用了很多方法,可以实现渐变,直接的一个css属性是border ...
- phpcms 的getcache()函数
一直没有去研究phpcms 的getcache()函数是干嘛的,今天有空去看了一下,原来就那样. 1 function getcache($name, $filepath='', $type='fil ...
- fragmentTabHost 使用示例
目前我们看微信的底部,有四个导航栏,那我们应该来怎么实现类似的导航栏呢? 在 android 4.0 的时候,推出了一个新的工具,fragmentTabHost . fragmentTabHost ...
- 函数chdir、fchdir和getcwd
函数chdir.fchdir和getcwd chdir.fchdir函数 每个进程都有一个当前工作目录,当前目录是进程的一个属性 当用户登录UNIX系统时,其当前工作目录通常是口令文件 ...
- java并发之同步辅助类(Semphore、CountDownLatch、CyclicBarrier、Phaser)
线程同步辅助类,主要学习两点: 1.上述几种同步辅助类的作用以及常用的方法 2.适用场景,如果有适当的场景可以用到,那无疑是最好的 semaphore(seməˌfôr) 含义 信号量就是可以声明多把 ...
- js中this的意义
随着函数使用场合的不同,this的值会发生变化.但是有一个总的原则,那就是this指的是,调用函数的那个对象.
- 拼写纠错的利器,BK树算法
BK树或者称为Burkhard-Keller树,是一种基于树的数据结构,被设计于快速查找近似字符串匹配,比方说拼写纠错,或模糊查找,当搜索”aeek”时能返回”seek”和”peek”. 本文首先剖析 ...