콘텐츠로 이동

내부 네트워크 환경 Dubbo 마이크로서비스 Guance 연동


작성자: Liu Yujie

소개

일부 프로젝트는 사용자가 회사 내부 직원이거나 그룹사 직원인 경우가 있습니다. 보안을 위해 이러한 프로젝트는 자체 구축한 데이터 센터에 배포되며, 직원은 내부 네트워크 또는 VPN을 통해 접속합니다. 이러한 시나리오를 위해 Guance은 오프라인 배포 솔루션을 제공합니다. 즉, 외부 네트워크에 연결 가능한 호스트에 DataKit을 배포하고 Proxy 수집기를 활성화한 후, 내부 네트워크의 호스트가 이 프록시를 통해 DataKit을 설치하고 모든 데이터도 이 배포된 DataKit을 통해 Guance에 전송하는 방식입니다.

아래에서는 마이크로서비스 아키텍처 프로젝트를 예시로 Guance에 연동하는 방법을 소개합니다. 이 프로젝트는 프론트엔드와 백엔드가 분리된 프로젝트로, 프론트엔드는 Vue, 백엔드 마이크로서비스는 Spring Boot와 Dubbo를 사용하여 개발되었으며, 프론트엔드는 Gateway를 통해 백엔드 서비스에 접근합니다. 사용자는 브라우저로 프론트엔드 웹사이트에 접속하고, 인터페이스의 버튼을 클릭하여 백엔드 API 요청을 트리거합니다. 요청은 Gateway를 통해 Consumer 마이크로서비스로 전달되고, Consumer 마이크로서비스는 요청 처리 과정에서 Provider 마이크로서비스를 호출하고 로그를 기록한 후, 처리가 완료되면 결과를 브라우저에 반환하여 한 번의 호출을 완료합니다.

image

배포 계획

예시 프로젝트는 총 4개의 서비스가 있으며, 각각 4대의 호스트에 배포됩니다. 또한 외부 네트워크에 연결 가능한 호스트 1대가 추가로 필요하며, 이 호스트도 다른 4대의 호스트와 동일한 내부 네트워크에 있습니다.

  • 먼저, 외부 네트워크에 연결된 호스트에 DataKit을 배포하고 Proxy 수집기를 활성화합니다.
  • 다음으로, 나머지 4대의 호스트가 이 프록시를 통해 DataKit을 설치합니다.
  • 그런 다음, Nginx가 설치된 웹 서버에 웹 프로젝트를 배포합니다. 이 웹 호스트의 9529 포트는 내부 네트워크의 다른 호스트에서 접근할 수 있어야 합니다.
  • 마지막으로, Gateway, Consumer, Provider 마이크로서비스를 배포하고 SkyWalking 수집기를 활성화합니다.

예시에서 사용된 서비스는 https://github.com/stevenliu2020/vue3-dubbo에서 다운로드할 수 있습니다. 여기에는 provider.jar, consumer.jar, gateway.jardist 디렉토리가 포함되어 있으며, dist는 Vue 프로젝트입니다. 아래는 프로젝트와 호스트의 매핑 관계 및 전체 배포 아키텍처 다이어그램입니다.

  • 프로젝트와 호스트 매핑 관계
IP 배포 프로젝트 설명
172.16.0.245 DataKit (Proxy) 외부 네트워크 연결 가능
172.16.0.29 Web/DataKit 내부 네트워크, 웹 서버(Nginx)
172.16.0.51 Gateway/DataKit 내부 네트워크, 게이트웨이 서비스 배포
172.16.0.52 Consumer/DataKit 내부 네트워크, 컨슈머 서비스 배포
172.16.0.53 Provider/DataKit 내부 네트워크, 프로바이더 서비스 배포
  • 전체 배포 아키텍처 다이어그램

image

전제 조건

  • Centos 7.9
  • Nginx 설치
  • JDK 설치
  • Zookeeper 설치
  • Guance 계정

환경 버전

Warning

이번 예시에서 사용된 버전은 다음과 같습니다: DataKit 1.4.9, Nginx 1.22.0, Spring Cloud 3.1.1, Spring Boot 2.6.6, Dubbo 2.7.15, Zookeeper 3.7.1, Vue 3.2, JDK 1.8

운영 단계

1 DataKit 배포

1.1 온라인 DataKit 배포

Guance」에 로그인하여 「통합」 모듈로 이동한 후, 「DataKit」 - 「Linux」를 클릭하고 설치 명령어를 복사하여 172.16.0.245 호스트에서 실행합니다. 설치 명령어에는 토큰이 포함되어 있으며, 이후 작업에서 이 토큰을 사용하므로 주의하세요.

image

설치가 완료되면 다음 명령어를 실행하여 Proxy 수집기를 활성화합니다.

cd /usr/local/datakit/conf.d/proxy
cp proxy.conf.sample proxy.conf

/usr/local/datakit/conf.d/datakit.conf 파일을 편집하고, http_apilisten 값을 0.0.0.0:9529로 수정하여 다른 호스트가 이 호스트의 9529 포트에 정상적으로 접근할 수 있도록 합니다.

image

DataKit을 재시작합니다.

systemctl restart datakit

1.2 프록시를 통한 DataKit 배포

172.16.0.29 호스트에 로그인하여 다음 명령어를 실행하여 DataKit을 설치합니다.

여기서 172.16.0.245는 이전 단계에서 DataKit이 설치된 호스트의 IP입니다. 이 단계는 DataKit 프록시를 통해 설치하는 과정이며, 명령어에 사용된 토큰은 위에서 언급한 토큰과 동일합니다.

export HTTPS_PROXY=http://172.16.0.245:9530;  DK_DATAWAY=https://openway.guance.com?token=tkn_9a1111123412341234123412341113bb bash -c "$(curl -L https://static.guance.com/datakit/install.sh)"

다음 명령어를 실행하여 데이터가 Guance에 정상적으로 전송되는지 테스트합니다.

curl -x http://172.16.0.245:9530 -v -X POST https://openway.guance.com/v1/write/metrics?token=tkn_9a1111123412341234123412341113bb -d "proxy_test,name=test c=123i"

200이 반환되면 데이터 전송이 성공한 것입니다.

image

동일한 절차로 172.16.0.51, 172.16.0.52, 172.16.0.53 호스트에 DataKit을 배포합니다. 이렇게 4대의 호스트에 DataKit 배포가 완료됩니다.

2 APM 연동

2.1 SkyWalking 수집기 활성화

172.16.0.51 호스트에 로그인하여 sample 파일을 복사하고 skywalking 수집기를 활성화합니다.

cd /usr/local/datakit/conf.d/skywalking
cp skywalking.conf.sample skywalking.conf

DataKit을 재시작합니다.

systemctl restart datakit

동일한 작업으로 172.16.0.52, 172.16.0.53 호스트에 배포된 DataKit의 SkyWalking 수집기를 활성화합니다.

2.2 SkyWalking 에이전트 업로드

시중에는 다양한 APM 도구가 있지만, 마이크로서비스가 Dubbo 프레임워크를 사용하므로 여기서는 SkyWalking을 권장합니다.

apache-skywalking-java-agent-8.11.0을 다운로드하고, 압축을 풀어 파일 이름을 agent로 변경한 후, 172.16.0.51, 172.16.0.52, 172.16.0.53 호스트의 /usr/local/df-demo/ 디렉토리에 업로드합니다.

참고: 172.16.0.51 호스트에는 gateway가 배포되어 있으므로, agent\optional-plugins 디렉토리에 있는 apm-spring-cloud-gateway-3.x-plugin-8.11.0.jarapm-spring-webflux-5.x-plugin-8.11.0.jar 패키지를 agent\plugins 디렉토리로 복사해야 합니다.

image

2.3 provider 마이크로서비스 배포

provider.jar를 172.16.0.53 호스트의 /usr/local/df-demo/ 디렉토리에 업로드하고, provider.jar가 agent 폴더와 동일한 디렉토리에 있는지 확인합니다. provider 서비스를 시작합니다.

cd /usr/local/df-demo/
java -javaagent:agent/skywalking-agent.jar -Dskywalking.agent.service_name=dubbo-provider -Dskywalking.collector.backend_service=localhost:11800 -jar provider.jar

2.4 consumer 마이크로서비스 배포

consumer.jar를 172.16.0.52 호스트의 /usr/local/df-demo/ 디렉토리에 업로드합니다. consumer 서비스를 시작합니다.

cd /usr/local/df-demo/
java -javaagent:agent/skywalking-agent.jar -Dskywalking.agent.service_name=dubbo-consumer -Dskywalking.collector.backend_service=localhost:11800 -jar consumer.jar

2.5 gateway 마이크로서비스 배포

gateway.jar를 172.16.0.51 호스트의 /usr/local/df-demo/ 디렉토리에 업로드합니다. gateway 서비스를 시작합니다.

cd /usr/local/df-demo/
java -javaagent:agent/skywalking-agent.jar -Dskywalking.agent.service_name=dubbo-gateway -Dskywalking.collector.backend_service=localhost:11800 -jar gateway.jar

3 RUM 연동

dist 디렉토리를 172.16.0.29 호스트의 /usr/local/df-demo/ 디렉토리에 업로드합니다. 프론트엔드가 백엔드 API에 연결하는 URL은 dist\js\app.ec288764.js 파일 내에 있으며, 여기서 백엔드 gateway의 URL은 http://172.16.0.51:9000/api입니다. 「Guance」에 로그인하여 「RUM」 모듈로 이동한 후, dubbo-web 애플리케이션을 생성하고 아래 명령어를 복사합니다.

image

image

/etc/nginx/nginx.conf 파일을 편집하고 다음 내용을 추가합니다.

server {
        listen       80;
        #add_header Access-Control-Allow-Origin '*';
        #add_header Access-Control-Allow-Headers Origin,X-Requested-Width,Content-Type,Accept;

        location / {
            proxy_set_header   Host    $host:$server_port;
            proxy_set_header   X-Real-IP   $remote_addr;
            proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
            root   /usr/local/df-demo/dist;
            index  index.html index.htm;
        }
        #location /nginx_status{
        #        stub_status on;
        #}

    }

설정을 다시 로드합니다.

 nginx -s reload

브라우저에서 http://172.16.0.29/에 접속하면 프론트엔드 인터페이스에 접근할 수 있으며, 인터페이스의 버튼을 클릭하면 백엔드 API가 호출됩니다.

Guance」에 로그인하여 「RUM」 - 「dubbo-web」으로 이동합니다. 여기에는 프론트엔드 애플리케이션의 성능을 분석하는 데 사용할 수 있는 다양한 기능이 있습니다.

image

4 로그 연동

SkyWalking의 apm-toolkit-log4j-2.x 패키지를 사용하면 SkyWalking에서 생성된 traceId를 log4j2를 통해 로그에 출력할 수 있습니다.

DataKit의 pipeline을 사용하면 로그에서 traceId를 추출하여 트레이스와 연결할 수 있습니다.

4.1 의존성 추가

provider 마이크로서비스의 로그에 traceId를 출력하려면 provider의 pom.xml 파일에 의존성을 추가해야 합니다. 버전은 javaagent에서 사용하는 버전과 동일해야 하며, 여기서는 8.11.0입니다.

<dependency>
    <groupId>org.apache.skywalking</groupId>
    <artifactId>apm-toolkit-log4j-2.x</artifactId>
    <version>8.11.0</version>
</dependency>

4.2 로그 수집기 활성화

Provider 서비스가 배포된 서버 172.16.0.53에 로그인하여 sample 파일을 복사합니다.

cd /usr/local/datakit/conf.d/log
cp logging.conf.sample logging.conf

logging.conf 파일을 편집하고, sourcelog-dubbo-provider를 입력합니다. 이 이름은 로그 조회 또는 pipeline 구성 시 필요합니다. logfiles에는 수집할 로그 파일 경로를 입력합니다.

image

DataKit을 재시작합니다.

systemctl restart datakit

4.3 pipeline

Guance」에 로그인하여 「로그」 - 「Pipelines」로 이동합니다.
「Pipeline 생성」을 클릭하고, 필터에서 로그 수집기에 정의한 source인 log-dubbo-provider를 선택합니다.
다음 내용을 구문 분석 규칙으로 입력하고, 마지막으로 「저장」을 클릭합니다.

# 2022-08-03 10:55:50.818 [DubboServerHandler-172.16.0.29:20880-thread-2] INFO dubbo.service.StockAPIService - [decreaseStorage,21] - [TID: 1bc41dfa-3c2c-4917-9da7-0f48b4bcf4b7] - 사용자 ID:-4972683369271453960 ,결재 프로세스 시작:-1133938638

grok(_, "%{TIMESTAMP_ISO8601:time} %{NOTSPACE:thread_name} %{LOGLEVEL:status}%{SPACE}%{NOTSPACE:class_name} - \\[%{NOTSPACE:method_name},%{NUMBER:line}\\] - \\[TID: %{DATA:trace_id}\\] - %{GREEDYDATA:msg}")
default_time(time)

image

프론트엔드를 사용하여 provider 서비스 호출을 트리거하면, provider에서 생성된 로그가 DataKit에 의해 수집되어 Guance에 전송됩니다.

Guance」에 로그인하여 「로그」 모듈의 탐색기로 이동하고, 데이터 소스에서 log-dubbo-provider를 찾은 후 로그 하나를 클릭하여 들어가면 traceId가 태그로 추가된 것을 확인할 수 있습니다. 이후 APM에서 이 traceId를 통해 로그와 연결하여 문제를 신속하게 파악할 수 있습니다.

image

5 연동 분석

위의 단계를 통해 RUM, APM 및 로그의 연동이 완료되었습니다.

Guance」 - 「RUM」에 로그인하여 「dubbo-web」을 클릭한 후 「탐색기」로 이동하여 「view」를 선택하고 페이지 호출 현황을 확인합니다.
그런 다음 「route_change」를 클릭하여 들어가면 Fetch/XHR 탭에서 프론트엔드가 트리거한 API 호출 현황을 확인할 수 있습니다. 항목 하나를 클릭하여 들어가면 플레임 그래프, 스팬 목록, 서비스 호출 관계 및 연결된 provider 서비스의 로그를 확인할 수 있습니다.

image

image

문서 평가

이 페이지가 도움이 되었나요?