마이크로서비스 아키텍처란 무엇입니까?
마이크로서비스 아키텍처는 여러 개의 작은 프로그램을 결합하여 애플리케이션을 작성하는 소프트웨어 디자인 패턴입니다. 마이크로서비스라고 하는 이러한 프로그램은 공통의 목표를 위해 함께 작동합니다. 일부 팀의 경우 하나의 큰 응용 프로그램보다 여러 개의 작은 응용 프로그램을 작성하는 데 훨씬 적은 시간과 노력이 소요됩니다.
마이크로 서비스 지향 프로젝트는 각각의 역할을 수행하고 별도의 프로세스에서 실행되고 표준화된 인터페이스를 통해 나머지와 통신하는 작은 애플리케이션의 집합으로 구성됩니다. 이 접근 방식을 통해 팀은 하나의 언어나 프레임워크를 사용하지 않고도 각 문제에 가장 적합한 도구를 선택할 수 있습니다. 또한 보다 전문화된 그룹 간에 작업을 분할할 수 있습니다.
모놀리스에서 마이크로서비스로
이 시리즈의 첫 번째 파트에서 우리는 모노리스에 대해 이야기했습니다. 모노리스는 시작하기 쉽습니다. 그러나 개발 속도는 모든 것이 밀접하게 결합되어 있기 때문에 확장성이 좋지 않습니다. 코드를 조금만 변경해도 전체 프로젝트를 다시 빌드하고 테스트해야 하므로 릴리스 주기가 너무 길어집니다.
모놀리스에서 마이크로서비스로 어떻게 이동합니까? 아마존의 경우를 보자. 얼마 전 모놀리스로 시작하여 시간이 지남에 따라 마이크로 서비스로 전환했습니다. 초기 디자인은 다음과 같았을 것입니다.
물론 여기에서 지나치게 단순화하고 있지만 대부분의 기본 사항을 다뤘다고 생각합니다. 처음부터 마이크로서비스 패턴을 따르기로 선택했다면 어떻게 될까요? 그들은 각 구성 요소가 하나의 문제에 초점을 맞추도록 기능별로 응용 프로그램을 분할했을 것입니다.
또한 일반적으로 RESTful API와 같은 경량 메커니즘을 사용하여 서비스 간 통신을 위한 인터페이스와 프로토콜을 정의해야 했습니다.
네임스페이스란 무엇입니까
마이크로서비스 설계에는 고유한 과제가 있습니다. 주된 것은 아마도 계측 및 오류 보고일 것입니다. 생각해 보세요. 우리는 다양한 플랫폼과 언어에 걸쳐 수십 또는 수백 개의 구성 요소를 모니터링하고 있습니다. 그리고 우리는 어떻게든 그들 모두를 주시하고 동시에 큰 그림을 잃지 않도록 해야 합니다. 네임스페이스는 느슨하게 연결된 마이크로서비스 그룹을 일관된 그림으로 집중하는 데 도움이 됩니다.
AppSignal에서 네임스페이스는 수집된 메트릭의 컨테이너입니다. AppSignal은 기본적으로 3개의 네임스페이스를 사용합니다(web
, background
및 frontend
), 하지만 몇 줄의 코드를 추가하여 직접 만들 수 있습니다. 다음에는 어떻게 작동하는지 살펴보겠습니다.
모든 것을 지배하는 하나의 응용 프로그램
마이크로 서비스 구성 요소를 설정할 때 가장 먼저 해야 할 일은 공통 애플리케이션 이름과 환경을 구성하는 것입니다. 따라서 AppSignal은 수집된 모든 지표와 알림을 동일한 대시보드에 표시합니다.
이러한 값을 구성하는 방법에 대한 구체적인 세부 정보는 언어 및 통합에 따라 다릅니다. 예를 들어 "Nozama"라는 이름을 사용하도록 Ruby on Rails 애플리케이션을 구성하려면:
# config/appsignal.yml
production:
active: true
push_api_key: "YOUR APPSIGNAL API KEY"
name: "Nozama"
이는 Elixir 통합을 구성하는 방법과 매우 유사합니다.
# config/config.exs
config :appsignal, :config,
active: true,
name: "Nozama",
push_api_key: "YOUR APPSIGNAL API KEY",
env: "production"
반면에 Node.js에서는 다음을 사용합니다.
const { Appsignal } = require("@appsignal/nodejs");
const appsignal = new Appsignal({
active: true,
name: "Nozama",
apiKey: "YOUR APPSIGNAL API KEY",
});
Frontent JavaScript 통합을 위해 @appsignal/javascript
를 사용합니다. 대신:
import Appsignal from "@appsignal/javascript";
export default new Appsignal({
name: "Nozama",
key: "YOUR FRONTEND API KEY",
});
여기에서 AppSignal 설치 및 구성에 대한 정보를 찾을 수 있습니다.
- 새 애플리케이션 추가
- 애플리케이션 구성
마이크로서비스에서 네임스페이스 사용
각 마이크로 서비스를 코딩하는 방법을 살펴보겠습니다. 청구 시스템부터 시작하겠습니다. 이 부분에서는 Elixir와 Phoenix를 사용할 것입니다.
Phoenix 통합 설정을 따르고 나면 컨트롤러 작업을 시작할 수 있습니다. 다음 스니펫은 네임스페이스를 billing
으로 설정합니다. :
# in a Phoenix controller, we use plug to run the namespace initialization
defmodule BillingPageController.PageController do
use BillingPageController, :controller
plug :set_appsignal_namespace
defp set_appsignal_namespace(conn, _params) do
# Sets all actions in this controller to report in the "billing" namespace
Appsignal.Transaction.set_namespace(:billing)
conn
end
# rest of the controller ...
end
마이크로서비스가 실행되고 컨트롤러가 일부 활동을 확인하면 데이터가 대시보드에 표시되기 시작해야 합니다.
물론 사람들이 무언가를 사지 않는 한 청구서는 우리를 멀리 얻지 못할 것입니다. 이것은 별도의 마이크로 서비스에서 해결할 수 있는 문제입니다. 동일한 패턴에 따라 PayButtonController
를 사용하여 완전히 새로운 Phoenix 애플리케이션을 작성합니다. 다음과 같이 시작하는 컨트롤러:
defmodule PayButtonController.PageController do
use PayButtonController, :controller
plug :set_appsignal_namespace
defp set_appsignal_namespace(conn, _params) do
Appsignal.Span.set_namespace(Appsignal.Tracer.root_span(), "pay_button")
conn
end
# rest of the controller ...
end
이제 대시보드에 두 개의 네임스페이스가 있습니다. 동일한 이름과 환경을 사용하면 PayButtonController
의 데이터가 BillingPageController
와 함께 표시됩니다. , 서로 다른 컴퓨터에서 실행되는 별도의 응용 프로그램인 경우에도 마찬가지입니다.
다음 구성 요소는 추천 엔진입니다. Express를 사용하여 제품 제안을 표시하는 API 엔드포인트를 구현합니다. 다음과 같이 Node.js에 네임스페이스를 설정합니다.
app.get("/", (req, res) => {
const tracer = appsignal.tracer();
tracer.withSpan(
tracer.createSpan({ namespace: "recommendations" }),
(span) => {
// code to measure goes here
span.close();
}
);
});
이제 최대 3개의 네임스페이스가 있습니다.
모바일 및 프론트엔드 팀은 대시보드에 오류를 기록할 수 있습니다. AppSignal의 JavaScript 통합은 들어오는 데이터를 frontend
와 함께 자동으로 할당합니다. 네임스페이스. 하지만 다음과 같이 변경할 수 있습니다.
try {
// code that might fail
} catch (error) {
// handle the error
// send error to AppSignal
appsignal.sendError(error, {}, "Mobile");
}
잠시 후 데이터가 Mobile
에 나타나기 시작합니다. 네임스페이스.
예제는 일반 JavaScript를 보여주지만 React 또는 Angular와 같은 프론트엔드 프레임워크를 사용하는 경우 추가 설정 단계가 필요할 수 있습니다.
웹사이트의 경우 AppSignal이 즉시 사용 가능한 통합 MVC 프레임워크로 잘 알려진 Ruby on Rails를 사용해 보겠습니다. 다음 스니펫으로 Rails 컨트롤러를 시작하여 네임스페이스를 homepage
로 설정합니다. :
# in Rails we use before_action callback to change
# the namespace before the request starts
class HomepageController < ApplicationController
before_action :set_appsignal_namespace
def set_appsignal_namespace
Appsignal.set_namespace("homepage")
end
# controller actions ...
end
다음으로 API 엔드포인트를 사용하여 웹사이트와 모바일 애플리케이션에 데이터를 제공할 수 있습니다. 이를 위해 Ruby용 경량 REST API 프레임워크인 Grape를 사용할 수 있습니다. 이번에는 AppSignal을 구성하는 데 조금 더 많은 작업이 필요합니다.
이전에 했던 것처럼 'config/appsignal.yml'에서 Ruby 통합을 구성한 후 다음을 사용하여 이벤트 및 메트릭 로깅을 시작할 수 있습니다.
Appsignal.start_logger
Appsignal.start
그런 다음 오류 처리기 체인에 AppSignal 미들웨어를 삽입합니다.
require "appsignal"
require "appsignal/integrations/grape"
class API < Grape::API
insert_before Grape::Middleware::Error, Appsignal::Grape::Middleware
resource :search do
desc 'return a product search'
before do
Appsignal.set_namespace("search")
end
get :product do
# product search logic
end
end
end
더 많은 예를 보려면 Grape 통합 문서를 확인하세요.
그림을 완성하기 위해 Sidekiq 백그라운드 작업으로 마무리하겠습니다. Sidekiq는 Ruby용으로 널리 사용되는 작업 프로세서이며 이것이 'config/appsignal.yml'을 구성한 후 독립형 모드에서 시작하는 방법입니다:
# config.ru
require 'appsignal'
Sidekiq.on(:startup) do
Appsignal.start
end
Sidekiq.on(:shutdown) do
Appsignal.stop('Sidekiq shutdown')
end
AppSignal은 작업의 데이터를 background
에 자동으로 할당합니다. 네임스페이스. 좀 더 구체적인 네임스페이스로 변경할 수 있습니다.
require 'sidekiq'
require 'appsignal'
class PlainOldRuby
include Sidekiq::Worker
def perform()
Appsignal.set_namespace("urgent_background")
# job logic
end
end
독립형 에이전트로 측정항목 수집
독립 실행형 에이전트는 Ubuntu, RedHat 또는 CentOS 시스템에서 리소스 사용률 메트릭을 수집합니다. 에이전트를 사용하여 데이터베이스, 게이트웨이 또는 메시지 브로커와 같은 기능을 마이크로서비스 애플리케이션에 제공하는 위성 서버를 모니터링할 수 있습니다.
AppSignal에서 에이전트를 사용하여 자체 Kafka 서버를 모니터링합니다. 에이전트는 직접 지원되지 않는 언어 및 프레임워크에 대한 사용자 지정 도구를 만드는 데에도 유용합니다.
에이전트를 시작하려면 설치 지침에 따라 에이전트를 다운로드하여 설치하세요.
일단 실행되면 구성 파일을 편집하여 API 키, 애플리케이션 이름 및 환경을 설정해야 합니다. 나머지 마이크로서비스에 사용된 것과 동일한 값을 사용하여 모든 것을 하나의 대시보드로 가져오세요.
# /etc/appsignal-agent.conf
push_api_key = "YOUR APPSIGNAL API KEY"
app_name = "Nozama"
environment = "production"
결론
네임스페이스는 여러 시스템에 분산된 데이터를 구성하는 좋은 방법입니다. 또한 알림을 구성하고 경고 처리를 미세 조정할 수 있습니다. 작동 방식을 보려면 이 시리즈의 첫 번째 부분을 확인하세요.
추가 읽기:
- 네임스페이스로 무엇을 할 수 있나요?
- StatsD 및 AppSignal의 독립 실행형 에이전트로 모든 시스템 모니터링
- 향상된 호스트 측정항목 및 알림