Tip: 此篇已加入.NET Core微服务基础系列文章索引
上一篇发布之后,很多人点赞和评论,不胜惶恐,这一篇把上一篇没有弄到的东西补一下,也算是给各位前来询问的朋友的一些回复吧。
一、Consul服务注册之配置文件方式
1.1 重温Consul实验集群
这里我们有三个Consul Server节点,一个Consul Client节点,在Client节点上跑了两个ClientService实例,分别占用8810和8820端口。至于基于Ocelot的API网关服务,还没有实现,留到以后跟各位分享。这里假设我们已经启动了这几个节点,并且能够成功访问这两个ClientService实例(事先把实例启动起来,可以通过IIS,也可以通过命令行启动Kerstel服务器运行)。
实例1:192.168.80.71:8810
实例2:192.168.80.71:8820
1.2 准备好json配置文件
这里我准备了一个如下所示的JSON配置文件(eg.取名为services_config.json),配置了两个服务在里边:
代码语言:javascript复制{
"services":[
{
"id": "EDC_DNC_MSAD_CLIENT_SERVICE_01",
"name" : "CAS Client Service",
"tags": [
"urlprefix-/ClientService01"
],
"address": "192.168.80.71",
"port": 8810,
"checks": [
{
"name": "clientservice_check",
"http": "http://192.168.80.71:8810/api/health",
"interval": "10s",
"timeout": "5s"
}
]
},
{
"id": "EDC_DNC_MSAD_CLIENT_SERVICE_02",
"name" : "CAS Client Service",
"tags": [
"urlprefix-/ClientService02"
],
"address": "192.168.80.71",
"port": 8820,
"checks": [
{
"name": "clientservice_check",
"http": "http://192.168.80.71:8820/api/health",
"interval": "10s",
"timeout": "5s"
}
]
}
]
}
至于配置文件的含义,这里不再赘述,和上一篇在代码中进行注册的items一致。
编辑完成后,我们在Consul Client节点中新建一个文件夹,放入json配置文件,然后启动/重启Consul Client服务:
192.168.80.71>consul agent -bind 0.0.0.0 -client 192.168.80.71 -config-dir=C:ServerConsulconfig -data-dir=C:ServerConsultempdata -node EDC.DEV.WebServer -join 192.168.80.100
启动之后,可以看到Consul已经通过扫描配置文件,去注册了这两个ClientService的实例。
1.3 通过WebUI查看服务状况
可以看到,两个ClientService实例已经成功注册。
1.4 通过API进行服务发现
URL>192.168.80.100:8500/v1/catalog/service/CAS Client Service
可以看到返回了两个服务实例的信息,当然,这里建议服务名还是不要有空格为好。此外,在服务发现的过程中,会加以一定的负载均衡策略,从这两个服务实例中选择一个返回给服务消费端,比如:随机、轮询、加权轮询、基于性能的最小连接数等等。关于这一块,会在后面的API网关实践中跟大家分享。
二、Consul集群之Key/Value存储
Consul除了可以实现服务注册和服务发现之外,还提供了强大的KV(Key/Value)存储。我们可以使用Consul的分层KV存储干任何事情,比如:动态配置,特征标记,协调,leader选举等。KV存储的API是基于http的。
2.1 查看所有KV
我们可以通过命令行在consul节点中进行查询:
192.168.80.100>curl -v http://192.168.80.100:8500/v1/kv/?recurse
可以看到,返回的是404 Not Found,可见现在木有一个Key/Value存储项。
*.关于?recurse参数=>用来指定查看多个KV
当然我们也可以通过WebUI来查看和管理KV,如下图所示,后续我们都以Shell命令行来调用API,不会进行WebUI界面的调用。
2.2 新增KV
这里假设我们要配置一个视频直播平台的账号:
192.168.80.100>curl -X PUT -d 'edisonchou' http://192.168.80.100:8500/v1/kv/web/vhallaccount
key:vhallaccount, value:edisonchou
添加后可以通过如下命令调用接口查看这个Key的Value
192.168.80.100>curl http://192.168.80.100:8500/v1/kv/web/vhallaccount
*.由于Consul的Value是经过Base64编码的(主要是为了允许非UTF-8的字符),所以这里看到的是编码后的结果。我们可以通过解码得到最终的Value值。
2.3 验证KV是否同步
由于我们调用的是Leader节点进行的KV存储,我们想要验证一下是否在另外两个节点进行了同步,否则KV只存在一个节点达不到同步的效果。
192.168.80.101 节点:
192.168.80.102 节点:
可以看到该key值已经在集群中三个节点进行了同步。
2.4 编辑KV和删除KV
编辑KV其实和添加KV完全一致,如下所示:
192.168.80.100>curl -X PUT -d 'andyai' http://192.168.80.100:8500/v1/kv/web/vhallaccount
删除KV主要用到HTTP DELETE
192.168.80.100>curl -X DELETE http://192.168.80.100:8500/v1/kv/web/vhallaccount
这里不再演示结果。
三、Consul服务告警之Watch机制
熔断保护在Consul和Ocelot中都有实现,意思就是当一个服务不正常时(比如我们的一个服务实例挂了,Consul的健康检查机制检测到了),应该给系统维护人员给以告警。在Consul中,服务告警也是通过配置文件来实现的。
3.1 添加watch.json配置文件
代码语言:javascript复制{
"watches": [
{
"type": "checks",
"handler_type": "http",
"state": "critical",
"http_handler_config": {
"path": "http://192.168.80.71:9000/notice",
"method": "POST",
"timeout": "10s",
"header": { "Authorization": [ "token" ] }
}
}
]
}
*.有关watch的细节,请参考:https://www.consul.io/docs/agent/watches.html
这里编辑完成之后,就可以放到config目录下了,后面重启Consul Client Agent服务时会加载新的watches_config.json配置文件。
3.2 添加NoticeService服务
新写一个ASP.NET Core WebAPI程序,其主要功能就是接受Consul POST过来的参数并调用方法发送电子邮件。
(1)Controller编写
代码语言:javascript复制 [Route("api/[controller]")]
public class HomeController : Controller
{
public IConfiguration Configuration { get; }
public HomeController(IConfiguration configuration)
{
Configuration = configuration;
}
[HttpPost("/notice")]
public IActionResult Notice()
{
var bytes = new byte[10240];
var i = Request.Body.ReadAsync(bytes, 0, bytes.Length);
var content = System.Text.Encoding.UTF8.GetString(bytes).Trim('