微服务组件之Consul

微服务组件之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.编写代码

  1. 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}");
        }

  1. 心跳检查拓展
    在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");
            }));
        }

  1. 服务实例注册进Consul
    在ConsulDemo.API下的program写入以下代码:
app.Configuration.ConsulRegist();

启用心跳检测:

app.UseHealthCheckMiddlewareExtension("/Api/Health/Index");

  1. 上端通过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;
 }

四、启动运行

  1. 启动Consul
    切换到Consul的解压路径,cmd 敲入以下命令启动Consul服务:
consul agent -dev
  1. 启动服务实例
    切换到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
  1. Consul UI查看服务实例
    浏览器输入http://localhost:8500/ 即可看到刚才启动的服务实例:
    在这里插入图片描述
  2. 上端调用测试
    切换到ConsulDemo.Client的文件资源路径,cmd 敲入命令启动:
dotnet run

可以看到上端已经成功调用了服务。
在这里插入图片描述


总结

Consul在.Net Core下的使用就给大家介绍到这了,大家感兴趣的话可以自行去测试下Consul的心跳检测,自动伸缩,自定义一些负载均衡策略等等。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值