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月前
|
开发框架 .NET C#
ASP.NET Core Blazor 路由配置和导航
大家好,我是码农刚子。本文系统介绍Blazor单页应用的路由机制,涵盖基础配置、路由参数、编程式导航及高级功能。通过@page指令定义路由,支持参数约束、可选参数与通配符捕获,结合NavigationManager实现页面跳转与参数传递,并演示用户管理、产品展示等典型场景,全面掌握Blazor路由从入门到实战的完整方案。
214 6
|
11月前
|
开发框架 .NET 开发者
简化 ASP.NET Core 依赖注入(DI)注册-Scrutor
Scrutor 是一个简化 ASP.NET Core 应用程序中依赖注入(DI)注册过程的开源库,支持自动扫描和注册服务。通过简单的配置,开发者可以轻松地从指定程序集中筛选、注册服务,并设置其生命周期,同时支持服务装饰等高级功能。适用于大型项目,提高代码的可维护性和简洁性。仓库地址:&lt;https://github.com/khellang/Scrutor&gt;
288 5
|
5月前
|
存储 缓存
.NET 6中Startup.cs文件注入本地缓存策略与服务生命周期管理实践:AddTransient, AddScoped, AddSingleton。
记住,选择正确的服务生命周期并妥善管理它们是至关重要的,因为它们直接影响你的应用程序的性能和行为。就像一个成功的建筑工地,工具箱如果整理得当,工具选择和使用得当,工地的整体效率将会大大提高。
226 0
|
存储 开发框架 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`,优化了内存使用和序列化速度。
266 0
|
开发框架 .NET C#
在 ASP.NET Core 中创建 gRPC 客户端和服务器
本文介绍了如何使用 gRPC 框架搭建一个简单的“Hello World”示例。首先创建了一个名为 GrpcDemo 的解决方案,其中包含一个 gRPC 服务端项目 GrpcServer 和一个客户端项目 GrpcClient。服务端通过定义 `greeter.proto` 文件中的服务和消息类型,实现了一个简单的问候服务 `GreeterService`。客户端则通过 gRPC 客户端库连接到服务端并调用其 `SayHello` 方法,展示了 gRPC 在 C# 中的基本使用方法。
258 5
在 ASP.NET Core 中创建 gRPC 客户端和服务器
|
11月前
|
开发框架 算法 中间件
ASP.NET Core 中的速率限制中间件
在ASP.NET Core中,速率限制中间件用于控制客户端请求速率,防止服务器过载并提高安全性。通过`AddRateLimiter`注册服务,并配置不同策略如固定窗口、滑动窗口、令牌桶和并发限制。这些策略可在全局、控制器或动作级别应用,支持自定义响应处理。使用中间件`UseRateLimiter`启用限流功能,并可通过属性禁用特定控制器或动作的限流。这有助于有效保护API免受滥用和过载。 欢迎关注我的公众号:Net分享 (239字符)
262 1
|
11月前
|
开发框架 缓存 .NET
GraphQL 与 ASP.NET Core 集成:从入门到精通
本文详细介绍了如何在ASP.NET Core中集成GraphQL,包括安装必要的NuGet包、创建GraphQL Schema、配置GraphQL服务等步骤。同时,文章还探讨了常见问题及其解决方法,如处理复杂查询、错误处理、性能优化和实现认证授权等,旨在帮助开发者构建灵活且高效的API。
324 3
|
存储 消息中间件 NoSQL
Redis 入门 - C#.NET Core客户端库六种选择
Redis 入门 - C#.NET Core客户端库六种选择
500 8
|
网络协议 Unix Linux
一个.NET开源、快速、低延迟的异步套接字服务器和客户端库
一个.NET开源、快速、低延迟的异步套接字服务器和客户端库
244 4
|
开发框架 JavaScript 前端开发
一个适用于 ASP.NET Core 的轻量级插件框架
一个适用于 ASP.NET Core 的轻量级插件框架
205 0