91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

SpringBoot部署到外部Tomcat無法注冊到Nacos服務端如何解決

發布時間:2023-03-17 09:43:40 來源:億速云 閱讀:118 作者:iii 欄目:開發技術

本文小編為大家詳細介紹“SpringBoot部署到外部Tomcat無法注冊到Nacos服務端如何解決”,內容詳細,步驟清晰,細節處理妥當,希望這篇“SpringBoot部署到外部Tomcat無法注冊到Nacos服務端如何解決”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來學習新知識吧。

事情經過

近期做一個項目投標演示(POC)環境支持,需要集成Nacos服務端。考慮到現有項目中已經有了Nacos相關依賴,那還不簡單?新建個服務端,配置幾下重啟不就搞定了嗎?然而事情遠沒有想得這么簡單。同樣的代碼在我本地IDE里運行就能注冊成功,在演示環境 Tomcat+War 部署就不行了。

經過遠程Debug代碼,發現Nacos客戶端的線程都有啟動,卻沒有注冊成功。

思路

想到可能與Tomcat部署模式有關系,就去查了官方issue和StackOverFlow

The event is published as part of Spring Boot starting the embedded Tomcat instance. If you're deploying to an external container, there's no embedded container to start and, therefore, no event is published. – Andy Wilkinson

大致是說只有當 Spring Boot 啟動內嵌 Tomcat 成功后,才會發布 WebServerInitializedEvent 事件。而Nacos客戶端在等這個事件出現才會向服務端注冊自己。又因部署在外部Tomcat中就不會初始化內嵌Tomcat,也就沒觸發這個事件。

所以解決方法就是將Nacos等事件的部分代碼調用下,讓他們啟動注冊。

Nacos的自動注冊類是 NacosAutoServiceRegistration,它繼承Spring Cloud的AbstractAutoServiceRegistration,在AbstractAutoServiceRegistration等的 bind(WebServerInitializedEvent)方法監聽事件,設置端口號并啟動注冊。這里邊 this.port 是從事件中獲取的,需要我們自行獲取。

SpringBoot部署到外部Tomcat無法注冊到Nacos服務端如何解決

設置port的位置可見,是從org.springframework.cloud.client.serviceregistry.Registration中取到的,給它設置一下就可以了。

SpringBoot部署到外部Tomcat無法注冊到Nacos服務端如何解決

解決辦法

我寫了一個完整的配置類放到了該ISSUE下邊,這里直接貼在下邊。

import java.lang.management.ManagementFactory;
import java.util.Set;
 
import javax.annotation.PostConstruct;
import javax.management.MBeanServer;
import javax.management.MalformedObjectNameException;
import javax.management.ObjectName;
import javax.management.Query;
 
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.env.Environment;
 
import com.alibaba.cloud.nacos.registry.NacosAutoServiceRegistration;
import com.alibaba.cloud.nacos.registry.NacosRegistration;
 
@Configuration
public class NacosWarDeployConfig {
    private static final Logger logger = LoggerFactory.getLogger(NacosWarDeployConfig.class);
 
    @Autowired
    private Environment env;
    @Autowired
    private NacosRegistration registration;
    @Autowired
    private NacosAutoServiceRegistration nacosAutoServiceRegistration;
 
    @PostConstruct
    public void nacosServerRegister() {
        if (registration != null) {
            registration.setPort(getTomcatPort());
            nacosAutoServiceRegistration.start();
        }
    }
 
    public int getTomcatPort() {
        try {
            return getProvideTomcatPort();
        } catch (Exception e) {
            logger.warn("obtain provide tomcat port failed, fallback to embeded tomcat port.");
        }
        return getEmbeddedTomcatPort();
    }
 
    private int getProvideTomcatPort() throws MalformedObjectNameException, NullPointerException {
        MBeanServer beanServer = ManagementFactory.getPlatformMBeanServer();
        Set<ObjectName> objectNames = beanServer.queryNames(new ObjectName("*:type=Connector,*"),
                Query.match(Query.attr("protocol"), Query.value("HTTP/1.1")));
        String port = objectNames.iterator().next().getKeyProperty("port");
        return Integer.valueOf(port);
    }
 
    private int getEmbeddedTomcatPort() {
        return env.getProperty("server.port", Integer.class, 8080);
    }
 
}

讀到這里,這篇“SpringBoot部署到外部Tomcat無法注冊到Nacos服務端如何解決”文章已經介紹完畢,想要掌握這篇文章的知識點還需要大家自己動手實踐使用過才能領會,如果想了解更多相關內容的文章,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

盐边县| 福鼎市| 唐海县| 安义县| 绥化市| 乌海市| 黄梅县| 交口县| 云林县| 郯城县| 庆城县| 葫芦岛市| 晴隆县| 镇赉县| 嘉义市| 洪江市| 天祝| 孟州市| 会宁县| 二连浩特市| 文安县| 莲花县| 仙桃市| 修武县| 奉新县| 锡林郭勒盟| 灵丘县| 河西区| 云南省| 大渡口区| 紫金县| 庆云县| 彰武县| 梓潼县| 德清县| 唐海县| 武冈市| 通州市| 陆河县| 宣化县| 永济市|