今天抽空学写了一下微服务Consule构建,记录一下已被以后查看,也希望帮助到其他小伙伴,首先要去consul官网下载consul,官网地址为https://www.consul.io/,点击download下载
下载好后解压进入文件夹可以看到consul.exe,然后打开命令行运行consul.exe启动consul服务,如下图
然后看到==> Consul agent running!说明consul运行成功了,我们可以看到2020-07-17T14:58:48.414+0800 [INFO] agent: Started HTTP server: address=127.0.0.1:8500 network=tcp,这个记录,然后浏览器地址打开127.0.0.1:8005可以访问这个地址看到服务实例,如下图
consul启动好后,我们下来开始撸代码了,我们要先创建一个.NetCore API应用程序,然后创建一个ConsulHelper类用来将API注册到consul,代码如下
public static void RegisterConsul(this IConfiguration configuration)
{
//创建Consul客户端实例
ConsulClient consulClient = new ConsulClient(cfg =>
{
//Consul监听地址
cfg.Address = new Uri("http://localhost:8500");
//数据中心名称
cfg.Datacenter = "MTS";
});
//命令行获取IP地址
var ip = configuration["ip"];
Console.WriteLine($"****ip:{ip}");
var port = configuration["port"];
//权重
var weight = string.IsNullOrEmpty(configuration["weight"])?1:int.Parse(configuration["weight"]);
//注册服务
consulClient.Agent.ServiceRegister(new AgentServiceRegistration
{
//服务唯一标识
ID = "Test_" + DateTime.Now.ToString("yyyyMMddHHmmssfff"),
//服务分组
Name = "API",
//服务对应的ip地址
Address = ip,
//服务对应的端口
Port = int.Parse(port),
//心跳检查
Check = new AgentServiceCheck
{
//心跳检查路径
HTTP = $"http://{ip}:{port}/health/index",
//检查间隔
Interval = TimeSpan.FromSeconds(12),
//超时时间
Timeout = TimeSpan.FromSeconds(5),
//失败多久取消注册
DeregisterCriticalServiceAfter = TimeSpan.FromSeconds(60)
},
Tags = new string[] { weight.ToString() }
});
}
这边使用扩展IConfiguration的方法实现,代码都有注释,然后再在Startup里面的config调用如下图
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseRouting();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
});
this.Configuration.RegisterConsul();
}
到这里就完成了将API接口注册到consul的代码
然后下面就是命令行运行API项目将API接口注册到consul,如下图
这步操作过后我们可以到consul站点上看服务实例
接下来我们就要创建一个.NetCore Web应用程序来调用consul获取服务站点,我这边测试简单点直接放在HomeController中的Index Action中,代码测试如下
public IActionResult Index()
{
//创建consul客户端实例
ConsulClient consulClient = new ConsulClient(cfg =>
{
cfg.Datacenter = "MTS";
cfg.Address = new Uri("http://127.0.0.1:8500");
});
//该url中的API对应consul注册服务时的name
var uri = new Uri("http://API/user/all");
var host = uri.Host;
//获取consul下的所有服务
var services = consulClient.Agent.Services().Result.Response;
//找出API对应的所有服务
var speficRes = services.Where(w => w.Value.Service.Equals(host, StringComparison.OrdinalIgnoreCase));
//根据权重新增相应的服务数量
List<KeyValuePair<string, AgentService>> pairs = new List<KeyValuePair<string, AgentService>>();
foreach (var dic in speficRes)
{
var count = int.Parse(dic.Value.Tags?[0]);
for (var i = 0; i < count; i++)
{
pairs.Add(dic);
}
}
//随机寻找
var service = pairs[new Random(iSeed++).Next(0,pairs.Count())].Value;
var url = $"http://{service.Address}:{service.Port}/user/all";
Console.WriteLine(url);
//请求地址
HttpClient httpClient = new HttpClient();
var res = httpClient.GetAsync(url).Result.Content.ReadAsStringAsync().Result;
var users = JsonConvert.DeserializeObject<List<User>>(res);
ViewBag.Users = users;
return View();
}
private static int iSeed = 0;
页面代码如下
@{
ViewData["Title"] = "Home Page";
}
<h1>用户</h1>
<ul>
@{
foreach (var user in ViewBag.Users)
{
<li>@user.Name</li>
}
}
</ul>
<div class="text-center">
<h1 class="display-4">Welcome</h1>
<p>Learn about <a href="https://docs.microsoft.com/aspnet/core">building Web apps with ASP.NET Core</a>.</p>
</div>
然后运行.NetCore Web应用程序如下