最近线上consul部署遇到的一些问题,和开发有点区别。还是总结下一些所谓的方法吧。如果大家有好的方法欢迎讨论
【1】war包丢到tomcat中注册不到consul,但是服务是可以访问的
在本地发开因为是springboot直接启动,所以注册没问题,通过idea配置外部tomcat运行时还是没问题。But当我把war信誓旦旦的放到正式服务器上,what?竟然没有成功。一直注册不进去,分析了半天发现idea是把编译文件直接放到了\webapps\ROOT下。为了验证我又把ROOT下的对应文件拷到另一个tomcat中竟然注册成功了(前提是配置文件里的注册discover地址要改成和tomcat端口一样才行)。
所以在服务器的tomcat中修改了对应编译jar的文件如下:
之后通过写了shell脚本进行的编译部署:
(1)先把存在wars包所在项目进行编译:unzip xxx.war -d 路径名/xxx
(2)./startup.sh
这样运行后成功注册到了consul中
【2】重复注册服务
线上有个服务重复启动后发现注册了两次,通过修改实例名进行保证实例的唯一性。
server:
port: 8095
number: 1001
spring:
application:
name: xx-service
cloud:
# 使用consul作为注册中心
consul:
# 正式环境service模式
host: ${CONSUL_HOST:172.16.56.9}
port: ${CONSUL_PORT:8500}
discovery:
port: ${server.port}
register: true
instance-id: ${spring.application.name}:${server.port}:${server.number}
通过给部署的实例进行编码拼接到 instance-id中
以上方式也有问题,就是部署比较麻烦,所以可以根据机器唯一表示定义instance-id,例如机器ip
#主机名
instance-id: ${spring.application.name}-${server.port}-${spring.cloud.client.hostname}
#ip地址
instance-id: ${spring.application.name}-${server.port}-${spring.cloud.client.ip-address}
【3】删除无效服务
可以通过consul的api进行操作
如果你不知道服务对应的实例id,首先查看下consul的日志:
通过consul日志查看具体哪个服务实例有问题,找到对应的id通过命令删除:
curl -X PUT 'http://xxx:8500/v1/agent/service/deregister/xx-service'
不报错再看服务就好了。
还要一些其他问题后续再进行更新。。