winserver的consul部署实践与.net core客户端使用(附demo源码)(二)

简介: winserver的consul部署实践与.net core客户端使用(附demo源码)(二)

客户端实践


安装Consul


image.png


封装扩展


只贴部分核心代码,具体可以查看demo源码。


注入ConsulClient


public static IServiceCollection AddConsul(this IServiceCollection serviceCollection, Action<ConsulConfiguration> optionAction)
        {
            _consulConfiguration = new ConsulConfiguration();
            optionAction(_consulConfiguration);
            var consulClient = new ConsulClient(x =>
                x.Address = new Uri(_consulConfiguration.Host));
            serviceCollection.AddSingleton(consulClient);
            return serviceCollection;
        }
把当前服务注册到Consul
private static ConsulConfiguration _consulConfiguration;
        public static IApplicationBuilder UseConsul(this IApplicationBuilder app, IApplicationLifetime lifetime, Action<ServerConfiguration> optionAction)
        {
            var consulClient = app.ApplicationServices.GetService<ConsulClient>();
            if (consulClient == null)
                throw new Exception("please AddConsul first");
            var serverConfiguration = new ServerConfiguration();
            optionAction(serverConfiguration);
            var serviceRegistration = GetServiceRegistration(serverConfiguration);
            //添加注册
            consulClient.Agent.ServiceRegister(serviceRegistration).Wait();
            //取消注册
            lifetime.ApplicationStopping.Register(() =>
            {
                consulClient.Agent.ServiceDeregister(serviceRegistration.ID).Wait();
            });
            return app;
        }
private static Uri GetSelfUri(string uristring)
        {
            return new Uri(uristring);
        }
        private static AgentServiceRegistration GetServiceRegistration(ServerConfiguration serverConfiguration)
        {
            var localIp = GetSelfUri(serverConfiguration.SelfHost);
            var serviceRegistration = new AgentServiceRegistration
            {
                Check = new AgentServiceCheck//健康检查
                {
                    DeregisterCriticalServiceAfter = TimeSpan.FromSeconds(60),
                    Interval = TimeSpan.FromSeconds(30),
                    HTTP = $"http://{localIp.Host}:{localIp.Port}/api/health",
                    Timeout = TimeSpan.FromSeconds(3)
                },
                ID = Guid.NewGuid().ToString("N"),
                Name = serverConfiguration.ServerName,
                Address = localIp.Host,
                Port = localIp.Port,
                Tags =
                    new[]
                    {
                        serverConfiguration.ServerName
                    }
            };
            return serviceRegistration;
        }


添加健康检查接口


与上述封装可以在同一个库,避免每个web服务都要写一个


[Route("api/[Controller]")]
    public class HealthController : Controller
    {
        [HttpGet]
        public OkResult Get()
        {
            return Ok();
        }
    }


在Startup.cs对Consul封装进行调用


ConfigureServices


public void ConfigureServices(IServiceCollection services)
 {
      services.AddOptions().AddConsul(option =>
      {
          option.WithHost(Configuration["ConsulConfiguration:Host"]);
      }).AddMvc();
 }


Configure


app.UseConsul(lifetime, option =>
{
    option.WithSelfHost(Configuration["SelfHost"]);
    option.WithServerName(Configuration["ConsulConfiguration:ServerName"]);
});


K/V扩展


只实现了put、get、delete,剩下可以自行按需添加


public static class ConsulKyExtensions
    {
        public static async Task<bool> KvPutAsync(this ConsulClient consulClient, string key, string value)
        {
            var kvPair = new KVPair(key)
            {
                Value = Encoding.UTF8.GetBytes(value)
            };
            var result = await consulClient.KV.Put(kvPair);
            if (result.StatusCode == HttpStatusCode.OK)
                return result.Response;
            return false;
        }
        public static bool KvPut(this ConsulClient consulClient, string key, string value)
        {
            var kvPair = new KVPair(key)
            {
                Value = Encoding.UTF8.GetBytes(value)
            };
            var result = consulClient.KV.Put(kvPair).ConfigureAwait(false).GetAwaiter().GetResult();
            if (result.StatusCode == HttpStatusCode.OK)
                return result.Response;
            return false;
        }
        public static async Task<string> KvGetAsync(this ConsulClient consulClient, string key)
        {
            var result = await consulClient.KV.Get(key);
            return Encoding.UTF8.GetString(result.Response.Value);
        }
        public static string KvGet(this ConsulClient consulClient, string key)
        {
            var result = consulClient.KV.Get(key).ConfigureAwait(false).GetAwaiter().GetResult();
            return Encoding.UTF8.GetString(result.Response.Value);
        }
        public static async Task<bool> KvDeleteAsync(this ConsulClient consulClient, string key)
        {
            var result = await consulClient.KV.Delete(key);
            if (result.StatusCode == HttpStatusCode.OK)
                return result.Response;
            return false;
        }
        public static bool KvDelete(this ConsulClient consulClient, string key)
        {
            var result = consulClient.KV.Delete(key).ConfigureAwait(false).GetAwaiter().GetResult();
            if (result.StatusCode == HttpStatusCode.OK)
                return result.Response;
            return false;
        }
    }


部署启动


修改appsettings.json,填写目标consul地址和本服务地址


{
  "Logging": {
    "IncludeScopes": false,
    "LogLevel": {
      "Default": "Warning"
    }
  },
  "ConsulConfiguration": {
    "Host": "http://192.168.20.80:8500",
    "ServerName": "ConsulWebDemo",
    "Id": "20E2CFBB-95C0-496A-B70F-11111111"
  },
  "SelfHost": "http://localhost:1495/"
}



启动后,如果服务正常则可以显示下图效果。


image.png

目录
相关文章
|
1月前
|
存储 开发框架 JSON
ASP.NET Core OData 9 正式发布
【10月更文挑战第8天】Microsoft 在 2024 年 8 月 30 日宣布推出 ASP.NET Core OData 9,此版本与 .NET 8 的 OData 库保持一致,改进了数据编码以符合 OData 规范,并放弃了对旧版 .NET Framework 的支持,仅支持 .NET 8 及更高版本。新版本引入了更快的 JSON 编写器 `System.Text.UTF8JsonWriter`,优化了内存使用和序列化速度。
|
27天前
|
网络协议 Unix Linux
一个.NET开源、快速、低延迟的异步套接字服务器和客户端库
一个.NET开源、快速、低延迟的异步套接字服务器和客户端库
|
1月前
|
存储 消息中间件 NoSQL
Redis 入门 - C#.NET Core客户端库六种选择
Redis 入门 - C#.NET Core客户端库六种选择
54 8
|
2月前
|
开发框架 监控 前端开发
在 ASP.NET Core Web API 中使用操作筛选器统一处理通用操作
【9月更文挑战第27天】操作筛选器是ASP.NET Core MVC和Web API中的一种过滤器,可在操作方法执行前后运行代码,适用于日志记录、性能监控和验证等场景。通过实现`IActionFilter`接口的`OnActionExecuting`和`OnActionExecuted`方法,可以统一处理日志、验证及异常。创建并注册自定义筛选器类,能提升代码的可维护性和复用性。
|
2月前
|
开发框架 .NET 中间件
ASP.NET Core Web 开发浅谈
本文介绍ASP.NET Core,一个轻量级、开源的跨平台框架,专为构建高性能Web应用设计。通过简单步骤,你将学会创建首个Web应用。文章还深入探讨了路由配置、依赖注入及安全性配置等常见问题,并提供了实用示例代码以助于理解与避免错误,帮助开发者更好地掌握ASP.NET Core的核心概念。
89 3
|
27天前
|
开发框架 JavaScript 前端开发
一个适用于 ASP.NET Core 的轻量级插件框架
一个适用于 ASP.NET Core 的轻量级插件框架
|
27天前
|
开发框架 缓存 算法
开源且实用的C#/.NET编程技巧练习宝库(学习,工作,实践干货)
开源且实用的C#/.NET编程技巧练习宝库(学习,工作,实践干货)
|
1月前
|
Cloud Native API C#
.NET云原生应用实践(一):从搭建项目框架结构开始
.NET云原生应用实践(一):从搭建项目框架结构开始
|
2月前
|
开发框架 NoSQL .NET
利用分布式锁在ASP.NET Core中实现防抖
【9月更文挑战第5天】在 ASP.NET Core 中,可通过分布式锁实现防抖功能,仅处理连续相同请求中的首个请求,其余请求返回 204 No Content,直至锁释放。具体步骤包括:安装分布式锁库如 `StackExchange.Redis`;创建分布式锁服务接口及其实现;构建防抖中间件;并在 `Startup.cs` 中注册相关服务和中间件。这一机制有效避免了短时间内重复操作的问题。
|
3月前
|
jenkins 测试技术 持续交付
解锁.NET项目高效秘籍:从理论迷雾到实践巅峰,持续集成与自动化测试如何悄然改变游戏规则?
【8月更文挑战第28天】在软件开发领域,持续集成(CI)与自动化测试已成为提升效率和质量的关键工具。尤其在.NET项目中,二者的结合能显著提高开发速度并保证软件稳定性。本文将从理论到实践,详细介绍CI与自动化测试的重要性,并以ASP.NET Core Web API项目为例,演示如何使用Jenkins和NUnit实现自动化构建与测试。每次代码提交后,Jenkins自动触发构建流程,通过编译和运行NUnit测试确保代码质量。这种方式不仅节省了时间,还能快速发现并解决问题,推动.NET项目开发迈向更高水平。
48 8
下一篇
无影云桌面