微服务组件之Consul
文章目录
前言
随着微服务架构的流行,越来越多的企业选择微服务作为自己的系统架构。在微服务架构中,服务治理显得尤为重要,下面向大家介绍一款服务治理组件Consul,Consul的介绍以及与服务治理组件的对比等等笔者在这里不过多赘述,有兴趣的可以去网上找找相关资料,今天主要聊聊Consul在.Net Core下的使用(带心跳检测)。直接步入正题
一、环境
.Net6+VS2022+Consul 1.11.1(最新稳定版)
二、使用步骤
1.下载Consul
下载解压出exe文件,后面启动Consul服务需要用到
2.项目搭建
我这里新建了一个解决方案,项目结构如下:
ConsulDemo.Interface/Service/Model 不做过多介绍,主要是做些抽象实现,模拟一些数据
ConsulDemo.Client 模拟上端 请求API
ConsulDemo.Franework 在这里做一些封装操作
ConsulDemo.API 这里写了一个简单的Get请求获取全部用户
app.MapGet("/api/users/all", (IUserService userService, IHttpContextAccessor httpContextAccessor) =>
{
Console.WriteLine($"This is UsersController {app.Configuration["port"] ?? app.Configuration["port"] } Invoke");
var host = httpContextAccessor.HttpContext!.Request.Host;
return userService.UserAll();
});
3.编写代码
- Consul注册
在ConsulDemo.Franework(需Nuget引入Consul)新建一个静态类:ConsulSetup,写入以下代码:
public static void ConsulRegist(this IConfiguration configuration)
{
ConsulClient client = new ConsulClient(c =>
{
c.Address = new Uri("http://localhost:8500/");
c.Datacenter = "dc1";
});//找到consul
string ip = string.IsNullOrWhiteSpace(configuration["ip"]) ? "192.168.11.245" : configuration["ip"];
int port = int.Parse(configuration["port"]);//命令行参数
int weight = string.IsNullOrWhiteSpace(configuration["tags"]) ? 1 : int.Parse(configuration["tags"]);
client.Agent.ServiceRegister(new AgentServiceRegistration()
{
ID = "service " + Guid.NewGuid(),//服务ID
Name = "ConsulDomeService",//Group--组名
Address = ip,
Port = port,
Tags = new string[] { weight.ToString() },//标签,对应Consul UI中的Tages
Check = new AgentServiceCheck() //健康检查
{
Interval = TimeSpan.FromSeconds(12),//间隔12s一次
HTTP = $"http://{ip}:{port}/Api/Health/Index",
Timeout = TimeSpan.FromSeconds(5),//检测等待时间
DeregisterCriticalServiceAfter = TimeSpan.FromSeconds(120)//失败后多久移除
}
});
Console.WriteLine($"注册成功:{ip}:{port}--weight:{weight}");
}
- 心跳检查拓展
在ConsulDemo.Franework新建一个静态类:HealthCheckMiddlewareExtension,写入以下代码:
public static void UseHealthCheckMiddlewareExtension(this IApplicationBuilder app, string checkPath = "/Health")
{
app.Map(checkPath, applicationBuilder => applicationBuilder.Run(async context =>
{
Console.WriteLine($"This is Health Check");
context.Response.StatusCode = (int)HttpStatusCode.OK;
await context.Response.WriteAsync("OK");
}));
}
- 服务实例注册进Consul
在ConsulDemo.API下的program写入以下代码:
app.Configuration.ConsulRegist();
启用心跳检测:
app.UseHealthCheckMiddlewareExtension("/Api/Health/Index");
- 上端通过Consul调用服务
找到ConsulDemo.Client中的UserController,在Index方法中写入以下代码:
string url = "http://ConsulDomeService/api/users/all";//注意这里使用第一步中的Group替代IP与Port
ConsulClient client = new ConsulClient(c =>
{
c.Address = new Uri("http://localhost:8500/");
c.Datacenter = "dc1";
});//找到consul--像DNS
var response = client.Agent.Services().Result.Response;//获取Consul全部服务清单
Uri uri = new Uri(url);
string groupName = uri.Host;
AgentService agentService = null;
var dictionary = response.Where(s => s.Value.Service.Equals(groupName, StringComparison.OrdinalIgnoreCase)).ToArray();
{
///这里可以用代码灵活处理,这里使用随机策略
随机策略
agentService = dictionary[new Random(iIndex++).Next(0, dictionary.Length)].Value;
}
url = $"{uri.Scheme}://{agentService.Address}:{agentService.Port}{uri.PathAndQuery}";
string content = InvokeApi(url);
ViewBag.Users = JsonConvert.DeserializeObject<IEnumerable<User>>(content);
Console.WriteLine($"This is {url} Invoke");
InvokeApi是使用HttpClient做Get请求的一个封装,代码如下:
using (HttpClient httpClient = new HttpClient())
{
HttpRequestMessage message = new HttpRequestMessage();
message.Method = HttpMethod.Get;
message.RequestUri = new Uri(url);
var result = httpClient.SendAsync(message).Result;
string content = result.Content.ReadAsStringAsync().Result;
return content;
}
四、启动运行
- 启动Consul
切换到Consul的解压路径,cmd 敲入以下命令启动Consul服务:
consul agent -dev
- 启动服务实例
切换到ConsulDemo.API的文件资源路径,cmd 敲入以下命令启动(可启动多个,这里我启动了两个):
dotnet run --urls="http://*:5727" --ip=127.0.0.1 --port=5727 --tags=10
dotnet run --urls="http://*:5728" --ip=127.0.0.1 --port=5728 --tags=20
- Consul UI查看服务实例
浏览器输入http://localhost:8500/ 即可看到刚才启动的服务实例:
- 上端调用测试
切换到ConsulDemo.Client的文件资源路径,cmd 敲入命令启动:
dotnet run
可以看到上端已经成功调用了服务。
总结
Consul在.Net Core下的使用就给大家介绍到这了,大家感兴趣的话可以自行去测试下Consul的心跳检测,自动伸缩,自定义一些负载均衡策略等等。