因为一些业务原因我会隐藏一些细节,可能后面客官会猜到因为什么。
20190928注:这文章是最早写的,其实最简单的方案是在开发环境设置client的地址为测试服务器地址:
eureka:
instance:
prefer-ip-address: true #以IP地址注册到服务中心
instance-id: http://192.168.1.4:8110 #服务中心的信息显示(如果IP地址不显示的话,进行配置)
此配置最好在部署服务的时候加在启动命令中,而非写死在配置文件
如题,目的是想让测试环境不会访问开发环境的服务。
1 先说一个失败的方案。如果对此不感兴趣,可以跳到方案2.
项目结构如下:
product-service
| -- src
|main
| -- java
| -- resources
| -- doc
| -- ...
| -- application.yml
| -- ...
| -- application-test7.yml
这里application.yml配置如下
spring:
profiles:
active: test7
jackson:
serialization:
FAIL_ON_EMPTY_BEANS: false
意思比较明确,就是在开发环境使用application-test7.yml的配置文件的配置。application-test7.yml(以下将简称test7)部分配置:
eureka:
instance:
## 心跳间隔,5秒
leaseRenewalIntervalInSeconds: 5
##没有心跳的淘汰时间,10秒
lease-expiration-duration-in-seconds: 10
prefer-ip-address: true
ip-address: x.x.x.8
client:
# 定时刷新本地缓存时间 默认30s
registryFetchIntervalSeconds: 5
serviceUrl:
defaultZone: http://x.x.x.106:899/eureka/
product服务在测试环境启动以后,注册到106服务器的Eureka,本地开发环境的服务也注册到了106服务器。当测试同学测试的时候,发现接口时好时坏。
原因是这样的:
当前端调用api时,网关将请求分发到在Eureka注册的服务器,当分发到测试环境服务器时,服务器响应了,当分发到开发pc时,因为请求不到内网ip出现请求错误。
因此我提供了一个简单的解决方案:
product-service
| -- src
|main
| -- java
| -- resources
| -- doc
| -- ...
| -- application.yml
| -- ...
| -- application-test7.yml
| -- application-dev.yml
并在application.yml配置如下
spring:
profiles: application-dev.yml
active:
jackson:
serialization:
FAIL_ON_EMPTY_BEANS: false
以此将开发环境与测试环境隔离。我擦,太简单了。
可是
这样并不能解决问题,因为在开发环境中有服务之间调用会出现问题。比如:
我开发a服务,需要调用另一个小伙伴的b服务,如果使用上面的配置,a服务注册到了dev环境的Erueka,可是b服务有可能尚未在dev环境的Eureka注册。
方案2:
因此最简单的方式应该是:开发环境不注册Eureka。
对此, 在启动类加入了参数
public class MfCodeGoodsApplication {
private static final String SHUT_DOWN_ERREKA = "shutdowneureka";
private static final String SHUT_DOWN_ERREKA_VAL = "true";
public static void main(String[] args) {
SpringApplication.run(MfCodeGoodsApplication.class, args);
for(String arg:args){
// 如果工程启动时候,给main函数加了参数,就解析出来
String[] param = arg.trim().toLowerCase().split("=");
// 如果参数带有 SHUT_DOWN_ERREKA=true
if (param.length > 1 && SHUT_DOWN_ERREKA.equals(param[0])) {
if (SHUT_DOWN_ERREKA_VAL.equals(param[1])) {
// 不注册Eureka
DiscoveryManager.getInstance().shutdownComponent();
}
}
}
}
}
idea加入启动参数的方式。
这样一来,开发环境和测试环境使用相同配置,但开发环境关闭了Eureka的注册,所以测试环境不会请求开发环境,但是开发环境的可以请求测试环境。
以上。