You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Ballerina程序中组织微服务的代码结构?

Ballerina微服务代码组织方案(User + BankAccount)

先明确Ballerina里两个核心概念:

  • Package:顶级代码容器,包含Ballerina.toml配置,管理依赖、元数据,可包含多个Module。
  • Module:Package内的可执行单元,每个Module对应一个独立服务/库,默认模块名为default,也可自定义。

下面针对你的需求,给出两种实用的代码结构方案:


方案1:单Package多Module(适合小型项目)

把两个微服务放在同一个Package下,用不同Module区分,结构紧凑,便于统一管理。

目录结构

banking-ms/
├── Ballerina.toml       # 顶级Package配置
├── user-service/        # User微服务Module
│   └── main.bal         # User服务入口
└── bank-account-service/# BankAccount微服务Module
    └── main.bal         # BankAccount服务入口

关键文件内容示例

  1. Ballerina.toml(Package配置)
[package]
org = "your-university-org"
name = "banking-ms"
version = "0.1.0"

[dependencies]
ballerina/http = "2.0.0"
  1. user-service/main.bal(User微服务)
import ballerina/http;

service /user on new http:Listener(8080) {
    // 获取用户信息
    resource function get [string id]() returns http:Response {
        http:Response res = new;
        res.setPayload({
            id: id,
            name: "John Doe",
            email: "john@example.com"
        });
        return res;
    }

    // 创建用户
    resource function post create(http:Request req) returns http:Response {
        json payload = check req.getJsonPayload();
        http:Response res = new;
        res.statusCode = 201;
        res.setPayload({message: "User created", user: payload});
        return res;
    }
}
  1. bank-account-service/main.bal(BankAccount微服务)
import ballerina/http;

service /account on new http:Listener(8081) {
    // 获取账户余额
    resource function get balance/[string accountId]() returns http:Response {
        http:Response res = new;
        res.setPayload({
            accountId: accountId,
            balance: 5000.00,
            currency: "USD"
        });
        return res;
    }

    // 转账操作
    resource function post transfer(http:Request req) returns http:Response {
        json payload = check req.getJsonPayload();
        http:Response res = new;
        res.setPayload({message: "Transfer successful", from: payload.from, to: payload.to, amount: payload.amount});
        return res;
    }
}

运行与交互

  • 启动User服务:在项目根目录执行 bal run user-service
  • 启动BankAccount服务:新开终端执行 bal run bank-account-service
  • 测试交互:
    • 访问User服务:curl http://localhost:8080/user/123
    • 访问BankAccount服务:curl http://localhost:8081/account/balance/456

方案2:多Package独立结构(适合扩展性需求)

每个微服务作为独立的Package,完全隔离,便于后续单独部署或维护。

目录结构

microservices/
├── user-service/        # User微服务Package
│   ├── Ballerina.toml
│   └── default/
│       └── main.bal
└── bank-account-service/# BankAccount微服务Package
    ├── Ballerina.toml
    └── default/
        └── main.bal

关键文件说明

  • 每个Package的Ballerina.toml独立配置,比如user-service/Ballerina.toml:
[package]
org = "your-university-org"
name = "user-service"
version = "0.1.0"

[dependencies]
ballerina/http = "2.0.0"
  • 每个Package的default/main.bal内容和方案1中对应的服务代码一致,监听不同端口即可。

运行与交互

  • 进入user-service目录,执行 bal run 启动User服务
  • 进入bank-account-service目录,执行 bal run 启动BankAccount服务
  • 测试方式和方案1相同

核心注意点

  • 每个Module的入口必须是main.bal,Ballerina会自动识别这个文件中的服务并启动。
  • 不同服务要监听不同端口,避免端口冲突。
  • 如果需要服务间调用,可以在对应Module中导入另一个Module(方案1)或添加Package依赖(方案2)。

内容的提问来源于stack exchange,提问作者LochanaJ

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 06:07:36