Consul的微服务一般都是集群,集群由一个个的Consul节点组成,在这些Consul节点里面,分为两种角色,Server 以及 Client。
consul节点在启动时可以定义自身角色,client、server两种。
client节点只负责转发外部请求,所有注册到当前节点的服务会被转发到server节点,向server节点进行键值对的读/写,本身是不持久化这些信息,是无状态的;
server节点的职责是使用raft协议保证数据一致性,响应客户端的请求,维护集群状态,与其他数据中心交互,另外所有的信息持久化到本地,这样遇到故障,信息是可以被保留的。节点之间通过gossip广播协议(谣言协议),进行节点之间的数据交互,最终大家达到一致。
现在我们的Consul上微服务有几个服务器 现在我们来看看:
这是所有API服务节点的信息:
当用户需要使用我们的API的信息 我们只需要告诉用户地址 以及 付费的Key 然后就可以使用Api接口
我们接下来进行调用:
调用代码:
//创建consul客户端实例 ConsulClient consulClient = new ConsulClient(cfg => { cfg.Address = new Uri("http://127.0.0.1:8501"); }); //该url中的API对应consul注册服务时的name var host = "API"; //获取consul下的所有服务 var services = consulClient.Agent.Services().Result.Response.Values.Where(w => w.Service.Equals(host, StringComparison.OrdinalIgnoreCase)); if (!services.Any()) { return Content(host+"服务未运行,请联系管理!"); } //随机寻找服务器 减少服务压力 var service = services.ElementAt(Environment.TickCount % services.Count()); var url = $"http://{service.Address}:{service.Port}/API/Note/SendTwo_CYBLOG"; //请求地址 HttpClient httpClient = new HttpClient(); var httpcontent = new StringContent("{key:123}", Encoding.UTF8, "appliction/json"); var res = httpClient.PostAsync(url, httpcontent).Result.Content.ReadAsStringAsync().Result; return Content(res);
当我们使用API服务进行调用时 未找到API服务时 会提示如下:
当服务运行正常时:并验证身份成功以后会返回以下信息:
当输入的Key不正确时 就不能通过服务器验证 就会返回以下信息:
然后我们去看看服务上的变化:
调用成功服务器上的变化:
这样就完美的使用调用 可以统计哪些时非法使用该接口 进行尝试数据操作。
很方便的Consul 就这样部署完毕 就可以使用了。