Apollo 오류 로 apollo. meta 의 문제 해결 방안 을 찾 을 수 없습니다.
Apollo 가 틀 렸 습 니 다. apoll. meta 를 찾 을 수 없 지만 apollo - env. properties 를 apollo - client 에 설정 하 였 습 니 다.
apollo-env.properties
pro.meta=http://apollo.xxxx.com:81
문제 분석
회사 내부 에서 사용 하 는 ctrip Apollo 는 비교적 빠 른 버 전 을 사 용 했 기 때문에 그 동안 업 그 레이 드 를 한 번 거 쳤 고 저 는 Apollo 의 충실 한 사용자 라 고 할 수 있 습 니 다. 사용 시간 은 2 년 이 넘 었 습 니 다.그래서 저 는 아폴로 의 초기 버 전 은 Apollo - client 를 중앙 창고 에 발표 하지 않 았 습 니 다. Apollo - client 의 내부 에는 컴 파일 기간 에 지정 한 apollo - env. properties 파일 이 포함 되 어 있 기 때문에 중앙 창고 에 발표 하기 위해 서 는 이 방식 으로 자사 의 meta 주 소 를 넣 을 수 없습니다.따라서 Apollo 는 JVM 파라미터 등 을 통 해 apollo 의 meta Server 주 소 를 지정 하 는 설정 방식 을 추가 했다.
회사 Maven 창고 에 있 는 apollo - client 에는 apollo - env. properties 가 들 어 있 습 니 다.따라서 원칙적으로 Apollo 는 더 이상 배치 할 필요 가 없다.
왜 잘못 보 고 했 을 까?
문제 의 원인
Apollo 의 Meta 주소 획득 논리, JAVA 의 SPI 로 구현
package com.ctrip.framework.apollo.core.spi;
import com.ctrip.framework.apollo.core.enums.Env;
/**
* @since 1.0.0
*/
public interface MetaServerProvider extends Ordered {
/**
* Provide the Apollo meta server address, could be a domain url or comma separated ip addresses, like http://1.2.3.4:8080,http://2.3.4.5:8080.
*
* In production environment, we suggest using one single domain like http://config.xxx.com(backed by software load balancers like nginx) instead of multiple ip addresses
*/
String getMetaServerAddress(Env targetEnv);
}
이 인 터 페 이 스 는 두 가지 실현 이 있다.
기본 구현:
public class DefaultMetaServerProvider implements MetaServerProvider
두 번 째 실현: (구 버 전)
public class LegacyMetaServerProvider implements MetaServerProvider
정상 적 인 상황 에서 apollo 는 양자 중의 Provider 를 사용 해 야 한다.
JVM 이 시 작 될 때 DefaultMetaServerProvider 를 사 용 했 을 때 JVM 인자 apollo. meta 가 설정 되 어 있 지 않 으 면 오류 가 발생 하여 meta server 를 찾 을 수 없습니다.
그런데 왜 회사 창고 에 apollo - client 에 apollo - env. properties 가 있 는데 Legacy MetaServerProvider 를 사용 하지 않 았 습 니까?
문제 해결
구 덩이 를 밟 는 횟수 가 많아 졌 기 때문에 자 연 스 럽 게 jar 가방 에 가 보 려 고 했 습 니 다. 검 사 를 통 해 jar 안의 META - INF 에 apollo - env. properties 가 있 는 것 을 발 견 했 습 니 다.문 제 는 바로 apollo - core - 1.3.0 - xxx. jar! /META - INF / services / com. ctrip. framework. apollo. core. spi. MetaServerProvider 내:
com.ctrip.framework.apollo.internals.DefaultMetaServerProvider
그리고 apollo - client - 1.3.0 - xxx. jar! /META - INF / services / com. ctrip. framework. apollo. core. spi. MetaServerProvider 내:
com.ctrip.framework.apollo.core.internals.LegacyMetaServerProvider
최종 원인 은 maven 포장 도구 에 maven - jar - plugin, maven - assembly - plugin, maven - shaded - plugin 이 있 기 때문이다.
spring - boot - maven - plugin 을 사용 하면 maven - shaded - plugin 이 내장 되 어 있 지만 apollo 를 전혀 모 릅 니 다.
이러한 상황 은 결국 불확실 성 을 초래 했 습 니 다. JVM 에서 불 러 온 Jar 패키지 의 순서 가 다 르 거나 포장 순서 가 달라 서 하나의 SPI 파일 이 다른 파일 로 덮어 져 provider 를 잃 어 버 렸 습 니 다.
그러나 maven - shaded - plugin 만 있 습 니 다. TRANSFORMER 설정 을 통 해 이 두 가 지 를 하나의 com. ctrip. framework. apollo. core. spi. MetaServerProvider 파일 에 통합 할 수 있 습 니 다.
최종 해결 방안
apollo - client 와 apollo - core 가방 안의
/META-INF/services/com.ctrip.framework.apollo.core.spi.MetaServerProvider
두 개의 Provider 를 유지 하고 각각 한 줄 을 쓴다.또는 관계자 에 게 연락 해 이 두 파일 의 내용 을 일치 시 키 고 적용 할 수 있 는 방안 을 제시한다.예 를 들 어 jar 패키지 에 pro. meta 등 변 수 를 추가 할 때 Legacy MetaServerProvider 를 제공 합 니 다.첨부 되 지 않 으 면 사용 자 는 스스로 apollo. meta 를 설정 하도록 요구 합 니 다.마침 이 글 은 내 가 아폴로 와 Dubbo 를 통합 한 글 에서 겪 은 또 다른 문 제 를 해결 했다.
Dubbo 2.7.3 버 전 사용 ConfigCenter Config 통합 Apollo No Provider found 문제 해결
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.