iT邦幫忙

2024 iThome 鐵人賽

DAY 22
0
Software Development

從零開始構建能理解語義的 Linebot 架構系列 第 22

使用 Spring Boot 開發 Backend Bot Server: 程式結構及Spring Boot Starter

  • 分享至 

  • xImage
  •  

概述

本篇文章將說明我們在專案中開發的 Bot Server 所使用的依賴項,以及它們如何透過上一篇提到的Spring Boot Starters與注解設定來協同工作,實現我們所需的功能。內容包括:

  • 程式結構
  • 依賴說明

程式結構

環境需求

  • Java Development Kit (JDK) 8 或更高版本。
  • Maven 3.6.0 或更高版本

目錄說明

以下是專案中的所有 Package 及其子 Package,並附上簡要說明:
https://ithelp.ithome.com.tw/upload/images/20241006/20105227F0PffobDZY.png
圖: Bot Server 程式結構

主流程

  • 當BotServer啟動時,就會透過KafkaConsumer Service持續監聽指定的Topic,檢查是否有來自使用者的訊息進入。
  • 當有新訊息進入Topic,就把使用者的訊息與指定的Prompt一同傳送至 OpenAIApi Service,並交由 OpenAI 進行語意判斷。
  • 根據解析後的語意,將資料使用Jackson 映射成不同的Java Class以後,透過MongoTemplate寫入MongoDB
  • 最後,透過LineMessagingClient設定好從Consumer拿到的replyToken,將訊息回傳給LINE Plaform,最終回傳給LINE使用者。

com.cancerpio.nextpagelinebotserver

  • 主要package,包含專案的主要類別:

程式進入點與Configuration Class

  • 根據上篇說明,我們知道:
    • 進入點與 Component 掃描起點 應設置在專案的根目錄,即 NextpageLineBotServerApplication,以便 Spring 能夠正確識別和管理所有需要託管的 Beans。
    • 所有標註了 @Configuration 或 @Component 的Class必須放置於根目錄或其下的子目錄中,這樣才能被Spring託管。
      • 這邊我們的做法是: 統一把所有標示了@Configuration的Class都放在根目錄,方便開發過程中管理和託管新的Beans。每個Configuration Class都會根據設定的功能命名,方便辨識:
        https://ithelp.ithome.com.tw/upload/images/20241006/20105227iQrH8aPGP1.png
      • KafkaConsumerConfig
      • LinebotConfig
      • MongoConfig
      • OpenAIAPiConfig

com.cancerpio.nextpagelinebotserver.model

  • 在Java中,我們常需要把資料轉換成POJO Class (Plain Old Java Object),才能進行後續的處理。
  • POJO Class是沒有商業邏輯的,純粹用來表示資料的Class,也就是我們這裡說的model。
  • 這類model通常會在以下幾個場景中使用:
    • 1.送出API Request

      • 會需要一個Class來代表request body中的訊息或其他欄位。
    • 2.接收API Response

      • Java會透過Jackson來把JSON String轉成Class。
    • 2.資料庫存取物件

      • 當資料庫操作時,會透過Class來裝載需要寫入或讀取的資料。

model負責在這三個場景中,為Class指定資料的結構(Schema),包含資料型態,名稱等等。

com.cancerpio.nextpagelinebotserver.constant

  • 包含專案中用到的常數。

com.cancerpio.nextpagelinebotserver.service

  • 包含服務層的Class,本專案主要透過下面兩種Service驅動主流程
    https://ithelp.ithome.com.tw/upload/images/20241006/201052277pzbLq2x8D.png

resource

  • 包含環境變數,其中:
    • application.properties 包含了真正在使用的環境變數值。如同我們在建立官方帳號時提到,此檔案包含了連線設定和Token的私密資訊 ,不可以上傳到git。
    • application.properties.example 只包含此專案可以設定的環境變數名稱及說明,每次有新增或修改時,和程式碼一樣被更新到git。
    • 目的是提醒開發者目前有哪些環境變數需要配置。

依賴及說明

1. Spring Kafka

  • 依賴名稱: spring-kafka
  • 用途: 用於整合 Kafka,提供專案需要的Kafka Consumer功能。
  • Stereotype Annotations:
    • 使用 @KafkaListener @EnableKafka 來設定Consumer Listener。
    • 這邊說的特化註解,指得是@Component這個Annotation的特化,可以想像成繼承了@Component,但根據不同的依賴,有額外功能的Annotation

2. Spring Boot Starter

  • 依賴名稱: spring-boot-starter
  • 用途: 提供Spring Boot 的核心功能,簡化 Spring 應用的配置和部署。

3. Spring Data MongoDB Starter

  • 依賴名稱: spring-boot-starter-data-mongodb
  • 用途: 提供與MongoDB的整合,簡化MongoDB的操作。
  • 使用mongoTemplate進行操作。

4. Jackson

  • 依賴名稱: jackson-databind
  • 用途: 提供JSON的序列化和反序列化功能。
  • 主要功能:
    • 將Java Class 轉換為JSON字符串,反之亦然。

5. Line Messaging API

  • 依賴名稱: line-bot-sdk
  • 用途: 提供與LINE Messaging API的整合,實現LINE Bot的消息處理功能。
  • 主要功能:
    • 處理LINE Bot的回覆訊息。

6. OpenAI API

  • 依賴名稱: openai-api
  • 用途: 提供與OpenAI API 的整合,實現與OpenAI的溝通。
  • 主要功能:
    • 發送訊息到OpenAI API,並獲取回覆。

依賴配置範例 (pom.xml)

<dependencies>
    <!-* Spring Kafka -->
    <dependency>
        <groupId>org.springframework.kafka</groupId>
        <artifactId>spring-kafka</artifactId>
    </dependency>

    <!-* Spring Boot Starter -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter</artifactId>
    </dependency>

    <!-* Spring Data MongoDB -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-mongodb</artifactId>
    </dependency>

    <!-* Jackson Databind -->
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
    </dependency>

    <!-* Line Messaging API -->
    <dependency>
        <groupId>com.linecorp.bot</groupId>
        <artifactId>line-bot-sdk</artifactId>
    </dependency>

    <!-* OpenAI API -->
    <dependency>
        <groupId>com.openai</groupId>
        <artifactId>openai-api</artifactId>
    </dependency>
</dependencies>

總結

本章介紹Bot Server如何實現上一章提到的Spring Boot程式結構與掃描機制,以及所使用的依賴項。
下一章將解釋序列化與反序列化,這是我們在 Java 中進行 JSON 或其他外部交換格式轉換時經常用到的重要概念。


上一篇
使用 Spring Boot 開發 Backend Bot Server: Bean的組合與 ComponentScan 機制
下一篇
使用 Spring Boot 開發 Backend Bot Server: Serialize 及 Deserialize
系列文
從零開始構建能理解語義的 Linebot 架構30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言