최근 POC(Project Bidding Demonstration) 환경 지원을 했는데 Nacos 서버 통합이 필요했습니다. 기존 프로젝트에 이미 Nacos 관련 종속성이 있다는 점을 고려하면 간단하지 않나요? 새 서버를 만들고 구성하고 몇 번 다시 시작하면 되지 않습니까? 그러나 상황은 생각만큼 단순하지 않습니다. 내 로컬 IDE에서 실행하면 동일한 코드가 성공적으로 등록될 수 있지만 Tomcat+War 데모 환경에서는 배포할 수 없습니다.
원격으로 코드를 디버깅한 결과 Nacos 클라이언트의 스레드가 시작되었으나 등록에 실패한 것으로 나타났습니다.
Tomcat 배포 모드와 관련이 있을 수 있다고 생각하여 공식 이슈와 StackOverFlow를 확인했습니다.
외부에 배포하는 경우 내장된 Tomcat 인스턴스를 시작하는 Spring Boot의 일부로 이벤트가 게시됩니다. 컨테이너에는 시작할 내장 컨테이너가 없으므로 이벤트가 게시되지 않습니다. – Andy Wilkinson
대략 말하면 WebServerInitializedEvent
이벤트는 Spring Boot가 내장 Tomcat을 성공적으로 시작한 후에만 게시됩니다. Nacos 클라이언트는 서버에 등록하기 전에 이 이벤트가 발생할 때까지 기다립니다. 그리고 외부 Tomcat에 배포되기 때문에 내장된 Tomcat이 초기화되지 않으므로 이 이벤트가 발생하지 않습니다. WebServerInitializedEvent
事件。而Nacos客户端在等这个事件出现才会向服务端注册自己。又因部署在外部Tomcat中就不会初始化内嵌Tomcat,也就没触发这个事件。
所以解决方法就是将Nacos等事件的部分代码调用下,让他们启动注册。
Nacos的自动注册类是 NacosAutoServiceRegistration
,它继承Spring Cloud的AbstractAutoServiceRegistration
,在AbstractAutoServiceRegistration
等的 bind(WebServerInitializedEvent)
方法监听事件,设置端口号并启动注册。这里边 this.port
是从事件中获取的,需要我们自行获取。
设置port的位置可见,是从org.springframework.cloud.client.serviceregistry.Registration
Nacos의 자동 등록 클래스는 Spring Cloud의 AbstractAutoServiceRegistration
과 AbstractAutoServiceRegistration
의 bind(WebServerInitializedEvent)NacosAutoServiceRegistration
입니다. /code> 메소드는 이벤트를 수신하고 포트 번호를 설정하며 등록을 시작합니다. 여기서 this.port
는 이벤트에서 가져오며 직접 가져와야 합니다.
포트가 설정된 위치가 보입니다. org.springframework.cloud.client.serviceregistry.Registration
에서 가져옵니다. 설정하면 됩니다.
위 내용은 SpringBoot가 외부 Tomcat에 배포되어 Nacos 서버에 등록할 수 없는 경우 문제를 해결하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!