(4).NET CORE微服务 Micro-Service ---- Consul服务发现和消费

上一章说了  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 }

原文地址:https://www.cnblogs.com/twinhead/p/9229027.html

时间: 2024-08-28 06:23:25

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

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

原文:.NET Core微服务实施之Consul服务发现与治理 Consul官网:https://www.consul.io Consul下载地址:https://www.consul.io/downloads.html Consul nuget 命令:Install-Package Consul 我的理解是,Consul是一个服务管理者,系统中所有使用到的服务他都帮你管理好,促销高峰需要新增服务的时候,服务开启来就自动注册到Consul中,服务下线关闭,也自动从Consul注销,无缝衔接,对于

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

一.Consul基础介绍 Consul是HashiCorp公司推出的开源工具,用于实现分布式系统的服务发现与配置.与其他分布式服务注册与发现的方案,比如 Airbnb的SmartStack等相比,Consul的方案更"一站式",内置了服务注册与发现框 架.分布一致性协议实现.健康检查.Key/Value存储.多数据中心方案,不再需要依赖其他工具(比如ZooKeeper等),使用起来也较 为简单. Consul用Golang实现,因此具有天然可移植性(支持Linux.windows和Ma

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

在传统单体架构中,由于应用动态性不强,不会频繁的更新和发布,也不会进行自动伸缩,我们通常将所有的服务地址都直接写在项目的配置文件中,发生变化时,手动改一下配置文件,也不会觉得有什么问题.但是在微服务模式下,服务会更细的拆分解耦,微服务会被频繁的更新和发布,根据负载情况进行动态伸缩,以及受资源调度影响而从一台服务器迁移到另一台服务器等等.总而言之,在微服务架构中,微服务实例的网络位置变化是一种常态,服务发现也就成了微服务中的一个至关重要的环节. 服务发现是什么 其实,服务发现可以说自古有之,我们每

ASP.NET Core微服务框架Ocelot+Consul+IdentityServer4实战演练

一.背景介绍 API网关的流行源于最近几年移动应用与企业间接口对接的兴起,使得原来单一的PC客户端,变化到PC客户端.各种浏览器.手机移动端及智能终端等.同时系统之间大部分都不是单独运行,经常会涉及与其他系统对接.共享数据的需求.随着微服务架构概念的提出,API网关成为了微服务架构的一个标配组件.随着业务快速发展,面向手机移动应用业务越来越多,为了减少客户端与服务的耦合,节约后端微服务的开发成本,建立一个高性能.高可用.减少上线风险的API网关成为一个迫切的需求. 1).目前面临现状:假设你正好

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

上一篇发布之后,这一篇把上一篇没有弄到的东西补一下,也算是给各位前来询问的朋友的一些回复吧. 一.Consul服务注册之配置文件方式 1.1 重温Consul实验集群 这里我们有三个Consul Server节点,一个Consul Client节点,在Client节点上跑了两个ClientService实例,分别占用8810和8820端口.至于基于Ocelot的API网关服务,还没有实现,留到以后跟各位分享.这里假设我们已经启动了这几个节点,并且能够成功访问这两个ClientService实例(

.NET Core微服务之基于Ocelot实现API网关服务(续)

一.负载均衡与请求缓存 1.1 负载均衡 为了验证负载均衡,这里我们配置了两个Consul Client节点,其中ClientService分别部署于这两个节点内(192.168.80.70与192.168.80.71). 为了更好的展示API Repsonse来自哪个节点,我们更改一下返回值: [Route("api/[controller]")] public class ValuesController : Controller { // GET api/values [Http

(1).NET CORE微服务 Micro-Service ---- 什么是微服务架构,.netCore微服务选型

开发工具:VS2017 .Net Core 2.1 什么是微服务?单体结构: 缺点:1)只能采用同一种技术,很难用不同的语言或者语言不同版本开发不同模块:2)系统耦合性强,一旦其中一个模块有问题,整个系统就瘫痪了:一旦升级其中一个模块,整个系统就停机了:3)要上线必须一起上线,互相等待,无法快速响应需求:4)集群只能是复制整个系统,即使只是其中一个模块压力大: 微服务:不同模块放到不同的进程/服务器上,模块之间通过网络通讯进行协作.适用于:模块比较多,访问量比较大的互联网类系统,并不是所有项目都

基于.NET CORE微服务框架 -浅析如何使用surging

1.前言 surging受到大家这么强烈的关注,我感到非常意外,比如有同僚在公司的分享会上分享surging, 还有在博客拿其它的RPC框架,微服务做对比等等,这些举动都让我感觉压力很大,毕竟作为个人的开源项目,无法与成熟的开源社区的项目相比,也只有等到后面有许许多多志同道合的朋友加入一起研发完善surging,这样才能让surging 成为流行的微服务框架. 这篇文章介绍如何使用surging 开源地址:https://github.com/dotnetcore/surging 2.设计模式

微服务之Service Fabric 系列 (一)

参考 微软官方文档  service fabric 百家号   大话微服务架构之微服务框架微软ServiceFabric正式开源 一.概述 1.概念 Azure Service Fabric 是一款分布式系统平台,可方便用户轻松打包.部署和管理可缩放的可靠微服务和容器. Service Fabric 还解决了开发和管理云本机应用程序面临的重大难题. 开发人员和管理员不需解决复杂的基础结构问题,只需专注于实现苛刻的任务关键型工作负荷,即那些可缩放.可靠且易于管理的工作负荷. Service Fab