一、背景
今天一個朋友問了一個問題,測試環境比線上的代碼多了幾行代碼怎麼辦?
是不是要建立分支?有沒有更好的辦法?
其實還有類似的場景,比如測試環境和線上環境用了同一套NoSQL存儲,想隔離兩個環境。
下面提供一個比較簡單的通用的方案,希望對大家有幫助。
二、方法
我們可以寫一個環境工具類,然後再特定環境的代碼上用這個工具類進行判斷。
public class EnvironmentHelper implements EnvironmentAware {
private Environment environment;
private static final String PROD = "prod";
private static final String PRE = "pre";
private static final String QA = "qa";
public boolean isProd() {
return environment.acceptsProfiles(PROD);
}
public boolean isPre() {
return environment.acceptsProfiles(PRE);
}
public boolean isQa() {
return environment.acceptsProfiles(QA);
}
public String[] getActiveProfiles() {
return environment.getActiveProfiles();
}
@Override
public void setEnvironment(Environment environment) {
this.environment = environment;
}
}

當然也可以直接注入
@Component
public class EnvironmentHelper{
@Autowired
private Environment environment;
private static final String PROD = "prod";
private static final String PRE = "pre";
private static final String QA = "qa";
public boolean isProd() {
return environment.acceptsProfiles(PROD)
}
public boolean isPre() {
return environment.acceptsProfiles(PRE);
}
public boolean isQa() {
return environment.acceptsProfiles(QA);
}
public String[] getActiveProfiles() {
return environment.getActiveProfiles();
}
}
然後借助工具類來判斷環境
@Service
public class DemoServiceImpl implements DemoService {
@Resource
private EnvironmentHelper environmentHelper;
@Override
public void test() {
// 其他代碼1
if (environmentHelper.isQa()) {
// 測試環境專用代碼
}
// 其他代碼2
}
}
當然了也可以借助Apollo來配置,比如設定一個變量表示是否開啟某個功能,線上的Apollo和測試服的配置不同。
如果預發和線上服公用同一套緩存架構,通過環境工具類擷取環境的名稱和key組合成一個新的key字元串,即可實作環境的隔離。
三、總結
方法不難,在開發中偶爾也會用到。
另外建議大家多看Spring的官方文檔,很多場景都有專門的類提供了相關的功能,而不是遇到一個問題一個問題去查,去問。
創作不易,如果覺得本文對你有幫助,歡迎點贊,歡迎關注我,如果有補充歡迎評論交流,我将努力創作更多更好的文章。