## 一、环境准备
| IP | 节点名称 | Consul角色 |
| --- | --- | --- |
| 192.168.161.3 | s1 | bootstrap Server |
| 192.168.161.4 | s2 | Server |
| 192.168.161.5 | s3 | Server |
| 192.168.161.6 | c1 | Client(UI) |
> bootstrap Server就是人为在consul server启动的时候指定Server Leader,不需要选举。参考下文中agent启动参数 -bootstrap参数说明。
## 二、consul 端口说明
| 端口 | 说明 |
| --- | --- |
| TCP/8300 | 8300 端口用于服务器节点。客户端通过该端口 RPC 协议调用服务端节点。服务器节点之间相互调用 |
| TCP/UDP/8301 | 8301 端口用于单个数据中心所有节点之间的互相通信,即对 LAN 池信息的同步。它使得整个数据中心能够自动发现服务器地址,分布式检测节点故障,事件广播(如领导选举事件)。 |
| TCP/UDP/8302 | 8302 端口用于单个或多个数据中心之间的服务器节点的信息同步,即对 WAN 池信息的同步。它针对互联网的高延迟进行了优化,能够实现跨数据中心请求。 |
| 8500 | 8500 端口基于 HTTP 协议,用于 API 接口或 WEB UI 访问。 |
| 8600 | 8600 端口作为 DNS 服务器,它使得我们可以通过节点名查询节点信息。 |
所以主机节点的防火墙开放如下端口:
~~~
firewall-cmd --zone=public --add-port=8300/tcp --permanent;
firewall-cmd --zone=public --add-port=8301/tcp --permanent;
firewall-cmd --zone=public --add-port=8302/tcp --permanent;
firewall-cmd --zone=public --add-port=8500/tcp --permanent;
firewall-cmd --zone=public --add-port=8600/tcp --permanent;
firewall-cmd --reload
~~~
## 三、agent启动参数
consul agent 启动命令参数,`consul agent --help`
~~~
-advertise:通知展现地址用来改变我们给集群中的其他节点展现的地址,一般情况下-bind地址就是展现地址
-bootstrap:用来控制一个server是否在bootstrap模式,在一个datacenter中只能有一个server处于bootstrap模式,当一个server处于bootstrap模式时,可以自己选举为raft leader。
-bootstrap-expect:在一个datacenter中期望提供的server节点数目,当该值提供的时候,consul一直等到达到指定sever数目的时候才会引导整个集群,该标记不能和bootstrap公用。
-bind:该地址用来在集群内部的通讯,集群内的所有节点到地址都必须是可达的,默认是0.0.0.0。
-client:consul绑定在哪个client地址上,这个地址提供HTTP、DNS、RPC等服务,默认是127.0.0.1。
-config-file:明确的指定要加载哪个配置文件
-config-dir:配置文件目录,里面所有以.json结尾的文件都会被加载
-data-dir:提供一个目录用来存放agent的状态,所有的agent都需要该目录,该目录必须是稳定的,系统重启后都继续存在。
-dc:该标记控制agent的datacenter的名称,默认是dc1。
-encrypt:指定secret key,使consul在通讯时进行加密,key可以通过consul keygen生成,同一个集群中的节点必须使用相同的key。
-join:加入一个已经启动的agent的ip地址,可以多次指定多个agent的地址。如果consul不能加入任何指定的地址中,则agent会启动失败。默认agent启动时不会加入任何节点。
-retry-join:和join类似,但是允许你在第一次失败后进行尝试。
-retry-interval:两次join之间的时间间隔,默认是30s。
-retry-max:尝试重复join的次数,默认是0,也就是无限次尝试。
-log-level:consul agent启动后显示的日志信息级别。默认是info,可选:trace、debug、info、warn、err。
-node:节点在集群中的名称,在一个集群中必须是唯一的,默认是该节点的主机名。
-protocol:consul使用的协议版本。
-rejoin:使consul忽略先前的离开,在再次启动后仍旧尝试加入集群中。
-server:定义agent运行在server模式,每个集群至少有一个server,建议每个集群的server不要超过5个。
-syslog:开启系统日志功能,只在linux/osx上生效。
-ui-dir:提供存放web ui资源的路径,该目录必须是可读的。
-pid-file:提供一个路径来存放pid文件,可以使用该文件进行SIGINT/SIGHUP(关闭/更新)agent。
~~~
举例:启动Bootstrap Server,具体启动参数实例说明看下文CMD\_OPTS
~~~
consul agent -server -bootstrap 其他启动参数
~~~
举例:启动Server,不加-server启动的agent就是cllient运行模式
~~~
consul agent -server 其他启动参数
~~~
## 四、安装过程
因为consul每次启动都需要配置很多的参数,为了将启动流程及参数固化下来,我们通常会将它写成一个linux 的systemd服务。
> 不了解systemd服务?白话说就是linux服务启动、停止、重启脚本的一个模板。详细学习的话可以参考[https://www.cnblogs.com/jhxxb/p/10654554.html](https://www.cnblogs.com/jhxxb/p/10654554.html)
### consul下载、解压和目录创建
~~~
wget https://releases.hashicorp.com/consul/1.7.2/consul_1.7.2_linux_amd64.zip
unzip consul_1.7.2_linux_amd64.zip
mv consul /usr/local/bin/
mkdir -p /opt/consul/{data,config} #创建数据目录和配置目录
~~~
### consul配置文件
将以下的内容写入对应主机的配置文件
192.168.161.3:/etc/sysconfig/consul,-bootstrap指定了该agent为Server Leader,无需选举。
~~~
CMD_OPTS="agent -server -data-dir=/opt/consul/data -node=s1 -config-dir=/opt/consul/config -bind=192.168.161.3 -rejoin -client=0.0.0.0 -bootstrap"
~~~
192.168.161.4:/etc/sysconfig/consul,-join要求该agent启动之后加入192.168.161.3为leader的集群
~~~
CMD_OPTS="agent -server -data-dir=/opt/consul/data -node=s2 -config-dir=/opt/consul/config -bind=192.168.161.4 -rejoin -client=0.0.0.0 -join 192.168.161.3"
~~~
192.168.161.5:/etc/sysconfig/consul,-join要求该agent启动之后加入192.168.161.3为leader的集群
~~~
CMD_OPTS="agent -server -data-dir=/opt/consul/data -node=s3 -config-dir=/opt/consul/config -bind=192.168.161.5 -rejoin -client=0.0.0.0 -join 192.168.161.3"
~~~
192.168.161.6:/etc/sysconfig/consul,该节点没有指定-server,说明它是client运行模式。-ui说明该client提供web UI的管理界面。
~~~
CMD_OPTS="agent -ui -data-dir=/opt/consul/data -node=c1 -config-dir=/opt/consul/config -bind=192.168.161.6 -rejoin -client=0.0.0.0 -join 192.168.161.3"
~~~
### linux consul systemd服务配置
> 这一步可以不做,只是用来简化每次启动consul都输入一串consul命令的痛苦。如果这一小节内容无法理解,直接用consul 启动consul实例即可
创建service配置文件
~~~
touch /usr/lib/systemd/system/consul.service
~~~
通过cat命令将如下内容写入文件
~~~
cat > /usr/lib/systemd/system/consul.service<<EOF
[Unit]
Description=consul
After=network.target
[Service]
EnvironmentFile=-/etc/sysconfig/consul
ExecStart=/usr/local/bin/consul \$CMD_OPTS
ExecReload=/bin/kill -HUP \$MAINPID
KillSignal=SIGTERM
[Install]
WantedBy=multi-user.target
EOF
~~~
服务配置完成之后需要重新加载systemd配置文件
~~~
systemctl daemon-reload
~~~
如果希望consul服务开机启动,执行下面命令
~~~
systemctl enable consul #启动命令
journalctl -f #查看启动日志,都可以
journalctl -xe #查看启动日志,都可以
~~~
手动启动执行下面的命令
~~~
systemctl start consul
~~~
因为上面的CMD\_OPTS中制定了-join参数,所以我们就不用手动的把启动后的agent加入集群。如果没有加-join参数,我们可以使用如下命令手动将新启动的agent加入集群。
~~~
consul join <Leader Server IP> # 非Leader节点执行 join
~~~
## 五、consul集群安装结果验证
通过consul members命令查看该集群agent的组成(分不出谁是leader)。使用consul info命令可以查看更详细的集群信息,可以分出leader。
~~~
consul members
Node Address Status Type Build Protocol DC Segment
s1 192.168.161.3:8301 alive server 1.7.2 2 dc1 <all>
s2 192.168.161.4:8301 alive server 1.7.2 2 dc1 <all>
s3 192.168.161.5:8301 alive server 1.7.2 2 dc1 <all>
c1 192.168.161.6:8301 alive client 1.7.2 2 dc1 <default>
~~~
### web UI
访问192.168.161.6:8500/ui可以查看集群的agent节点组成,也可以表示我们安装成功。
## 六、consul命令详解(用到查一下、不用记)
* agent指令是consul的核心,它运行agent来维护成员的重要信息、运行检查、服务宣布、查询处理等等。
* join指令告诉consul agent加入一个已经存在的集群中,一个新的consul agent必须加入一个已经有至少一个成员的集群中,这样它才能加入已经存在的集群中,如果你不加入一个已经存在的集群,则agent是它自身集群的一部分,其他agent则可以加入进来。agent可以加入其他agent多次。如果你想加入多个集群,则可以写多个地址,consul会加入所有的地址。
* leave指令触发一个优雅的离开动作并关闭agent,节点离开后不会尝试重新加入集群中。运行在server状态的节点,节点会被优雅的删除,这是很严重的,在某些情况下一个不优雅的离开会影响到集群的可用性。
* members指令输出consul agent目前所知道的所有的成员以及它们的状态,节点的状态只有alive、left、failed三种状态。
* info指令提供了各种操作时可以用到的debug信息,对于client和server,info有返回不同的子系统信息,目前有以下几个KV信息:agent(提供agent信息),consul(提供consul库的信息),raft(提供raft库的信息),serf\_lan(提供LAN gossip pool),serf\_wan(提供WAN gossip pool)。
* event命令提供了一种机制,用来fire自定义的用户事件,这些事件对consul来说是不透明的,但它们可以用来构建自动部署、重启服务或者其他行动的脚本。
* exec指令提供了一种远程执行机制,比如你要在所有的机器上执行uptime命令,远程执行的工作通过job来指定,存储在KV中。agent使用event系统可以快速的知道有新的job产生,消息是通过gossip协议来传递的,因此消息传递是最佳的,但是并不保证命令的执行。事件通过gossip来驱动,远程执行依赖KV存储系统(就像消息代理一样)。
* force-leave可以强制consul集群中的成员进入left状态(空闲状态),记住,即使一个成员处于活跃状态,它仍旧可以再次加入集群中,这个方法的真实目的是强制移除failed的节点。如果failed的节点还是网络的一部分,则consul会周期性的重新链接failed的节点,如果经过一段时间后(默认是72小时),consul则会宣布停止尝试链接failed的节点。force-leave指令可以快速的把failed节点转换到left状态。
* keygen指令生成加密的密钥,可以用在consul agent通讯加密。
* monitor指令用来链接运行的agent,并显示日志。monitor会显示最近的日志,并持续的显示日志流,不会自动退出,除非你手动或者远程agent自己退出。
* reload指令可以重新加载agent的配置文件。SIGHUP指令在重新加载配置文件时使用,任何重新加载的错误都会写在agent的log文件中,并不会打印到屏幕。
* version指令用作打印consul的版本
* watch指令提供了一个机制,用来监视实际数据视图的改变(节点列表、成员服务、KV),如果没有指定进程,当前值会被dump出来。
- 文档简介
- 模块与代码分支说明
- dongbb-cloud项目核心架构
- 微服务架构进化论
- SpringBoot与Cloud选型兼容
- Spring Cloud组件的选型
- 单体应用拆分微服务
- 单体应用与微服务对比
- 微服务设计拆分原则
- 新建父工程及子模块框架
- 通用微服务初始化模块构建
- 持久层模块单独拆分
- 拆分rbac权限管理微服务
- Hello-microservice
- 构建eureka服务注册中心
- 向服务注册中心注册服务
- 第一个微服务调用
- 远程服务调用
- HttpClient远程服务调用
- RestTemplate远程服务调用
- RestTemplate多实例负载均衡
- Ribbon调用流程源码解析
- Ribbon负载均衡策略源码解析
- Ribbon重试机制与饥饿加载
- Ribbon自定义负载均衡策略
- Feign与OpenFeign
- Feign设计原理源码解析
- Feign请求压缩与超时等配置
- 服务注册与发现
- 白话服务注册与发现
- DiscoveryClient服务发现
- Eureka集群环境构建(linux)
- Eureka集群多网卡环境ip设置
- Eureka集群服务注册与安全认证
- Eureka自我保护与健康检查
- 主流服务注册中心对比(含nacos)
- zookeeper概念及功能简介
- zookeeper-linux集群安装
- zookeeper服务注册与发现
- consul概念及功能介绍
- consul-linux集群安装
- consul服务注册与发现
- 通用-auatator导致401问题
- 分布式配置中心-apollo
- 服务配置中心概念及使用场景
- apollo概念功能简介
- apollo架构详解
- apollo分布式部署之Portal
- apollo分布式部署之环境区分
- apollo项目权限管理实战
- apollo-java客户端基础
- apollo与SpringCloud服务集成
- apollo实例配置热更新
- apollo命名空间与集群
- apollo灰度发布(日志热更新为例)
- SpringCloudConfig配置中心
- config-git配置文件仓库
- config配置中心搭建与测试
- config客户端基础
- config配置安全认证
- config客户端配置刷新
- config配置中心高可用
- BUS消息总线
- bus消息总线简介
- docker安装rabbitMQ
- 基于rabbitMQ的消息总线
- bus实现批量配置刷新
- alibaba-nacos
- nacos介绍与单机部署
- nacos集群部署方式(linux)
- nacos服务注册与发现
- nacos服务注册中心详解
- nacos客户端配置加载
- nacos客户端配置刷新
- nacos服务配置隔离与共享
- nacos配置Beta发布
- 服务熔断降级hystrix
- 服务降级&熔断&限流
- Hystrix集成并实现服务熔断
- Jemter模拟触发服务熔断
- Hystrix服务降级fallback
- Hystrix结合Feign服务降级
- 远程服务调用异常传递的问题
- Hystrix-Feign异常拦截与处理
- Hystrix-DashBoard单服务监控
- Hystrix-dashboard集群监控
- 分布式系统流量卫兵sentinel
- sentinel简介与安装
- 客户端集成与实时监控
- 实战流控规则-QPS限流
- 实战流控规则-线程数限流
- 实战流控规则-关联限流
- 实战流控规则-链路限流
- 实战流控效果-WarmUp
- 实战流控效果-匀速排队
- BlockException处理
- 实战熔断降级-RT
- 实战熔断降级-异常数与比例
- DegradeException处理
- 注解与异常的归纳总结
- Feign降级及异常传递拦截
- 动态规则nacos集中存储
- 热点参数限流
- 系统自适应限流
- 微服务网关-GateWay
- 还有必要学习Zuul么?
- 简介与非阻塞异步IO模型
- GateWay概念与流程
- 新建一个GateWay项目
- 通用Predicate的使用
- 自定义PredicateFactory
- 编码方式构建静态路由
- Filter过滤器介绍与使用
- 自定义过滤器Filter
- 网关请求转发负载均衡
- 结合nacos实现动态路由配置
- 整合Sentinel实现资源限流
- 跨域访问配置
- 网关层面全局异常处理
- 微服务网关安全认证-JWT篇
- Gateway-JWT认证鉴权流程
- 登录认证JWT令牌颁发
- 全局过滤器实现JWT鉴权
- 微服务自身内部的权限管理
