上一章说了  Consul服务注册  现在我要连接上Consul里面的服务 请求它们的API接口 应该怎么做呢?

1.找Consul要一台你需要的服务器

1.1 获取Consul下的所有注册的服务

using (var consulClient = new ConsulClient(c => c.Address = new Uri("http://127.0.0.1:8500")))
{
  var services = consulClient.Agent.Services().Result.Response;
   foreach(var service in services.Values)
{
      Console.WriteLine($"id={service.ID},name={service.Service},ip={service.Address},port={service.Port}");
}
}

1.2 随机取一个Name为MsgService的服务


下面的代码使用当前 TickCount 进行取模的方式达到随机获取一台服务器实例的效果,这叫做“客户端负载均衡”: 
using (var consulClient = new ConsulClient(c => c.Address = new Uri("http://127.0.0.1:8500")))
{
var services = consulClient.Agent.Services().Result.Response.Values.Where(s => s.Service.Equals("MsgService", StringComparison.OrdinalIgnoreCase));
if(!services.Any())
{
Console.WriteLine("找不到服务的实例");
}
else
{
var service = services.ElementAt(Environment.TickCount%services.Count());
Console.WriteLine($"{service.Address}:{service.Port}");
}
}

当然在一个毫秒之类会所有请求都压给一台服务器,基本就够用了。也可以自己写随机、轮询等客户端负载均衡算法,也可以自己实现按不同权重分配(注册时候 Tags 带上配置、权重等信息)等算法。

2.请求服务器的接口

你拿到了http地址  难道还不会请求接口么   找个httphelper  直接请求就好了  如果还是不会 就来群里问吧  群号:608188505

给大家上一个 我常用的httphelper 可能被我该的不像样了  不过相信大家都会用  不会的话 来群里找我吧。

  1 using System;
2 using System.Collections.Generic;
3 using System.Diagnostics;
4 using System.IO;
5 using System.IO.Compression;
6 using System.Linq;
7 using System.Net;
8 using System.Net.Security;
9 using System.Runtime.InteropServices;
10 using System.Security.Cryptography.X509Certificates;
11 using System.Text;
12 using System.Text.RegularExpressions;
13 using System.Threading.Tasks;
14
15 namespace ClientApp
16 {/// <summary>
17 /// Http连接操作帮助类
18 /// </summary>
19 public class HttpHelper
20 {
21 private const int ConnectionLimit = 100;
22 //编码
23 private Encoding _encoding = Encoding.Default;
24 //浏览器类型
25 private string[] _useragents = new string[]{
26 "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.90 Safari/537.36",
27 "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/7.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0)",
28 "Mozilla/5.0 (Windows NT 6.1; rv:36.0) Gecko/20100101 Firefox/36.0",
29 "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:31.0) Gecko/20130401 Firefox/31.0"
30 };
31
32 private String _useragent = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.90 Safari/537.36";
33 //接受类型
34 private String _accept = "text/html, application/xhtml+xml, application/xml, */*";
35 //超时时间
36 private int _timeout = 30 * 1000;
37 //类型
38 private string _contenttype = "application/x-www-form-urlencoded";
39 //cookies
40 private String _cookies = "";
41 //cookies
42 private CookieCollection _cookiecollection;
43 //custom heads
44 private Dictionary<string, string> _headers = new Dictionary<string, string>();
45
46 public HttpHelper()
47 {
48 _headers.Clear();
49 //随机一个useragent
50 _useragent = _useragents[new Random().Next(0, _useragents.Length)];
51 //解决性能问题?
52 ServicePointManager.DefaultConnectionLimit = ConnectionLimit;
53 }
54
55 public void InitCookie()
56 {
57 _cookies = "";
58 _cookiecollection = null;
59 _headers.Clear();
60 }
61
62 /// <summary>
63 /// 设置当前编码
64 /// </summary>
65 /// <param name="en"></param>
66 public void SetEncoding(Encoding en)
67 {
68 _encoding = en;
69 }
70
71 /// <summary>
72 /// 设置UserAgent
73 /// </summary>
74 /// <param name="ua"></param>
75 public void SetUserAgent(String ua)
76 {
77 _useragent = ua;
78 }
79
80 public void RandUserAgent()
81 {
82 _useragent = _useragents[new Random().Next(0, _useragents.Length)];
83 }
84
85 public void SetCookiesString(string c)
86 {
87 _cookies = c;
88 }
89
90 /// <summary>
91 /// 设置超时时间
92 /// </summary>
93 /// <param name="sec"></param>
94 public void SetTimeOut(int msec)
95 {
96 _timeout = msec;
97 }
98
99 public void SetContentType(String type)
100 {
101 _contenttype = type;
102 }
103
104 public void SetAccept(String accept)
105 {
106 _accept = accept;
107 }
108
109 /// <summary>
110 /// 添加自定义头
111 /// </summary>
112 /// <param name="key"></param>
113 /// <param name="ctx"></param>
114 public void AddHeader(String key, String ctx)
115 {
116 //_headers.Add(key,ctx);
117 _headers[key] = ctx;
118 }
119
120 /// <summary>
121 /// 清空自定义头
122 /// </summary>
123 public void ClearHeader()
124 {
125 _headers.Clear();
126 }
127
128 /// <summary>
129 /// 获取HTTP返回的内容
130 /// </summary>
131 /// <param name="response"></param>
132 /// <returns></returns>
133 private String GetStringFromResponse(HttpWebResponse response)
134 {
135 String html = "";
136 try
137 {
138 Stream stream = response.GetResponseStream();
139 StreamReader sr = new StreamReader(stream, Encoding.UTF8);
140 html = sr.ReadToEnd();
141
142 sr.Close();
143 stream.Close();
144 }
145 catch (Exception e)
146 {
147 Trace.WriteLine("GetStringFromResponse Error: " + e.Message);
148 }
149
150 return html;
151 }
152
153 /// <summary>
154 /// 检测证书
155 /// </summary>
156 /// <param name="sender"></param>
157 /// <param name="certificate"></param>
158 /// <param name="chain"></param>
159 /// <param name="errors"></param>
160 /// <returns></returns>
161 private bool CheckCertificate(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors errors)
162 {
163 return true;
164 }
165
166 /// <summary>
167 /// 发送GET请求
168 /// </summary>
169 /// <param name="url"></param>
170 /// <returns></returns>
171 public String HttpGet(String url)
172 {
173 return HttpGet(url, url);
174 }
175
176
177 /// <summary>
178 /// 发送GET请求
179 /// </summary>
180 /// <param name="url"></param>
181 /// <param name="refer"></param>
182 /// <returns></returns>
183 public String HttpGet(String url, String refer)
184 {
185 String html;
186 try
187 {
188 ServicePointManager.ServerCertificateValidationCallback = new System.Net.Security.RemoteCertificateValidationCallback(CheckCertificate);
189 HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(url);
190 request.UserAgent = _useragent;
191 request.Timeout = _timeout;
192 request.ContentType = _contenttype;
193 request.Accept = _accept;
194 request.Method = "GET";
195 request.Referer = refer;
196 request.KeepAlive = true;
197 request.AllowAutoRedirect = true;
198 request.UnsafeAuthenticatedConnectionSharing = true;
199 request.CookieContainer = new CookieContainer();
200 //据说能提高性能
201 //request.Proxy = null;
202 if (_cookiecollection != null)
203 {
204 foreach (Cookie c in _cookiecollection)
205 {
206 c.Domain = request.Host;
207 }
208
209 request.CookieContainer.Add(_cookiecollection);
210 }
211
212 foreach (KeyValuePair<String, String> hd in _headers)
213 {
214 request.Headers[hd.Key] = hd.Value;
215 }
216
217 HttpWebResponse response = (HttpWebResponse)request.GetResponse();
218 html = GetStringFromResponse(response);
219 if (request.CookieContainer != null)
220 {
221 response.Cookies = request.CookieContainer.GetCookies(request.RequestUri);
222 }
223
224 if (response.Cookies != null)
225 {
226 _cookiecollection = response.Cookies;
227 }
228 if (response.Headers["Set-Cookie"] != null)
229 {
230 string tmpcookie = response.Headers["Set-Cookie"];
231 _cookiecollection.Add(ConvertCookieString(tmpcookie));
232 }
233
234 response.Close();
235 return html;
236 }
237 catch (Exception e)
238 {
239 Trace.WriteLine("HttpGet Error: " + e.Message);
240 return String.Empty;
241 }
242 }
243
244 /// <summary>
245 /// 获取MINE文件
246 /// </summary>
247 /// <param name="url"></param>
248 /// <returns></returns>
249 public Byte[] HttpGetMine(String url)
250 {
251 Byte[] mine = null;
252 try
253 {
254 ServicePointManager.ServerCertificateValidationCallback = new System.Net.Security.RemoteCertificateValidationCallback(CheckCertificate);
255 HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(url);
256 request.UserAgent = _useragent;
257 request.Timeout = _timeout;
258 request.ContentType = _contenttype;
259 request.Accept = _accept;
260 request.Method = "GET";
261 request.Referer = url;
262 request.KeepAlive = true;
263 request.AllowAutoRedirect = true;
264 request.UnsafeAuthenticatedConnectionSharing = true;
265 request.CookieContainer = new CookieContainer();
266 //据说能提高性能
267 request.Proxy = null;
268 if (_cookiecollection != null)
269 {
270 foreach (Cookie c in _cookiecollection)
271 c.Domain = request.Host;
272 request.CookieContainer.Add(_cookiecollection);
273 }
274
275 foreach (KeyValuePair<String, String> hd in _headers)
276 {
277 request.Headers[hd.Key] = hd.Value;
278 }
279
280 HttpWebResponse response = (HttpWebResponse)request.GetResponse();
281 Stream stream = response.GetResponseStream();
282 MemoryStream ms = new MemoryStream();
283
284 byte[] b = new byte[1024];
285 while (true)
286 {
287 int s = stream.Read(b, 0, b.Length);
288 ms.Write(b, 0, s);
289 if (s == 0 || s < b.Length)
290 {
291 break;
292 }
293 }
294 mine = ms.ToArray();
295 ms.Close();
296
297 if (request.CookieContainer != null)
298 {
299 response.Cookies = request.CookieContainer.GetCookies(request.RequestUri);
300 }
301
302 if (response.Cookies != null)
303 {
304 _cookiecollection = response.Cookies;
305 }
306 if (response.Headers["Set-Cookie"] != null)
307 {
308 _cookies = response.Headers["Set-Cookie"];
309 }
310
311 stream.Close();
312 stream.Dispose();
313 response.Close();
314 return mine;
315 }
316 catch (Exception e)
317 {
318 Trace.WriteLine("HttpGetMine Error: " + e.Message);
319 return null;
320 }
321 }
322
323 /// <summary>
324 /// 发送POST请求
325 /// </summary>
326 /// <param name="url"></param>
327 /// <param name="data"></param>
328 /// <returns></returns>
329 public String HttpPost(String url, String data)
330 {
331 return HttpPost(url, data, url,null);
332 }
333
334 /// <summary>
335 /// 发送POST请求
336 /// </summary>
337 /// <param name="url"></param>
338 /// <param name="data"></param>
339 /// <param name="refer"></param>
340 /// <returns></returns>
341 public String HttpPost(String url, String data, String refer,string cookie)
342 {
343 String html;
344 try
345 {
346 ServicePointManager.ServerCertificateValidationCallback = new System.Net.Security.RemoteCertificateValidationCallback(CheckCertificate);
347 HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(url);
348 request.UserAgent = _useragent;
349 request.Timeout = _timeout;
350 request.Referer = refer;
351 request.ContentType = _contenttype;
352 request.Accept = _accept;
353 request.Method = "POST";
354 request.KeepAlive = true;
355 request.AllowAutoRedirect = true;
356
357 request.CookieContainer = new CookieContainer();
358 if (!string.IsNullOrEmpty(cookie))
359 {
360 _cookiecollection = this.ConvertCookieString(cookie);
361 }
362 //据说能提高性能
363 request.Proxy = null;
364
365 if (_cookiecollection != null)
366 {
367 foreach (Cookie c in _cookiecollection)
368 {
369 c.Domain = request.Host;
370 if (c.Domain.IndexOf(':') > 0)
371 c.Domain = c.Domain.Remove(c.Domain.IndexOf(':'));
372 }
373 request.CookieContainer.Add(_cookiecollection);
374 }
375
376 foreach (KeyValuePair<String, String> hd in _headers)
377 {
378 request.Headers[hd.Key] = hd.Value;
379 }
380 byte[] buffer = _encoding.GetBytes(data.Trim());
381 request.ContentLength = buffer.Length;
382 request.GetRequestStream().Write(buffer, 0, buffer.Length);
383 request.GetRequestStream().Close();
384
385 HttpWebResponse response = (HttpWebResponse)request.GetResponse();
386 html = GetStringFromResponse(response);
387 if (request.CookieContainer != null)
388 {
389 response.Cookies = request.CookieContainer.GetCookies(request.RequestUri);
390 }
391 if (response.Cookies != null)
392 {
393 _cookiecollection = response.Cookies;
394 }
395 if (response.Headers["Set-Cookie"] != null)
396 {
397 string tmpcookie = response.Headers["Set-Cookie"];
398 _cookiecollection.Add(ConvertCookieString(tmpcookie));
399 }
400
401 response.Close();
402 return html;
403 }
404 catch (Exception e)
405 {
406 Trace.WriteLine("HttpPost Error: " + e.Message);
407 return String.Empty;
408 }
409 }
410
411
412 public string UrlEncode(string str)
413 {
414 StringBuilder sb = new StringBuilder();
415 byte[] byStr = _encoding.GetBytes(str);
416 for (int i = 0; i < byStr.Length; i++)
417 {
418 sb.Append(@"%" + Convert.ToString(byStr[i], 16));
419 }
420
421 return (sb.ToString());
422 }
423
424 /// <summary>
425 /// 转换cookie字符串到CookieCollection
426 /// </summary>
427 /// <param name="ck"></param>
428 /// <returns></returns>
429 private CookieCollection ConvertCookieString(string ck)
430 {
431 CookieCollection cc = new CookieCollection();
432 string[] cookiesarray = ck.Split(";".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
433 for (int i = 0; i < cookiesarray.Length; i++)
434 {
435 string[] cookiesarray_2 = cookiesarray[i].Split(",".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
436 for (int j = 0; j < cookiesarray_2.Length; j++)
437 {
438 string[] cookiesarray_3 = cookiesarray_2[j].Trim().Split("=".ToCharArray());
439 if (cookiesarray_3.Length == 2)
440 {
441 string cname = cookiesarray_3[0].Trim();
442 string cvalue = cookiesarray_3[1].Trim();
443 if (cname.ToLower() != "domain" && cname.ToLower() != "path" && cname.ToLower() != "expires")
444 {
445 Cookie c = new Cookie(cname, cvalue);
446 cc.Add(c);
447 }
448 }
449 }
450 }
451
452 return cc;
453 }
454
455
456 public void DebugCookies()
457 {
458 Trace.WriteLine("**********************BEGIN COOKIES*************************");
459 foreach (Cookie c in _cookiecollection)
460 {
461 Trace.WriteLine(c.Name + "=" + c.Value);
462 Trace.WriteLine("Path=" + c.Path);
463 Trace.WriteLine("Domain=" + c.Domain);
464 }
465 Trace.WriteLine("**********************END COOKIES*************************");
466 }
467
468 }
469 }

(4).NET CORE微服务 Micro-Service ---- Consul服务发现和消费的更多相关文章

  1. .NET Core微服务实施之Consul服务发现与治理

    .NET Core微服务实施之Consul服务发现与治理   Consul官网:https://www.consul.io Consul下载地址:https://www.consul.io/downl ...

  2. 基于.net core微服务(Consul、Ocelot、Docker、App.Metrics+InfluxDB+Grafana、Exceptionless、数据一致性、Jenkins)

    1.微服务简介 一种架构模式,提倡将单一应用程序划分成一组小的服务,服务之间互相协调.互相配合,为用户提供最终价值.每个服务运行在其独立的进程中,服务与服务间采用轻量级的通信机制互相沟通(RESTfu ...

  3. .Net Core微服务——服务发现:Consul(一)

    先思考一些问题:它是做什么的.以及怎么使用它.带着这些问题往下走. consul是做什么的 consul用于微服务下的服务治理.服务治理是什么?它包含但不限于:服务发现.服务配置.健康检查.键值存储. ...

  4. 微服务之Service Fabric 系列 (一):概览、环境安装

    参考 微软官方文档  service fabric 百家号   大话微服务架构之微服务框架微软ServiceFabric正式开源 一.概述 1.概念 Azure Service Fabric 是一款分 ...

  5. .NET Core微服务之基于Consul实现服务治理

    Tip: 此篇已加入.NET Core微服务基础系列文章索引 一.Consul基础介绍 Consul是HashiCorp公司推出的开源工具,用于实现分布式系统的服务发现与配置.与其他分布式服务注册与发 ...

  6. .NET Core微服务之基于Consul实现服务治理(续)

    Tip: 此篇已加入.NET Core微服务基础系列文章索引 上一篇发布之后,很多人点赞和评论,不胜惶恐,这一篇把上一篇没有弄到的东西补一下,也算是给各位前来询问的朋友的一些回复吧. 一.Consul ...

  7. ASP.NET Core 微服务初探[1]:服务发现之Consul

    ASP.NET Core 微服务初探[1]:服务发现之Consul   在传统单体架构中,由于应用动态性不强,不会频繁的更新和发布,也不会进行自动伸缩,我们通常将所有的服务地址都直接写在项目的配置文件 ...

  8. .NET CORE微服务中CONSUL的相关使用

    .NET CORE微服务中CONSUL的相关使用 1.consul在微服务中的作用 consul主要做三件事:1.提供服务到ip的注册 2.提供ip到服务地址的列表查询 3.对提供服务方做健康检查(定 ...

  9. (转)微服务_.NET Core Consul服务发现与治理

    原文地址:https://www.cnblogs.com/waynechan/p/9354909.html Consul官网:https://www.consul.io Consul下载地址:http ...

  10. .NET Core微服务一:Consul服务中心

    本文的项目代码,在文章结尾处可以下载. 防爬虫,本文的网址是:https://www.cnblogs.com/shousiji/p/12253295.html 本文使用的环境:Windows10 64 ...

随机推荐

  1. 后台拼接json字符串,传到前台时注意特殊符号处理

    1.后台拼接常用的形式:     sb.AppendFormat("\"字段名\":\"{0}\"", i + 1); 这个要注意字符串截断 ...

  2. <TCP/IP>记一次关于IP地址和MAC物理地址的思考

    是的,从3月6日第一次上计算机网络课起,我还是今天第一次对这本书里讲的知识点有了自己的疑问..之前看书就是 嗯嗯这好像很有道理,嗯嗯也许再多看几章就知道它在讲什么了.. 不过今天已经自学到了网络层了, ...

  3. 027_磁盘维护命令du等

    一.du查看磁盘空间大小排除指定目录的的用法. 下面的例子为排除/data目录,因为/data目录是单独挂载的磁盘 [pe@jyall-3 /data]$ sudo du --exclude='/da ...

  4. 漏洞扫描工具Nessu的安装和简单使用

    一.软件介绍Nessus号称是世界上最流行的漏洞扫描程序,全世界有超过75000个组织在使用它.该工具提供完整的电脑漏洞扫描服务,并随时更新其漏洞数据库.Nessus不同于传统的漏洞扫描软件,Ness ...

  5. zepplin0.7.2报错ERROR, exception: null, result: %text java.lang.NullPointerException的处理

    zepplin0.7.2报错ERROR, exception: null, result: %text java.lang.NullPointerException的处理 问题描述: 使用zeppli ...

  6. GIT入门文档

    集中式(SVN): 集中式版本控制系统,版本库是集中存放在中央服务器的,用的都是自己的电脑,所以要先从中央服务器取得最新的版本,然后开始干活,干完活了,再把自己的活推送给中央服务器. 集中式版本控制系 ...

  7. how to avoid inheritance abuse

    Liskov Principle: if S is a subtype of Type T, then any objects of type T may be repalced by objects ...

  8. Ex3_7无向图二部图_十一次作业

    (a) 从图中的某个顶点做深度优先遍历,并将不同层的顶点标记为红黑两种颜色,使得每条树边的两个顶点的颜色都不相同,如果遇到一条回边并且两个顶点的颜色都相同则说明图不是二部图. (b)如果存在一个长度为 ...

  9. 如何用Axure快速制作APP交互原型

    对于产品经理来说,熟练使用一些常用软件是一项十分必要的技能.其中,作为一个专业的快速原型设计工具,Axure RP无疑在产品人心中拥有一个难以撼动的地位.但就要PS一样,虽然足够专业,但同样也会存在使 ...

  10. HTML之Position用法

    在此,先做声明,本篇仅是摘录自互联网,个人认为这篇文章讲的很不错,附于此地与大家共同欣赏. position的四个属性值: 1.relative2.absolute3.fixed4.static下面分 ...