Spring cloud boot節點中的項目往往都比較小,適合本地啓動調試(本地斷點調試很方便),但在實行本地調試的時候遇到了如下問題:
1.非boot節點本地環境啓動時往往配置不好就註冊到了dev環境,由於appName,serviceId(vipAdress)相同,導致dev環境形成集羣,該節點參與dev環境運作,影響dev環境穩定性(本地服務頻繁啓動且由於節點不能被及時剔除導致dev環境經常出現500,以及觸發開啓了保護模式的eureka server)
2.如若純本地跑,本地環境需要一套eureka server與zuul等配置,環境配置複雜,涉及服務間調用的話還需要啓動多個服務導致本機卡頓,環境穩定性不可靠。
如何既能訪問dev環境一整套完整的服務,又不影響dev環境的穩定性?
1.spring boot節點
boot節點配置可以從配置中心拉取local配置,只需要在local配置中改成和dev環境不一樣的appName就可以避免集羣了,這樣自己本地能夠訪問dev環境,而dev環境卻因爲沒有指向local的appName的服務而不會訪問本地。
2.非boot節點
之前因爲迫於本地服務總註冊到dev環境的壓力,於是弄了一套“假的”eureka server 讓本地服務去註冊,這樣雖然避免了本地服務註冊到eureka上,但除非本地再將另一個服務註冊上去,否則是無法訪問的。
基於boot節點的隔離處理原理,同樣的非boot節點也可以修改appName:
package com.kowalski.demo.eureka;
import com.netflix.appinfo.MyDataCenterInstanceConfig;
import javax.management.MBeanServer;
import javax.management.ObjectName;
import javax.management.Query;
import java.lang.management.ManagementFactory;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.Set;
/**
* Created by kowalski 2017/5/25
*/
public class MyInstanceConfig extends MyDataCenterInstanceConfig {
/**
* 優先使用ip 替換 hostname
* @param refresh
* @return
*/
@Override
public String getHostName(boolean refresh) {
try {
return InetAddress.getLocalHost().getHostAddress();
} catch (UnknownHostException e) {
return super.getHostName(refresh);
}
}
/***
*獲取本機啓動中tomcat端口號
* @return
*/
@Override
public int getNonSecurePort(){
int tomcatPort;
try {
MBeanServer beanServer = ManagementFactory.getPlatformMBeanServer();
Set<ObjectName> objectNames = beanServer.queryNames(new ObjectName("*:type=Connector,*"),
Query.match(Query.attr("protocol"), Query.value("HTTP/1.1")));
tomcatPort = Integer.valueOf(objectNames.iterator().next().getKeyProperty("port"));
}catch (Exception e){
return super.getNonSecurePort();
}
return tomcatPort;
}
/**
* 區分服務器環境與本地環境
* @return
*/
@Override
public String getAppname(){
try {
String ipAddr = InetAddress.getLocalHost().getHostAddress();
if (ipAddr.startsWith("10.")) {
return super.getAppname();
} else {
return "local-" + super.getAppname();
}
} catch (UnknownHostException e) {
e.printStackTrace();
return "localAppnameErr";
}
}
}
由於是非boot節點,本地啓動tomcat端口號取決於本地配置,所以這裏採用了動態獲取本機tomcat端口號的方法,再由於我們dev環境採用的是騰訊雲服務器,所以暫時是通過ip來做區分(也可以採取別的方式),ip如果不是以10.開頭就會被認爲是本地服務(可以搞一個ip列表區分),appName會被加上local字樣用以區分,這樣就實現了本地與dev的隔離