【SpringCloud】consul注册中心注册的服务为内网(局域网)IP
一、前因
最近在做公司的一个微服务项目,技术架构为spring cloud + consul + SSM。
当我写完一个功能要在本地测试时,发现服务运行成功,但是前后端联调报500错误。
当时的第一个想法就是gateway服务的问题,但是其他同事却说gateway服务没毛病。
最后想到可能是注册中心的问题,于是访问consul的管理页面。服务是注册上了,但是一眼就能看到毛病:

居然是内网IP!!我惊了!
检查日志信息发现,向注册中心发送注册地址,为内网ip地址:

那么就找到问题原因了。
二、问题
先回想了一下注册中心原理(以前用的是Eruka,不过原理都是大同小异的):
- 服务提供者启动后,发送自己的信息到注册中心进行注册
- 服务提供者每隔一段时间会想注册中心发送心跳,证明自己还活着,没有挂掉!(默认90s)
- 服务调用者第一次调用服务提供者时,会向注册中心拉取一份服务提供者的地址,并缓存在本地(下次用可以直接从本地取)
- 当服务提供者不可用时,注册中心会将这个服务提供者信息同步到订阅过这个服务的服务消费者。

查阅了一些资料,consul的原理如下图:

和Eruka基本差不多,只是consul不是由服务提供者发送心跳,而是由注册中心访问服务提供者的健康检查链接,以此来判断服务提供者是否还存活!
清晰明了!真正的问题就是:我的服务用局域网链接向consul注册健康检查链接,我能访问consul,但consul肯定是访问不到我的局域网IP来对我服务进行健康检查,因此判断我的服务挂了
因为和其他同事不在一个地方办公,我这里拿到的资料很不全,仅仅只有一个服务的代码和需求文档。连数据库、redis、consul等的地址账号密码,都是自己从项目配置文件中找的。
而他们的办公环境是和公司服务器在一个局域网的,所以他们不会出现我这个问题。
三、解决
因为我本地连接了wifi,需要内网穿透才能将本机暴露出去。
这太麻烦了,所以我将服务打包到了自己的阿里云服务器。
但是,这里也有坑:Consul在不写ip_address配置项的情况下,默认从第一网卡取地址值。而阿里云的第一个网卡就是内网ip。

eth0,eth1,eth2……代表网卡一,网卡二,网卡三……
直接拿服务器的外网ip,在配置文件中指定:

spring:
cloud:
consul:
host: ${CONSUL_HOST}
port: ****
discovery:
hostname: ${spring.cloud.client.ip-address}
instance-id: ${spring.application.name}:118.***.***.**:${spring.application.instance_id:${server.port}}
service-name: ${spring.application.name}-app
#check失败后,多少秒后删除本服务
health-check-critical-timeout: 30s
#显示ip地址
prefer-ip-address: true
ip-address: 118.***.***.**
搞定!打包上传服务器运行,注册成功


【SpringCloud】consul注册中心注册的服务为内网(局域网)IP的更多相关文章
- SpringCloud Alibaba实战(7:nacos注册中心管理微服务)
源码地址:https://gitee.com/fighter3/eshop-project.git 持续更新中-- 在上一节我们已经完成了Nacos Server的本地部署,这一节我们学习如何将Nac ...
- 【Java】Web 服务编程技巧与窍门: 在 UDDI 注册中心为 Web 服务注册开发 UDDI Java 应用程序
本技巧建立了一个使用统一描述.发现和集成 (Universal Description, Discovery, and Integration,UDDI) 来注册应用程序级消费的 Web 服务实例.作 ...
- Dubbo中多注册中心问题与服务分组
一:注册中心 1.场景 Dubbo 支持同一服务向多注册中心同时注册, 或者不同服务分别注册到不同的注册中心上去, 甚至可以同时引用注册在不同注册中心上的同名服务. 2.多注册中心注册 中文站有些服务 ...
- Dubbo多注册中心和Zookeeper服务的迁移
一.Dubbo多注册中心 1. 应用场景 例如阿里有些服务来不及在青岛部署,只在杭州部署,而青岛的其它应用需要引用此服务,就可以将服务同时注册到两个注册中心. consumer.xml <?xm ...
- spring cloud系列教程第八篇-修改服务名称及获取注册中心注册者的信息
spring cloud系列教程第八篇-修改服务名称及获取注册中心注册者的信息 本文主要内容: 1:管理页面主机名及访问ip信息提示修改 2:获取当前注册中心的服务列表及每个服务对于的服务提供者列表 ...
- Dubbo系列之 (二)Registry注册中心-注册(1)
引导 dubbo的服务的注册与发现,需要通过第三方注册中心来协助完成,目前dubbo支持的注册中心包括 zookeeper,consul,etcd3,eureka,nacas,redis,sofa.这 ...
- Dubbo系列之 (二)Registry注册中心-注册(2)
引导 本章主要介绍下AbstractRegistry.FailbackRegistry的作用和源码. AbstractRegistry 首先,直接引出这个类的作用,该类主要把服务提供者信息缓存本地文件 ...
- 使用nproxy代理本地服务到内网
前端开发中:很多场景需要在局域网下的其他手机或设备查看网页, 问题来了, web服务部署在本机的某个端口上(8080),只能通过本机浏览器访问, 怎样能让局域网下的其他设备也访问呢?可能你会说 关闭 ...
- Spring Cloud(Dalston.SR5)--Eureka 注册中心高可用-服务提供和消费
由于 Eureka 注册中心只是在内存中保存服务注册实例,并且没有将服务注册实例进行同步,因此我们需要对服务提供和消费进行调整,需要指定服务提供和消费的注册.服务发现的具体Eureka 注册中心配置, ...
随机推荐
- python 爬虫 循环分页
import osfrom time import sleepimport fakerimport requestsfrom lxml import etreefake = faker.Faker() ...
- js 如何获取浏览器的高度?
<SCRIPT LANGUAGE="JavaScript"><!--var s = ""; s += " 网页可见区域宽:" ...
- 详解Kubernetes微服务自动化发布系统
实施微服务架构后,原先单一的系统结构统变成了数量众多的微服务应用,开发.测试.运维部署等都会面临不少挑战.在微服务架构下如何提高工程研发效率,确保开发.测试.运维部署等流程上的顺畅,是微服务技术体系能 ...
- java安全编码指南之:ThreadPool的使用
目录 简介 java自带的线程池 提交给线程池的线程要是可以被中断的 正确处理线程池中线程的异常 线程池中使用ThreadLocal一定要注意清理 简介 在java中,除了单个使用Thread之外,我 ...
- git学习(六) git reset操作
git reset 操作 git reset git reset HEAD 文件名 移除不必要的添加到暂存区的文件 git reset HEAD^ 或者 commitid 去掉上一次的提交 git r ...
- 为什么使用CNN作为降噪先验?
图像恢复的MAP推理公式: $\hat{x}\text{}=\text{}$arg min$_{x}\frac{1}{2}||\textbf{y}\text{}-\text{}\textbf{H}x| ...
- json针对list map set 应用
package JSONtest; import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; im ...
- 手写webpack核心原理,再也不怕面试官问我webpack原理
手写webpack核心原理 目录 手写webpack核心原理 一.核心打包原理 1.1 打包的主要流程如下 1.2 具体细节 二.基本准备工作 三.获取模块内容 四.分析模块 五.收集依赖 六.ES6 ...
- MongoDB 数据备份和恢复 --- MongoDB基础用法(七)
数据备份 在Mongodb中我们使用mongodump命令来备份MongoDB数据.该命令可以导出所有数据到指定目录中. mongodump命令可以通过参数指定导出的数据量级转存的服务器. mongo ...
- kubectl命令小妙招
kubectl命令使用大全 中文: http://docs.kubernetes.org.cn/683.html [root@master-test ~]# kubectl --help kube ...