非Boot節點Eureka服務單向調用,環境隔離

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的隔離

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章