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 ...
随机推荐
- 暑假练习赛 007 E - Pairs
E - Pairs Description standard input/outputStatements In the secret book of ACM, it’s said: “Glory f ...
- CS231n 2017 学习笔记01——KNN(K-Nearest Neighbors)
本博客内容来自 Stanford University CS231N 2017 Lecture 2 - Image Classification 课程官网:http://cs231n.stanford ...
- java三级考试理论题
Java试卷 一.单项选择题: 1. 试题: 在WINDOWS环境下,ODBC在__A____中设置 A. 控制面板 B. 注册表 C. 浏览器 D. 写字板 2. 阅读以下描述: C <jsp ...
- 检测CSS属性 是否支持
原理是:创建一个节点,判断其的style属性是否含有textOverflow属性,有则进一步判断是否支持ellipsis这个值.当遇到不支持的属性值时,浏览器会直接把这个值抛弃.因此这里就可以先给te ...
- filereader api 类型
filereader类似XMLHttpRequest,只是它用来从文件系统读取文件,提供了不同的方法去读取文件数据:1.readAsText2.readAsDataURL3.readAsBinaryS ...
- 【机器学习实战】第13章 利用 PCA 来简化数据
第13章 利用 PCA 来简化数据 降维技术 场景 我们正通过电视观看体育比赛,在电视的显示器上有一个球. 显示器大概包含了100万像素点,而球则可能是由较少的像素点组成,例如说一千个像素点. 人们实 ...
- 面试经典算法题集锦——《剑指 offer》小结
从今年 3 月份开始准备找实习,到现在校招结束,申请的工作均为机器学习/数据挖掘算法相关职位,也拿到了几个 sp offer.经历这半年的洗礼,自己的综合能力和素质都得到了一个质的提升. 实话说对于未 ...
- 【WEB API项目实战干货系列】- API访问客户端(WebApiClient适用于MVC/WebForms/WinForm)(四)
这几天没更新主要是因为没有一款合适的后端框架来支持我们的Web API项目Demo, 所以耽误了几天, 目前最新的代码已经通过Sqlite + NHibernate + Autofac满足了我们基本的 ...
- Photoshop颜色出现比较大的偏差,偏色严重,显示器配置文件2351似乎有问题
其实出现这个问题是因为 显示器的配置问题.并不是PS版本或者电脑系统问题. 一般在你首次启动PS的时候会出现提示:显示器配置文件2351似乎有问题. 如果你点击了继续运行那以后你使用PS打开任何文件都 ...
- java之JVM学习--基本机构
JDK,JRE,JVM关系图 JVM物理结构: jvm内存区详解: 程序计数器 程序计数器(Program Counter Register)是一块较小的内存空间,它的作用可以看做是当前线程所执行的字 ...