<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Joniss</title>
    <description>The latest articles on DEV Community by Joniss (@joniss).</description>
    <link>https://dev.to/joniss</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F2887969%2F24b11125-4dd1-42b3-ac2b-4bdc6acb90f5.jpg</url>
      <title>DEV Community: Joniss</title>
      <link>https://dev.to/joniss</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/joniss"/>
    <language>en</language>
    <item>
      <title>Complete Guide to LangChainJS Documentation: Optimize LLM Usage with Ease</title>
      <dc:creator>Joniss</dc:creator>
      <pubDate>Thu, 13 Mar 2025 05:19:29 +0000</pubDate>
      <link>https://dev.to/joniss/complete-guide-to-langchainjs-documentation-optimize-llm-usage-with-ease-1mni</link>
      <guid>https://dev.to/joniss/complete-guide-to-langchainjs-documentation-optimize-llm-usage-with-ease-1mni</guid>
      <description>&lt;p&gt;LangChainJS is a powerful library for building applications based on language models (LLMs) such as GPT-3, GPT-4, and others. With clear and well-structured documentation, developers can easily configure and utilize this library. In this guide, we will provide clear instructions on how to clone the optimized LangChainJS documentation repository, as well as important information regarding its structure.&lt;/p&gt;

&lt;p&gt;This documentation is taken and adapted from the LangChainJS Examples GitHub repository: &lt;a href="https://github.com/Jonilss-Labs/langchainjs-docs" rel="noopener noreferrer"&gt;LangChainJS Examples&lt;/a&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Steps to Clone the LangChainJS Documentation Repository
&lt;/h2&gt;

&lt;p&gt;To get started, you can follow the steps below to clone the LangChainJS documentation repository to your local machine.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Ensure Git is Installed
&lt;/h3&gt;

&lt;p&gt;Before starting, make sure Git is installed on your system. If not, you can download it from &lt;a href="https://git-scm.com/" rel="noopener noreferrer"&gt;this link&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Clone the Repository
&lt;/h3&gt;

&lt;p&gt;Open your terminal or command prompt and run the following command to clone the LangChainJS documentation repository:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/Jonilss-Labs/langchainjs-docs.git
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This will copy the repository into a new folder named &lt;code&gt;langchainjs-docs&lt;/code&gt; on your computer.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Navigate to the Repository Folder
&lt;/h3&gt;

&lt;p&gt;Once the cloning process is complete, navigate to the repository folder using the following command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd &lt;/span&gt;langchainjs-docs
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now, you can start exploring and configuring the optimized documentation.&lt;/p&gt;




&lt;h2&gt;
  
  
  Key Points in the Documentation
&lt;/h2&gt;

&lt;p&gt;Updates to enhance developer understanding:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Parameter Explanations&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Each parameter and configuration option is well-explained, accompanied by relevant usage examples to facilitate understanding.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Clear Configuration Steps&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
The configuration and implementation process is now presented in a logical sequence with easy-to-follow instructions, enabling developers to configure their applications quickly.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Neat Documentation Structure Using Markdown&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Developers can easily find the information they need without extensive searching.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Benefits of the Documentation
&lt;/h2&gt;

&lt;p&gt;With structured documentation, we hope developers can achieve the following benefits:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Save Time&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Developers can quickly understand how to use LangChainJS.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Reduce Errors&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
In-depth explanations of each parameter reduce the likelihood of configuration errors.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Accelerate Development&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Good documentation allows developers to focus more on feature development.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Detailed documentation is key to enabling developers to use LangChainJS more efficiently. With these updates, we hope developers can more easily understand and implement LangChainJS in their projects, saving time and reducing configuration errors.&lt;/p&gt;

&lt;p&gt;To view the documentation, please visit the following repository:&lt;br&gt;&lt;br&gt;
&lt;a href="https://github.com/Jonilss-Labs/langchainjs-docs" rel="noopener noreferrer"&gt;LangChainJS Examples&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We also invite you to provide feedback or contribute to the development of this documentation to further improve its quality. Happy coding!&lt;/p&gt;

</description>
      <category>rag</category>
      <category>langchain</category>
      <category>typescript</category>
      <category>llm</category>
    </item>
    <item>
      <title>Mengintegrasikan Prometheus dan Grafana dengan Microservices untuk Monitoring yang Efektif</title>
      <dc:creator>Joniss</dc:creator>
      <pubDate>Fri, 28 Feb 2025 10:19:53 +0000</pubDate>
      <link>https://dev.to/joniss/mengintegrasikan-microservices-dengan-prometheus-dan-grafana-untuk-monitoring-yang-efektif-5e4b</link>
      <guid>https://dev.to/joniss/mengintegrasikan-microservices-dengan-prometheus-dan-grafana-untuk-monitoring-yang-efektif-5e4b</guid>
      <description>&lt;p&gt;Dalam dunia pengembangan aplikasi modern, arsitektur mikroservis telah menjadi pilihan utama karena fleksibilitas dan skalabilitasnya. Namun, dengan banyaknya layanan yang terpisah, memantau kesehatan dan kinerja sistem menjadi tantangan tersendiri. Di sinilah &lt;strong&gt;Prometheus&lt;/strong&gt; dan &lt;strong&gt;Grafana&lt;/strong&gt; hadir sebagai solusi monitoring yang powerful. Artikel ini akan membahas cara mengintegrasikan Prometheus dan Grafana ke dalam arsitektur mikroservis untuk memantau kinerja aplikasi secara real-time.&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;Apa Itu Prometheus dan Grafana?&lt;/strong&gt;
&lt;/h2&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Prometheus&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Prometheus adalah sistem monitoring dan alerting open-source yang dirancang untuk keandalan dan skalabilitas. Prometheus mengumpulkan metrik dari berbagai sumber, menyimpannya dalam basis data time-series, dan memungkinkan pengguna untuk melakukan query terhadap data tersebut. Prometheus sangat cocok untuk memantau aplikasi berbasis mikroservis karena kemampuannya untuk mengumpulkan metrik dari berbagai layanan secara terdistribusi.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Grafana&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Grafana adalah platform visualisasi data open-source yang memungkinkan Anda membuat dashboard interaktif untuk memantau metrik dari berbagai sumber, termasuk Prometheus. Grafana menyediakan antarmuka yang intuitif untuk menampilkan data dalam bentuk grafik, tabel, dan panel lainnya.&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;Mengapa Menggunakan Prometheus dan Grafana untuk Microservices?&lt;/strong&gt;
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Real-Time Monitoring&lt;/strong&gt;: Prometheus mengumpulkan metrik secara real-time, memungkinkan Anda untuk memantau kesehatan sistem secara langsung.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Visualisasi yang Kuat&lt;/strong&gt;: Grafana menyediakan alat visualisasi yang memudahkan analisis data metrik.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Skalabilitas&lt;/strong&gt;: Prometheus dirancang untuk menangani sistem terdistribusi, cocok untuk arsitektur mikroservis.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Alerting&lt;/strong&gt;: Prometheus dapat mengirim notifikasi (alert) ketika metrik tertentu melebihi ambang batas yang ditentukan.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Open-Source&lt;/strong&gt;: Kedua tools ini gratis dan memiliki komunitas yang besar.&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;Langkah-langkah Integrasi Prometheus dan Grafana dengan Microservices&lt;/strong&gt;
&lt;/h2&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;1. Menyiapkan Prometheus&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Prometheus akan bertindak sebagai pusat pengumpulan metrik dari semua layanan mikro.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;a. Install Prometheus&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Unduh dan instal Prometheus dari &lt;a href="https://prometheus.io/download/" rel="noopener noreferrer"&gt;situs resmi Prometheus&lt;/a&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;wget &amp;lt;https://github.com/prometheus/prometheus/releases/download/v2.30.3/prometheus-2.30.3.linux-amd64.tar.gz&amp;gt;
&lt;span class="nb"&gt;tar&lt;/span&gt; &lt;span class="nt"&gt;-xvf&lt;/span&gt; prometheus-2.30.3.linux-amd64.tar.gz
&lt;span class="nb"&gt;cd &lt;/span&gt;prometheus-2.30.3.linux-amd64

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;strong&gt;b. Konfigurasi Prometheus&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Buat file konfigurasi &lt;code&gt;prometheus.yml&lt;/code&gt; untuk menentukan target yang akan dimonitor. Contoh konfigurasi:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;global&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;scrape_interval&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;15s&lt;/span&gt;

&lt;span class="na"&gt;scrape_configs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;job_name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;user_service'&lt;/span&gt;
    &lt;span class="na"&gt;static_configs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;targets&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;localhost:8080'&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;  &lt;span class="c1"&gt;# Ganti dengan alamat Service A&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;job_name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;image_service'&lt;/span&gt;
    &lt;span class="na"&gt;static_configs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;targets&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;localhost:8081'&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;  &lt;span class="c1"&gt;# Ganti dengan alamat Service B&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;job_name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;comment_service'&lt;/span&gt;
    &lt;span class="na"&gt;static_configs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;targets&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;localhost:8082'&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;  &lt;span class="c1"&gt;# Ganti dengan alamat Service C&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;strong&gt;c. Jalankan Prometheus&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Mulai Prometheus dengan perintah berikut:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;./prometheus &lt;span class="nt"&gt;--config&lt;/span&gt;.file&lt;span class="o"&gt;=&lt;/span&gt;prometheus.yml

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Prometheus akan berjalan di &lt;code&gt;http://localhost:9090&lt;/code&gt;.&lt;/p&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;2. Menambahkan Metric Exporter ke Microservices&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Prometheus membutuhkan metrik yang diekspos oleh layanan mikro. Untuk Spring Boot, Anda dapat menggunakan library &lt;strong&gt;Micrometer&lt;/strong&gt; untuk mengekspos metrik.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;a. Tambahkan Dependensi Micrometer&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Tambahkan dependensi berikut ke file &lt;code&gt;pom.xml&lt;/code&gt; atau &lt;code&gt;build.gradle&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;dependency&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;groupId&amp;gt;&lt;/span&gt;io.micrometer&lt;span class="nt"&gt;&amp;lt;/groupId&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;artifactId&amp;gt;&lt;/span&gt;micrometer-registry-prometheus&lt;span class="nt"&gt;&amp;lt;/artifactId&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;version&amp;gt;&lt;/span&gt;1.7.0&lt;span class="nt"&gt;&amp;lt;/version&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/dependency&amp;gt;&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;strong&gt;b. Konfigurasi Micrometer di Spring Boot&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Tambahkan konfigurasi berikut di aplikasi Spring Boot Anda:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;io.micrometer.core.instrument.binder.jvm.JvmMemoryMetrics&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;io.micrometer.core.instrument.binder.system.ProcessorMetrics&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;io.micrometer.prometheus.PrometheusMeterRegistry&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;org.springframework.context.annotation.Bean&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;org.springframework.context.annotation.Configuration&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="nd"&gt;@Configuration&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;MetricsConfig&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="nd"&gt;@Bean&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;PrometheusMeterRegistry&lt;/span&gt; &lt;span class="nf"&gt;prometheusMeterRegistry&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="nc"&gt;PrometheusMeterRegistry&lt;/span&gt; &lt;span class="n"&gt;registry&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;PrometheusMeterRegistry&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
        &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;JvmMemoryMetrics&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;bindTo&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;registry&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;ProcessorMetrics&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;bindTo&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;registry&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;registry&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;strong&gt;c. Ekspos Endpoint Prometheus&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Tambahkan endpoint Prometheus di aplikasi Spring Boot:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;management&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;endpoints&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;web&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;exposure&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;include&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;prometheus&lt;/span&gt;
  &lt;span class="na"&gt;metrics&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;export&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;prometheus&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;enabled&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Sekarang, metrik aplikasi Anda akan tersedia di &lt;code&gt;http://localhost:8080/actuator/prometheus&lt;/code&gt;.&lt;/p&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;3. Menyiapkan Grafana&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Grafana akan digunakan untuk memvisualisasikan metrik yang dikumpulkan oleh Prometheus.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;a. Install Grafana&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Unduh dan instal Grafana dari &lt;a href="https://grafana.com/grafana/download" rel="noopener noreferrer"&gt;situs resmi Grafana&lt;/a&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;wget &amp;lt;https://dl.grafana.com/oss/release/grafana-8.1.5.linux-amd64.tar.gz&amp;gt;
&lt;span class="nb"&gt;tar&lt;/span&gt; &lt;span class="nt"&gt;-xvf&lt;/span&gt; grafana-8.1.5.linux-amd64.tar.gz
&lt;span class="nb"&gt;cd &lt;/span&gt;grafana-8.1.5

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;strong&gt;b. Jalankan Grafana&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Mulai Grafana dengan perintah berikut:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;./bin/grafana-server

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Grafana akan berjalan di &lt;code&gt;http://localhost:3000&lt;/code&gt;. Login dengan username &lt;code&gt;admin&lt;/code&gt; dan password &lt;code&gt;admin&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;c. Tambahkan Prometheus sebagai Data Source&lt;/strong&gt;
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Buka Grafana di browser.&lt;/li&gt;
&lt;li&gt;Navigasi ke &lt;strong&gt;Configuration &amp;gt; Data Sources&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Pilih &lt;strong&gt;Add data source&lt;/strong&gt; dan pilih &lt;strong&gt;Prometheus&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Masukkan URL Prometheus (misalnya, &lt;code&gt;http://localhost:9090&lt;/code&gt;) dan klik &lt;strong&gt;Save &amp;amp; Test&lt;/strong&gt;.&lt;/li&gt;
&lt;/ol&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;4. Membuat Dashboard di Grafana&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Setelah menambahkan Prometheus sebagai data source, Anda dapat membuat dashboard untuk memvisualisasikan metrik.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;a. Buat Dashboard Baru&lt;/strong&gt;
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Klik &lt;strong&gt;Create &amp;gt; Dashboard&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Tambahkan panel baru dengan memilih &lt;strong&gt;Add panel&lt;/strong&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;b. Contoh Query untuk Visualisasi&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Jumlah Request per Detik&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;rate(http_server_requests_seconds_count[1m])

&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Penggunaan Memori&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;jvm_memory_used_bytes

&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;CPU Usage&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;system_cpu_usage

&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;c. Simpan Dashboard&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Setelah menambahkan panel, simpan dashboard dengan nama yang sesuai.&lt;/p&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;5. Mengatur Alerting di Prometheus&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Prometheus memungkinkan Anda mengatur alerting untuk memantau kondisi tertentu.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;a. Buat File Alert Rules&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Buat file &lt;code&gt;alert.rules.yml&lt;/code&gt; dengan contoh aturan berikut:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;groups&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;example&lt;/span&gt;
  &lt;span class="na"&gt;rules&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;alert&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;HighRequestLatency&lt;/span&gt;
    &lt;span class="na"&gt;expr&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;rate(http_server_requests_seconds_sum[1m]) &amp;gt; &lt;/span&gt;&lt;span class="m"&gt;0.5&lt;/span&gt;
    &lt;span class="na"&gt;for&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;5m&lt;/span&gt;
    &lt;span class="na"&gt;labels&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;severity&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;critical&lt;/span&gt;
    &lt;span class="na"&gt;annotations&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;summary&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;High&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;request&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;latency&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;detected"&lt;/span&gt;
      &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Request&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;latency&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;is&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;above&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;0.5&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;seconds."&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;strong&gt;b. Tambahkan Alert Rules ke Prometheus&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Tambahkan path ke file &lt;code&gt;alert.rules.yml&lt;/code&gt; di konfigurasi Prometheus:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;rule_files&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;alert.rules.yml"&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;strong&gt;c. Integrasi dengan Alertmanager&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Anda dapat mengintegrasikan Prometheus dengan Alertmanager untuk mengirim notifikasi melalui email, Slack, atau channel lainnya.&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;Kesimpulan&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Dengan mengintegrasikan Prometheus dan Grafana ke dalam arsitektur mikroservis, Anda dapat memantau kesehatan dan kinerja aplikasi secara real-time. Prometheus bertindak sebagai pengumpul metrik yang handal, sementara Grafana menyediakan visualisasi yang powerful untuk analisis data. Kombinasi ini memungkinkan tim DevOps dan pengembang untuk merespons masalah dengan cepat dan memastikan aplikasi berjalan dengan optimal.&lt;/p&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;Referensi dan Bacaan Lebih Lanjut&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://prometheus.io/docs/" rel="noopener noreferrer"&gt;Dokumentasi Resmi Prometheus&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://grafana.com/docs/" rel="noopener noreferrer"&gt;Dokumentasi Resmi Grafana&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://micrometer.io/docs/" rel="noopener noreferrer"&gt;Micrometer Documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://prometheus.io/docs/alerting/latest/overview/" rel="noopener noreferrer"&gt;Panduan Alerting dengan Prometheus&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Dengan mempelajari lebih lanjut melalui referensi di atas, Anda dapat memperdalam pemahaman tentang monitoring dan observability dalam arsitektur mikroservis&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Menangani Pengecualian di Spring Boot: Cara Mudah Membuat Custom Exception dan Global Exception Handler</title>
      <dc:creator>Joniss</dc:creator>
      <pubDate>Thu, 27 Feb 2025 01:59:22 +0000</pubDate>
      <link>https://dev.to/joniss/menangani-pengecualian-di-spring-boot-cara-mudah-membuat-custom-exception-dan-global-exception-4k23</link>
      <guid>https://dev.to/joniss/menangani-pengecualian-di-spring-boot-cara-mudah-membuat-custom-exception-dan-global-exception-4k23</guid>
      <description>&lt;p&gt;Spring Boot adalah salah satu framework populer untuk membangun aplikasi Java yang efisien dan skalabel. Salah satu aspek penting dalam pengembangan aplikasi adalah penanganan kesalahan atau pengecualian (exception handling). Tanpa penanganan yang baik, aplikasi Anda bisa memberikan pengalaman pengguna yang buruk atau bahkan rentan terhadap masalah keamanan.&lt;/p&gt;

&lt;p&gt;Dalam blog ini, kita akan membahas cara menangani pengecualian di Spring Boot dengan membuat &lt;strong&gt;custom exception&lt;/strong&gt; dan &lt;strong&gt;global exception handler&lt;/strong&gt;. Mari kita mulai!&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;Apa Itu Pengecualian (Exception) dalam Spring Boot?&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Pengecualian adalah kejadian yang mengganggu aliran normal program. Misalnya, ketika Anda mencoba mengakses data yang tidak ada di database, Spring Boot akan melemparkan pengecualian seperti &lt;code&gt;EntityNotFoundException&lt;/code&gt;. Namun, pengecualian default seringkali tidak memberikan informasi yang cukup atau tidak sesuai dengan kebutuhan bisnis.&lt;/p&gt;

&lt;p&gt;Dengan membuat &lt;strong&gt;custom exception&lt;/strong&gt;, Anda dapat mengontrol pesan kesalahan dan respons yang dikembalikan ke klien.&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;Mengapa Membuat Custom Exception?&lt;/strong&gt;
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Kontrol Lebih Baik&lt;/strong&gt;: Anda dapat menentukan pesan kesalahan yang spesifik dan mudah dipahami.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Respons yang Konsisten&lt;/strong&gt;: Memberikan respons HTTP yang seragam untuk setiap jenis kesalahan.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Keamanan&lt;/strong&gt;: Menghindari kebocoran informasi sensitif yang mungkin terjadi jika pengecualian default ditampilkan.&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;Langkah 1: Membuat Custom Exception&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Custom exception adalah kelas yang meng-extend &lt;code&gt;RuntimeException&lt;/code&gt;. Berikut contohnya:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;UserNotFoundException&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nc"&gt;RuntimeException&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;UserNotFoundException&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="kd"&gt;super&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Kelas ini akan digunakan ketika entitas &lt;code&gt;User&lt;/code&gt; tidak ditemukan di database.&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;Langkah 2: Membuat Global Exception Handler&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Spring Boot menyediakan anotasi &lt;code&gt;@ControllerAdvice&lt;/code&gt; dan &lt;code&gt;@ExceptionHandler&lt;/code&gt; untuk membuat &lt;strong&gt;global exception handler&lt;/strong&gt;. Ini memungkinkan Anda menangani pengecualian di satu tempat.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nd"&gt;@ControllerAdvice&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;GlobalExceptionHandler&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

    &lt;span class="nd"&gt;@ExceptionHandler&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;UserNotFoundException&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;ResponseEntity&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;handleUserNotFound&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;UserNotFoundException&lt;/span&gt; &lt;span class="n"&gt;ex&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;ResponseEntity&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&amp;gt;(&lt;/span&gt;&lt;span class="n"&gt;ex&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getMessage&lt;/span&gt;&lt;span class="o"&gt;(),&lt;/span&gt; &lt;span class="nc"&gt;HttpStatus&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;NOT_FOUND&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Dengan ini, setiap kali &lt;code&gt;UserNotFoundException&lt;/code&gt; terjadi, Spring Boot akan mengembalikan respons HTTP 404 dengan pesan kesalahan yang sesuai.&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;Langkah 3: Menggunakan Custom Exception di Service Layer&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Anda dapat melemparkan custom exception di service layer ketika kondisi tertentu tidak terpenuhi. Contoh:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nd"&gt;@Service&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;UserService&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

    &lt;span class="nd"&gt;@Autowired&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;UserRepository&lt;/span&gt; &lt;span class="n"&gt;userRepository&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;User&lt;/span&gt; &lt;span class="nf"&gt;getUserById&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Long&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;userRepository&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;findById&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
                &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;orElseThrow&lt;/span&gt;&lt;span class="o"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;UserNotFoundException&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"User dengan ID "&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s"&gt;" tidak ditemukan"&lt;/span&gt;&lt;span class="o"&gt;));&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  &lt;strong&gt;Langkah 4: Menambahkan Komentar untuk Dokumentasi&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Jangan lupa untuk menambahkan komentar JavaDoc pada handler method untuk memudahkan pemahaman dan dokumentasi.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="cm"&gt;/**
 * Menangani pengecualian UserNotFoundException yang terjadi dalam aplikasi.
 * Memberikan respons HTTP dengan status 404 Not Found dan pesan kesalahan
 * yang relevan untuk memberitahukan bahwa entitas User tidak ditemukan.
 *
 * @param ex Pengecualian yang terjadi saat User tidak ditemukan.
 * @return ResponseEntity yang berisi pesan kesalahan dan status HTTP.
 */&lt;/span&gt;
&lt;span class="nd"&gt;@ExceptionHandler&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;UserNotFoundException&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;ResponseEntity&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;handleUserNotFound&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;UserNotFoundException&lt;/span&gt; &lt;span class="n"&gt;ex&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;ResponseEntity&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&amp;gt;(&lt;/span&gt;&lt;span class="n"&gt;ex&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getMessage&lt;/span&gt;&lt;span class="o"&gt;(),&lt;/span&gt; &lt;span class="nc"&gt;HttpStatus&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;NOT_FOUND&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  &lt;strong&gt;Keuntungan Menggunakan Global Exception Handler&lt;/strong&gt;
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Kode yang Bersih&lt;/strong&gt;: Semua pengecualian ditangani di satu tempat.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Respons yang Konsisten&lt;/strong&gt;: Klien selalu menerima respons dalam format yang sama.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mudah Diperluas&lt;/strong&gt;: Anda dapat menambahkan handler untuk pengecualian baru dengan mudah.&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;Kesimpulan&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Menangani pengecualian dengan baik adalah kunci untuk membangun aplikasi Spring Boot yang robust dan user-friendly. Dengan membuat &lt;strong&gt;custom exception&lt;/strong&gt; dan &lt;strong&gt;global exception handler&lt;/strong&gt;, Anda dapat mengontrol bagaimana aplikasi merespons kesalahan dan memberikan pengalaman yang lebih baik kepada pengguna.&lt;/p&gt;

&lt;p&gt;Jangan lupa untuk selalu mendokumentasikan kode Anda dengan komentar yang jelas agar memudahkan tim pengembang lainnya. Selamat mencoba! 🚀&lt;/p&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;Referensi dan Bacaan Lebih Lanjut&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://docs.spring.io/spring-boot/docs/current/reference/html/features.html#features.developing-web-applications.exception-handling" rel="noopener noreferrer"&gt;Dokumentasi Resmi Spring Boot Exception Handling&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.baeldung.com/exception-handling-for-rest-with-spring" rel="noopener noreferrer"&gt;Panduan Lengkap Spring Boot @ControllerAdvice&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.javatpoint.com/custom-exception" rel="noopener noreferrer"&gt;Membuat Custom Exception di Java&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.toptal.com/java/spring-boot-rest-api-error-handling" rel="noopener noreferrer"&gt;Spring Boot Best Practices for Exception Handling&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Dengan mempelajari lebih lanjut melalui referensi di atas, Anda dapat memperdalam pemahaman tentang penanganan pengecualian di Spring Boot.&lt;/p&gt;

</description>
      <category>springboot</category>
      <category>backend</category>
      <category>java</category>
      <category>bawok</category>
    </item>
    <item>
      <title>**Mengimplementasikan Metrik Kustom di Aplikasi Spring Boot untuk Prometheus**</title>
      <dc:creator>Joniss</dc:creator>
      <pubDate>Tue, 25 Feb 2025 23:38:48 +0000</pubDate>
      <link>https://dev.to/joniss/mengimplementasikan-metrik-kustom-di-aplikasi-spring-boot-untuk-prometheus-4mpl</link>
      <guid>https://dev.to/joniss/mengimplementasikan-metrik-kustom-di-aplikasi-spring-boot-untuk-prometheus-4mpl</guid>
      <description>&lt;p&gt;Dalam pengembangan aplikasi modern, terutama yang menggunakan arsitektur mikroservis, pemantauan (monitoring) adalah aspek kritis untuk memastikan kesehatan dan kinerja sistem. &lt;strong&gt;Prometheus&lt;/strong&gt; adalah salah satu alat monitoring yang paling populer, dan &lt;strong&gt;Spring Boot&lt;/strong&gt; menyediakan dukungan yang kuat untuk mengintegrasikan metrik aplikasi dengan Prometheus. Artikel ini akan membahas cara mengimplementasikan metrik kustom di aplikasi Spring Boot dan mengeksposnya ke Prometheus menggunakan &lt;code&gt;spring-boot-starter-actuator&lt;/code&gt; dan &lt;code&gt;micrometer-registry-prometheus&lt;/code&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;Apa Itu Metrik Kustom?&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Metrik kustom adalah metrik yang Anda definisikan sendiri untuk memantau aspek spesifik dari aplikasi Anda. Misalnya, Anda mungkin ingin melacak jumlah permintaan tertentu, waktu respons, atau jumlah entitas yang diproses. Dengan metrik kustom, Anda dapat mengumpulkan data yang relevan dengan bisnis atau aplikasi Anda dan memvisualisasikannya menggunakan alat seperti Prometheus dan Grafana.&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;Mengapa Menggunakan &lt;code&gt;spring-boot-starter-actuator&lt;/code&gt; dan &lt;code&gt;micrometer-registry-prometheus&lt;/code&gt;?&lt;/strong&gt;
&lt;/h2&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;&lt;code&gt;spring-boot-starter-actuator&lt;/code&gt;&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Dependency ini menambahkan fitur siap produksi ke aplikasi Spring Boot, termasuk:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Pemantauan&lt;/strong&gt;: Memantau kesehatan aplikasi, metrik, dan informasi lainnya.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Endpoint Actuator&lt;/strong&gt;: Menyediakan endpoint seperti &lt;code&gt;/actuator/health&lt;/code&gt;, &lt;code&gt;/actuator/metrics&lt;/code&gt;, dan &lt;code&gt;/actuator/prometheus&lt;/code&gt; untuk mengakses data pemantauan.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;&lt;code&gt;micrometer-registry-prometheus&lt;/code&gt;&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Pustaka ini memungkinkan aplikasi Spring Boot untuk mengekspos metrik dalam format yang kompatibel dengan Prometheus. Dengan ini, Anda dapat:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Mengekspos metrik aplikasi ke Prometheus melalui endpoint &lt;code&gt;/actuator/prometheus&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Mengintegrasikan metrik aplikasi dengan sistem monitoring berbasis Prometheus.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;Langkah-langkah Implementasi Metrik Kustom&lt;/strong&gt;
&lt;/h2&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;1. Menambahkan Dependensi&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Tambahkan dependensi berikut ke file &lt;code&gt;pom.xml&lt;/code&gt; atau &lt;code&gt;build.gradle&lt;/code&gt; aplikasi Spring Boot Anda:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;dependencies&amp;gt;&lt;/span&gt;
    &lt;span class="c"&gt;&amp;lt;!-- Spring Boot Actuator --&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;dependency&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;groupId&amp;gt;&lt;/span&gt;org.springframework.boot&lt;span class="nt"&gt;&amp;lt;/groupId&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;artifactId&amp;gt;&lt;/span&gt;spring-boot-starter-actuator&lt;span class="nt"&gt;&amp;lt;/artifactId&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/dependency&amp;gt;&lt;/span&gt;
    &lt;span class="c"&gt;&amp;lt;!-- Micrometer Prometheus Registry --&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;dependency&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;groupId&amp;gt;&lt;/span&gt;io.micrometer&lt;span class="nt"&gt;&amp;lt;/groupId&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;artifactId&amp;gt;&lt;/span&gt;micrometer-registry-prometheus&lt;span class="nt"&gt;&amp;lt;/artifactId&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/dependency&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/dependencies&amp;gt;&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;strong&gt;2. Mengaktifkan Endpoint Actuator&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Konfigurasikan aplikasi Spring Boot untuk mengekspos endpoint Actuator, termasuk endpoint Prometheus. Tambahkan konfigurasi berikut ke file &lt;code&gt;application.yml&lt;/code&gt; atau &lt;code&gt;application.properties&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;management&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;endpoints&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;web&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;exposure&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;include&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;health, metrics, prometheus&lt;/span&gt;
  &lt;span class="na"&gt;metrics&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;export&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;prometheus&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;enabled&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;strong&gt;3. Membuat Metrik Kustom&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Anda dapat membuat metrik kustom menggunakan &lt;strong&gt;Micrometer&lt;/strong&gt;, yang terintegrasi dengan Spring Boot. Berikut adalah contoh membuat metrik kustom untuk melacak jumlah permintaan tertentu:&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;a. Membuat Counter&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Counter digunakan untuk melacak jumlah kejadian tertentu, seperti jumlah permintaan ke endpoint tertentu.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;io.micrometer.core.instrument.Counter&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;io.micrometer.core.instrument.MeterRegistry&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;org.springframework.stereotype.Service&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="nd"&gt;@Service&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;CustomMetricsService&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="nc"&gt;Counter&lt;/span&gt; &lt;span class="n"&gt;customCounter&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;CustomMetricsService&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;MeterRegistry&lt;/span&gt; &lt;span class="n"&gt;registry&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;customCounter&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Counter&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;builder&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"custom.requests.count"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
                &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Jumlah permintaan kustom"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
                &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;tag&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"type"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"custom"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
                &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;register&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;registry&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;incrementCounter&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;customCounter&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;increment&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;strong&gt;b. Membuat Timer&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Timer digunakan untuk mengukur durasi suatu operasi, seperti waktu respons endpoint.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;io.micrometer.core.instrument.Timer&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;io.micrometer.core.instrument.MeterRegistry&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;org.springframework.stereotype.Service&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="nd"&gt;@Service&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;CustomMetricsService&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="nc"&gt;Timer&lt;/span&gt; &lt;span class="n"&gt;customTimer&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;CustomMetricsService&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;MeterRegistry&lt;/span&gt; &lt;span class="n"&gt;registry&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;customTimer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Timer&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;builder&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"custom.requests.timer"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
                &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Waktu respons permintaan kustom"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
                &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;tag&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"type"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"custom"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
                &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;register&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;registry&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;recordTimer&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Runnable&lt;/span&gt; &lt;span class="n"&gt;task&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;customTimer&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;record&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;task&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;strong&gt;4. Menggunakan Metrik Kustom di Controller&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Anda dapat menggunakan metrik kustom di controller untuk melacak permintaan atau operasi tertentu.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;org.springframework.web.bind.annotation.GetMapping&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;org.springframework.web.bind.annotation.RestController&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="nd"&gt;@RestController&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;CustomController&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="nc"&gt;CustomMetricsService&lt;/span&gt; &lt;span class="n"&gt;customMetricsService&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;CustomController&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;CustomMetricsService&lt;/span&gt; &lt;span class="n"&gt;customMetricsService&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;customMetricsService&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;customMetricsService&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="nd"&gt;@GetMapping&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"/custom-endpoint"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="nf"&gt;customEndpoint&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// Increment counter&lt;/span&gt;
        &lt;span class="n"&gt;customMetricsService&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;incrementCounter&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;

        &lt;span class="c1"&gt;// Record timer&lt;/span&gt;
        &lt;span class="n"&gt;customMetricsService&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;recordTimer&lt;/span&gt;&lt;span class="o"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="c1"&gt;// Simulasi operasi yang memakan waktu&lt;/span&gt;
            &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
                &lt;span class="nc"&gt;Thread&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;sleep&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
            &lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;InterruptedException&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
                &lt;span class="nc"&gt;Thread&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;currentThread&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;interrupt&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
            &lt;span class="o"&gt;}&lt;/span&gt;
        &lt;span class="o"&gt;});&lt;/span&gt;

        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s"&gt;"Custom endpoint called!"&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;strong&gt;5. Mengekspos Metrik ke Prometheus&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Setelah mengimplementasikan metrik kustom, metrik tersebut akan otomatis tersedia di endpoint &lt;code&gt;/actuator/prometheus&lt;/code&gt;. Prometheus dapat mengumpulkan metrik ini dengan mengkonfigurasi target scrape ke endpoint tersebut.&lt;/p&gt;

&lt;p&gt;Contoh output dari &lt;code&gt;/actuator/prometheus&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# HELP custom_requests_count Jumlah permintaan kustom
# TYPE custom_requests_count counter
custom_requests_count{type="custom",} 5.0

# HELP custom_requests_timer Waktu respons permintaan kustom
# TYPE custom_requests_timer summary
custom_requests_timer_count{type="custom",} 3.0
custom_requests_timer_sum{type="custom",} 300.0

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  &lt;strong&gt;Mengintegrasikan dengan Prometheus dan Grafana&lt;/strong&gt;
&lt;/h2&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;1. Konfigurasi Prometheus&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Tambahkan target scrape ke aplikasi Spring Boot di file &lt;code&gt;prometheus.yml&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;scrape_configs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;job_name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;spring_boot_app'&lt;/span&gt;
    &lt;span class="na"&gt;metrics_path&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;/actuator/prometheus'&lt;/span&gt;
    &lt;span class="na"&gt;static_configs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;targets&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;localhost:8080'&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;  &lt;span class="c1"&gt;# Ganti dengan alamat aplikasi Anda&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;strong&gt;2. Membuat Dashboard di Grafana&lt;/strong&gt;
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Tambahkan Prometheus sebagai data source di Grafana.&lt;/li&gt;
&lt;li&gt;Buat dashboard baru dan tambahkan panel untuk memvisualisasikan metrik kustom.

&lt;ul&gt;
&lt;li&gt;Contoh query untuk counter: &lt;code&gt;custom_requests_count&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Contoh query untuk timer: &lt;code&gt;rate(custom_requests_timer_sum[1m])&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;Kesimpulan&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Dengan menggunakan &lt;code&gt;spring-boot-starter-actuator&lt;/code&gt; dan &lt;code&gt;micrometer-registry-prometheus&lt;/code&gt;, Anda dapat dengan mudah mengimplementasikan metrik kustom di aplikasi Spring Boot dan mengeksposnya ke Prometheus. Metrik kustom memungkinkan Anda untuk memantau aspek spesifik dari aplikasi Anda, memberikan wawasan yang lebih mendalam tentang kinerja dan kesehatan sistem. Integrasi dengan Prometheus dan Grafana memungkinkan Anda untuk memvisualisasikan dan menganalisis metrik ini secara real-time, membantu Anda merespons masalah dengan cepat dan memastikan aplikasi berjalan dengan optimal.&lt;/p&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;Referensi dan Bacaan Lebih Lanjut&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://docs.spring.io/spring-boot/docs/current/reference/html/actuator.html" rel="noopener noreferrer"&gt;Dokumentasi Resmi Spring Boot Actuator&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://micrometer.io/docs/" rel="noopener noreferrer"&gt;Dokumentasi Resmi Micrometer&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://prometheus.io/docs/" rel="noopener noreferrer"&gt;Dokumentasi Resmi Prometheus&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://grafana.com/docs/grafana/latest/datasources/prometheus/" rel="noopener noreferrer"&gt;Panduan Grafana untuk Prometheus&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Dengan mempelajari lebih lanjut melalui referensi di atas, Anda dapat memperdalam pemahaman tentang pemantauan dan observability dalam aplikasi Spring Boot.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Mengenal Gaya Arsitektur API: REST, SOAP, GraphQL, dan Lebih Banyak Lagi</title>
      <dc:creator>Joniss</dc:creator>
      <pubDate>Tue, 25 Feb 2025 06:44:36 +0000</pubDate>
      <link>https://dev.to/joniss/mengenal-gaya-arsitektur-api-rest-soap-graphql-dan-lebih-banyak-lagi-12g4</link>
      <guid>https://dev.to/joniss/mengenal-gaya-arsitektur-api-rest-soap-graphql-dan-lebih-banyak-lagi-12g4</guid>
      <description>&lt;p&gt;Dalam dunia pengembangan perangkat lunak modern, komunikasi antar sistem menjadi sangat penting. Salah satu cara utama untuk mencapainya adalah melalui &lt;strong&gt;API&lt;/strong&gt; (Application Programming Interface). API memungkinkan aplikasi untuk saling berinteraksi dan bertukar data. Namun, untuk memastikan komunikasi yang efisien, penting untuk memilih &lt;strong&gt;gaya arsitektur API&lt;/strong&gt; yang tepat. Dalam artikel ini, kita akan membahas berbagai gaya arsitektur API populer, seperti &lt;strong&gt;REST&lt;/strong&gt;, &lt;strong&gt;SOAP&lt;/strong&gt;, &lt;strong&gt;GraphQL&lt;/strong&gt;, &lt;strong&gt;gRPC&lt;/strong&gt;, &lt;strong&gt;WebSocket&lt;/strong&gt;, dan lainnya. Kami juga akan menjelaskan manfaat, kasus penggunaan, serta kapan setiap gaya paling cocok untuk berbagai jenis aplikasi.&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;Apa Itu Gaya Arsitektur API?&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Gaya arsitektur API&lt;/strong&gt; merujuk pada cara API dirancang dan diimplementasikan untuk memungkinkan komunikasi antara aplikasi atau layanan. Gaya arsitektur ini mengatur bagaimana data dikirim, bagaimana server dan klien berinteraksi, serta bagaimana sumber daya (data atau layanan) diekspos dan diakses.&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;1. REST (Representational State Transfer)&lt;/strong&gt;
&lt;/h2&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Deskripsi&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;REST&lt;/strong&gt; adalah salah satu gaya arsitektur API yang paling banyak digunakan. REST mengandalkan prinsip-prinsip desain berbasis HTTP dan memanfaatkan metode standar seperti &lt;strong&gt;GET&lt;/strong&gt;, &lt;strong&gt;POST&lt;/strong&gt;, &lt;strong&gt;PUT&lt;/strong&gt;, dan &lt;strong&gt;DELETE&lt;/strong&gt; untuk berinteraksi dengan sumber daya di server. RESTful API memungkinkan pertukaran data melalui format yang ringan seperti &lt;strong&gt;JSON&lt;/strong&gt; dan &lt;strong&gt;XML&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Manfaat&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Sederhana dan Mudah Digunakan&lt;/strong&gt;: REST memanfaatkan HTTP standar, yang berarti Anda dapat dengan mudah berkomunikasi antar aplikasi.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Stateless&lt;/strong&gt;: Setiap permintaan REST mengandung semua informasi yang diperlukan, jadi server tidak perlu menyimpan status klien.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Skalabilitas&lt;/strong&gt;: REST dapat mengelola beban yang lebih besar, karena tidak ada sesi atau status yang perlu dipertahankan di server.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Kasus Penggunaan&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Aplikasi Web&lt;/strong&gt;: REST sangat cocok untuk aplikasi berbasis web yang memerlukan komunikasi antar server dan klien.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Aplikasi Mobile&lt;/strong&gt;: Banyak aplikasi mobile menggunakan RESTful API untuk mengakses layanan backend.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Layanan Mikro&lt;/strong&gt;: REST juga sangat populer dalam arsitektur mikroservis.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Contoh Praktis&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Jika Anda memiliki aplikasi toko online, API RESTful bisa digunakan untuk mengelola produk, pelanggan, dan pesanan. Misalnya:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;GET /products&lt;/strong&gt;: Mengambil daftar produk.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;POST /orders&lt;/strong&gt;: Membuat pesanan baru.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Kekurangan&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Over-fetching atau Under-fetching&lt;/strong&gt;: Kadang, REST dapat mengambil lebih banyak data daripada yang dibutuhkan (over-fetching) atau kurang (under-fetching), yang bisa berdampak pada kinerja aplikasi.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;2. SOAP (Simple Object Access Protocol)&lt;/strong&gt;
&lt;/h2&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Deskripsi&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;SOAP&lt;/strong&gt; adalah protokol berbasis XML yang dirancang untuk pertukaran data yang lebih kompleks, terutama dalam aplikasi yang membutuhkan tingkat keamanan dan transaksi yang lebih tinggi. SOAP mengandalkan &lt;strong&gt;XML Schema&lt;/strong&gt; untuk menentukan format pesan dan protokol komunikasi.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Manfaat&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Keamanan&lt;/strong&gt;: SOAP mendukung protokol keamanan seperti &lt;strong&gt;WS-Security&lt;/strong&gt;, yang membuatnya cocok untuk aplikasi yang membutuhkan enkripsi dan autentikasi yang ketat.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Transaksi&lt;/strong&gt;: SOAP memungkinkan pengelolaan transaksi yang lebih kompleks, sangat berguna dalam aplikasi perbankan dan sistem enterprise.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Interoperabilitas&lt;/strong&gt;: SOAP memungkinkan komunikasi lintas platform yang lebih luas, karena berbasis XML.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Kasus Penggunaan&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Layanan Keuangan&lt;/strong&gt;: Aplikasi perbankan atau layanan keuangan sering menggunakan SOAP untuk keamanan dan keandalan yang lebih tinggi.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sistem Legacy&lt;/strong&gt;: Banyak sistem enterprise atau legacy menggunakan SOAP untuk kompatibilitas dengan sistem lama.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Contoh Praktis&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Di sistem pembayaran perbankan, API SOAP digunakan untuk memastikan bahwa transaksi dapat dilakukan dengan aman dan terverifikasi. Setiap transaksi bisa memanfaatkan standar keamanan seperti &lt;strong&gt;SSL/TLS&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Kekurangan&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Berat&lt;/strong&gt;: SOAP lebih kompleks dan memerlukan lebih banyak sumber daya dibandingkan dengan REST.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Keterbatasan Flexibilitas&lt;/strong&gt;: SOAP tidak selalu fleksibel dalam menangani data dengan struktur yang berubah-ubah.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;3. GraphQL&lt;/strong&gt;
&lt;/h2&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Deskripsi&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;GraphQL&lt;/strong&gt; adalah bahasa query API yang dikembangkan oleh Facebook untuk memungkinkan klien meminta hanya data yang mereka butuhkan. Dengan GraphQL, klien dapat mengirimkan query yang spesifik, yang mengurangi over-fetching atau under-fetching data.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Manfaat&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Fleksibilitas dalam Permintaan Data&lt;/strong&gt;: Klien bisa memilih data yang ingin diambil dengan cara yang lebih efisien.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pengurangan Over-fetching dan Under-fetching&lt;/strong&gt;: Hanya data yang dibutuhkan yang akan dikirim, sehingga lebih hemat bandwidth.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Single Endpoint&lt;/strong&gt;: GraphQL hanya menggunakan satu endpoint untuk semua operasi, berbeda dengan REST yang menggunakan banyak endpoint.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Kasus Penggunaan&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Aplikasi yang Memiliki Banyak Klien&lt;/strong&gt;: Aplikasi yang melibatkan berbagai klien (misalnya, web, mobile, IoT) dan membutuhkan query data yang berbeda dapat memanfaatkan GraphQL.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Aplikasi Sosial Media&lt;/strong&gt;: Aplikasi dengan struktur data yang kompleks, seperti Facebook, dapat menggunakan GraphQL untuk query data yang efisien.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Contoh Praktis&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Dalam aplikasi berita, klien bisa menggunakan query GraphQL untuk hanya mengambil &lt;strong&gt;judul&lt;/strong&gt;, &lt;strong&gt;gambar&lt;/strong&gt;, dan &lt;strong&gt;link artikel&lt;/strong&gt; tanpa mengambil data lainnya yang tidak diperlukan.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight graphql"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="n"&gt;articles&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="n"&gt;image&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;strong&gt;Kekurangan&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Kurva Pembelajaran&lt;/strong&gt;: Meskipun powerful, GraphQL membutuhkan pemahaman yang lebih dalam dibandingkan dengan REST.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Kompleksitas Server&lt;/strong&gt;: Memerlukan pengelolaan yang lebih rumit di sisi server untuk mendukung fleksibilitas query.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;4. gRPC (Google Remote Procedure Call)&lt;/strong&gt;
&lt;/h2&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Deskripsi&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;gRPC&lt;/strong&gt; adalah framework untuk melakukan &lt;strong&gt;Remote Procedure Calls (RPC)&lt;/strong&gt;, menggunakan &lt;strong&gt;Protocol Buffers&lt;/strong&gt; untuk serialisasi data. gRPC sangat efisien dan mendukung komunikasi dua arah (bidirectional streaming) antara klien dan server.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Manfaat&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Performa Tinggi&lt;/strong&gt;: gRPC menggunakan Protocol Buffers yang lebih cepat daripada JSON atau XML.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dukungan Streaming&lt;/strong&gt;: Mendukung komunikasi dua arah, sehingga cocok untuk aplikasi real-time.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sederhana dan Efisien&lt;/strong&gt;: Menyederhanakan pengelolaan komunikasi antar layanan mikro.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Kasus Penggunaan&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Microservices&lt;/strong&gt;: gRPC sangat cocok untuk arsitektur berbasis microservices yang memerlukan komunikasi cepat dan efisien.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Aplikasi Real-Time&lt;/strong&gt;: Aplikasi seperti game online atau chat yang membutuhkan komunikasi dua arah real-time.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Contoh Praktis&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Pada aplikasi chat, gRPC digunakan untuk memastikan pesan terkirim dan diterima secara langsung dalam dua arah (klien-server dan server-klien).&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Kekurangan&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Keterbatasan Browser&lt;/strong&gt;: gRPC tidak didukung secara native oleh browser, sehingga memerlukan solusi tambahan seperti gRPC-Web.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Kompleksitas Setup&lt;/strong&gt;: Memerlukan setup dan pengelolaan yang lebih rumit dibandingkan dengan REST atau GraphQL.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;5. WebSocket&lt;/strong&gt;
&lt;/h2&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Deskripsi&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;WebSocket&lt;/strong&gt; adalah protokol komunikasi dua arah yang memungkinkan koneksi terbuka dan terus-menerus antara klien dan server. WebSocket sangat cocok untuk aplikasi yang memerlukan pembaruan data secara real-time.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Manfaat&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Real-Time Communication&lt;/strong&gt;: Cocok untuk aplikasi yang memerlukan pembaruan langsung, seperti aplikasi chat atau live tracking.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Efisien&lt;/strong&gt;: Setelah koneksi dibuka, data dapat dikirimkan tanpa overhead protokol HTTP.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Kasus Penggunaan&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Aplikasi Chat&lt;/strong&gt;: WebSocket sering digunakan untuk aplikasi messaging yang memerlukan komunikasi dua arah.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Game Online&lt;/strong&gt;: Untuk game real-time yang membutuhkan sinkronisasi cepat antar pemain.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Contoh Praktis&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Dalam aplikasi trading saham, WebSocket digunakan untuk mengirimkan pembaruan harga saham secara real-time.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Kekurangan&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Manajemen Koneksi&lt;/strong&gt;: Menjaga banyak koneksi WebSocket tetap terbuka dapat menjadi tantangan di skala besar.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tidak Sesuai untuk Semua Jenis Aplikasi&lt;/strong&gt;: WebSocket hanya cocok untuk aplikasi yang memerlukan komunikasi real-time.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;Kesimpulan&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Memilih gaya arsitektur API yang tepat sangat penting untuk memastikan aplikasi Anda berjalan dengan efisien dan memenuhi kebutuhan pengguna. &lt;strong&gt;REST&lt;/strong&gt; cocok untuk aplikasi web dan mobile yang membutuhkan komunikasi sederhana, sementara &lt;strong&gt;SOAP&lt;/strong&gt; lebih cocok untuk aplikasi yang membutuhkan keamanan dan transaksi yang lebih tinggi. &lt;strong&gt;GraphQL&lt;/strong&gt; memberikan fleksibilitas dalam pengambilan data, sementara &lt;strong&gt;gRPC&lt;/strong&gt; dan &lt;strong&gt;WebSocket&lt;/strong&gt; sangat berguna untuk aplikasi yang memerlukan komunikasi real-time atau efisien antar layanan.&lt;/p&gt;

&lt;p&gt;Dengan memahami manfaat, kasus penggunaan, dan kekurangan dari setiap gaya arsitektur API, Anda dapat membuat keputusan yang lebih baik untuk proyek Anda.&lt;/p&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;Referensi dan Bacaan Lebih Lanjut&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://restfulapi.net/" rel="noopener noreferrer"&gt;Dokumentasi Resmi REST&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.w3.org/TR/soap/" rel="noopener noreferrer"&gt;Dokumentasi Resmi SOAP&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://graphql.org/" rel="noopener noreferrer"&gt;Dokumentasi Resmi GraphQL&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://grpc.io/docs/" rel="noopener noreferrer"&gt;Dokumentasi Resmi gRPC&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/API/WebSockets_API" rel="noopener noreferrer"&gt;WebSocket Documentation&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Dengan membaca lebih lanjut melalui referensi di atas, Anda akan mendapatkan pemahaman yang lebih mendalam tentang &lt;strong&gt;gaya arsitektur API&lt;/strong&gt; dan bagaimana mengimplementasikannya dengan efektif.&lt;/p&gt;

</description>
      <category>graphql</category>
      <category>rest</category>
      <category>arsitektur</category>
      <category>microservices</category>
    </item>
    <item>
      <title>Mengintegrasikan Microservices dengan Prometheus dan Grafana untuk Monitoring yang Efektif</title>
      <dc:creator>Joniss</dc:creator>
      <pubDate>Tue, 25 Feb 2025 05:35:36 +0000</pubDate>
      <link>https://dev.to/joniss/mengintegrasikan-microservices-dengan-prometheus-dan-grafana-untuk-monitoring-yang-efektif-2jbc</link>
      <guid>https://dev.to/joniss/mengintegrasikan-microservices-dengan-prometheus-dan-grafana-untuk-monitoring-yang-efektif-2jbc</guid>
      <description>&lt;p&gt;Dalam dunia pengembangan aplikasi modern, arsitektur mikroservis telah menjadi pilihan utama karena fleksibilitas dan skalabilitasnya. Namun, dengan banyaknya layanan yang terpisah, memantau kesehatan dan kinerja sistem menjadi tantangan tersendiri. Di sinilah &lt;strong&gt;Prometheus&lt;/strong&gt; dan &lt;strong&gt;Grafana&lt;/strong&gt; hadir sebagai solusi monitoring yang powerful. Artikel ini akan membahas cara mengintegrasikan Prometheus dan Grafana ke dalam arsitektur mikroservis untuk memantau kinerja aplikasi secara real-time.&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;Apa Itu Prometheus dan Grafana?&lt;/strong&gt;
&lt;/h2&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Prometheus&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Prometheus adalah sistem monitoring dan alerting open-source yang dirancang untuk keandalan dan skalabilitas. Prometheus mengumpulkan metrik dari berbagai sumber, menyimpannya dalam basis data time-series, dan memungkinkan pengguna untuk melakukan query terhadap data tersebut. Prometheus sangat cocok untuk memantau aplikasi berbasis mikroservis karena kemampuannya untuk mengumpulkan metrik dari berbagai layanan secara terdistribusi.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Grafana&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Grafana adalah platform visualisasi data open-source yang memungkinkan Anda membuat dashboard interaktif untuk memantau metrik dari berbagai sumber, termasuk Prometheus. Grafana menyediakan antarmuka yang intuitif untuk menampilkan data dalam bentuk grafik, tabel, dan panel lainnya.&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;Mengapa Menggunakan Prometheus dan Grafana untuk Microservices?&lt;/strong&gt;
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Real-Time Monitoring&lt;/strong&gt;: Prometheus mengumpulkan metrik secara real-time, memungkinkan Anda untuk memantau kesehatan sistem secara langsung.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Visualisasi yang Kuat&lt;/strong&gt;: Grafana menyediakan alat visualisasi yang memudahkan analisis data metrik.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Skalabilitas&lt;/strong&gt;: Prometheus dirancang untuk menangani sistem terdistribusi, cocok untuk arsitektur mikroservis.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Alerting&lt;/strong&gt;: Prometheus dapat mengirim notifikasi (alert) ketika metrik tertentu melebihi ambang batas yang ditentukan.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Open-Source&lt;/strong&gt;: Kedua tools ini gratis dan memiliki komunitas yang besar.&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;Langkah-langkah Integrasi Prometheus dan Grafana dengan Microservices&lt;/strong&gt;
&lt;/h2&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;1. Menyiapkan Prometheus&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Prometheus akan bertindak sebagai pusat pengumpulan metrik dari semua layanan mikro.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;a. Install Prometheus&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Unduh dan instal Prometheus dari &lt;a href="https://prometheus.io/download/" rel="noopener noreferrer"&gt;situs resmi Prometheus&lt;/a&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;wget &amp;lt;https://github.com/prometheus/prometheus/releases/download/v2.30.3/prometheus-2.30.3.linux-amd64.tar.gz&amp;gt;
&lt;span class="nb"&gt;tar&lt;/span&gt; &lt;span class="nt"&gt;-xvf&lt;/span&gt; prometheus-2.30.3.linux-amd64.tar.gz
&lt;span class="nb"&gt;cd &lt;/span&gt;prometheus-2.30.3.linux-amd64

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;strong&gt;b. Konfigurasi Prometheus&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Buat file konfigurasi &lt;code&gt;prometheus.yml&lt;/code&gt; untuk menentukan target yang akan dimonitor. Contoh konfigurasi:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;global&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;scrape_interval&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;15s&lt;/span&gt;

&lt;span class="na"&gt;scrape_configs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;job_name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;user_service'&lt;/span&gt;
    &lt;span class="na"&gt;static_configs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;targets&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;localhost:8080'&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;  &lt;span class="c1"&gt;# Ganti dengan alamat Service A&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;job_name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;image_service'&lt;/span&gt;
    &lt;span class="na"&gt;static_configs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;targets&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;localhost:8081'&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;  &lt;span class="c1"&gt;# Ganti dengan alamat Service B&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;job_name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;comment_service'&lt;/span&gt;
    &lt;span class="na"&gt;static_configs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;targets&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;localhost:8082'&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;  &lt;span class="c1"&gt;# Ganti dengan alamat Service C&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;strong&gt;c. Jalankan Prometheus&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Mulai Prometheus dengan perintah berikut:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;./prometheus &lt;span class="nt"&gt;--config&lt;/span&gt;.file&lt;span class="o"&gt;=&lt;/span&gt;prometheus.yml

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Prometheus akan berjalan di &lt;code&gt;http://localhost:9090&lt;/code&gt;.&lt;/p&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;2. Menambahkan Metric Exporter ke Microservices&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Prometheus membutuhkan metrik yang diekspos oleh layanan mikro. Untuk Spring Boot, Anda dapat menggunakan library &lt;strong&gt;Micrometer&lt;/strong&gt; untuk mengekspos metrik.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;a. Tambahkan Dependensi Micrometer&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Tambahkan dependensi berikut ke file &lt;code&gt;pom.xml&lt;/code&gt; atau &lt;code&gt;build.gradle&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;dependency&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;groupId&amp;gt;&lt;/span&gt;io.micrometer&lt;span class="nt"&gt;&amp;lt;/groupId&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;artifactId&amp;gt;&lt;/span&gt;micrometer-registry-prometheus&lt;span class="nt"&gt;&amp;lt;/artifactId&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;version&amp;gt;&lt;/span&gt;1.7.0&lt;span class="nt"&gt;&amp;lt;/version&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/dependency&amp;gt;&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;strong&gt;b. Konfigurasi Micrometer di Spring Boot&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Tambahkan konfigurasi berikut di aplikasi Spring Boot Anda:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;io.micrometer.core.instrument.binder.jvm.JvmMemoryMetrics&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;io.micrometer.core.instrument.binder.system.ProcessorMetrics&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;io.micrometer.prometheus.PrometheusMeterRegistry&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;org.springframework.context.annotation.Bean&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;org.springframework.context.annotation.Configuration&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="nd"&gt;@Configuration&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;MetricsConfig&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="nd"&gt;@Bean&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;PrometheusMeterRegistry&lt;/span&gt; &lt;span class="nf"&gt;prometheusMeterRegistry&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="nc"&gt;PrometheusMeterRegistry&lt;/span&gt; &lt;span class="n"&gt;registry&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;PrometheusMeterRegistry&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
        &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;JvmMemoryMetrics&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;bindTo&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;registry&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;ProcessorMetrics&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;bindTo&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;registry&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;registry&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;strong&gt;c. Ekspos Endpoint Prometheus&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Tambahkan endpoint Prometheus di aplikasi Spring Boot:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;management&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;endpoints&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;web&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;exposure&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;include&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;prometheus&lt;/span&gt;
  &lt;span class="na"&gt;metrics&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;export&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;prometheus&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;enabled&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Sekarang, metrik aplikasi Anda akan tersedia di &lt;code&gt;http://localhost:8080/actuator/prometheus&lt;/code&gt;.&lt;/p&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;3. Menyiapkan Grafana&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Grafana akan digunakan untuk memvisualisasikan metrik yang dikumpulkan oleh Prometheus.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;a. Install Grafana&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Unduh dan instal Grafana dari &lt;a href="https://grafana.com/grafana/download" rel="noopener noreferrer"&gt;situs resmi Grafana&lt;/a&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;wget &amp;lt;https://dl.grafana.com/oss/release/grafana-8.1.5.linux-amd64.tar.gz&amp;gt;
&lt;span class="nb"&gt;tar&lt;/span&gt; &lt;span class="nt"&gt;-xvf&lt;/span&gt; grafana-8.1.5.linux-amd64.tar.gz
&lt;span class="nb"&gt;cd &lt;/span&gt;grafana-8.1.5

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;strong&gt;b. Jalankan Grafana&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Mulai Grafana dengan perintah berikut:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;./bin/grafana-server

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Grafana akan berjalan di &lt;code&gt;http://localhost:3000&lt;/code&gt;. Login dengan username &lt;code&gt;admin&lt;/code&gt; dan password &lt;code&gt;admin&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;c. Tambahkan Prometheus sebagai Data Source&lt;/strong&gt;
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Buka Grafana di browser.&lt;/li&gt;
&lt;li&gt;Navigasi ke &lt;strong&gt;Configuration &amp;gt; Data Sources&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Pilih &lt;strong&gt;Add data source&lt;/strong&gt; dan pilih &lt;strong&gt;Prometheus&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Masukkan URL Prometheus (misalnya, &lt;code&gt;http://localhost:9090&lt;/code&gt;) dan klik &lt;strong&gt;Save &amp;amp; Test&lt;/strong&gt;.&lt;/li&gt;
&lt;/ol&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;4. Membuat Dashboard di Grafana&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Setelah menambahkan Prometheus sebagai data source, Anda dapat membuat dashboard untuk memvisualisasikan metrik.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;a. Buat Dashboard Baru&lt;/strong&gt;
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Klik &lt;strong&gt;Create &amp;gt; Dashboard&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Tambahkan panel baru dengan memilih &lt;strong&gt;Add panel&lt;/strong&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;b. Contoh Query untuk Visualisasi&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Jumlah Request per Detik&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;rate(http_server_requests_seconds_count[1m])

&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Penggunaan Memori&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;jvm_memory_used_bytes

&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;CPU Usage&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;system_cpu_usage

&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;c. Simpan Dashboard&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Setelah menambahkan panel, simpan dashboard dengan nama yang sesuai.&lt;/p&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;5. Mengatur Alerting di Prometheus&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Prometheus memungkinkan Anda mengatur alerting untuk memantau kondisi tertentu.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;a. Buat File Alert Rules&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Buat file &lt;code&gt;alert.rules.yml&lt;/code&gt; dengan contoh aturan berikut:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;groups&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;example&lt;/span&gt;
  &lt;span class="na"&gt;rules&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;alert&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;HighRequestLatency&lt;/span&gt;
    &lt;span class="na"&gt;expr&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;rate(http_server_requests_seconds_sum[1m]) &amp;gt; &lt;/span&gt;&lt;span class="m"&gt;0.5&lt;/span&gt;
    &lt;span class="na"&gt;for&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;5m&lt;/span&gt;
    &lt;span class="na"&gt;labels&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;severity&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;critical&lt;/span&gt;
    &lt;span class="na"&gt;annotations&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;summary&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;High&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;request&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;latency&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;detected"&lt;/span&gt;
      &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Request&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;latency&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;is&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;above&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;0.5&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;seconds."&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;strong&gt;b. Tambahkan Alert Rules ke Prometheus&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Tambahkan path ke file &lt;code&gt;alert.rules.yml&lt;/code&gt; di konfigurasi Prometheus:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;rule_files&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;alert.rules.yml"&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;strong&gt;c. Integrasi dengan Alertmanager&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Anda dapat mengintegrasikan Prometheus dengan Alertmanager untuk mengirim notifikasi melalui email, Slack, atau channel lainnya.&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;Kesimpulan&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Dengan mengintegrasikan Prometheus dan Grafana ke dalam arsitektur mikroservis, Anda dapat memantau kesehatan dan kinerja aplikasi secara real-time. Prometheus bertindak sebagai pengumpul metrik yang handal, sementara Grafana menyediakan visualisasi yang powerful untuk analisis data. Kombinasi ini memungkinkan tim DevOps dan pengembang untuk merespons masalah dengan cepat dan memastikan aplikasi berjalan dengan optimal.&lt;/p&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;Referensi dan Bacaan Lebih Lanjut&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://prometheus.io/docs/" rel="noopener noreferrer"&gt;Dokumentasi Resmi Prometheus&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://grafana.com/docs/" rel="noopener noreferrer"&gt;Dokumentasi Resmi Grafana&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://micrometer.io/docs/" rel="noopener noreferrer"&gt;Micrometer Documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://prometheus.io/docs/alerting/latest/overview/" rel="noopener noreferrer"&gt;Panduan Alerting dengan Prometheus&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Dengan mempelajari lebih lanjut melalui referensi di atas, Anda dapat memperdalam pemahaman tentang monitoring dan observability dalam arsitektur mikroservis.&lt;/p&gt;

</description>
      <category>microservices</category>
      <category>grafana</category>
      <category>prometheus</category>
      <category>kubernetes</category>
    </item>
    <item>
      <title>Membangun Aplikasi Web dengan Arsitektur Microservices dan Integrasi GraphQL</title>
      <dc:creator>Joniss</dc:creator>
      <pubDate>Mon, 24 Feb 2025 14:28:38 +0000</pubDate>
      <link>https://dev.to/joniss/membangun-aplikasi-web-dengan-arsitektur-microservices-dan-integrasi-graphql-3jp</link>
      <guid>https://dev.to/joniss/membangun-aplikasi-web-dengan-arsitektur-microservices-dan-integrasi-graphql-3jp</guid>
      <description>&lt;p&gt;&lt;em&gt;Menggunakan Spring Boot, Nginx, dan Layanan Terpisah&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Arsitektur mikroservis telah menjadi pilihan populer dalam pengembangan aplikasi modern, karena memberikan fleksibilitas, skalabilitas, dan pemeliharaan yang lebih mudah. Dalam artikel ini, kita akan membahas bagaimana membangun aplikasi web dengan pendekatan arsitektur mikroservis menggunakan Spring Boot, GraphQL, Relay, dan Nginx.&lt;/p&gt;

&lt;h3&gt;
  
  
  Apa itu Arsitektur Microservices?
&lt;/h3&gt;

&lt;p&gt;Arsitektur mikroservis adalah gaya desain perangkat lunak yang membagi aplikasi besar menjadi layanan-layanan kecil yang independen, masing-masing berfokus pada fungsionalitas tertentu. Setiap layanan mikro ini dapat dikembangkan, diterapkan, dan diskalakan secara independen. Komunikasi antar layanan dapat dilakukan menggunakan API (seperti REST atau GraphQL), dan setiap layanan memiliki basis data terpisah.&lt;/p&gt;

&lt;p&gt;Keuntungan utama dari arsitektur ini adalah pemisahan yang jelas antara layanan, memungkinkan tim untuk bekerja pada bagian aplikasi yang berbeda tanpa mempengaruhi bagian lainnya.&lt;/p&gt;

&lt;h3&gt;
  
  
  Struktur Aplikasi:
&lt;/h3&gt;

&lt;p&gt;Kita akan membagi aplikasi menjadi beberapa layanan (microservices) yang akan saling berinteraksi. Di bawah ini adalah contoh arsitektur yang melibatkan &lt;strong&gt;Service A&lt;/strong&gt;, &lt;strong&gt;Service B&lt;/strong&gt;, &lt;strong&gt;Service C&lt;/strong&gt;, dan &lt;strong&gt;Nginx&lt;/strong&gt; sebagai proxy untuk komunikasi.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Service A&lt;/strong&gt;: Layanan untuk mengelola pengguna dan profil.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Service B&lt;/strong&gt;: Layanan untuk mengelola gambar dan postingan.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Service C&lt;/strong&gt;: Layanan untuk mengelola komentar dan like.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Nginx&lt;/strong&gt;: Sebagai reverse proxy yang mengarahkan permintaan ke layanan-layanan yang sesuai.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Menggunakan Spring Boot untuk Microservices
&lt;/h3&gt;

&lt;p&gt;Spring Boot adalah framework Java yang sangat populer untuk membuat aplikasi berbasis Spring, terutama dalam pengembangan mikroservis. Spring Boot menyederhanakan proses pengembangan aplikasi dengan mengurangi konfigurasi dan memungkinkan pembuatan aplikasi yang dapat dijalankan langsung.&lt;/p&gt;

&lt;h3&gt;
  
  
  Langkah-langkah Membangun Layanan Mikro:
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Service A - Pengguna dan Profil&lt;/strong&gt;:

&lt;ul&gt;
&lt;li&gt;Membuat aplikasi Spring Boot yang menyediakan API untuk mendaftarkan dan mengelola pengguna.&lt;/li&gt;
&lt;li&gt;Menyimpan data pengguna seperti email, username, bio, dan lain-lain di database.&lt;/li&gt;
&lt;li&gt;Implementasi GraphQL di dalam Spring Boot untuk memudahkan pengambilan data pengguna.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Service B - Gambar dan Postingan&lt;/strong&gt;:

&lt;ul&gt;
&lt;li&gt;Membuat aplikasi Spring Boot untuk mengelola gambar dan postingan pengguna.&lt;/li&gt;
&lt;li&gt;Setiap gambar memiliki metadata seperti judul, deskripsi, jumlah like, dan komentar.&lt;/li&gt;
&lt;li&gt;Integrasi GraphQL untuk mengambil informasi gambar sesuai permintaan.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Service C - Komentar dan Like&lt;/strong&gt;:

&lt;ul&gt;
&lt;li&gt;Aplikasi Spring Boot untuk menangani interaksi pengguna dengan postingan melalui komentar dan like.&lt;/li&gt;
&lt;li&gt;Menyimpan data tentang siapa yang memberi komentar atau like pada gambar.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Contoh Kode untuk Service A:
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nd"&gt;@SpringBootApplication&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;UserServiceApplication&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="nc"&gt;SpringApplication&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;UserServiceApplication&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Dengan aplikasi ini, kita akan membuat API yang memungkinkan pengguna untuk mendaftar dan mengelola profil mereka.&lt;/p&gt;

&lt;h3&gt;
  
  
  Mengintegrasikan GraphQL
&lt;/h3&gt;

&lt;p&gt;GraphQL adalah bahasa query untuk API yang memungkinkan klien untuk meminta data secara lebih fleksibel. Dibandingkan dengan REST, di mana Anda harus melakukan beberapa permintaan untuk mendapatkan data yang relevan, GraphQL memungkinkan klien untuk mengambil semua data yang dibutuhkan dalam satu permintaan.&lt;/p&gt;

&lt;p&gt;Untuk mengintegrasikan GraphQL ke dalam Spring Boot:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Dependensi GraphQL&lt;/strong&gt;: Tambahkan dependensi GraphQL ke dalam file &lt;code&gt;pom.xml&lt;/code&gt; atau &lt;code&gt;build.gradle&lt;/code&gt;:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;dependency&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;groupId&amp;gt;&lt;/span&gt;com.graphql-java&lt;span class="nt"&gt;&amp;lt;/groupId&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;artifactId&amp;gt;&lt;/span&gt;graphql-java&lt;span class="nt"&gt;&amp;lt;/artifactId&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;version&amp;gt;&lt;/span&gt;latest.version&lt;span class="nt"&gt;&amp;lt;/version&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/dependency&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Skema GraphQL&lt;/strong&gt;: Buat file &lt;code&gt;.graphqls&lt;/code&gt; yang mendefinisikan struktur data dan query/mutation yang dapat dilakukan oleh klien.
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight graphql"&gt;&lt;code&gt;&lt;span class="k"&gt;type&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;User&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;ID&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="n"&gt;username&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;String&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="n"&gt;email&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;String&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="n"&gt;bio&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;String&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="k"&gt;type&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Query&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="n"&gt;getUser&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;ID&lt;/span&gt;&lt;span class="p"&gt;!):&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;User&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="k"&gt;type&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Mutation&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="n"&gt;createUser&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;username&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;String&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;email&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;String&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;bio&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;String&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;User&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Resolver (DataFetcher)&lt;/strong&gt;: Implementasikan kelas yang mengambil data sesuai dengan skema yang didefinisikan.
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nd"&gt;@Component&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;UserDataFetcher&lt;/span&gt; &lt;span class="kd"&gt;implements&lt;/span&gt; &lt;span class="nc"&gt;DataFetcher&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;User&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="nd"&gt;@Autowired&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;UserRepository&lt;/span&gt; &lt;span class="n"&gt;userRepository&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

    &lt;span class="nd"&gt;@Override&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;User&lt;/span&gt; &lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;DataFetchingEnvironment&lt;/span&gt; &lt;span class="n"&gt;environment&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;userId&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;environment&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getArgument&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"id"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;userRepository&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;findById&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;userId&lt;/span&gt;&lt;span class="o"&gt;).&lt;/span&gt;&lt;span class="na"&gt;orElse&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Endpoint GraphQL&lt;/strong&gt;: Ekspos endpoint GraphQL melalui Spring Boot.
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nd"&gt;@Bean&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;GraphQL&lt;/span&gt; &lt;span class="nf"&gt;graphQL&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nc"&gt;GraphQL&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;newGraphQL&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;GraphQLSchema&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;Builder&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;build&lt;/span&gt;&lt;span class="o"&gt;()).&lt;/span&gt;&lt;span class="na"&gt;build&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Nginx Sebagai Reverse Proxy
&lt;/h3&gt;

&lt;p&gt;Untuk mengarahkan permintaan ke berbagai layanan mikro, kita akan menggunakan &lt;strong&gt;Nginx&lt;/strong&gt; sebagai reverse proxy. Nginx akan menangani permintaan masuk dan mendistribusikannya ke layanan yang sesuai.&lt;/p&gt;

&lt;h3&gt;
  
  
  Konfigurasi Nginx:
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Install Nginx pada server yang akan berfungsi sebagai proxy.&lt;/li&gt;
&lt;li&gt;Konfigurasikan file &lt;code&gt;nginx.conf&lt;/code&gt; untuk mengarahkan permintaan ke setiap layanan mikro berdasarkan URL.
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight nginx"&gt;&lt;code&gt;&lt;span class="k"&gt;server&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kn"&gt;listen&lt;/span&gt; &lt;span class="mi"&gt;80&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="kn"&gt;server_name&lt;/span&gt; &lt;span class="s"&gt;api.example.com&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="kn"&gt;location&lt;/span&gt; &lt;span class="n"&gt;/user/&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kn"&gt;proxy_pass&lt;/span&gt; &lt;span class="s"&gt;http://user_service&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="kn"&gt;location&lt;/span&gt; &lt;span class="n"&gt;/image/&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kn"&gt;proxy_pass&lt;/span&gt; &lt;span class="s"&gt;http://image_service&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="kn"&gt;location&lt;/span&gt; &lt;span class="n"&gt;/comment/&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kn"&gt;proxy_pass&lt;/span&gt; &lt;span class="s"&gt;http://comment_service&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Dengan konfigurasi ini, setiap permintaan akan diarahkan ke layanan yang sesuai berdasarkan path URL.&lt;/p&gt;

&lt;h3&gt;
  
  
  Kesimpulan
&lt;/h3&gt;

&lt;p&gt;Dengan menggunakan &lt;strong&gt;Spring Boot&lt;/strong&gt;, &lt;strong&gt;GraphQL&lt;/strong&gt;, dan &lt;strong&gt;Nginx&lt;/strong&gt;, Anda dapat membangun aplikasi web yang terdistribusi dan skalabel dengan arsitektur mikroservis. Spring Boot menyediakan alat yang kuat untuk membangun layanan mikro yang efisien, GraphQL memberikan fleksibilitas dalam mengambil data, dan Nginx memastikan komunikasi antar layanan yang efisien.&lt;/p&gt;

&lt;p&gt;Arsitektur ini memberikan kelebihan besar dalam hal pengembangan dan pemeliharaan aplikasi modern, serta memungkinkan aplikasi Anda untuk dengan mudah diskalakan sesuai dengan kebutuhan.&lt;/p&gt;

&lt;h3&gt;
  
  
  Referensi dan Bacaan Lebih Lanjut
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://spring.io/projects/spring-boot" rel="noopener noreferrer"&gt;Dokumentasi Resmi Spring Boot&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://graphql.org/learn/" rel="noopener noreferrer"&gt;Dokumentasi Resmi GraphQL&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://nginx.org/en/docs/" rel="noopener noreferrer"&gt;Dokumentasi Resmi Nginx&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.baeldung.com/spring-graphql" rel="noopener noreferrer"&gt;Panduan GraphQL dengan Spring Boot&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.digitalocean.com/community/tutorials/how-to-configure-nginx-as-a-reverse-proxy-on-ubuntu-20-04" rel="noopener noreferrer"&gt;Panduan Konfigurasi Nginx sebagai Reverse Proxy&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Dengan mempelajari lebih lanjut melalui referensi di atas, Anda dapat memperdalam pemahaman Anda tentang arsitektur mikroservis dan teknologi yang digunakan dalam artikel ini.&lt;/p&gt;

</description>
      <category>microservices</category>
      <category>graphql</category>
      <category>kubernetes</category>
      <category>springboot</category>
    </item>
    <item>
      <title>Membangun dan Mengelola Aplikasi Multi-Container Menggunakan Docker Swarm</title>
      <dc:creator>Joniss</dc:creator>
      <pubDate>Sun, 23 Feb 2025 22:16:09 +0000</pubDate>
      <link>https://dev.to/joniss/membangun-dan-mengelola-aplikasi-multi-container-menggunakan-docker-swarm-1ma4</link>
      <guid>https://dev.to/joniss/membangun-dan-mengelola-aplikasi-multi-container-menggunakan-docker-swarm-1ma4</guid>
      <description>&lt;p&gt;Docker Swarm adalah fitur orkestrasi yang disediakan oleh Docker untuk mengelola aplikasi yang terdiri dari beberapa container dalam skala besar. Dengan Docker Swarm, Anda dapat mengelola banyak container yang tersebar di berbagai mesin secara terkoordinasi, meningkatkan ketersediaan aplikasi, serta menyediakan skalabilitas yang lebih baik. Artikel ini akan membahas bagaimana Docker Swarm dapat membantu Anda dalam membangun dan mengelola aplikasi multi-container dengan lebih efisien.&lt;/p&gt;

&lt;h3&gt;
  
  
  Apa itu Docker Swarm?
&lt;/h3&gt;

&lt;p&gt;Docker Swarm adalah mode orkestrasi yang terintegrasi langsung dengan Docker. Swarm memungkinkan Anda untuk mengelola cluster Docker, yang terdiri dari beberapa mesin atau node, sebagai satu kesatuan. Dengan Swarm, Anda dapat mengelola distribusi container, penjadwalan, dan pemantauan status container secara otomatis. Swarm mendukung pengelolaan layanan yang berjalan di banyak node, sehingga cocok untuk aplikasi yang memerlukan ketersediaan tinggi dan skalabilitas.&lt;/p&gt;

&lt;h3&gt;
  
  
  Mengapa Menggunakan Docker Swarm?
&lt;/h3&gt;

&lt;p&gt;Docker Swarm menawarkan beberapa manfaat yang sangat berguna dalam pengelolaan aplikasi multi-container:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Skalabilitas Otomatis&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Docker Swarm memudahkan untuk menambah atau mengurangi jumlah container yang berjalan pada layanan tertentu. Anda dapat mengatur jumlah replika untuk setiap layanan, dan Swarm akan menangani penjadwalan dan distribusi container secara otomatis.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Keandalan dan Ketersediaan Tinggi&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Dengan fitur pemulihan otomatis, Docker Swarm akan secara otomatis mengganti container yang gagal dengan yang baru tanpa mengganggu layanan. Swarm memastikan aplikasi tetap berjalan meskipun ada kegagalan pada node atau container.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Manajemen Terpusat&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Swarm menyediakan manajemen terpusat untuk aplikasi multi-container. Anda hanya perlu mengelola satu cluster, dan Docker Swarm akan menangani distribusi container ke berbagai node, membuat pengelolaan lebih efisien.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Keamanan&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Docker Swarm menyediakan komunikasi yang terenkripsi antar node, dan juga memiliki mekanisme untuk mengelola sertifikat dan kredensial dengan aman, memastikan data Anda terlindungi.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Langkah-Langkah Menggunakan Docker Swarm
&lt;/h3&gt;

&lt;p&gt;Untuk memulai dengan Docker Swarm, ikuti langkah-langkah berikut:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. &lt;strong&gt;Mempersiapkan Cluster Docker Swarm&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Sebelum memulai, pastikan Anda memiliki beberapa mesin (fisik atau virtual) yang dapat dijadikan node di cluster Docker Swarm. Anda dapat menggunakan mesin lokal atau mesin di cloud.&lt;/p&gt;

&lt;p&gt;Untuk memulai, pilih satu node untuk menjadi &lt;em&gt;manager node&lt;/em&gt; (node yang mengatur cluster), dan sisanya akan menjadi &lt;em&gt;worker node&lt;/em&gt; (node yang menjalankan aplikasi).&lt;/p&gt;

&lt;h3&gt;
  
  
  Membuat Swarm
&lt;/h3&gt;

&lt;p&gt;Pada node yang akan menjadi manager, jalankan perintah berikut untuk memulai Swarm:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker swarm init

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Perintah ini akan menghasilkan token yang digunakan untuk menambahkan node lainnya ke dalam cluster.&lt;/p&gt;

&lt;h3&gt;
  
  
  Menambahkan Worker Node
&lt;/h3&gt;

&lt;p&gt;Pada node lainnya (worker), jalankan perintah berikut untuk bergabung ke cluster:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker swarm &lt;span class="nb"&gt;join&lt;/span&gt; &lt;span class="nt"&gt;--token&lt;/span&gt; &amp;lt;TOKEN&amp;gt; &amp;lt;MANAGER-IP&amp;gt;:2377

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Gantilah &lt;code&gt;&amp;lt;TOKEN&amp;gt;&lt;/code&gt; dengan token yang diperoleh dari perintah &lt;code&gt;docker swarm init&lt;/code&gt; dan &lt;code&gt;&amp;lt;MANAGER-IP&amp;gt;&lt;/code&gt; dengan alamat IP manager node.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. &lt;strong&gt;Mendefinisikan Layanan dalam Docker Swarm&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Setelah cluster siap, Anda dapat mulai mendefinisikan layanan yang akan dijalankan dalam Swarm. Layanan ini dapat berupa aplikasi yang terdiri dari beberapa container. Anda dapat menggunakan file &lt;code&gt;docker-compose.yml&lt;/code&gt; untuk mendefinisikan layanan tersebut, sama seperti yang dilakukan di Docker Compose.&lt;/p&gt;

&lt;p&gt;Contoh file &lt;code&gt;docker-compose.yml&lt;/code&gt; untuk aplikasi yang terdiri dari backend dan database PostgreSQL:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;3.7'&lt;/span&gt;

&lt;span class="na"&gt;services&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;backend&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;node:14&lt;/span&gt;
    &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;3000:3000"&lt;/span&gt;
    &lt;span class="na"&gt;environment&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;DATABASE_URL=postgres://user:password@db:5432/mydb&lt;/span&gt;
    &lt;span class="na"&gt;deploy&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;replicas&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;3&lt;/span&gt;
      &lt;span class="na"&gt;restart_policy&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;condition&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;on-failure&lt;/span&gt;
  &lt;span class="na"&gt;db&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;postgres:alpine&lt;/span&gt;
    &lt;span class="na"&gt;environment&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;POSTGRES_USER&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;user&lt;/span&gt;
      &lt;span class="na"&gt;POSTGRES_PASSWORD&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;password&lt;/span&gt;
      &lt;span class="na"&gt;POSTGRES_DB&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;mydb&lt;/span&gt;
    &lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;db_data:/var/lib/postgresql/data&lt;/span&gt;

&lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;db_data&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Pada contoh ini, kita mendefinisikan dua layanan: &lt;code&gt;backend&lt;/code&gt; dan &lt;code&gt;db&lt;/code&gt;. Layanan &lt;code&gt;backend&lt;/code&gt; memiliki 3 replika yang berjalan di berbagai node dalam cluster.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. &lt;strong&gt;Menerapkan Layanan ke Docker Swarm&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Setelah file &lt;code&gt;docker-compose.yml&lt;/code&gt; selesai, Anda dapat menerapkannya ke Docker Swarm menggunakan perintah &lt;code&gt;docker stack deploy&lt;/code&gt;. Ini akan membuat Docker Swarm menjalankan aplikasi sesuai dengan definisi dalam file Compose.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker stack deploy &lt;span class="nt"&gt;-c&lt;/span&gt; docker-compose.yml myapp

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Perintah ini akan mengonfigurasi aplikasi, membangun container-container yang diperlukan, dan mendistribusikannya ke node-node dalam cluster.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. &lt;strong&gt;Memantau dan Mengelola Layanan&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Setelah layanan berjalan, Anda dapat memantau status dan kinerja aplikasi menggunakan beberapa perintah berikut:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Melihat status layanan&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker stack ps myapp

&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Melihat log aplikasi&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker service logs myapp_backend

&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Mengatur skalabilitas layanan&lt;/strong&gt;: Misalnya, untuk menambah jumlah replika backend menjadi 5:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker service scale &lt;span class="nv"&gt;myapp_backend&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;5

&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  5. &lt;strong&gt;Mengelola Swarm dengan Docker Swarm CLI&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Docker Swarm memberikan berbagai perintah untuk mengelola cluster dan layanan. Beberapa perintah yang sering digunakan antara lain:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Melihat status Swarm&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker info

&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Melihat node yang bergabung dalam Swarm&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker node &lt;span class="nb"&gt;ls&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Meningkatkan atau mengurangi jumlah replika&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker service update &lt;span class="nt"&gt;--replicas&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;5 myapp_backend

&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Menghentikan dan menghapus layanan&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker stack &lt;span class="nb"&gt;rm &lt;/span&gt;myapp

&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  6. &lt;strong&gt;Pemisahan antara Pengembangan dan Produksi&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Seperti halnya dengan Docker Compose, Anda dapat menggunakan file yang berbeda untuk pengembangan dan produksi. Anda dapat membuat file &lt;code&gt;docker-compose.override.yml&lt;/code&gt; untuk pengembangan dan &lt;code&gt;docker-compose.prod.yml&lt;/code&gt; untuk produksi, lalu menggunakan flag &lt;code&gt;-f&lt;/code&gt; untuk memilih file yang sesuai.&lt;/p&gt;

&lt;h3&gt;
  
  
  Praktik Terbaik Menggunakan Docker Swarm
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Gunakan Stack untuk Mengelola Aplikasi&lt;/strong&gt;: Docker Swarm mendukung konsep "stack" yang memungkinkan Anda untuk mengelola aplikasi sebagai satu kesatuan. Gunakan &lt;code&gt;docker stack&lt;/code&gt; untuk menerapkan, mengelola, dan menghapus aplikasi.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tuning Performa&lt;/strong&gt;: Sesuaikan jumlah replika dan sumber daya seperti CPU dan memori untuk setiap layanan agar aplikasi berjalan lebih optimal sesuai kebutuhan.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pemantauan dan Logging&lt;/strong&gt;: Implementasikan pemantauan dan logging untuk memudahkan pengelolaan dan troubleshooting. Anda dapat mengintegrasikan Swarm dengan alat seperti Prometheus atau ELK stack.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Keamanan&lt;/strong&gt;: Gunakan jaringan overlay dan enkripsi komunikasi antar node untuk meningkatkan keamanan dalam pengelolaan aplikasi.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Kesimpulan
&lt;/h3&gt;

&lt;p&gt;Docker Swarm adalah alat orkestrasi yang kuat untuk mengelola aplikasi multi-container di skala besar. Dengan kemampuannya untuk menangani distribusi container, penjadwalan otomatis, dan pemulihan dari kegagalan, Swarm sangat cocok untuk aplikasi yang membutuhkan skalabilitas dan ketersediaan tinggi. Menggunakan Docker Swarm memungkinkan Anda untuk mengelola aplikasi secara efisien di berbagai node dan memastikan aplikasi tetap berjalan dengan lancar meskipun ada perubahan atau kegagalan pada beberapa bagian sistem.&lt;/p&gt;

</description>
      <category>docker</category>
      <category>k8s</category>
      <category>webdev</category>
      <category>kubernetes</category>
    </item>
    <item>
      <title>Mengoptimalkan Proses Pengembangan dengan Docker Compose</title>
      <dc:creator>Joniss</dc:creator>
      <pubDate>Fri, 21 Feb 2025 18:09:32 +0000</pubDate>
      <link>https://dev.to/joniss/mengoptimalkan-proses-pengembangan-dengan-docker-compose-34k1</link>
      <guid>https://dev.to/joniss/mengoptimalkan-proses-pengembangan-dengan-docker-compose-34k1</guid>
      <description>&lt;p&gt;Docker Compose merupakan alat yang sangat berguna bagi pengembang untuk mengelola aplikasi multi-container dengan lebih mudah. Ketika aplikasi Anda membutuhkan lebih dari satu container—seperti backend, database, atau layanan lainnya—Docker Compose memungkinkan Anda untuk mendefinisikan, mengonfigurasi, dan menjalankan container-container tersebut sebagai satu unit yang terintegrasi. Artikel ini akan mengulas bagaimana Docker Compose dapat mengoptimalkan proses pengembangan dan mengurangi kompleksitas dalam manajemen container.&lt;/p&gt;

&lt;h3&gt;
  
  
  Apa itu Docker Compose?
&lt;/h3&gt;

&lt;p&gt;Docker Compose adalah alat yang memungkinkan Anda untuk mendefinisikan dan menjalankan aplikasi yang terdiri dari beberapa container menggunakan file YAML. Dengan Docker Compose, Anda dapat mendeklarasikan berbagai container, jaringan, volume, dan layanan dalam satu file yang mudah dikelola. Ini sangat membantu dalam pengembangan aplikasi yang memiliki banyak komponen yang saling berinteraksi, seperti frontend, backend, database, cache, dan lainnya.&lt;/p&gt;

&lt;h3&gt;
  
  
  Mengapa Menggunakan Docker Compose?
&lt;/h3&gt;

&lt;p&gt;Docker Compose menawarkan beberapa manfaat besar dalam pengembangan aplikasi, antara lain:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Simplifikasi Konfigurasi&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Docker Compose memungkinkan Anda mendeklarasikan seluruh infrastruktur aplikasi dalam satu file YAML. Hal ini mempermudah pengelolaan konfigurasi dan meminimalisir kompleksitas dalam pengaturan berbagai layanan.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Pengelolaan Multi-Container yang Mudah&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Compose menyederhanakan pengelolaan banyak container, memungkinkan Anda untuk mengatur layanan-layanan yang saling bergantung—seperti database dan API—dalam satu tempat yang terstruktur.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Reusabilitas dan Konsistensi&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;File Compose yang sama dapat digunakan di berbagai lingkungan, seperti pengembangan, pengujian, atau produksi. Ini memastikan bahwa lingkungan yang digunakan oleh tim pengembang adalah konsisten dan mudah dipindahkan antar mesin.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Pengelolaan Sumber Daya yang Efisien&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Docker Compose memudahkan konfigurasi dan pengelolaan volume, jaringan, dan variabel lingkungan, yang membuatnya lebih efisien dalam penggunaan sumber daya.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Langkah-Langkah Menggunakan Docker Compose
&lt;/h3&gt;

&lt;p&gt;Untuk memulai menggunakan Docker Compose dalam proyek pengembangan Anda, ikuti langkah-langkah berikut:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. &lt;strong&gt;Instal Docker Compose&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Jika Docker Compose belum terinstal di sistem Anda, pastikan Docker dan Docker Compose sudah terpasang. Untuk pengguna Windows dan macOS, Docker Compose sudah terintegrasi dengan Docker Desktop. Bagi pengguna Linux, Anda bisa menginstalnya menggunakan perintah berikut:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;apt-get &lt;span class="nb"&gt;install &lt;/span&gt;docker-compose

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. &lt;strong&gt;Buat Dockerfile untuk Setiap Layanan&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Setiap layanan yang dijalankan dalam container memerlukan Dockerfile-nya sendiri. Misalnya, jika Anda bekerja dengan aplikasi Node.js, Anda perlu membuat Dockerfile untuk aplikasi tersebut.&lt;/p&gt;

&lt;p&gt;Contoh Dockerfile untuk aplikasi Node.js:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Menggunakan image dasar node
FROM node:14

# Menentukan direktori kerja
WORKDIR /app

# Menyalin file aplikasi ke dalam container
COPY . .

# Menginstal dependensi
RUN npm install

# Menjalankan aplikasi
CMD ["npm", "start"]

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3. &lt;strong&gt;Buat File docker-compose.yml&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;File &lt;code&gt;docker-compose.yml&lt;/code&gt; adalah tempat Anda mendefinisikan seluruh layanan, volume, dan jaringan untuk aplikasi Anda. Berikut adalah contoh file &lt;code&gt;docker-compose.yml&lt;/code&gt; untuk aplikasi yang terdiri dari backend Node.js dan database PostgreSQL:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;3'&lt;/span&gt;

&lt;span class="na"&gt;services&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;backend&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;build&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;.&lt;/span&gt;
    &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;3000:3000"&lt;/span&gt;
    &lt;span class="na"&gt;environment&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;DATABASE_URL=postgres://user:password@db:5432/mydb&lt;/span&gt;
    &lt;span class="na"&gt;depends_on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;db&lt;/span&gt;
  &lt;span class="na"&gt;db&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;postgres:alpine&lt;/span&gt;
    &lt;span class="na"&gt;environment&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;POSTGRES_USER&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;user&lt;/span&gt;
      &lt;span class="na"&gt;POSTGRES_PASSWORD&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;password&lt;/span&gt;
      &lt;span class="na"&gt;POSTGRES_DB&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;mydb&lt;/span&gt;
    &lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;db_data:/var/lib/postgresql/data&lt;/span&gt;

&lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;db_data&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Pada contoh di atas:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Backend&lt;/strong&gt;: Layanan ini dibangun menggunakan Dockerfile yang ada di direktori saat ini (&lt;code&gt;build: .&lt;/code&gt;). Aplikasi ini berjalan di port 3000 dan bergantung pada layanan &lt;code&gt;db&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Database (db)&lt;/strong&gt;: Menggunakan image PostgreSQL dan mengonfigurasi variabel lingkungan untuk nama pengguna, kata sandi, dan nama database. Volume &lt;code&gt;db_data&lt;/code&gt; digunakan untuk menyimpan data database secara persisten.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  4. &lt;strong&gt;Menjalankan Aplikasi dengan Docker Compose&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Setelah file &lt;code&gt;docker-compose.yml&lt;/code&gt; selesai dibuat, Anda dapat menjalankan seluruh aplikasi dengan satu perintah:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker-compose up

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Perintah ini akan membangun dan menjalankan semua container yang didefinisikan dalam file &lt;code&gt;docker-compose.yml&lt;/code&gt;. Jika Anda ingin menjalankan aplikasi di background, gunakan flag &lt;code&gt;-d&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker-compose up &lt;span class="nt"&gt;-d&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Untuk menghentikan aplikasi, Anda bisa menggunakan perintah:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker-compose down

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  5. &lt;strong&gt;Mengelola Multi-Container dengan Docker Compose&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Docker Compose tidak hanya mempermudah Anda dalam menjalankan aplikasi multi-container, tetapi juga menyediakan beberapa perintah berguna lainnya, seperti:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Melihat Log&lt;/strong&gt;: Anda dapat melihat log dari semua container yang sedang berjalan dengan perintah:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker-compose logs

&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Skalabilitas&lt;/strong&gt;: Anda dapat menambah atau mengurangi jumlah container untuk suatu layanan. Misalnya, untuk menjalankan dua instance dari backend:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker-compose up &lt;span class="nt"&gt;--scale&lt;/span&gt; &lt;span class="nv"&gt;backend&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;2

&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  6. &lt;strong&gt;Menggunakan Docker Compose untuk Pengujian&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Docker Compose sangat berguna dalam pengujian, terutama saat aplikasi Anda membutuhkan beberapa layanan yang saling berinteraksi, seperti API dan database. Anda dapat membuat lingkungan pengujian terisolasi dengan Docker Compose untuk memastikan aplikasi berfungsi dengan baik sebelum dipindahkan ke produksi.&lt;/p&gt;

&lt;p&gt;Contoh perintah untuk menjalankan tes dalam container:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker-compose run backend npm &lt;span class="nb"&gt;test&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Praktik Terbaik Menggunakan Docker Compose
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Gunakan &lt;code&gt;.env&lt;/code&gt; untuk Variabel Lingkungan&lt;/strong&gt;: Hindari menulis variabel lingkungan sensitif langsung di dalam file &lt;code&gt;docker-compose.yml&lt;/code&gt;. Sebagai gantinya, gunakan file &lt;code&gt;.env&lt;/code&gt; untuk menyimpan variabel lingkungan dan referensikan di dalam file Compose.&lt;/p&gt;

&lt;p&gt;Contoh &lt;code&gt;.env&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;POSTGRES_USER&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;user
&lt;span class="nv"&gt;POSTGRES_PASSWORD&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;password

&lt;/code&gt;&lt;/pre&gt;


&lt;p&gt;Kemudian, referensikan di dalam file &lt;code&gt;docker-compose.yml&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;db&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;postgres:alpine&lt;/span&gt;
  &lt;span class="na"&gt;environment&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;POSTGRES_USER=${POSTGRES_USER}&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;POSTGRES_PASSWORD=${POSTGRES_PASSWORD}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Pemisahan Antara Pengembangan dan Produksi&lt;/strong&gt;: Anda dapat membuat beberapa file &lt;code&gt;docker-compose.yml&lt;/code&gt; untuk lingkungan yang berbeda. Misalnya, &lt;code&gt;docker-compose.dev.yml&lt;/code&gt; untuk pengembangan dan &lt;code&gt;docker-compose.prod.yml&lt;/code&gt; untuk produksi. Anda bisa menggunakan flag &lt;code&gt;f&lt;/code&gt; untuk menentukan file yang berbeda:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker-compose &lt;span class="nt"&gt;-f&lt;/span&gt; docker-compose.dev.yml up

&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Pembersihan Volume&lt;/strong&gt;: Untuk menghindari akumulasi data yang tidak perlu, gunakan perintah berikut untuk menghapus volume yang tidak digunakan:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker volume prune

&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Kesimpulan
&lt;/h3&gt;

&lt;p&gt;Docker Compose adalah alat yang sangat efektif untuk mengelola aplikasi yang terdiri dari banyak layanan. Dengan Docker Compose, Anda dapat mendefinisikan, mengonfigurasi, dan menjalankan aplikasi multi-container dengan lebih mudah dan efisien. Dengan kemudahan pengelolaan ini, proses pengembangan dan pengujian aplikasi menjadi lebih terstruktur, terisolasi, dan konsisten, baik di lingkungan pengembangan maupun produksi. Docker Compose membantu para pengembang mengurangi kompleksitas dan meningkatkan produktivitas dalam proyek pengembangan perangkat lunak yang memerlukan berbagai layanan yang saling berinteraksi.&lt;/p&gt;

</description>
      <category>devops</category>
      <category>docker</category>
      <category>microservices</category>
      <category>devto</category>
    </item>
    <item>
      <title>Panduan Lengkap untuk Memulai dengan Docker: Konsep dan Praktik Terbaik</title>
      <dc:creator>Joniss</dc:creator>
      <pubDate>Thu, 20 Feb 2025 14:02:46 +0000</pubDate>
      <link>https://dev.to/joniss/panduan-lengkap-untuk-memulai-dengan-docker-konsep-dan-praktik-terbaik-1145</link>
      <guid>https://dev.to/joniss/panduan-lengkap-untuk-memulai-dengan-docker-konsep-dan-praktik-terbaik-1145</guid>
      <description>&lt;p&gt;Docker telah menjadi salah satu alat yang paling banyak digunakan di dunia pengembangan perangkat lunak. Dengan Docker, Anda dapat mengemas aplikasi dan dependensinya ke dalam container yang dapat dijalankan di mana saja. Docker mengatasi tantangan terkait konsistensi pengembangan, pengujian, dan deployment. Artikel ini akan membahas konsep dasar Docker dan memberikan praktik terbaik untuk memulai serta memaksimalkan penggunaannya.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Apa Itu Docker?&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Docker adalah platform open-source yang memungkinkan pengembang untuk mengemas aplikasi dan dependensinya ke dalam container. Container ini mencakup semua yang dibutuhkan untuk menjalankan aplikasi, termasuk sistem operasi, kode aplikasi, dan pustaka-pustaka. Keunggulan utama Docker terletak pada kemampuannya untuk menjalankan aplikasi dengan konsisten di berbagai lingkungan, mulai dari pengembangan hingga produksi.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Mengapa Menggunakan Docker?&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Ada beberapa alasan mengapa Docker sangat populer di kalangan komunitas pengembang perangkat lunak:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Portabilitas&lt;/strong&gt;: Docker memastikan aplikasi dapat berjalan dengan konsisten di berbagai lingkungan tanpa masalah terkait dependensi atau konfigurasi.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Isolasi&lt;/strong&gt;: Setiap aplikasi berjalan dalam container yang terpisah, menghindari konflik antara aplikasi yang berbeda.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Efisiensi&lt;/strong&gt;: Docker menggunakan sumber daya sistem dengan lebih efisien dibandingkan dengan metode virtualisasi tradisional.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Kemudahan Pengelolaan&lt;/strong&gt;: Docker menyederhanakan pembuatan, pengelolaan, dan penghapusan container aplikasi dengan perintah-perintah yang sederhana.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Konsep Dasar Docker&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Untuk memulai dengan Docker, penting untuk memahami beberapa konsep inti berikut:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Image&lt;/strong&gt;: Sebuah Docker image adalah template yang digunakan untuk membuat container. Sebuah image berisi semua yang dibutuhkan untuk menjalankan aplikasi, termasuk sistem operasi, kode aplikasi, dan pustaka-pustaka.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Container&lt;/strong&gt;: Container adalah instance yang sedang berjalan dari sebuah Docker image. Ini adalah unit terisolasi yang menjalankan aplikasi Anda.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dockerfile&lt;/strong&gt;: Dockerfile adalah sebuah skrip yang berisi instruksi untuk membangun sebuah Docker image. Anda dapat mendefinisikan bagaimana cara menyiapkan image, seperti menginstal perangkat lunak atau mengonfigurasi variabel lingkungan.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Docker Hub&lt;/strong&gt;: Docker Hub adalah registry publik tempat Anda dapat menemukan dan berbagi Docker images.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Langkah-langkah untuk Memulai dengan Docker&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Berikut adalah langkah-langkah dasar untuk mulai menggunakan Docker:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Install Docker&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Pertama, Anda perlu menginstal Docker di sistem Anda. Docker tersedia untuk Windows, macOS, dan berbagai distribusi Linux. Anda dapat mengunduhnya dari &lt;a href="https://www.docker.com/get-started" rel="noopener noreferrer"&gt;situs resmi Docker&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Buat Dockerfile&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Buat sebuah file bernama &lt;code&gt;Dockerfile&lt;/code&gt; di direktori proyek Anda. Berikut adalah contoh Dockerfile untuk aplikasi Node.js:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Gunakan base image
FROM node:14

# Tentukan direktori kerja
WORKDIR /app

# Salin file aplikasi ke dalam container
COPY . .

# Instal dependensi
RUN npm install

# Jalankan aplikasi
CMD ["npm", "start"]

&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Bangun Image&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Setelah Dockerfile dibuat, bangun image dengan menjalankan perintah berikut di terminal:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker build &lt;span class="nt"&gt;-t&lt;/span&gt; my-app &lt;span class="nb"&gt;.&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Jalankan Container&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Setelah membangun image, Anda dapat menjalankan aplikasi di dalam container:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker run &lt;span class="nt"&gt;-p&lt;/span&gt; 3000:3000 my-app

&lt;/code&gt;&lt;/pre&gt;


&lt;p&gt;Ini akan menjalankan aplikasi di dalam container dan memetakan port 3000 dari container ke port 3000 di mesin host.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Praktik Terbaik untuk Menggunakan Docker&lt;/strong&gt;
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Gunakan &lt;code&gt;.dockerignore&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Mirip dengan file &lt;code&gt;.gitignore&lt;/code&gt;, file &lt;code&gt;.dockerignore&lt;/code&gt; digunakan untuk mengecualikan file atau direktori tertentu dari penyalinan ke dalam Docker image. Ini membantu mengurangi ukuran image dan mencegah file yang tidak perlu dimasukkan.&lt;br&gt;
Contoh &lt;code&gt;.dockerignore&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;node_modules
*.log

&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Minimalkan Ukuran Image&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Untuk mengurangi ukuran image Anda, gunakan base image yang lebih kecil seperti &lt;code&gt;alpine&lt;/code&gt;. Misalnya, untuk aplikasi Python, Anda bisa menggunakan:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;FROM python:3.9-alpine

&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Gunakan Multi-Stage Builds&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Jika aplikasi Anda membutuhkan dependensi pengembangan yang besar, pertimbangkan untuk menggunakan multi-stage builds untuk mengurangi ukuran image akhir. Ini memungkinkan Anda memisahkan tahap pembangunan dan tahap produksi.&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Build stage
FROM node:14 AS build
WORKDIR /app
COPY . .
RUN npm install &amp;amp;&amp;amp; npm run build

# Production stage
FROM node:14-alpine
WORKDIR /app
COPY --from=build /app /app
CMD ["npm", "start"]

&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Manfaatkan Docker Compose untuk Aplikasi Multi-Container&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Jika aplikasi Anda memerlukan beberapa container, seperti backend dan database, Docker Compose adalah alat yang kuat untuk mendefinisikan dan menjalankan aplikasi multi-container. Berikut adalah contoh file &lt;code&gt;docker-compose.yml&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;3'&lt;/span&gt;
&lt;span class="na"&gt;services&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;app&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;build&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;.&lt;/span&gt;
    &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;3000:3000"&lt;/span&gt;
  &lt;span class="na"&gt;db&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;postgres:alpine&lt;/span&gt;
    &lt;span class="na"&gt;environment&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;POSTGRES_PASSWORD&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;example&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;


&lt;p&gt;Untuk menjalankan aplikasi dengan Docker Compose, cukup gunakan:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker-compose up

&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Jaga Keamanan Docker&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Hindari menjalankan container sebagai pengguna root, terutama di lingkungan produksi. Sebagai gantinya, buat pengguna non-root di dalam Dockerfile:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;RUN useradd -m myuser
USER myuser

&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Kesimpulan&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Docker adalah alat yang sangat kuat untuk membangun, mengemas, dan menjalankan aplikasi dalam lingkungan terisolasi. Meskipun mudah untuk mulai menggunakan Docker, ada banyak fitur lanjutan yang dapat membantu Anda mengelola aplikasi yang lebih besar dan lebih kompleks. Dengan mengikuti panduan ini, Anda akan memiliki dasar yang solid untuk menguasai Docker dan mengintegrasikannya ke dalam proyek Anda.&lt;/p&gt;

&lt;p&gt;Jangan ragu untuk mengeksplorasi lebih lanjut dengan bereksperimen dengan berbagai fitur Docker, dan pastikan untuk selalu mengikuti praktik terbaik untuk mengoptimalkan pengembangan dan pengelolaan aplikasi Anda.&lt;/p&gt;




</description>
      <category>docker</category>
      <category>devops</category>
      <category>devto</category>
      <category>developers</category>
    </item>
  </channel>
</rss>
