一.介绍下系统背景
先贴出eureka注册中心上的注册信息
拿登录举例子吧,我的登录流程是前端输入用户名密码,通过网关将请求转发到mall-user微服务上,mall-user通过Feign远程调用oauth2微服务进行登录验证然后返回消息,oauth2是部署在两台虚拟机上的,这就涉及到分布式部署负载均衡了。看起来并不难,但绝知此事要躬行,如果只是在自己电脑上改个端口然后像我上面类似流程请求成功的话并无难度,因为你的所有微服务都是在一个局域网下的一台主机上,你可能什么困难也碰不到就轻松运行成功了。
在eureka的status列是根据项目中的yml配置文件显示的,我刚开始小看它了,以为它只是展示作用,然而它却并不简单,尤其在涉及分布式部署的时候,由于ip的不同就一定会出问题。
先看看我原来的配置(mall-product微服务)。这是网上99%人的配置。
这样的配置在单机情况下没有问题,运行之后看看是什么样子的
本地运行的在eureka上的ip是在当前局域网下分配的ip,所以虽然注册到了eureka上,但是显然其他服务包括网关是无法请求到本地的微服务的(我一直没有解决这个问题),如果就将这样的配置的微服务打包部署到服务器上又会什么样子的呢?这里就不尝试了,直接说出我的亲测结论,如果部署在服务器运行上面的信息是 linux内网ip+端口,注意是内网,别的微服务还是无法请求到该服务的(404),之前上面eureka注册信息ip都是服务器公网ip,也就是任何人都可以请求到。租的服务器都有一个公网一个内网ip的。
二、解决方式
将原来的内网ip配置方式改为公网ip配置方式(写死是一遗憾)。
这样的话部署到服务器上就会是你指定的服务器公网ip地址了,根据部署在不同服务器来修改不同的ip地址并分开部署。这是我的解决方式,写死我总感觉不太好,但目前没有找到更好的方式了。
三 、测试
用最开始说的登录测试吧,打开postman 输入网址测试。负载均衡到两台服务器上的oauth2服务。先负载到A
轮询机制下次请求会到B服务器上的Oauth2服务
请求流程如下图
源码方面:
包>package org.springframework.cloud.netflix.eureka;
private String ipAddress;
public void setIpAddress(String ipAddress) {
this.ipAddress = ipAddress;
this.hostInfo.override = true;
}