一句话

用agent更优雅,适合agent遍布每个应用机的情况。用catalog更直接,操作更方便

前言

今天遇到写一个服务启动自注册的逻辑时产生了一点纠结,可以使用agent对象的register方法进行注册,也可以使用catalog的register方法进行注册。那么,两种方式有什么区别呢?

agent对象

new 一个consulClient对象,应当是作为一个软consul agent

对API URL对应的节点的属性没有要求. 其可以是server身份也可以是纯agent身份

数据要经过冲突确认后,再存入catalog中

反注册时只可以反注册自身的节点(主机)上的服务,注册时可以注册其他主机上的服务

catalog

connect to consul database

连接的节点应当是server节点

操作后数据立马生效

反注册对所有节点生效

用途

编写反注册节点的服务应使用catalog的方法

使用agent方法反注册服务时,需要指定一个serviceID参数,该ID是的唯一维度是node也就是主机唯一的。因此从catalog进行反注册时最好是提供主机名和服务ID,当然也可以是IP和服务ID,服务名和服务ID的结合我没有尝试过。

案例

实现反注册节点的逻辑

用途:删除已经失效的主机信息,用于取消报警触发

// 根据IP删除节点

func (c *ConsulHelper) DropNodeByIP(ip string) error {

// STEP1: 查找IP在Consul中对应的NodeName

nodeName, err := c.FindNodeNameByIP(ip)

if err != nil {

return err

}

p.Infof("Find node %s by ip %s success, ", nodeName, ip)

// STEP2: 调用DropNode删除节点

err = c.DropNode(nodeName)

if err != nil {

p.Errorf("Drop Node by ip: %s failed, %+v", ip, err)

return err

}

return nil

}

func (c *ConsulHelper) DropNode(nodeName string) error {

var bom = consul.CatalogDeregistration{

Node: nodeName,

Datacenter: common.CONF.Consul.DataCenter,

}

_, err := c.API.Catalog().Deregister(&bom, nil)

return err

}

func (c *ConsulHelper) DropSelfNode() error {

return c.DropNode(c.hostUniqueName)

}

实现反注册服务的逻辑

用途:服务启动时向consul注册自身,服务正常关闭时将自身从consul中反注册

```c#

///

/// 反注册服务(使用catalog实现)

///

///

///

///

public WriteResult DeregisterService(string nodeIP, string serviceID)

{

this.logger.LogDebug($"Now start DeregisterService in {nodeIP}, service:{serviceID}");

var x = new CatalogDeregistration { Datacenter = "dc1", Address = nodeIP, ServiceID= serviceID };

return this.consul.Catalog.Deregister(x).Result;

}

///

/// 注册服务(使用Agent实现)

///

///

public void RegisterService(AgentServiceRegistration serviceRegistration)

{

this.logger.LogDebug("Now do service register");

this.consul.Agent.ServiceRegister(serviceRegistration);

}

///

/// 反注册本机上的服务(使用Agent实现)

///

/// 本机唯一的服务ID

public void DeregisterSelfNodeService(string serviceID)

{

this.logger.LogDebug("Now do service deregister");

this.consul.Agent.ServiceDeregister(serviceID);

}

private void OnStarted(IConsulService consulService)

{

var exposedHTTPURL = this.Configuration["Kestrel:EndPoints:Http:Url"];

var stringPort = exposedHTTPURL.Split(":")[^1];

consulService.RegisterSelfProject(int.Parse(stringPort));

}

private void OnStopped(IConsulService consulService)

{

var exposedHTTPURL = this.Configuration["Kestrel:EndPoints:Http:Url"];

var stringPort = exposedHTTPURL.Split(":")[^1];

consulService.DeregisterSelfProject(int.Parse(stringPort));

}

输出:

```bash

2020/04/23 17:59:26 [WARN] agent: Node name "PsyDuck.local" will not be discoverable via DNS due to invalid characters. Valid characters include all alpha-numerics and dashes.

2020/04/23 17:59:26 [INFO] raft: Restored from snapshot 13-163854-1558515302742

2020/04/23 17:59:26 [INFO] raft: Initial configuration (index=1): [{Suffrage:Voter ID:e15ef033-ec5c-f2c5-4679-43fdfa69f508 Address:10.100.100.1:8300}]

2020/04/23 17:59:26 [INFO] raft: Node at 127.0.0.1:8300 [Follower] entering Follower state (Leader: "")

2020/04/23 17:59:26 [INFO] serf: EventMemberJoin: PsyDuck.local.dc1 127.0.0.1

2020/04/23 17:59:26 [WARN] serf: Failed to re-join any previously known node

2020/04/23 17:59:26 [INFO] serf: EventMemberJoin: PsyDuck.local 127.0.0.1

2020/04/23 17:59:26 [WARN] serf: Failed to re-join any previously known node

2020/04/23 17:59:26 [INFO] consul: Adding LAN server PsyDuck.local (Addr: tcp/127.0.0.1:8300) (DC: dc1)

2020/04/23 17:59:26 [INFO] consul: Handled member-join event for server "PsyDuck.local.dc1" in area "wan"

2020/04/23 17:59:26 [INFO] agent: Started DNS server 0.0.0.0:8600 (tcp)

2020/04/23 17:59:26 [INFO] agent: Started DNS server 0.0.0.0:8600 (udp)

2020/04/23 17:59:26 [INFO] agent: Started HTTP server on [::]:8500 (tcp)

2020/04/23 17:59:26 [INFO] agent: started state syncer

2020/04/23 17:59:33 [ERR] agent: failed to sync remote state: No cluster leader

2020/04/23 17:59:35 [WARN] raft: Heartbeat timeout from "" reached, starting election

2020/04/23 17:59:35 [INFO] raft: Node at 127.0.0.1:8300 [Candidate] entering Candidate state in term 14

2020/04/23 17:59:35 [INFO] raft: Election won. Tally: 1

2020/04/23 17:59:35 [INFO] raft: Node at 127.0.0.1:8300 [Leader] entering Leader state

2020/04/23 17:59:35 [INFO] consul: cluster leadership acquired

2020/04/23 17:59:35 [INFO] consul: New leader elected: PsyDuck.local

2020/04/23 17:59:35 [INFO] consul: member 'PsyDuck.local' joined, marking health alive

2020/04/23 17:59:36 [INFO] agent: Synced node info

==> Failed to check for updates: Get https://checkpoint-api.hashicorp.com/v1/check/consul?arch=amd64&os=darwin&signature=01a8a19a-0919-6b96-8aa1-eaf5f977a351&version=1.4.2: net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)

2020/04/23 18:00:05 [WARN] agent: Service name "监控系统" will not be discoverable via DNS due to invalid characters. Valid characters include all alpha-numerics and dashes.

2020/04/23 18:00:05 [INFO] agent: Synced service "监控系统@127.0.0.1:5007"

2020/04/23 18:00:29 [INFO] agent: Deregistered service "监控系统@127.0.0.1:5007"

2020/04/23 18:02:06 [INFO] agent: Synced service "DBAMonitorAPI@127.0.0.1:5007"

将mysql服务注册到consul_【NoSQL】Consul中服务注册的两种方式相关推荐

  1. 使用mysql创建外键约束_Mysql创建外键约束的两种方式

    通过给mysql的表字段添加外键约束,可以有效的保持数据的一致性和完整性,数据就不会很容易出问题. 1.创建表时直接创建外键约束create table books( bookid number(10 ...

  2. MySQL 清空表数据的两种方式和区别

    在MySQL中删除数据有两种方式:truncate table 表名.delete from 表名. 它们在以下方面存在区别: 执行效率 truncate不扫描表,相当于重新创建了表,只保留了表的结构 ...

  3. mysql不停止重启服务器_不停止MySQL服务增加从库的两种方式

    现在生产环境MySQL数据库是一主一从,由于业务量访问不断增大,故再增加一台从库.前提是不能影响线上业务使用,也就是说不能重启MySQL服务,为了避免出现其他情况,选择在网站访问量低峰期时间段操作. ...

  4. mysql增加从库_不停止MySQL服务增加从库的两种方式 (装载)

    现在生产环境MySQL数据库是一主一从,由于业务量访问不断增大,故再增加一台从库.前提是不能影响线上业务使用,也就是说不能重启MySQL服务,为了避免出现其他情况,选择在网站访问量低峰期时间段操作. ...

  5. mysql 停从库_不停止 MySQL 服务增加从库的两种方式

    现在生产环境MySQL数据库是一主一从,由于业务量访问不断增大,故再增加一台从库.前提是不能影响线上业务使用,也就是说不能重启MySQL服务,为了避免出现其他情况,选择在网站访问量低峰期时间段操作. ...

  6. 不停止MySQL服务增加从库的两种方式

    本文出自51CTO博客博主李振良的技术博客,如有任何问题请进入博主页面互动讨论. 博文地址:http://lizhenliang.blog.51cto.com/7876557/1669829 现在生产 ...

  7. mysql主库从库在同一台服务器_通过两种方式增加从库——不停止mysql服务

    一般在线增加从库有两种方式,一种是通过mysqldump备份主库,恢复到从库,mysqldump是逻辑备份,数据量大时,备份速度会很慢,锁表的时间也会很长.另一种是通过xtrabackup工具备份主库 ...

  8. Windows注册服务的两种方式,并设置服务开机自启

    目录 第一种方式: 下载instsrv.exe和srvany.exe 用管理员身份运行"命令提示符"工具 用"注册表编辑器"将服务替换为自己需要的功能 修改完注 ...

  9. mysql 从库_通过两种方式增加从库——不停止mysql服务

    一般在线增加从库有两种方式,一种是通过mysqldump备份主库,恢复到从库,mysqldump是逻辑备份,数据量大时,备份速度会很慢,锁表的时间也会很长.另一种是通过xtrabackup工具备份主库 ...

最新文章

  1. charts混合使用 elementui和e_vue模块化(echart+element ui)
  2. android javamail获取邮件太多太慢_结合 Spring 发送邮件的4种正确姿势,你知道几种?...
  3. 【必看】如何在 Linux 上恢复误删除的文件或目录
  4. echarts mysql scrapy_抓取58job, 赶集job以及智联招聘,并使用数据分析生成echarts图...
  5. B站Up主上传质量调优实践
  6. centos文件服务器软件,seafile服务器端的centos8的快速部署
  7. vbs当计算机重启,用vbs实现重新启动 Internet Explorer
  8. Quick BI产品核心功能大图(六)开放集成
  9. 转载一篇杨澜的演讲稿——关于孩子的想象力创造力
  10. mysql 以周为单位记录数据_mysql 按月/按周汇总统计函数 DATE_FORMAT() 函数
  11. redhat/centos下的lamp
  12. 优秀课程案例:使用Scratch制作俄罗斯方块哈利·波特魔法消除版!
  13. 大一计算机理论知识测试题,2017计算机基础大一考试试题「附答案」
  14. 继电保护整定值计算软件_电力系统继电保护整定计算与应用实例
  15. 图形2.5 Bump Map的改进(凹凸映射)
  16. Mybatis plus 修改密码
  17. mysql 体重 类型 身高_用身高和体重数据进行分类实验
  18. Linux基础——防火墙(一)
  19. 爬虫学习笔记-scrapy框架介绍
  20. CleanMyMac X4最新版测评效果及功能下载

热门文章

  1. ECharts 学习和使用——一切都在官网文档里
  2. 做亚马逊测评需要哪些成本?
  3. 电脑四核处理器与双核处理器的区别?
  4. 新年伊始,我们共赴数据盛宴,与未来对话 !​(文末有彩蛋)
  5. 大数据学习笔记之strom----实时流处理引擎
  6. Python:list和dict的数据类型基础操作
  7. vscode标签插件bookmarks
  8. 实时查询引擎 - Apache Drill 介绍与应用
  9. python 数据结构转换层_[mcj]使用OpenCV深度学习进行性别和年龄分类(C++/Python)...
  10. Jenkins出现错误Warnings have been published for the following currently installed components