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

关于.net core微服务的文章介绍很完整,可以参考

https://www.cnblogs.com/edisonchou/p/dotnetcore_microservice_foundation_blogs_index_final.htm

我以下写的内容是自己的学习笔记,主要是自己做了些封装,简化新项目接入流程:

一、封装了Consul服务注册类库

1、新建类库,版本.net core 3.1

2、应用包:

Consul
Microsoft.NETCore.App
Microsoft.AspNetCore.Hosting.Abstractions
Microsoft.Extensions.Hosting.Abstractions

3、注册服务类 :AppBuilderExtensions

 /// <summary>
    /// Consul 注册服务类
    /// </summary>
    public static class AppBuilderExtensions
    {
        /// <summary>
        /// 注册运行url
        /// </summary>
        /// <param name="applicationBuilder"></param>
        /// <param name="args"></param>
        /// <returns></returns>
        public static IWebHostBuilder RegiterUseUrls(this IWebHostBuilder applicationBuilder, string[] args)
        {
            string strIpAddress = "";
            int intPort = 0;
            foreach (var item in args)
            {
                if (item.Contains("ip="))
                {
                    strIpAddress = item.Replace("--ip=", "");
                }
                if (item.Contains("port="))
                {
                    intPort = int.Parse(item.Replace("--port=", ""));
                }
            }
            if (string.IsNullOrWhiteSpace(strIpAddress))
            {
                //默认还是读取配置文件
                strIpAddress = "localhost";
                intPort = 50001;
            }
            else
            {
                applicationBuilder.UseUrls(new string[] { $"http://{strIpAddress}:{intPort}" });
            }
            return applicationBuilder;
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="app"></param>
        /// <param name="lifetime"></param>
        /// <param name="serviceEntity"></param>
        /// <returns></returns>
        public static IApplicationBuilder RegisterConsul(this IApplicationBuilder app, IHostApplicationLifetime lifetime, ServiceEntity serviceEntity)
        {
            var consulClient = new ConsulClient(x => x.Address = new Uri($"http://{serviceEntity.ConsulIP}:{serviceEntity.ConsulPort}"));//请求注册的 Consul 地址
            var httpCheck = new AgentServiceCheck()
            {
                DeregisterCriticalServiceAfter = TimeSpan.FromSeconds(5),//服务启动多久后注册
                Interval = TimeSpan.FromSeconds(10),//健康检查时间间隔,或者称为心跳间隔
                HTTP = $"http://{serviceEntity.IP}:{serviceEntity.Port}{serviceEntity.HealthUrl}",//健康检查地址
                Timeout = TimeSpan.FromSeconds(5)
            };

            // Register service with consul
            var registration = new AgentServiceRegistration()
            {
                Checks = new[] { httpCheck },
                ID = Guid.NewGuid().ToString(),
                Name = serviceEntity.ServiceName,
                Address = serviceEntity.IP,
                Port = serviceEntity.Port,
                Tags = new[] { $"urlprefix-/{serviceEntity.ServiceName}" }//添加 urlprefix-/servicename 格式的 tag 标签,以便 Fabio 识别
            };

            consulClient.Agent.ServiceRegister(registration).Wait();//服务启动时注册,内部实现其实就是使用 Consul API 进行注册(HttpClient发起)

            lifetime.ApplicationStopping.Register(() =>
            {
                consulClient.Agent.ServiceDeregister(registration.ID).Wait();//服务停止时取消注册
            });
            return app;
        }
    }
/// <summary>
    ///  Consul 参数定义类
    /// </summary>
    public class ServiceEntity
    {
        /// <summary>
        /// 服务运行的IP地址
        /// </summary>
        public string IP { get; set; }
        /// <summary>
        /// 服务运行的短裤
        /// </summary>
        public int Port { get; set; }
        /// <summary>
        /// 运行的服务名称
        /// </summary>
        public string ServiceName { get; set; }
        /// <summary>
        /// consul的服务ip地址
        /// </summary>
        public string ConsulIP { get; set; }
        /// <summary>
        /// consul的服务端口
        /// </summary>
        public int ConsulPort { get; set; }
        /// <summary>
        /// 监控检查地址
        /// </summary>
        public string HealthUrl { get; set; } = "/Api/Health/Index";
    }

二、web项目或WebApi项目引用

1、配置文件appsettings.json,新增配置

  "Service": {
    "Name": "net5.consul.webapi" //服务名称
  },
  "Consul": {
    "IP": "你的IP地址",//consul服务地址
    "Port": "8500"
  }

2、Program.cs服务端口注册(此处主要解决部署或命令动态启动时候的ip和端口传入)

启动命令:
dotnet run --ip=你的IP地址 --port=7002
dotnet run --ip=你的IP地址 --port=7003
dotnet run --ip=你的IP地址 --port=7004

docker服务部署命令:
dotnet /app/webpai.dll --ip=192.168.3.230 --port=5727

其中的ip和port参数在程序启动时候,string[] args中接受,也会自动加载到
Configuration["ip"]和Configuration["port"]中
 public IHostBuilder CreateHostBuilder(string[] args)
        {
           return Microsoft.Extensions.Hosting.Host.CreateDefaultBuilder(args)
                .ConfigureWebHostDefaults(webBuilder =>
                {
                    webBuilder.UseStartup<Startup>().RegiterUseUrls(args);//启动服务的ip和端口设置
                });
        }

3、Startup.cs中的服务注册到Consul

public void Configure(IApplicationBuilder app, IWebHostEnvironment env, IHostApplicationLifetime applicationLifetime)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }
            //......其他代码省略
            //applicationLifetime.ApplicationStarted.Register((Started));//程序启动时候注入
            //applicationLifetime.ApplicationStopped.Register((Started));//程序停止时注入
            // register Consul service
            ServiceEntity serviceEntity = new ServiceEntity
            {
                IP = string.IsNullOrWhiteSpace(Configuration["ip"]) ? "localhost" : Configuration["ip"],//服务器IP注册,Configuration["ip"]启动时候参数传入
                Port = string.IsNullOrWhiteSpace(Configuration["port"]) ? 7001 : int.Parse(Configuration["port"]),//命令行参数必须传入
                ServiceName = Configuration["Service:Name"],//注册到Consul的服务名称
                ConsulIP = Configuration["Consul:IP"],//Consul服务器IP
                ConsulPort = Convert.ToInt32(Configuration["Consul:Port"]),//Consul服务端口
                HealthUrl = "/api/Health/Get"//监控检查地址
            };
            app.RegisterConsul(applicationLifetime, serviceEntity);//注册到Consul
        }

三、以上流程搭建完毕就可以运行(此处忽略iis启动),直接介绍命令运行

1、找到项目的文件夹,直接输入cmd

2、运行命令,需要起多个窗口输入命令

dotnet run --ip=你的IP地址 --port=5002
dotnet run --ip=你的IP地址 --port=5003
dotnet run --ip=你的IP地址 --port=5004

3、运行结果

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值