当前位置: 首页 > 编程日记 > 正文

【阿圆实验】Consul HA 高可用方案


 一、建立Consul Cluster环境

利用Consul提供的服务实现服务的注册与发现,需要建立Consul Cluster。在Consul方案中,每个提供服务的节点上都要部署和运行Consul的agent,所有运行Consul agent节点的集合构成Consul Cluster。Consul agent有两种运行模式:Server和Client。这里的Server和Client只是Consul集群层面的区分,与搭建在Cluster之上 的应用服务无关。以Server模式运行的Consul agent节点用于维护Consul集群的状态,官方建议每个Consul Cluster至少有3个或以上的运行在Server mode的Agent,Client节点不限。

Consul架构说明

注:准备至少3台机器部署consul。

二.consul集群配置

两种配置方式:《1》通过进程管理器(supervisor)配置。前提是consul已经被supervisor管理,因此推荐新手使用命令行方式配置consul集群。

                         《2》通过consul命令行配置(此方式配置的consul集群将不被supervisor管理,在supervisor进程管理器上的状态会显示为FATAL)。

注:若是docker启动的,建议用命令行方式配置consul集群。

《1》通过进程管理器配置

1.修改启动脚本命令(以3台机器为例)

关闭防火墙

systemctl stop firewalld

vi /etc/supervisord.d/supervisor.ini

选取一台机器配置
[program:consul]
priority = 1
user = yy
command =
    /usr/bin/consul
        agent
        -server
        -data-dir="/data/yy-monitor-server/data/consul-data"
        -bootstrap-expect=3       #集群中最少consul实例数为3
        -client="0.0.0.0"
        -bind="本机ip"            # 如 -bind="10.22.0.1002" 
        -ui
stdout_logfile = /data/yy-monitor-server/log/consul.log
stderr_logfile = /data/yy-monitor-server/log/consul.log
autorestart = true
其他机器配置
[program:consul]
priority = 1
user = yy
command =
    /usr/bin/consul
        agent
        -server
        -data-dir="/data/yy-monitor-server/data/consul-data"
        -client="0.0.0.0"
        -bind="本机ip"             # 如-bind="10.22.0.1001"
        join=“其他consul ip”     # 如join=“10.22.0.1002”
        -ui
stdout_logfile = /data/yy-monitor-server/log/consul.log
stderr_logfile = /data/yy-monitor-server/log/consul.log
autorestart = true

2.重启配置

#systemctl restart supervisord

# supervisorctl restart consul

3.查看日志

tail -300f consul.log

其中一台主机上的consul日志
==> Starting Consul agent...
==> Consul agent running!
           Version: 'v0.9.2'
           Node ID: '035f828b-8db9-8cb1-a3a8-8eabf5e821c4'
         Node name: 'monitor-test-02.yfb.sun.cn'
        Datacenter: 'dc1'
            Server: true (bootstrap: false)
       Client Addr: 0.0.0.0 (HTTP: 8500, HTTPS: -1, DNS: 8600)
      Cluster Addr: 10.22.0.1001 (LAN: 8301, WAN: 8302)
    Gossip encrypt: false, RPC-TLS: false, TLS-Incoming: false
==> Log data will now stream in as it occurs:
    2018/08/27 13:43:20 [INFO] raft: Restored from snapshot 1370-114688-1535337744933
    2018/08/27 13:43:20 [INFO] raft: Initial configuration (index=117709): [{Suffrage:Voter ID:10.22.0.1001:8300 Address:10.22.0.1001:8300} {Suffrage:Voter ID:10.22.0.1002:8300 Address:10.22.0.1002:8300} {Suffrage:Voter ID:10.22.0.1000:8300 Address:10.22.0.1000:8300}]
    2018/08/27 13:43:20 [INFO] serf: EventMemberJoin: monitor-test-02.yfb.sun.cn.dc1 10.22.0.1001
    2018/08/27 13:43:20 [INFO] raft: Node at 10.22.0.1001:8300 [Follower] entering Follower state (Leader: "")
    2018/08/27 13:43:20 [INFO] serf: Attempting re-join to previously known node: n2.dc1: 10.22.0.1001:8302
    2018/08/27 13:43:20 [INFO] serf: EventMemberJoin: monitor-test-02.yfb.sun.cn 10.22.0.1001
    2018/08/27 13:43:20 [INFO] agent: Started DNS server 0.0.0.0:8600 (udp)
    2018/08/27 13:43:20 [INFO] serf: Attempting re-join to previously known node: monitor-test-01.yfb.sun.cn: 10.22.0.1000:8301
    2018/08/27 13:43:20 [INFO] consul: Adding LAN server monitor-test-02.yfb.sun.cn (Addr: tcp/10.22.0.1001:8300) (DC: dc1)
    2018/08/27 13:43:20 [INFO] consul: Handled member-join event for server "monitor-test-02.yfb.sun.cn.dc1" in area "wan"
    2018/08/27 13:43:20 [INFO] agent: Started DNS server 0.0.0.0:8600 (tcp)
    2018/08/27 13:43:20 [INFO] agent: Started HTTP server on [::]:8500
    2018/08/27 13:43:20 [INFO] serf: Re-joined to previously known node: n2.dc1: 10.22.0.1001:8302
    2018/08/27 13:43:20 [WARN] memberlist: Refuting a suspect message (from: monitor-test-02.yfb.sun.cn)
    2018/08/27 13:43:20 [INFO] serf: EventMemberJoin: monitor-test-03.yfb.sun.cn 10.22.0.1002
    2018/08/27 13:43:20 [INFO] serf: EventMemberJoin: monitor-test-01.yfb.sun.cn 10.22.0.1000
    2018/08/27 13:43:20 [INFO] serf: Re-joined to previously known node: monitor-test-01.yfb.sun.cn: 10.22.0.1000:8301
    2018/08/27 13:43:20 [INFO] consul: Adding LAN server monitor-test-03.yfb.sun.cn (Addr: tcp/10.22.0.1002:8300) (DC: dc1)
    2018/08/27 13:43:20 [INFO] consul: Adding LAN server monitor-test-01.yfb.sun.cn (Addr: tcp/10.22.0.1000:8300) (DC: dc1)
    2018/08/27 13:43:20 [INFO] serf: EventMemberJoin: monitor-test-01.yfb.sun.cn.dc1 10.22.0.1000
    2018/08/27 13:43:20 [WARN] memberlist: Refuting an alive message
    2018/08/27 13:43:20 [INFO] serf: EventMemberJoin: monitor-test-03.yfb.sun.cn.dc1 10.22.0.1002
    2018/08/27 13:43:20 [INFO] consul: Handled member-join event for server "monitor-test-01.yfb.sun.cn.dc1" in area "wan"
    2018/08/27 13:43:20 [INFO] consul: Handled member-join event for server "monitor-test-03.yfb.sun.cn.dc1" in area "wan"
    2018/08/27 13:43:20 [INFO] agent: Synced node info
    2018/08/27 13:43:54 [INFO] memberlist: Suspect monitor-test-01.yfb.sun.cn has failed, no acks received
    2018/08/27 13:43:54 [INFO] serf: EventMemberUpdate: monitor-test-01.yfb.sun.cn
    2018/08/27 13:43:55 [INFO] serf: EventMemberUpdate: monitor-test-01.yfb.sun.cn.dc1
    2018/08/27 13:43:56 [INFO] serf: EventMemberUpdate: monitor-test-01.yfb.sun.cn.dc1
    2018/08/27 13:43:57 [INFO] serf: EventMemberUpdate: monitor-test-01.yfb.sun.cn
==> Failed to check for updates: Get https://checkpoint-api.hashicorp.com/v1/check/consul?arch=amd64&os=linux&signature=143c3fc1-0a07-2f4e-79e3-528773c5260f&version=0.9.2: dial tcp 54.221.203.30:443: i/o timeout
    2018/08/27 13:44:01 [WARN] raft: Rejecting vote request from 10.22.0.1002:8300 since we have a leader: 10.22.0.1000:8300
    2018/08/27 13:44:01 [INFO] consul: New leader elected: monitor-test-03.yfb.sun.cn

注:更新异常可忽略,内网云桌面不能连接github。

4 查看当前节点信息

使用命令  consul info

每次启动之后,都会有一台部署有consul的机器被选举为leader节点:

其他consul节点
state = Follower

5.ui页面

访问任意节点localhost:8500  ,如下图

《2》通过consul命令行配置

1.部署前

关闭防火墙

#因consul集群间需通信,关闭部署monitor的虚拟机的防火墙

systemctl stop firewalld


分别进入到monitor的容器中

#monitor-server为容器名,按实际情况修改
docker exec -it monitor-server /bin/bash 
#停止consul
supervisorctl stop consul
[root@monitor-test-01 ~]# supervisorctl
alertmanager                     RUNNING   pid 22016, uptime 21:28:23
consul                           RUNNING   pid 11109, uptime 0:00:07
dashboard-upgrade                EXITED    Aug 14 05:51 PM
yy-echo-webhook                RUNNING   pid 22025, uptime 21:28:23
grafana                          RUNNING   pid 22015, uptime 21:28:23
nginx                            RUNNING   pid 22017, uptime 21:28:23
node_exporter                    RUNNING   pid 22020, uptime 21:28:23
prometheus                       RUNNING   pid 22018, uptime 21:28:23
supervisor> stop consul
consul: stopped

server:
1.1 部署主节点

运行命令:consul agent -server -bootstrap-expect 以sever方式运行的主机个数 -client 0.0.0.0 -bind 主机地址 -data-dir=/home/consul/ -ui &
[root@monitor-test-01 ~]# consul agent -server -bootstrap-expect 3 -client 0.0.0.0 -bind 10.22.0.1000 -data-dir=/home/consul/ -ui &
==> WARNING: Expect Mode enabled, expecting 3 servers
==> Starting Consul agent...
==> Consul agent running!
           Version: 'v0.9.2'
           Node ID: '8fea634e-c3d6-32ef-f8d4-4ed1a2c0ee42'
         Node name: 'monitor-test-01.yfb.sun.cn'
        Datacenter: 'dc1'
            Server: true (bootstrap: false)
       Client Addr: 0.0.0.0 (HTTP: 8500, HTTPS: -1, DNS: 8600)
      Cluster Addr: 10.22.0.1000 (LAN: 8301, WAN: 8302)
    Gossip encrypt: false, RPC-TLS: false, TLS-Incoming: false
==> Log data will now stream in as it occurs:
    2018/08/15 16:40:26 [INFO] raft: Initial configuration (index=1): [{Suffrage:Voter ID:10.22.0.1000:8300 Address:10.22.0.1000:8300} {Suffrage:Voter ID:10.22.0.1001:8300 Address:10.22.0.1001:8300} {Suffrage:Voter ID:10.22.0.1002:8300 Address:10.22.0.1002:8300}]
    2018/08/15 16:40:26 [INFO] serf: EventMemberJoin: monitor-test-01.yfb.sun.cn.dc1 10.22.0.1000
    2018/08/15 16:40:26 [INFO] serf: EventMemberJoin: monitor-test-01.yfb.sun.cn 10.22.0.1000
    2018/08/15 16:40:26 [INFO] agent: Started DNS server 0.0.0.0:8600 (udp)
    2018/08/15 16:40:26 [INFO] raft: Node at 10.22.0.1000:8300 [Follower] entering Follower state (Leader: "")
    2018/08/15 16:40:26 [INFO] serf: Attempting re-join to previously known node: monitor-test-02.yfb.sun.cn.dc1: 10.22.0.1001:8302
    2018/08/15 16:40:26 [INFO] serf: Attempting re-join to previously known node: monitor-test-02.yfb.sun.cn: 10.22.0.1001:8301
    2018/08/15 16:40:26 [INFO] consul: Adding LAN server monitor-test-01.yfb.sun.cn (Addr: tcp/10.22.0.1000:8300) (DC: dc1)

1.2 其他机器运行命令:

consul agent -server -retry-join 主节点ip地址 -bind 本机ip地址 -client 0.0.0.0 -data-dir=/home/consul/ -ui &
[root@monitor-test-02 ~]# consul agent -server -retry-join 10.22.0.1000 -bind 10.22.0.1001 -client 0.0.0.0 -data-dir=/home/consul/ -ui &
==> Starting Consul agent...
==> Consul agent running!
           Version: 'v0.9.2'
           Node ID: '9e35e3c2-9226-de85-2202-2d70e516f7b7'
         Node name: 'monitor-test-02.yfb.sun.cn'
        Datacenter: 'dc1'
            Server: true (bootstrap: false)
       Client Addr: 127.0.0.1 (HTTP: 8500, HTTPS: -1, DNS: 8600)
      Cluster Addr: 10.22.0.1001 (LAN: 8301, WAN: 8302)
    Gossip encrypt: false, RPC-TLS: false, TLS-Incoming: false
==> Log data will now stream in as it occurs:
    2018/08/15 16:32:51 [INFO] raft: Initial configuration (index=0): []
    2018/08/15 16:32:51 [INFO] serf: EventMemberJoin: monitor-test-02.yfb.sun.cn.dc1 10.22.0.1001
    2018/08/15 16:32:51 [INFO] serf: EventMemberJoin: monitor-test-02.yfb.sun.cn 10.22.0.1001
    2018/08/15 16:32:51 [INFO] agent: Started DNS server 127.0.0.1:8600 (udp)
    2018/08/15 16:32:51 [INFO] raft: Node at 10.22.0.1001:8300 [Follower] entering Follower state (Leader: "")
    2018/08/15 16:32:51 [WARN] serf: Failed to re-join any previously known node
    2018/08/15 16:32:51 [WARN] serf: Failed to re-join any previously known node
    2018/08/15 16:32:51 [INFO] consul: Adding LAN server monitor-test-02.yfb.sun.cn (Addr: tcp/10.22.0.1001:8300) (DC: dc1)
    2018/08/15 16:32:51 [INFO] consul: Handled member-join event for server "monitor-test-02.yfb.sun.cn.dc1" in area "wan"
    2018/08/15 16:32:51 [INFO] agent: Started DNS server 127.0.0.1:8600 (tcp)
    2018/08/15 16:32:51 [INFO] agent: Started HTTP server on 127.0.0.1:8500
    2018/08/15 16:32:51 [INFO] agent: Retry join is supported for: aws azure gce softlayer
    2018/08/15 16:32:51 [INFO] agent: Joining cluster...
    2018/08/15 16:32:51 [INFO] agent: (LAN) joining: [10.22.0.1000]
    2018/08/15 16:32:51 [INFO] serf: EventMemberJoin: monitor-test-01.yfb.su

1.6 验证集群可用性

1、 consul leave 命令可优雅退出consul集群。

2、consul members 可查看集群状况。

3、可分别访问consul ui界面进行验证。页面访问主机地址即可。

4、如果集群加入不成功,可以用 consul join 命令在非主节点机器上触发Cluster bootstrap过程:consul join 主节点ip地址。

三、代理配置

1.各主机做consul代理配置

# cat nginx.conf
    upstream consul.cn{
         server 其他机器ip:8500 backup;
         server 主机ip:8500;
         server 其他机器ip:8500 backup;
    }
    server {
        # Consul UI
        location /consul/ {
            proxy_pass      http://consul.cn/ui/;
        }
        # Consul API
        location /v1/ {
            proxy_pass      http://consul.cn/v1/;
            add_header      X-Remote-IP $remote_addr;
            add_header      X-Server-Time $date_gmt;
        }
    }

2.nginx重启

supervisorctl restart nginx

3.验证配置

 3.1 可以通过关闭其中一台机器的consul服务,查看日志或ui页面。

supervisorctl stop consul

 集群中任一consul宕机不会影响consul的使用,数据不丢失。

 注:如果其中两台的consul宕机,在集群中需要保证至少两台机器在线,否则无法自选出leader,因此consul不可用。

附录FAQ:

  • 命令行参数

  1. -advertise:通知展现地址用来改变我们给集群中的其他节点展现的地址,一般情况下-bind地址就是展现地址

  2. -bootstrap:用来控制一个server是否在bootstrap模式,在一个datacenter中只能有一个server处于bootstrap模式,当一个server处于bootstrap模式时,可以自己选举为raft leader。

  3. -bootstrap-expect:在一个datacenter中期望提供的server节点数目,当该值提供的时候,consul一直等到达到指定sever数目的时候才会引导整个集群,该标记不能和bootstrap公用。

  4. -bind:该地址用来在集群内部的通讯,集群内的所有节点到地址都必须是可达的,默认是0.0.0.0。

  5. -client:consul绑定在哪个client地址上,这个地址提供HTTP、DNS、RPC等服务,默认是127.0.0.1。

  6. -config-file:明确的指定要加载哪个配置文件

  7. -config-dir:配置文件目录,里面所有以.json结尾的文件都会被加载

  8. -data-dir:提供一个目录用来存放agent的状态,所有的agent都需要该目录,该目录必须是稳定的,系统重启后都继续存在。

  9. -dc:该标记控制agent的datacenter的名称,默认是dc1。

  10. -encrypt:指定secret key,使consul在通讯时进行加密,key可以通过consul keygen生成,同一个集群中的节点必须使用相同的key。

  11. -join:加入一个已经启动的agent的ip地址,可以多次指定多个agent的地址。如果consul不能加入任何指定的地址中,则agent会启动失败。默认agent启动时不会加入任何节点。

  12. -retry-join:和join类似,但是允许你在第一次失败后进行尝试。

  13. -retry-interval:两次join之间的时间间隔,默认是30s。

  14. -retry-max:尝试重复join的次数,默认是0,也就是无限次尝试。

  15. -log-level:consul agent启动后显示的日志信息级别。默认是info,可选:trace、debug、info、warn、err。

  16. -node:节点在集群中的名称,在一个集群中必须是唯一的,默认是该节点的主机名。

  17. -protocol:consul使用的协议版本。

  18. -rejoin:使consul忽略先前的离开,在再次启动后仍旧尝试加入集群中。

  19. -server:定义agent运行在server模式,每个集群至少有一个server,建议每个集群的server不要超过5个。

  20. -syslog:开启系统日志功能,只在linux/osx上生效。

  21. -ui-dir:提供存放web ui资源的路径,该目录必须是可读的。新版支持直接使用-ui。

  22. -pid-file:提供一个路径来存放pid文件,可以使用该文件进行SIGINT/SIGHUP(关闭/更新)agent。

  23. -enable-script-checks标志设置为true,以便启用可执行外部脚本的运行状况检查。 对于生产用途,需要将ACL配置为此以控制注册任意脚本的能力。

更多参数说明可参考:https://www.consul.io/docs/agent/options.html

[root@monitor-test-01 ~]# consul agent -server -bootstrap-expect 3 -client 0.0.0.0 -bind 10.22.0.1000 -data-dir=/home/consul/ -ui
==> WARNING: Expect Mode enabled, expecting 3 servers
==> Starting Consul agent...
==> Consul agent running!
           Version: 'v0.9.2'
           Node ID: '8fea634e-c3d6-32ef-f8d4-4ed1a2c0ee42'
         Node name: 'monitor-test-01.yfb.sun.cn'
        Datacenter: 'dc1'
            Server: true (bootstrap: false)
       Client Addr: 0.0.0.0 (HTTP: 8500, HTTPS: -1, DNS: 8600)
      Cluster Addr: 10.22.0.1000 (LAN: 8301, WAN: 8302)
    Gossip encrypt: false, RPC-TLS: false, TLS-Incoming: false
==> Log data will now stream in as it occurs:
    2018/08/15 16:40:26 [INFO] raft: Initial configuration (index=1): [{Suffrage:Voter ID:10.22.0.1000:8300 Address:10.22.0.1000:8300} {Suffrage:Voter ID:10.22.0.1001:8300 Address:10.22.0.1001:8300} {Suffrage:Voter ID:10.22.0.1002:8300 Address:10.22.0.1002:8300}]
    2018/08/15 16:40:26 [INFO] serf: EventMemberJoin: monitor-test-01.yfb.sun.cn.dc1 10.22.0.1000
    2018/08/15 16:40:26 [INFO] serf: EventMemberJoin: monitor-test-01.yfb.sun.cn 10.22.0.1000
    2018/08/15 16:40:26 [INFO] agent: Started DNS server 0.0.0.0:8600 (udp)
    2018/08/15 16:40:26 [INFO] raft: Node at 10.22.0.1000:8300 [Follower] entering Follower state (Leader: "")
    2018/08/15 16:40:26 [INFO] serf: Attempting re-join to previously known node: monitor-test-02.yfb.sun.cn.dc1: 10.22.0.1001:8302
    2018/08/15 16:40:26 [INFO] serf: Attempting re-join to previously known node: monitor-test-02.yfb.sun.cn: 10.22.0.1001:8301
    2018/08/15 16:40:26 [INFO] consul: Adding LAN server monitor-test-01.yfb.sun.cn (Addr: tcp/10.22.0.1000:8300) (DC: dc1)

转载于:https://www.cnblogs.com/chaos-li/p/10795691.html

相关文章:

【C++】拷贝,赋值与构造

拷贝,赋值与构造 文章目录拷贝,赋值与构造1. 拷贝构造函数/合成拷贝构造函数(copy constructor)2. 拷贝赋值运算符3. 析构函数1. 拷贝构造函数/合成拷贝构造函数(copy constructor) 1.1 定义:复…

Java 内存查看与分析

2019独角兽企业重金招聘Python工程师标准>>> 1:gc日志输出 在jvm启动参数中加入 -XX:PrintGC -XX:PrintGCDetails -XX:PrintGCTimestamps -XX:PrintGCApplicationStopedTime,jvm将会按照这些参数顺序输出gc概要信息,详细信息&…

玩转Vuejs--核心原理

一、摘要: Vuejs是一款前端MVVM框架,利用Vuejs、webpack以及周边一系列生态工具我们可以快速的构建起一个前端应用,网上对于Vue的分析大都是基于各个模块,理解起来不够顺畅,本文将从整个执行过程出发,讲一下…

【C++】拷贝控制与资源管理

1. 拷贝控制与资源管理 管理类外资源的类必须定义拷贝控制成员。如P447中所见,这种类需要通过析构函数来释放对象所分配的资源。一旦一个类需要析构函数,那么几乎可确定它也需要一个拷贝构造函数和一个拷贝赋值函数。 明确拷贝语义:可以定义…

leangoo V5.4.2版上线

本次更新增加了“卡片编辑面板内显示成员、截止日期、工作量”的功能。同时我们也进行了大量的功能优化,以下是此次更新详情: 1. 新增“卡片编辑面板内显示成员、截止日期、工作量”功能 本次更新后 ,您在卡片编辑面板内添加成员,…

差分边缘检测实现

#include <opencv2/core/core.hpp> #include <opencv2/highgui/highgui.hpp> #include <opencv2/opencv.hpp> using namespace cv; // 图像差分操作 void diffOperation(const cv::Mat srcImage, cv::Mat& edgeXImage,cv::Mat& edgeYImage) {cv::Mat…

2.1:CGPROGRAM

文章著作权归作者所有。转载请联系作者&#xff0c;并在文中注明出处&#xff0c;给出原文链接。 本系列原更新于作者的github博客&#xff0c;这里给出链接。 前言 经过前面两个章节的铺垫&#xff0c;我们对渲染以及Unity Shaderlab相关的知识已经有了大概的认识&#xff0c;…

【OpenCV】OpenCV中积分图函数与应用

OpenCV中积分图函数与应用 参考资料 opencv 查找integral&#xff0c;目前网上大部分的资料来自于opencv https://docs.opencv.org/master/d7/d1b/group__imgproc__misc.html#gadeaf38d7701d7ad371278d663c50c77dhttps://blog.csdn.net/jia20003/article/details/52710751ht…

django学习笔记【003】创建第一个带有model的app

【1】python应用程序要连接mysql有多个驱动程序可供选择&#xff1a; 1、MySQLdb 这个只支持python2.x 所以在这里就不说了&#xff1b; 2、mysqlclient 下载地址   https://pypi.python.org/pypi/mysqlclient/1.3.9 3、MySQL Connector/python 这个是mysql官方主推的mysql驱…

图像非极大值抑制 Sobel 边缘实现

bool SobelVerEdge(cv::Mat srcImage, cv::Mat& resultImage) {CV_Assert(srcImage.channels() 1);srcImage.convertTo(srcImage, CV_32FC1);// 水平方向的 Sobel 算子cv::Mat sobelx (cv::Mat_<float>(3,3) << -0.125, 0, 0.125,-0.25, 0, 0.25,-0.125, 0, …

第四次作业 (日期和jieba库的运用)

设计题1&#xff1a; 设计一个本月份日历&#xff0c;输出格式如下&#xff1a; 要求&#xff1a; 1.初始化start_day&#xff0c;end_day两个日期 from datetime import datetime start_daydatetime(2019,4,1) end_daydatetime(2019,4,30) 其它时间数据生成要用datetime或date…

【C++】LINK类型错误分析记录

LINK类型错误 情况1&#xff1a; 根据生成路径&#xff0c;查找是否成功生成静态库/动态库&#xff0c;一般在./bin文件中。 情况2&#xff1a; 是否在CMakeLists中target_link_libraries中添加链接静态库操作 情况3&#xff1a; 是都存在类模板&#xff0c;需要实例化&a…

eBay宣布发布全新的购买和销售APIs

eBay最近宣布发布两款全新的购买和销售APIs。这些APIs旨在促进eBay产品在第三方应用程序中的更好集成。eBay于10月19日在他们的博客上发表了几篇文章&#xff0c;不仅详细介绍了这些全新的购买和销售APIs提供的功能&#xff0c;而且还详细地总结了他们公司从SOAP&#xff08;简…

Sobel 边缘实现

#include <opencv2/core/core.hpp> #include <opencv2/highgui/highgui.hpp> #include "opencv2/imgproc/imgproc.hpp" #include <iostream> using namespace cv; // 非极大值抑制实现sobel竖直细化边缘 bool SobelVerEdge(cv::Mat srcImage, cv::…

vue下实现textarea类似密码框的功能之探索input输入框keyup,keydown,input事件的触发顺序...

项目中引入element的input框组件&#xff0c;触发事件必须要加上.native <el-input placeholder"请输入" type"textarea" v-model"valueText" keyup.native"keyUp(valueText,$event)" keydown.native"keyDown($event)" …

【C++】动态内存管理/move/以及移动构造与移动赋值运算符

文章目录1 .对象移动与右值引用 实际应用过程中遇到的问题及其解决方案c中临时变量不能作为非const的引用参数2. 动态内存管理类3. 对象移动与右值引用4. 移动构造与移动复制运算符1 .对象移动与右值引用 实际应用过程中遇到的问题及其解决方案 问题描述&#xff1a; bool Cr…

图像直接卷积 Sobel 边缘实现

bool sobelEdge(const cv::Mat& srcImage, cv::Mat& resultImage,uchar threshold) {CV_Assert(srcImage.channels() 1);// 初始化水平核因子Mat sobelx (Mat_<double>(3, 3) << 1, 0,-1, 2, 0, -2, 1, 0, -1);// 初始化垂直核因子Mat sobely (Mat_&…

JSON.parse解析特殊字符报错解决方案

2019独角兽企业重金招聘Python工程师标准>>> 具体案例&#xff1a; 页面点击”下一任务” 会去请求后台&#xff0c;这里出现的问题是有虚拟任务的时候。然后会返回一个map&#xff0c;也就是如下图中回调函数中的data。 当该map里存有以下字符的时候&#xff1a; \…

MySQL数据库字符集和整理

MySQL数据库字符集和整理(2009-11-20 22:23:37)mysql数据库 it 其实这个表在MySQL数据库中通过phpMyAdmin就能看到&#xff0c;icech只是把表格整理了一下方便大家使用&#xff0c;如果要更换数据库的字符集&#xff0c;心里有数。其中有三种utf8_general_ci、utf8_unicode_ci…

【SLAM后端】—— ceres优化相机位姿求解

求解结果如下&#xff1a; mat 初始化&#xff0c;eigenvalue初始化 Mat K ( Mat_<double> ( 3,3 ) << 520.9, 0, 325.1, 0, 521.0, 249.7, 0, 0, 1 );Eigen::Matrix<float,3,1> vd_3d;v_3d << 3, 2, 1;求解目标函数结构体构造与实例 struct CurveFi…

SPOJ 1811 LCS [后缀自动机]

题意&#xff1a; 求两个串的最大连续子串 一个串建SAM&#xff0c;另一个串在上面跑 注意如果走了Suffix Link&#xff0c;sum需要更新为t[u].val1 Suffix Link有点像失配吧&#xff0c;当前状态s走不了了就到Suffix Link指向的状态fa上去&#xff0c;fa是s的后缀所以是可行的…

图像卷积下非极大值抑制 Sobel 的实现

bool sobelOptaEdge(const cv::Mat& srcImage, cv::Mat& resultImage, int flag) {CV_Assert(srcImage.channels() 1);// 初始化sobel水平核因子cv::Mat sobelX (cv::Mat_<double>(3, 3) << 1, 0, -1,2, 0, -2, 1, 0, -1);// 初始化sebel垂直核因子cv::…

was unable to refresh its cache! status = Cannot execute request on any known server

出现这种错误是因为: Eureka服务注册中心也会将自己作为客户端来尝试注册它自己&#xff0c;所以我们需要禁用它的客户端注册行为。 在 yml中设置 eureka.client.register-with-eurekafalse eureka.client.fetch-registryfalse 但在服务端是要这是为false的&#xff0c;在客…

【C++】浅析析构函数(基类中)为什么要写成虚基类?

为什么有了虚析构函数&#xff0c;就能先调用子类的析构函数&#xff1f; class A {virtual ~A(){} };class B : A {virtual ~B(){} };A *p new B(); delete p; 唯一差别是&#xff0c;每个析构函数结束时会自动&#xff08;隐含地&#xff09;调上父类的析构函数&#xff0…

Roberts 边缘检测

#include <opencv2/opencv.hpp> // roberts算子实现 cv::Mat roberts(cv::Mat srcImage) {cv::Mat dstImage srcImage.clone();int nRows dstImage.rows;int nCols dstImage.cols;for (int i 0; i < nRows - 1; i){for (int j 0; j < nCols - 1; j){// 根据公…

vector、map删除当前记录

map<string, string> sMap; map<string, string>::iterator iter; for(iter sMap.begin();iter ! sMap.end();/* iter */) {sMap.erase(iter); }注意下列错误表达&#xff1a;1. for(iter sMap.begin();iter ! sMap.end(); iter ) {sMap.erase(iter); } 错误原因…

1-2 postman工具简介

postman提供了一个多窗口和多选项卡页面用于发送和接受请求&#xff0c;postman努力保持整洁和灵活&#xff0c;提供更多的空间&#xff0c;满足用户的需要。他很简单&#xff0c;能满足大部分接口的测试&#xff0c;性价比特别高。如图所示&#xff1a; 1.侧边栏 postman的侧边…

【C++】重载运算符(一)

1.1 重载运算符特点 重载运算符本质上是一次函数调用 除了operator() 运算符调用外&#xff0c;其他重载运算符不能含有默认参数。 当重载的运算符是成员函数时&#xff0c;this绑定到左侧运算对象。成员运算符函数&#xff08;显式&#xff09;的参数数量比运算对象少一个。…

javaScript的调试(二)

2019独角兽企业重金招聘Python工程师标准>>> 一、Firebug Firebug是Firefox浏览器的调试工具&#xff0c;只要我们在Firefox中安装了Firebug应用&#xff0c;就可以按F12或右击鼠标开启调试 那么我们就先来看一下如何在Firefox中安装了Firebug应用&#xff0c;一图剩…

Prewitt 边缘检测

#include <opencv2/core/core.hpp> #include <opencv2/highgui/highgui.hpp> #include "opencv2/imgproc/imgproc.hpp" #include <iostream> // prewitt算子实现 cv::Mat prewitts(cv::Mat img, bool verFlag false) {img.convertTo(img, CV_32FC…