<?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: Hoàng Tiến</title>
    <description>The latest articles on DEV Community by Hoàng Tiến (@hoangtien2k3).</description>
    <link>https://dev.to/hoangtien2k3</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%2F832314%2Fdea3ca8b-173a-4431-a6a3-4bbc92d9a716.jpeg</url>
      <title>DEV Community: Hoàng Tiến</title>
      <link>https://dev.to/hoangtien2k3</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/hoangtien2k3"/>
    <language>en</language>
    <item>
      <title>Introducing Java Library for Backend Microservice Webflux (Reactor-core)</title>
      <dc:creator>Hoàng Tiến</dc:creator>
      <pubDate>Sun, 12 Jan 2025 05:19:47 +0000</pubDate>
      <link>https://dev.to/hoangtien2k3/introducing-java-library-for-backend-microservice-webflux-reactor-core-4djc</link>
      <guid>https://dev.to/hoangtien2k3/introducing-java-library-for-backend-microservice-webflux-reactor-core-4djc</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fof2390e1nj4s7z6n3ne6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fof2390e1nj4s7z6n3ne6.png" alt="Image description" width="800" height="481"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Link github: &lt;a href="https://github.com/hoangtien2k3/reactify-core" rel="noopener noreferrer"&gt;https://github.com/hoangtien2k3/reactify-core&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;1. Library Overview&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;This library is built on the core components of Spring WebFlux and Reactor-Core – two powerful tools supporting reactive programming. With this library, you can easily build asynchronous microservice applications, handling non-linear data streams efficiently.&lt;/p&gt;

&lt;p&gt;Highlight features include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Full reactive programming support: Stream-based asynchronous data processing.&lt;/li&gt;
&lt;li&gt;High performance optimization: Minimize the number of threads needed and maximize CPU resources.&lt;/li&gt;
&lt;li&gt;Easy scalability: Suitable for microservice systems that require handling large volumes of requests from users.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;2. Advantages of the library&lt;/strong&gt;
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;High performance and good responsiveness:&lt;br&gt;
Using a non-blocking mechanism, this library can handle thousands of concurrent requests without creating too many threads, which reduces resource load and improves response speed.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Easy stream processing:&lt;br&gt;
Reactor-Core provides a powerful API for stream processing, suitable for applications that need to process continuous data such as real-time notification systems, event processing, and big data processing systems.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Easy integration with the Spring ecosystem:&lt;br&gt;
The library is designed to work well with components in the Spring ecosystem such as Spring Security, Spring Data R2DBC, helping to build complete applications with less effort.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7o0lqxa2oj94e1g7y6zr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7o0lqxa2oj94e1g7y6zr.png" alt="Image description" width="800" height="436"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Setup reactify-core
&lt;/h2&gt;

&lt;h4&gt;
  
  
  1. Use annotation @ComponentScan to scan all libraries
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nd"&gt;@ComponentScan&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;basePackages&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="s"&gt;"com.reactify.*"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;           &lt;span class="c1"&gt;// add default: com.reactify.*&lt;/span&gt;
        &lt;span class="s"&gt;"com.example.myproject"&lt;/span&gt;     &lt;span class="c1"&gt;// varies depending on your project&lt;/span&gt;
&lt;span class="o"&gt;})&lt;/span&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;ExampleApplication&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;Example&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;h4&gt;
  
  
  2. Config your project file application.yml or application.properties
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;# spring config&lt;/span&gt;
&lt;span class="na"&gt;spring&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;main&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;web-application-type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;reactive&lt;/span&gt;
    &lt;span class="na"&gt;allow-bean-definition-overriding&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
  &lt;span class="na"&gt;messages&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;basename&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;i18n/messages&lt;/span&gt;

  &lt;span class="c1"&gt;#connect db R2DBC PostgreSQL&lt;/span&gt;
  &lt;span class="na"&gt;r2dbc&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;url&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;r2dbc:postgresql://localhost:5434/auth&lt;/span&gt;
    &lt;span class="na"&gt;username&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;admin&lt;/span&gt;
    &lt;span class="na"&gt;password&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;admin&lt;/span&gt;
    &lt;span class="na"&gt;pool&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;max-size&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;10&lt;/span&gt;
      &lt;span class="na"&gt;initial-size&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;5&lt;/span&gt;

  &lt;span class="c1"&gt;# Config connect Keycloak&lt;/span&gt;
  &lt;span class="na"&gt;security&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;oauth2&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;client&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;provider&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;oidc&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
            &lt;span class="na"&gt;token-uri&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${keycloak.serverUrl}/realms/${keycloak.realm}/protocol/openid-connect/token&lt;/span&gt;
        &lt;span class="na"&gt;registration&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;oidc&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
            &lt;span class="na"&gt;client-id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${keycloak.clientId}&lt;/span&gt;
            &lt;span class="na"&gt;client-secret&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${keycloak.clientSecret}&lt;/span&gt;
            &lt;span class="na"&gt;authorization-grant-type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${keycloak.grantType}&lt;/span&gt; &lt;span class="c1"&gt;#password || #client_credentials&lt;/span&gt;
      &lt;span class="na"&gt;resourceserver&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;jwt&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;jwk-set-uri&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${keycloak.serverUrl}/realms/${keycloak.realm}/protocol/openid-connect/certs&lt;/span&gt;
      &lt;span class="na"&gt;keycloak&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;client-id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${keycloak.clientId}&lt;/span&gt;

&lt;span class="c1"&gt;# Web client config&lt;/span&gt;
&lt;span class="na"&gt;client&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="c1"&gt;#keycloak&lt;/span&gt;
  &lt;span class="na"&gt;keycloak&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;address&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;http://localhost:8080/realms/ezbuy-server/protocol/openid-connect&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;keycloak&lt;/span&gt;
    &lt;span class="na"&gt;auth&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;client-id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ezbuy-client&lt;/span&gt;
      &lt;span class="na"&gt;client-secret&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;mI92QDfvi20tZgFtjpRAPWu8TR6eMHmw&lt;/span&gt;
  &lt;span class="c1"&gt;#notification&lt;/span&gt;
  &lt;span class="na"&gt;notification&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;internal-oauth&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
    &lt;span class="na"&gt;address&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;http://localhost:7777/v1/transmission&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;notiServiceClient&lt;/span&gt;
    &lt;span class="na"&gt;pool&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;max-size&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;100&lt;/span&gt;
      &lt;span class="na"&gt;max-pending-acquire&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;100&lt;/span&gt;
    &lt;span class="na"&gt;timeout&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;read&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;60000&lt;/span&gt;
      &lt;span class="na"&gt;write&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1000&lt;/span&gt;

&lt;span class="c1"&gt;# Unauthenticated endpoints config&lt;/span&gt;
&lt;span class="na"&gt;application&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;http-logging&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;request&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;enable&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
      &lt;span class="na"&gt;header&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
      &lt;span class="na"&gt;param&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
      &lt;span class="na"&gt;body&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
    &lt;span class="na"&gt;response&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;enable&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
      &lt;span class="na"&gt;body&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
  &lt;span class="na"&gt;whiteList&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uri&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;/v1/auth/generate-otp&lt;/span&gt;
      &lt;span class="na"&gt;methods&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;POST&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uri&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;/**&lt;/span&gt;
      &lt;span class="na"&gt;methods&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;OPTIONS&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uri&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;/v1/auth/get-all&lt;/span&gt;
      &lt;span class="na"&gt;methods&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;GET&lt;/span&gt;
  &lt;span class="na"&gt;data&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;sync-data&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;limit&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;500&lt;/span&gt;

&lt;span class="c1"&gt;#keycloak client config&lt;/span&gt;
&lt;span class="na"&gt;keycloak&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;clientId&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ezbuy-client&lt;/span&gt;
  &lt;span class="na"&gt;clientSecret&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;mI92QDfvi20tZgFtjpRAPWu8TR6eMHmw&lt;/span&gt;
  &lt;span class="na"&gt;realm&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ezbuy-server&lt;/span&gt;
  &lt;span class="na"&gt;serverUrl&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;http://localhost:8080&lt;/span&gt;
  &lt;span class="na"&gt;grantType&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;host&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;localhost&lt;/span&gt;

&lt;span class="c1"&gt;# minio server config&lt;/span&gt;
&lt;span class="na"&gt;minio&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;bucket&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ezbuy-bucket&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;span class="na"&gt;baseUrl&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;http://localhost:9000&lt;/span&gt;
  &lt;span class="na"&gt;publicUrl&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;http://localhost:9000/ezbuy-bucket&lt;/span&gt;
  &lt;span class="na"&gt;accessKey&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;4DoaZ0KdzpXdDlVK104t&lt;/span&gt;
  &lt;span class="na"&gt;secretKey&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;nuRiQUIJNVygMOHhmtR4LT1etAa7F8PQOsRGP5oj&lt;/span&gt;
  &lt;span class="na"&gt;private&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;bucket&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ezbuy-private&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  3. After completing the configuration, start running the project.
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;  &lt;span class="c1"&gt;# Using Maven&lt;/span&gt;
  &lt;span class="s"&gt;mvn spring-boot:run&lt;/span&gt;

  &lt;span class="s"&gt;# Using Gradle&lt;/span&gt;
  &lt;span class="s"&gt;gradle bootRun&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  4. Refer to the following project, used
&lt;/h4&gt;

&lt;p&gt;reactify-core library for webflux microservice project: &lt;a href="https://github.com/hoangtien2k3/keycloak-auth-service" rel="noopener noreferrer"&gt;keycloak-auth-service&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Everyone can give feedback and find errors or improve this library to help develop the community stronger, thank you very much&lt;br&gt;
Have a nice day&lt;/p&gt;

</description>
      <category>java</category>
      <category>backend</category>
      <category>reactorcore</category>
      <category>webflux</category>
    </item>
    <item>
      <title>Java library for developing backend with reactive programming</title>
      <dc:creator>Hoàng Tiến</dc:creator>
      <pubDate>Fri, 04 Oct 2024 18:43:06 +0000</pubDate>
      <link>https://dev.to/hoangtien2k3/java-library-for-developing-backend-with-reactive-programming-57ol</link>
      <guid>https://dev.to/hoangtien2k3/java-library-for-developing-backend-with-reactive-programming-57ol</guid>
      <description>&lt;h3&gt;
&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fhoangtien2k3%2Freactify%2Fblob%2Fmain%2Fdocs%2Fimages%2Freactify_banner.png" alt="Ezbuy"&gt;

&lt;a href="https://github.com/hoangtien2k3/reactify/blob/main/docs/en/README.md" rel="noopener noreferrer"&gt;📚Docs&lt;/a&gt; |
&lt;a href="https://github.com/hoangtien2k3/reactify/blob/main/docs/en/README.md" rel="noopener noreferrer"&gt;💬Chat&lt;/a&gt; |
&lt;a href="https://github.com/hoangtien2k3/reactify/blob/main/docs/en/README.md" rel="noopener noreferrer"&gt;✨Live Demo&lt;/a&gt;
&lt;/h3&gt;

&lt;h2&gt;
  
  
  Java library for developing backend with reactive programming
&lt;/h2&gt;

&lt;p&gt;I am currently writing and developing a Java library with Webflux (reactor-core). Including utilities&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;security with keycloak&lt;/li&gt;
&lt;li&gt;trace log&lt;/li&gt;
&lt;li&gt;minio server&lt;/li&gt;
&lt;li&gt;support microservcie, java21, springboot&lt;/li&gt;
&lt;li&gt;aop, utils&lt;/li&gt;
&lt;li&gt;cache with ehcached and caffeine caching&lt;/li&gt;
&lt;li&gt;exception, filter, http config, call restful api ...&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  I want to introduce it to the community and need everyone to help develop this library to be more complete.
&lt;/h4&gt;

&lt;h4&gt;
  
  
  Please see the source code and contribute to this library of mine. Thanks everyone in the community.
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Link source github: &lt;a href="https://github.com/hoangtien2k3/reactify" rel="noopener noreferrer"&gt;https://github.com/hoangtien2k3/reactify&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Reactify &lt;a href=""&gt;a commons Java lib&lt;/a&gt; with spring boot framework, Supports using keycloak, filter, trace log, cached, minio&lt;br&gt;
server, exception handler, validate and call API with webclient&lt;/p&gt;

&lt;p&gt;This README provides quickstart instructions on running &lt;a href=""&gt;&lt;code&gt;reactify&lt;/code&gt;&lt;/a&gt; on bare metal project spring boot.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://sonarcloud.io/summary/new_code?id=hoangtien2k3_reactify" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fsonarcloud.io%2Fimages%2Fproject_badges%2Fsonarcloud-white.svg" alt="SonarCloud"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://app.circleci.com/pipelines/github/hoangtien2k3/reactify" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcircleci.com%2Fgh%2Fhoangtien2k3%2Freactify.svg%3Fstyle%3Dsvg" alt="CircleCI"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://sonarcloud.io/summary/new_code?id=hoangtien2k3_reactify" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fsonarcloud.io%2Fapi%2Fproject_badges%2Fmeasure%3Fproject%3Dhoangtien2k3_reactify%26metric%3Dalert_status" alt="Quality Gate Status"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://sonarcloud.io/summary/overall?id=hoangtien2k3_reactify" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fsonarcloud.io%2Fapi%2Fproject_badges%2Fmeasure%3Fproject%3Dhoangtien2k3_reactify%26metric%3Dncloc" alt="Lines of Code"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://mvnrepository.com/artifact/io.github.hoangtien2k3/reactify" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fgithub%2Fv%2Frelease%2Fhoangtien2k3%2Freactify%3Flabel%3Dlatest%2520release" alt="GitHub Release"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://www.apache.org/licenses/LICENSE-2.0.html" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fbadge%2Flicense-Apache--2.0-green.svg" alt="License"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://www.bestpractices.dev/projects/9383" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.bestpractices.dev%2Fprojects%2F9383%2Fbadge" alt="OpenSSF Best Practices"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://github.com/hoangtien2k3/reactify/actions" rel="noopener noreferrer"&gt;&lt;img src="https://github.com/ponfee/commons-core/workflows/build-with-maven/badge.svg" alt="Build status"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Download
&lt;/h2&gt;

&lt;p&gt;Gradle is the only supported build configuration, so just add the dependency to your project build.gradle file:&lt;/p&gt;

&lt;p&gt;⬇️ Download Gradle and Maven&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="nf"&gt;dependencies&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;implementation&lt;/span&gt; &lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="n"&gt;io&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;github&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;hoangtien2k3&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;reactify&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="n"&gt;latest&lt;/span&gt;&lt;span class="err"&gt;'&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;dependency&amp;gt;
   &amp;lt;groupId&amp;gt;io.github.hoangtien2k3&amp;lt;/groupId&amp;gt;
   &amp;lt;artifactId&amp;gt;reactify&amp;lt;/artifactId&amp;gt;
   &amp;lt;version&amp;gt;${latest}&amp;lt;/version&amp;gt;
&amp;lt;/dependency&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The latest &lt;code&gt;reactify&lt;/code&gt; version is: &lt;a href="https://mvnrepository.com/artifact/io.github.hoangtien2k3/reactify" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fgithub%2Fv%2Frelease%2Fhoangtien2k3%2Freactify%3Flabel%3Dlatest" alt="GitHub Release"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The latest stable lib &lt;code&gt;reactify&lt;/code&gt; version is: latestVersion Click &lt;a href="https://central.sonatype.com/namespace/io.github.hoangtien2k3" rel="noopener noreferrer"&gt;here&lt;/a&gt; for more information on reactify.&lt;/p&gt;

&lt;h2&gt;
  
  
  Getting Started
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Correct and complete setup to start the program &lt;code&gt;application.yml&lt;/code&gt; or &lt;code&gt;application.properties&lt;/code&gt;&lt;br&gt;
with &lt;a href="//src/main/resources/application.yml"&gt;CONFIG&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The &lt;a href=""&gt;reference documentation&lt;/a&gt; includes detailed &lt;a href=""&gt;installation instructions&lt;/a&gt; as well as a&lt;br&gt;
comprehensive &lt;a href=""&gt;getting started&lt;/a&gt; guide.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Here is a quick teaser of a complete Spring Boot application in Java:&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;@SpringBootApplication&lt;/span&gt;
&lt;span class="nd"&gt;@ComponentScan&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;basePackages&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="s"&gt;"io.hoangtien2k3.reactify.*"&lt;/span&gt;&lt;span class="o"&gt;})&lt;/span&gt;
&lt;span class="nd"&gt;@ImportResource&lt;/span&gt;&lt;span class="o"&gt;({&lt;/span&gt;&lt;span class="s"&gt;"classpath*:applicationContext.xml"&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;class&lt;/span&gt; &lt;span class="nc"&gt;Example&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

    &lt;span class="nd"&gt;@RequestMapping&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"/"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
    &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="nf"&gt;home&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;"Hello World!"&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="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;Example&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;h2&gt;
  
  
  Contributing
&lt;/h2&gt;

&lt;p&gt;If you would like to contribute to the development of this project, please follow our contribution guidelines.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Frepobeats.axiom.co%2Fapi%2Fembed%2F31a861bf21d352264c5c122808407abafb97b0ef.svg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Frepobeats.axiom.co%2Fapi%2Fembed%2F31a861bf21d352264c5c122808407abafb97b0ef.svg" title="Repobeats analytics image" alt="Alt"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Star History
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://star-history.com/#hoangtien2k3/fw-commons&amp;amp;Timeline" rel="noopener noreferrer"&gt;&lt;br&gt;
 &lt;br&gt;
   &lt;br&gt;
   &lt;br&gt;
   &lt;img alt="Star History Chart" src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fapi.star-history.com%2Fsvg%3Frepos%3Dhoangtien2k3%2Ffw-commons%26type%3DTimeline"&gt;&lt;br&gt;
 &lt;br&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Contributors ✨
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/hoangtien2k3/fw-commons/graphs/contributors" rel="noopener noreferrer"&gt;&lt;br&gt;
  &lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcontrib.rocks%2Fimage%3Frepo%3Dhoangtien2k3%2Freactify"&gt;&lt;br&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  License
&lt;/h2&gt;

&lt;p&gt;This project is licensed under the &lt;a href="https://www.apache.org/licenses/LICENSE-2.0" rel="noopener noreferrer"&gt;Apache License, Version 2.0&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Apache License
Copyright (c) 2024 Hoàng Anh Tiến
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>backend</category>
      <category>java21</category>
      <category>webflux</category>
      <category>microservices</category>
    </item>
    <item>
      <title>Getting Started with CI/CD: A Beginner's Guide to Automating Your First Pipeline (with Jenkins)</title>
      <dc:creator>Hoàng Tiến</dc:creator>
      <pubDate>Fri, 27 Sep 2024 13:01:10 +0000</pubDate>
      <link>https://dev.to/hoangtien2k3/getting-started-with-cicd-a-beginners-guide-to-automating-your-first-pipeline-with-jenkins-1m61</link>
      <guid>https://dev.to/hoangtien2k3/getting-started-with-cicd-a-beginners-guide-to-automating-your-first-pipeline-with-jenkins-1m61</guid>
      <description>&lt;h2&gt;
  
  
  Table of Contents
&lt;/h2&gt;

&lt;p&gt;Introduction&lt;br&gt;
What is CI/CD?&lt;br&gt;
Continuous Integration (CI)&lt;br&gt;
Continuous Delivery (CD)&lt;br&gt;
Continuous Deployment&lt;br&gt;
Benefits of CI/CD&lt;br&gt;
Faster Time to Market&lt;br&gt;
Improved Code Quality&lt;br&gt;
Efficient Collaboration&lt;br&gt;
Increased Automation and Consistency&lt;br&gt;
How to Create Your First CI/CD Pipeline&lt;br&gt;
Step 1: Set Up Version Control (GitHub)&lt;br&gt;
Step 2: Choose a CI/CD Tool&lt;br&gt;
Step 3: Jenkins Pipeline Setup&lt;br&gt;
Step 3.1: Installing Jenkins&lt;br&gt;
Step 3.2: Jenkins Configuration&lt;br&gt;
Step 3.3: Creating a Jenkins Pipeline&lt;br&gt;
Step 4: Write a Basic Pipeline Configuration (Jenkinsfile)&lt;br&gt;
Step 5: Deploy the Application&lt;br&gt;
Best Practices for CI/CD Pipelines&lt;br&gt;
Automate Everything&lt;br&gt;
Fail Fast, Fail Often&lt;br&gt;
Version Control Best Practices&lt;br&gt;
Keep Pipelines Simple&lt;br&gt;
Conclusion&lt;/p&gt;

</description>
      <category>programming</category>
      <category>tutorial</category>
      <category>opensource</category>
      <category>java</category>
    </item>
  </channel>
</rss>
