亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

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

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

問題描述

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

解決方案

為了在 WAR 包部署時(shí)正確地注冊(cè)服務(wù)到 Nacos,我們需要?jiǎng)討B(tài)地獲取實(shí)際使用的服務(wù)器端口,并將其設(shè)置到 Nacos 的服務(wù)注冊(cè)中。以下是一個(gè)具體的實(shí)現(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 包后無法注冊(cè)到 Nacos 的問題
 * 通過動(dòng)態(tài)獲取服務(wù)器端口并注冊(cè)到 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();
        }
    }
    /**
     * 獲取實(shí)際使用的服務(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 時(shí),才會(huì)創(chuàng)建這個(gè) NacosConfig bean。
  • @Component:標(biāo)記為 Spring 的組件,使其能夠被 Spring 掃描和管理。
  • ApplicationRunner:實(shí)現(xiàn)該接口的 run 方法將在應(yīng)用啟動(dòng)時(shí)運(yùn)行。

2. 自動(dòng)注入與配置

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

3. 啟動(dòng)時(shí)設(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)用啟動(dòng)時(shí)嘗試獲取實(shí)際使用的服務(wù)器端口,如果獲取失敗則使用配置文件中的端口。
  • 將端口設(shè)置到 Nacos 的服務(wù)注冊(cè)中,并啟動(dòng)服務(wù)注冊(cè)。

4. 獲取實(shí)際端口

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 管理接口獲取實(shí)際使用的 HTTP 端口。

總結(jié)

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

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

相關(guān)文章

  • Spring一步到位精通攔截器

    Spring一步到位精通攔截器

    攔截器(Interceptor)是一種動(dòng)態(tài)攔截方法調(diào)用的機(jī)制,在SpringMVC中動(dòng)態(tài)攔截控制器方法的執(zhí)行。本文將詳細(xì)講講SpringMVC中攔截器的概念及入門案例,感興趣的可以嘗試一下
    2023-01-01
  • SpringBoot使用thymeleaf實(shí)現(xiàn)前端表格

    SpringBoot使用thymeleaf實(shí)現(xiàn)前端表格

    雖然現(xiàn)在流行前后端分離,但是后端模版在一些關(guān)鍵地方還是非常有用的,例如郵件模版、代碼模版等。當(dāng)然也不排除一些古老的項(xiàng)目后端依然使用動(dòng)態(tài)模版。Thymeleaf 簡潔漂亮、容易理解,并且完美支持 HTML5,可以直接打開靜態(tài)頁面,同時(shí)不新增標(biāo)簽,只需增強(qiáng)屬性
    2022-10-10
  • Java 數(shù)據(jù)流之Broadcast State

    Java 數(shù)據(jù)流之Broadcast State

    這篇文章主要介紹了Java 數(shù)據(jù)流之Broadcast State,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-09-09
  • spring bean標(biāo)簽的primary屬性用法講解

    spring bean標(biāo)簽的primary屬性用法講解

    這篇文章主要介紹了spring bean標(biāo)簽的primary屬性用法講解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • Mybatis實(shí)現(xiàn)Mapper動(dòng)態(tài)代理方式詳解

    Mybatis實(shí)現(xiàn)Mapper動(dòng)態(tài)代理方式詳解

    這篇文章主要為大家詳細(xì)介紹了Mybatis實(shí)現(xiàn)Mapper動(dòng)態(tài)代理方式,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-08-08
  • 初次使用IDEA創(chuàng)建maven項(xiàng)目的教程

    初次使用IDEA創(chuàng)建maven項(xiàng)目的教程

    這篇文章主要介紹了初次使用IDEA創(chuàng)建maven項(xiàng)目的教程講解,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2018-01-01
  • Maven?pom.xml文件獲取當(dāng)前時(shí)間戳方式

    Maven?pom.xml文件獲取當(dāng)前時(shí)間戳方式

    這篇文章主要介紹了Maven?pom.xml文件獲取當(dāng)前時(shí)間戳方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • 解決MyBatis返回結(jié)果類型為Boolean的問題

    解決MyBatis返回結(jié)果類型為Boolean的問題

    這篇文章主要介紹了解決MyBatis返回結(jié)果類型為Boolean的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-11-11
  • Jmeter解析返回參數(shù)以及解析并操作json方式

    Jmeter解析返回參數(shù)以及解析并操作json方式

    本文總結(jié)了Java或JMeter的BeanShell腳本中處理JSON字符串的常用操作,包括解析JSON數(shù)組、JSON對(duì)象和嵌套的JSON字符串,并提供了示例代碼和打印結(jié)果
    2025-02-02
  • java自動(dòng)生成編號(hào)的實(shí)現(xiàn)(格式:yyMM+四位流水號(hào))

    java自動(dòng)生成編號(hào)的實(shí)現(xiàn)(格式:yyMM+四位流水號(hào))

    這篇文章主要介紹了java自動(dòng)生成編號(hào)的實(shí)現(xiàn)(格式:yyMM+四位流水號(hào)),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-10-10

最新評(píng)論