.NET Core微服务之路:基于Consul最少集群实现服务的注册与发现(二)

简介: 重温Consul最少化集群的搭建     我们再复习一下上一篇的内容,先建立三台consul server节点,两个consul client节点,分别在每个节点上跑不同(名称不同而已)的实例。

重温Consul最少化集群的搭建

 
  我们再复习一下上一篇的内容,先建立三台consul server节点,两个consul client节点,分别在每个节点上跑不同(名称不同而已)的实例。我们先通过vmware启动这五个节点,并且能成功访问这个两个client节点的实例。(具体配置可以见上一篇)
 
  通过配置文件自动生成服务
{
  "services": [
    {
      "id": "CLIENT_SERVICE_01",
      "name": "CAS Client Service",
      "tags": [
        "urlprefix-/ClientService01"
      ],
      "address": "192.168.153.132",
      "port": 5000,
      "checks": [
        {
          "name": "clientservice_check01",
          "http": "http://192.168.53.132:5000/api/health",
          "interval": "10s",
          "timeout": "5s"
        }
      ]
    },
    {
      "id": "CLIENT_SERVICE_02",
      "name": "CAS Client Service",
      "tags": [
        "urlprefix-/ClientService02"
      ],
      "address": "192.168.153.132",
      "port": 5001,
      "checks": [
        {
          "name": "clientservice_check02",
          "http": "http://192.168.153.132:5001/api/health",
          "interval": "10s",
          "timeout": "5s"
        }
      ]
    }
  ]
}

 

添加KEY/VALUE  

curl -X PUT -d 'edisonchou' http://192.168.80.100:8500/v1/kv/web/vhallaccount
  我们通过 http://192.168.153.129:8500/v1/kv/?recurse来查看这个值是否添加到Consul中
   再验证是否已经同步到其他Consul服务端,先看129,注意加粗字体
[root@localhost ~]# ./consul kv get web/vhallaccount
stevelee
[root@localhost ~]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: ens32: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast state DOWN group default qlen 1000
    link/ether 00:0c:29:a6:a1:1c brd ff:ff:ff:ff:ff:ff
3: ens34: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0c:29:a6:a1:26 brd ff:ff:ff:ff:ff:ff
    inet 192.168.153.129/24 brd 192.168.153.255 scope global noprefixroute ens34
       valid_lft forever preferred_lft forever
    inet6 fe80::6d21:aa51:2262:b80f/64 scope link noprefixroute
       valid_lft forever preferred_lft forever

   再看130的Consul服务端

[root@localhost ~]# ./consul kv get web/vhallaccount
stevelee
[root@localhost ~]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: ens32: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0c:29:2c:c2:fc brd ff:ff:ff:ff:ff:ff
    inet 192.168.153.130/24 brd 192.168.153.255 scope global noprefixroute ens32
       valid_lft forever preferred_lft forever
    inet6 fe80::6114:ed9c:c49d:649b/64 scope link noprefixroute
       valid_lft forever preferred_lft forever
3: ens34: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0c:29:2c:c2:06 brd ff:ff:ff:ff:ff:ff
    inet 192.168.153.170/24 brd 192.168.153.255 scope global noprefixroute dynamic ens34
       valid_lft 1216sec preferred_lft 1216sec
    inet6 fe80::a67c:7966:8767:27fb/64 scope link noprefixroute
       valid_lft forever preferred_lft forever

 

   我们也可以通过Consul WEB UI来编辑KV值。

 

 Consul服务的Watch机制

   熔断保护在Consul和Ocelot中都有实现,意思就是当一个服务不正常时(比如我们的一个服务实例挂了,Consul的健康检查机制检测到了),应该给系统维护人员给以告警。在Consul中,服务告警也是通过配置文件来实现的。

{
  "watches": [
    {
      "type": "checks",
      "handler_type": "http",
      "state": "critical",
      "http_handler_config": {
        "path": "http://192.168.153.132:9000/notice",
        "method": "POST",
        "timeout": "10s",
        "header": { "Authorization": [ "token" ] }
      }
    }
  ]
}

  我们再新建一个项目,建立一个控制器,用默认的HomController控制器也可以,键入如下代码:

[Produces("application/json")]
public class HomeController : Controller
{
    [HttpPost]
    [Route("/notice")]
    public IActionResult Notice()
    {
        var stream = HttpContext.Request.Body;
        if (HttpContext.Request.ContentLength != null)
        {
            var buffer = new byte[HttpContext.Request.ContentLength.Value];
            stream.Read(buffer, 0, buffer.Length);
            var content = Encoding.UTF8.GetString(buffer);

            var path = $"{AppDomain.CurrentDomain.BaseDirectory}{DateTime.Now:hh_mm_ss_ffff}.log";
            if (!System.IO.File.Exists(path))
            {
                System.IO.File.Create(path).Close();
            }

            using (var sw = new StreamWriter(path))
            {
                sw.Write(content);
                sw.Flush();
                sw.Close();
            }

            return Ok();
        }

        throw new Exception("post is null");
    }
}
  功能很简单,做一个接受消息的客户端,POST方法,代码不解释。
  当我们把5000端口上的服务停掉,会出现什么样的情况呢?132Consul的客户端服务器就会出现:5000/api/health无法访问的问题。
2018/10/17 04:03:10 [WARN] agent: Check "service:CLIENT_SERVICE_01" HTTP request failed: Get http://192.168.153.132:5000/api/health: dial tcp 192.168.153.132:5000: connect: connection refused
2018/10/17 04:03:10 [INFO] agent: Synced check "service:CLIENT_SERVICE_01"
2018/10/17 04:03:20 [WARN] agent: Check "service:CLIENT_SERVICE_01" HTTP request failed: Get http://192.168.153.132:5000/api/health: dial tcp 192.168.153.132:5000: connect: connection refused
2018/10/17 04:03:30 [WARN] agent: Check "service:CLIENT_SERVICE_01" HTTP request failed: Get http://192.168.153.132:5000/api/health: dial tcp 192.168.153.132:5000: connect: connection refused
2018/10/17 04:03:40 [WARN] agent: Check "service:CLIENT_SERVICE_01" HTTP request failed: Get http://192.168.153.132:5000/api/health: dial tcp 192.168.153.132:5000: connect: connection refused
2018/10/17 04:03:50 [WARN] agent: Check "service:CLIENT_SERVICE_01" HTTP request failed: Get http://192.168.153.132:5000/api/health: dial tcp 192.168.153.132:5000: connect: connection refused
2018/10/17 04:04:00 [WARN] agent: Check "service:CLIENT_SERVICE_01" HTTP request failed: Get http://192.168.153.132:5000/api/health: dial tcp 192.168.153.132:5000: connect: connection refused

  Watch机制会每隔10s向http://192.168.153.132:9000/notice发送一组json格式的消息,内容如下

[{
    "Node": "LZZ.DEV.WebServer",
    "CheckID": "service:CLIENT_SERVICE_01",
    "Name": "clientservice_check01",
    "Status": "critical",
    "Notes": "",
    "Output": "Get http://192.168.153.132:5000/api/health: dial tcp 192.168.153.132:5000: connect: connection refused",
    "ServiceID": "CLIENT_SERVICE_01",
    "ServiceName": "CAS Client Service",
    "ServiceTags": ["urlprefix-/ClientService01"],
    "Definition": {
        "HTTP": "",
        "Header": null,
        "Method": "",
        "TLSSkipVerify": false,
        "TCP": "",
        "Interval": "0s",
        "Timeout": "0s",
        "DeregisterCriticalServiceAfter": "0s"
    }
}]
  你也可以将上面的notice方法替换为其他消息通知的方法,比如邮件,比如短信,我更推荐用短信模式,这样能马上告诉运维人员,有节点挂了,该去加班了。
  综合之前上一篇的介绍,目前看Consul的Web控制台,已经出现了10个微服务了(不包括系统)!

 

 

相关文章
|
6月前
|
开发框架 .NET C#
ASP.NET Core Blazor 路由配置和导航
大家好,我是码农刚子。本文系统介绍Blazor单页应用的路由机制,涵盖基础配置、路由参数、编程式导航及高级功能。通过@page指令定义路由,支持参数约束、可选参数与通配符捕获,结合NavigationManager实现页面跳转与参数传递,并演示用户管理、产品展示等典型场景,全面掌握Blazor路由从入门到实战的完整方案。
535 6
|
开发框架 .NET 开发者
简化 ASP.NET Core 依赖注入(DI)注册-Scrutor
Scrutor 是一个简化 ASP.NET Core 应用程序中依赖注入(DI)注册过程的开源库,支持自动扫描和注册服务。通过简单的配置,开发者可以轻松地从指定程序集中筛选、注册服务,并设置其生命周期,同时支持服务装饰等高级功能。适用于大型项目,提高代码的可维护性和简洁性。仓库地址:&lt;https://github.com/khellang/Scrutor&gt;
504 5
|
存储 开发框架 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`,优化了内存使用和序列化速度。
342 0
|
开发框架 .NET C#
在 ASP.NET Core 中创建 gRPC 客户端和服务器
本文介绍了如何使用 gRPC 框架搭建一个简单的“Hello World”示例。首先创建了一个名为 GrpcDemo 的解决方案,其中包含一个 gRPC 服务端项目 GrpcServer 和一个客户端项目 GrpcClient。服务端通过定义 `greeter.proto` 文件中的服务和消息类型,实现了一个简单的问候服务 `GreeterService`。客户端则通过 gRPC 客户端库连接到服务端并调用其 `SayHello` 方法,展示了 gRPC 在 C# 中的基本使用方法。
404 5
在 ASP.NET Core 中创建 gRPC 客户端和服务器
|
开发框架 算法 中间件
ASP.NET Core 中的速率限制中间件
在ASP.NET Core中,速率限制中间件用于控制客户端请求速率,防止服务器过载并提高安全性。通过`AddRateLimiter`注册服务,并配置不同策略如固定窗口、滑动窗口、令牌桶和并发限制。这些策略可在全局、控制器或动作级别应用,支持自定义响应处理。使用中间件`UseRateLimiter`启用限流功能,并可通过属性禁用特定控制器或动作的限流。这有助于有效保护API免受滥用和过载。 欢迎关注我的公众号:Net分享 (239字符)
368 1
|
开发框架 缓存 .NET
GraphQL 与 ASP.NET Core 集成:从入门到精通
本文详细介绍了如何在ASP.NET Core中集成GraphQL,包括安装必要的NuGet包、创建GraphQL Schema、配置GraphQL服务等步骤。同时,文章还探讨了常见问题及其解决方法,如处理复杂查询、错误处理、性能优化和实现认证授权等,旨在帮助开发者构建灵活且高效的API。
431 3
|
开发框架 监控 前端开发
在 ASP.NET Core Web API 中使用操作筛选器统一处理通用操作
【9月更文挑战第27天】操作筛选器是ASP.NET Core MVC和Web API中的一种过滤器,可在操作方法执行前后运行代码,适用于日志记录、性能监控和验证等场景。通过实现`IActionFilter`接口的`OnActionExecuting`和`OnActionExecuted`方法,可以统一处理日志、验证及异常。创建并注册自定义筛选器类,能提升代码的可维护性和复用性。
278 3
|
开发框架 .NET 中间件
ASP.NET Core Web 开发浅谈
本文介绍ASP.NET Core,一个轻量级、开源的跨平台框架,专为构建高性能Web应用设计。通过简单步骤,你将学会创建首个Web应用。文章还深入探讨了路由配置、依赖注入及安全性配置等常见问题,并提供了实用示例代码以助于理解与避免错误,帮助开发者更好地掌握ASP.NET Core的核心概念。
382 3
|
开发框架 NoSQL .NET
利用分布式锁在ASP.NET Core中实现防抖
【9月更文挑战第5天】在 ASP.NET Core 中,可通过分布式锁实现防抖功能,仅处理连续相同请求中的首个请求,其余请求返回 204 No Content,直至锁释放。具体步骤包括:安装分布式锁库如 `StackExchange.Redis`;创建分布式锁服务接口及其实现;构建防抖中间件;并在 `Startup.cs` 中注册相关服务和中间件。这一机制有效避免了短时间内重复操作的问题。
380 4
|
开发框架 JavaScript 前端开发
一个适用于 ASP.NET Core 的轻量级插件框架
一个适用于 ASP.NET Core 的轻量级插件框架
272 0