最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Spring?Boot應(yīng)用打WAR包后無法注冊到Nacos的問題及解決方法

 更新時間:2024年06月06日 11:04:45   作者:柳岸花開  
當(dāng)我們將?Spring?Boot?應(yīng)用打包成?WAR?并部署到外部?Tomcat?服務(wù)器時,可能會遇到服務(wù)無法注冊到?Nacos?的情況,其原因主要是應(yīng)用獲取不到正確的服務(wù)器端口,下面給大家介紹Spring?Boot?應(yīng)用打?WAR?包后無法注冊到?Nacos的問題及解決方法,感興趣的朋友跟隨小編一起看看吧

在微服務(wù)架構(gòu)中,服務(wù)注冊與發(fā)現(xiàn)是至關(guān)重要的一環(huán)。Nacos 作為阿里巴巴開源的注冊中心,能夠很好地滿足這一需求。然而,在將 Spring Boot 應(yīng)用打包成 WAR 部署到外部服務(wù)器時,可能會遇到服務(wù)無法注冊到 Nacos 的問題。本文將詳細講解這一問題的解決方案。

問題描述

在開發(fā)過程中,通常使用 JAR 包運行 Spring Boot 應(yīng)用,這種方式下,服務(wù)注冊到 Nacos 通常沒有問題。然而,當(dāng)我們將 Spring Boot 應(yīng)用打包成 WAR 并部署到外部 Tomcat 服務(wù)器時,可能會遇到服務(wù)無法注冊到 Nacos 的情況。其原因主要是應(yīng)用獲取不到正確的服務(wù)器端口。

解決方案

為了在 WAR 包部署時正確地注冊服務(wù)到 Nacos,我們需要動態(tài)地獲取實際使用的服務(wù)器端口,并將其設(shè)置到 Nacos 的服務(wù)注冊中。以下是一個具體的實現(xiàn)代碼:

import com.alibaba.cloud.nacos.registry.NacosAutoServiceRegistration;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.stereotype.Component;
import javax.management.MBeanServer;
import javax.management.ObjectName;
import javax.management.Query;
import java.lang.management.ManagementFactory;
import java.util.Set;
/**
 * 解決 Spring Boot 應(yīng)用打 WAR 包后無法注冊到 Nacos 的問題
 * 通過動態(tài)獲取服務(wù)器端口并注冊到 Nacos
 */
@Slf4j
@ConditionalOnProperty(prefix = "project.deploy", name = "mode", havingValue = "war")
@Component
public class NacosConfig implements ApplicationRunner {
    @Autowired
    private NacosAutoServiceRegistration registration;
    @Value("${server.port:8080}")
    Integer port;
    @Override
    public void run(ApplicationArguments args) {
        if (registration != null && port != null) {
            Integer serverPort = port;
            try {
                serverPort = new Integer(getServerPort());
            } catch (Exception e) {
                log.warn("getServerPort warn", e);
                log.info("getServerPort fail, use the config-file's port {}", port);
            }
            registration.setPort(serverPort);
            registration.start();
        }
    }
    /**
     * 獲取實際使用的服務(wù)器端口
     */
    public String getServerPort() throws Exception {
        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");
        log.debug("getServerPort {}", port);
        return port;
    }
}

代碼解析

1. 類與注解

@Slf4j
@ConditionalOnProperty(prefix = "project.deploy", name = "mode", havingValue = "war")
@Component
public class NacosConfig implements ApplicationRunner {
  • @Slf4j:Lombok 提供的注解,用于生成日志記錄器。
  • @ConditionalOnProperty:只有在 project.deploy.mode 屬性值為 war 時,才會創(chuàng)建這個 NacosConfig bean。
  • @Component:標(biāo)記為 Spring 的組件,使其能夠被 Spring 掃描和管理。
  • ApplicationRunner:實現(xiàn)該接口的 run 方法將在應(yīng)用啟動時運行。

2. 自動注入與配置

@Autowired
private NacosAutoServiceRegistration registration;
@Value("${server.port:8080}")
Integer port;
  • @Autowired:注入 Nacos 的服務(wù)注冊類 NacosAutoServiceRegistration。
  • @Value:注入配置文件中的端口號,如果未配置則默認(rèn)使用 6888 端口。

3. 啟動時設(shè)置端口

@Override
public void run(ApplicationArguments args) {
    if (registration != null && port != null) {
        Integer serverPort = port;
        try {
            serverPort = new Integer(getServerPort());
        } catch (Exception e) {
            log.warn("getServerPort warn", e);
            log.info("getServerPort fail, use the config-file's port {}", port);
        }
        registration.setPort(serverPort);
        registration.start();
    }
}
  • 在應(yīng)用啟動時嘗試獲取實際使用的服務(wù)器端口,如果獲取失敗則使用配置文件中的端口。
  • 將端口設(shè)置到 Nacos 的服務(wù)注冊中,并啟動服務(wù)注冊。

4. 獲取實際端口

public String getServerPort() throws Exception {
    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");
    log.debug("getServerPort {}", port);
    return port;
}

通過 JMX 管理接口獲取實際使用的 HTTP 端口。

總結(jié)

通過上述代碼,我們可以實現(xiàn)在 Spring Boot 應(yīng)用啟動時,動態(tài)獲取并設(shè)置 Nacos 注冊的端口號。這對于在不同環(huán)境中部署應(yīng)用非常有用,可以避免硬編碼端口號帶來的問題。同時,結(jié)合 Nacos 的服務(wù)注冊與發(fā)現(xiàn)功能,可以更加靈活地管理微服務(wù)架構(gòu)中的各個服務(wù)。

到此這篇關(guān)于Spring Boot 應(yīng)用打 WAR 包后無法注冊到 Nacos怎么辦的文章就介紹到這了,更多相關(guān)Spring Boot打 WAR 包無法注冊到 Nacos內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 淺談Java多進程程序的運行模式

    淺談Java多進程程序的運行模式

    這篇文章主要介紹了淺談Java多進程程序的運行模式,包括對進程阻塞問題的討論等,需要的朋友可以參考下
    2015-11-11
  • Java中常見的對象轉(zhuǎn)換工具

    Java中常見的對象轉(zhuǎn)換工具

    對象進行對象的轉(zhuǎn)換是一個操作重復(fù)且繁瑣的工作,于是市面上就有許多的對象轉(zhuǎn)換工具來解決這個問題,下面我們就來看看幾個比較常用的工具(mapstruct,Spring BeanUtils,Apache BeanUtils)使用方式及其性能
    2023-04-04
  • 詳解Java關(guān)于JDK中時間日期的API

    詳解Java關(guān)于JDK中時間日期的API

    這篇文章主要介紹了詳解Java關(guān)于JDK中時間日期的API,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-09-09
  • 基于Java將Excel科學(xué)計數(shù)法解析成數(shù)字

    基于Java將Excel科學(xué)計數(shù)法解析成數(shù)字

    這篇文章主要介紹了基于Java將Excel科學(xué)計數(shù)法解析成數(shù)字,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-09-09
  • spring Boot打包部署到遠程服務(wù)器的tomcat中

    spring Boot打包部署到遠程服務(wù)器的tomcat中

    這篇文章主要給大家介紹了關(guān)于spring Boot打包部署到遠程服務(wù)器的tomcat中的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-12-12
  • springboot+vue實現(xiàn)websocket配置過程解析

    springboot+vue實現(xiàn)websocket配置過程解析

    這篇文章主要介紹了springboot+vue實現(xiàn)websocket配置過程解析,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-04-04
  • Java二維數(shù)組查找功能代碼實現(xiàn)

    Java二維數(shù)組查找功能代碼實現(xiàn)

    這篇文章主要介紹了Java二維數(shù)組查找功能代碼實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-06-06
  • Java中Volatile關(guān)鍵字能保證原子性嗎

    Java中Volatile關(guān)鍵字能保證原子性嗎

    這篇文章主要介紹了Java中Volatile關(guān)鍵字能保證原子性嗎,文章圍繞主題展開詳細的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下
    2022-08-08
  • 用Java實現(xiàn)聊天程序

    用Java實現(xiàn)聊天程序

    這篇文章主要為大家詳細介紹了用Java實現(xiàn)聊天程序,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-09-09
  • 關(guān)于Spring 中 StringUtils.isEmpty 被棄用如何正確使用

    關(guān)于Spring 中 StringUtils.isEmpty 被棄用如何正確使用

    SpringBoot/SpringFramework升級后,StringUtils.isEmpty()方法已被棄用,推薦使用hasLength和hasText替代,hasLength判斷是否有長度,hasText判斷是否包含至少一個非空白字符,本文給大家介紹關(guān)于Spring 中 StringUtils.isEmpty 被棄用如何正確使用,感興趣的朋友一起看看吧
    2026-01-01

最新評論

张掖市| 自治县| 怀安县| 康马县| 祁阳县| 长治县| 呈贡县| 明水县| 麻栗坡县| 巩义市| 昌平区| 天等县| 进贤县| 福安市| 札达县| 浙江省| 敖汉旗| 德江县| 将乐县| 台南县| 建德市| 广丰县| 新和县| 苍南县| 灵川县| 永清县| 靖江市| 聊城市| 册亨县| 达州市| 兴义市| 华坪县| 隆林| 昌邑市| 黄陵县| 南皮县| 景东| 郁南县| 田林县| 乐陵市| 绥棱县|