场景
将consul部署在云服务器上,本地服务注册至consul,并调试。服务健康检查不通过。
场景还原
-
consul组件安装
官网:https://www.consul.io/downloads
选择系统版本下载安装,示例:CentOs7环境sudo yum install -y yum-utils sudo yum-config-manager --add-repo https://rpm.releases.hashicorp.com/RHEL/hashicorp.repo sudo yum -y install consul
验证安装,正常情况下返回版本信息
consul -v
启动consul,示例(开发模式启动)
consul agent -dev
-
本地微服务启动文件配置,并启动服务
server: port: 8000 spring: application: name: business cloud: consul: host: 218.0.55.16 port: 8500 discovery: service-name: ${spring.application.name}
-
启动consul客户端 观察健康检查结果
健康检查失败。
原因分析
相比使用eureka作为服务注册中心时,服务注册如下:
- 服务提供者启动后,发送自己的信息到注册中心进行注册
- 服务提供者每隔一段时间会想注册中心发送心跳,证明自己还活着,没有挂掉!(默认90s)
- 服务调用者第一次调用服务提供者时,会向注册中心拉取一份服务提供者的地址,并缓存在本地(下次用可以直接从本地取)
- 当服务提供者不可用时,注册中心会将这个服务提供者信息同步到订阅过这个服务的服务消费者。
而consul得注册过程如下:
区别在于:eureka是服务提供者定时往注册中心发送心跳,保证存活,而consul是注册中心访问服务提供者健康检查url。
问题在于:服务器无法主动与内网IP建立连接(连路由都做不到),也就是说除非你本地主机拥有公网IP, 否则无法直接ping通。
解决
如何使服务器能够访问本地得服务接口,就是问题的关键。这就需要进行内网穿透。
网上有很多工具,这里使用frp,具体介绍不再赘述,官网很详尽,中文的
frp 官网地址如下:
https://gofrp.org/
下载地址:
https://github.com/fatedier/frp/releases
frp包含服务端和客户端。在下载的文件中都有包含,此处因涉及两个系统环境(本地window系统,服务器centos7),所以分别下载window和linux版本。
linux版本下载完成后,上传至服务器,并解压。也可以直接在linux下使用:
wget 【包下载路径】
下载,示例:
linux下:
wget https://github.com/fatedier/frp/releases/download/v0.38.0/frp_0.38.0_linux_386.tar.gz
解压:
tar -zxvf frp_0.38.0_linux_386.tar.gz
修改启动服务端配置文件frps.ini, 默认内容如下:
[common]
bind_port = 7000
启动frp服务端:
./frps -c ./frps.ini
下载window版本,并解压至本地。修改客户端启动配置文件frpc.ini, 如何配置?完整配置说明在frpc_full.ini中都有说明。这里更改配置如下:
[common]
server_addr = 218.0.55.16 #ftp服务端主机IP
server_port = 7000 #ftp服务端主机端口
[range:tcp_port]
type = tcp
local_ip = 127.0.0.1 #客户端主机IP
local_port = 7000-9000 #批量端口映射, 本地
remote_port = 7000-9000 #映射远程端口
use_encryption = false
use_compression = false
window下启动frp程序,需要进入window的cmd下才能执行。cmd下,进入解压包路径。执行
frpc.exe -c ./frpc.ini
再次查看服务注册情况,进入consul客户端管理页面:
服务健康检查正常。