찾다
시스템 튜토리얼리눅스마이크로서비스 아키텍처를 위한 Nginx 링크 추적

마이크로서비스 아키텍처를 위한 Nginx 링크 추적

Aug 06, 2024 pm 04:34 PM
linux리눅스 튜토리얼레드햇리눅스 시스템리눅스 명령리눅스 인증빨간 모자 리눅스리눅스 비디오

마이크로서비스 아키텍처를 위한 Nginx 링크 추적

대부분의 마이크로서비스 아키텍처에서 Nginx는 기본적으로 일반적으로 사용되는 액세스 계층 기능이므로 요청 ID가 Nginx 계층에서 확인 및 채워지고 Nginx 요청 로그에 인쇄되기를 바랍니다.

읽기 팁: 이 기사는 링크 추적을 위한 완전한 솔루션을 제공하지 않고 Nginx 계층에서 링크 추적을 위한 지원 솔루션만 제공합니다!

1 배경 소개

마이크로서비스의 탄생은 낮은 유지 관리성, 낮은 확장성, 낮은 유연성(대략적인 비교) 등 기존 모놀리식 애플리케이션의 많은 문제를 해결했습니다. 마이크로서비스 아키텍처는 훌륭하지만 많은 과제도 안겨줍니다. 그중 문제 해결은 해결해야 할 과제 중 하나입니다. 그렇다면 여러 애플리케이션과 인스턴스에서 오류의 근본 원인을 어떻게 찾을 수 있을까요?

위 요구 사항을 기반으로 각 애플리케이션의 각 거래에서 생성된 모든 로그를 중앙에서 수집하고 표시할 수 있습니다(단, 로그 센터가 있는 경우에만 해당). 이렇게 하면 거래가 실패한 단계를 빠르게 확인할 수 있습니다. 잘 수행되었다면 수집된 로그와 장애를 분석한 후 2차 개발 및 데이터 분석을 직접 수행할 수도 있으며 그래픽 인터페이스를 통해 직관적으로 표시할 수도 있습니다.

예를 들어, 마이크로서비스 호출의 토폴로지 다이어그램을 표시하고 색상을 사용하여 오류를 구분할 수 있습니다(예: 일반적으로 사용되는 빨간색: 이상을 나타냄, 녹색: 정상, 노란색: 경고). 그런 다음 일반적인 오류나 예외를 분류하고 다음과 같이 친숙한 표시를 할 수 있습니다(직접적으로 스택으로 이동할 필요가 없음). NullPointerException: 인터페이스는 어떤 코드 줄이 null 포인터를 던졌는지 직접적이고 친숙한 프롬프트를 표시합니다. , 입력 매개변수는 무엇입니까...(이 글의 초점은 이 부분이 아니므로 너무 장황한 내용은 다루지 않겠습니다. 나중에 기회가 되면 자세히 소개하겠습니다.)

전체 마이크로서비스 아키텍처의 링크 추적을 수행하려면 트랜잭션이 마이크로서비스 센터에 진입하는 첫 번째 지점부터 모든 로그를 연결하는 글로벌 트랜잭션 ID가 있기를 바랍니다(링크 추적의 경우 이러한 ID로는 충분하지 않습니다. 그러나 여기서는 이것만 소개합니다). 물론 가장 이상적인 것은 프런트 엔드 로그(예: 작업 로그, 데이터 흐름 등)를 계획하는 것입니다.

2 Nginx

대부분의 마이크로서비스 아키텍처에서 Nginx는 기본적으로 일반적으로 사용되는 액세스 계층 기능이므로 요청 ID가 Nginx 계층에서 확인 및 채워지고 Nginx 요청 로그에 인쇄되기를 바랍니다. Nginx 레이어의 트랜잭션 ID 생성 방법을 구현하는 방법은 세 가지뿐입니다.

2.1 옵션 2: 내장 변수를 기반으로 접합

1.11.0 이전 버전에서는 스플라이싱을 사용하여 요청 ID를 조합할 수 있습니다. 참조 구성은 다음과 같습니다.

으아악

매개변수 설명:

  • $pid: nginx 작업자 프로세스 ID
  • $connection: 업스트림 서버에 대한 링크 ID 수
  • $bytes_sent: 보낸 바이트 수
  • $msec: 현재 시간, 즉 초와 밀리초를 포함하여 이 변수로 얻은 시간( .)
2.2 옵션 3: LUA 스크립트를 기반으로 구현

시스템 /dev/urandom에서 생성된 무작위 UUID를 사용하세요. 참조 스크립트는 다음과 같습니다.

으아악
2.3 솔루션 1: $request_id 구현 기반

Nginx在 1.11.0版本中就提供了内置变量 $request_id ,其原理就是生成32位的随机字符串,虽不能比拟UUID的概率,但32位的随机字符串的重复概率也是微不足道了,所以一般可视为UUID来使用即可。参考配置如下:

<span class="hljs-comment"># Nnginx代理默认会把header中参数的 "_" 下划线去掉,所以后台服务器后就获取不到带"_"线的参数名</span>
<span class="hljs-attribute">underscores_<span class="hljs-keyword">in</span>_headers</span> <span class="hljs-literal">on</span>;

<span class="hljs-comment"># 设定日志格式</span>
<span class="hljs-attribute"><span class="hljs-built_in">log</span>_format</span> main  \<span class="hljs-string">'<span class="hljs-variable">$remote_addr</span> - <span class="hljs-variable">$remote_user</span> [<span class="hljs-variable">$time_local</span>] "<span class="hljs-variable">$request</span>" \'
                 \'<span class="hljs-variable">$status</span> <span class="hljs-variable">$body_bytes_sent</span> "<span class="hljs-variable">$http_referer</span>" <span class="hljs-variable">$upstream_http_request_id</span> \'
                 \'"<span class="hljs-variable">$http_user_agent</span>" "<span class="hljs-variable">$http_x_forwarded_for</span>"\';

server {
    location / {
        <span class="hljs-comment"># 如果请求头中已有该参数,则获取即可;如果没有,则使用</span><span class="hljs-variable"><span class="hljs-comment">$request_id</span></span><span class="hljs-comment">进行填充</span>
        <span class="hljs-built_in">set</span> <span class="hljs-variable">$temp_request_id</span> <span class="hljs-variable">$http_x_request_id</span>;
        <span class="hljs-keyword">if</span> (<span class="hljs-variable">$temp_request_id</span> = "") {
            <span class="hljs-built_in">set</span> <span class="hljs-variable">$temp_request_id</span> <span class="hljs-variable">$request_id</span>;
        }
        <span class="hljs-comment"># 屏蔽掉原来的请求头参数</span>
        proxy_<span class="hljs-built_in">set</span>_header  x_request_id        "";
        <span class="hljs-comment"># 设置向后转发的请求头参数</span>
        proxy_<span class="hljs-built_in">set</span>_header  X-Request-Id        <span class="hljs-variable">$temp_request_id</span>;
    }
}
</span>
3 最佳实践

生成交易ID的方式有很多种,但希望使用者结合自身实际情况进行合理取舍,而不要盲目的追求ID的唯一性、可读性和时序性等等。

比如,ID具有时序性虽然有一定的好处,但实际的架构根本没有去使用该时序性,则没必要花大量的精力和做出大量的开发,去实现一个有时序性的交易ID。又比如,觉得UUID可读性太差,从而花了很多成本去开发一个具有一定含义的交易ID(如前几位表示什么意思,多少位到多少位又表示什么意思之类的),开发出来后,实际架构根本没有去解读该ID的地方,则浪费了成本。

但也不是所有人都直接使用UUID就能满足的,比如我需要考虑日志的容量,则可以考虑适当缩减ID的长度(每个ID缩减10个字符串,每笔交易就可能少几百或几千个字符串,再往上规划,还是可以减少一些日志容量的)。

最后,如果有考虑想收集前端的日志的童鞋,建议交易ID就不要使用Long型,因为前端可能会有损失精度的问题。同时也建议使用 $request_id  来填充交易ID。

위 내용은 마이크로서비스 아키텍처를 위한 Nginx 링크 추적의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
메모리 관리는 Linux와 Windows간에 어떻게 다릅니 까?메모리 관리는 Linux와 Windows간에 어떻게 다릅니 까?May 13, 2025 am 12:04 AM

linuxandwindowsmanagememorydifferelyentlestotheDeignphilosophies.linuxUseSoverCommittingForBetTerformanceButrisksout-of-memoryErrors, whileWindOwsEmploySdemand-pagingForstablefictionForstabilityAndefficiency.thesedifference developmenta

Linux 보안을 위해 방화구 및 UFW를 관리하는 방법Linux 보안을 위해 방화구 및 UFW를 관리하는 방법May 12, 2025 am 10:56 AM

Linux 시스템은 무단 네트워크 액세스를 방지하기 위해 방화벽에 의존합니다. 이 소프트웨어 장벽은 사전 정의 된 규칙에 따라 데이터 패킷을 허용 또는 차단하는 네트워크 트래픽을 제어합니다. 주로 네트워크 계층에서 작동하면 관리합니다

Linux 시스템이 데스크톱 또는 노트북인지 확인하는 방법Linux 시스템이 데스크톱 또는 노트북인지 확인하는 방법May 12, 2025 am 10:48 AM

Linux 시스템이 데스크탑인지 랩톱인지 결정하는 것은 시스템 최적화에 중요합니다. 이 안내서는 시스템 유형을 식별하기위한 간단한 명령을 간략하게 설명합니다. hostnamectl 명령 :이 명령은 시스템의 섀시를 확인하는 간결한 방법을 제공합니다.

Linux에서 TCP/IP 연결을 늘리는 방법Linux에서 TCP/IP 연결을 늘리는 방법May 12, 2025 am 10:23 AM

Linux 서버의 TCP/IP 연결 수를 조정하기위한 안내서 Linux 시스템은 종종 서버 및 네트워크 응용 프로그램에서 사용됩니다. 관리자는 종종 TCP/IP 연결 수가 상한에 도달하여 사용자 연결 오류에 도달한다는 문제에 직면합니다. 이 기사에서는 Linux 시스템에서 최대 TCP/IP 연결 수를 개선하는 방법을 안내합니다. TCP/IP 연결 번호 이해 TCP/IP (전송 제어 프로토콜/인터넷 프로토콜)는 인터넷의 기본 통신 프로토콜입니다. 각 TCP 연결에는 시스템 리소스가 필요합니다. 활성 연결이 너무 많으면 시스템이 새로운 연결을 거부하거나 속도를 늦출 수 있습니다. 허용되는 최대 연결 수를 늘리면 서버 성능을 향상시키고 동시 사용자를 처리 할 수 ​​있습니다. 현재 Linux 연결 제한 수를 확인하십시오 설정 설정

Linux 터미널에서 SVG를 PNG로 변환하는 방법Linux 터미널에서 SVG를 PNG로 변환하는 방법May 12, 2025 am 10:21 AM

SVG (확장 가능한 벡터 그래픽) 파일은 품질 손실없이 방출 가능성으로 인해 로고 및 일러스트레이션에 이상적입니다. 그러나 PNG (Portable Network Graphics) 형식은 종종 웹 사이트 및 응용 프로그램과 더 나은 호환성을 제공합니다. 이 안내서 d

LiveCode를 사용하여 자신의 Android 및 iOS 앱을 만드는 방법LiveCode를 사용하여 자신의 Android 및 iOS 앱을 만드는 방법May 12, 2025 am 10:10 AM

LiveCode : 교차 플랫폼 개발 혁명 1993 년에 데뷔 한 프로그래밍 언어 인 LiveCode는 모든 사람을위한 앱 개발을 단순화합니다. 높은 수준의 영어와 같은 구문 및 동적 타이핑은 강력한 응용 프로그램을 쉽게 만들 수 있습니다.

Linux 터미널에서 USB 장치를 재설정하는 방법Linux 터미널에서 USB 장치를 재설정하는 방법May 12, 2025 am 10:07 AM

이 안내서는 Linux 명령 줄을 통해 오작동하는 USB 장치를 재설정하기위한 단계별 프로세스를 제공합니다. 이러한 명령을 사용하여 응답하지 않거나 연결 해제 된 USB 드라이브 문제 해결이 단순화됩니다. 1 단계 : USB 장치 식별 첫째, i

Linux에서 임시 정적 IP 주소를 설정하는 방법Linux에서 임시 정적 IP 주소를 설정하는 방법May 12, 2025 am 10:06 AM

Linux에서 정적 IP 주소를 일시적으로 설정하는 것은 네트워크 문제 해결 또는 특정 세션 구성에 매우 중요합니다. 이 안내서는 명령 줄 도구를 사용하여이를 달성하는 방법에 대해 자세히 설명합니다.

See all articles

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

Video Face Swap

Video Face Swap

완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

뜨거운 도구

VSCode Windows 64비트 다운로드

VSCode Windows 64비트 다운로드

Microsoft에서 출시한 강력한 무료 IDE 편집기

WebStorm Mac 버전

WebStorm Mac 버전

유용한 JavaScript 개발 도구

mPDF

mPDF

mPDF는 UTF-8로 인코딩된 HTML에서 PDF 파일을 생성할 수 있는 PHP 라이브러리입니다. 원저자인 Ian Back은 자신의 웹 사이트에서 "즉시" PDF 파일을 출력하고 다양한 언어를 처리하기 위해 mPDF를 작성했습니다. HTML2FPDF와 같은 원본 스크립트보다 유니코드 글꼴을 사용할 때 속도가 느리고 더 큰 파일을 생성하지만 CSS 스타일 등을 지원하고 많은 개선 사항이 있습니다. RTL(아랍어, 히브리어), CJK(중국어, 일본어, 한국어)를 포함한 거의 모든 언어를 지원합니다. 중첩된 블록 수준 요소(예: P, DIV)를 지원합니다.

Eclipse용 SAP NetWeaver 서버 어댑터

Eclipse용 SAP NetWeaver 서버 어댑터

Eclipse를 SAP NetWeaver 애플리케이션 서버와 통합합니다.

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기