差異
基於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應用程式池停止或者網站停止,響應的臨時節點也會刪掉
具體資料一致性可以參考www.cnblogs.com/leesf456/p/…
客戶端服務發現
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" />
複製程式碼
加群895244712,免費獲取架構師進階學習資料
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;
}
複製程式碼