# JSON‑RPC 架構實作:近端除錯 vs 遠端部署的最佳實踐
在企業系統開發中,API 架構扮演關鍵角色。它不僅是前後端溝通的橋樑,更是跨模組、跨服務協作的核心。相較於 REST 著重資源導向、gRPC 聚焦高效能與嚴格協定,**JSON-RPC 則提供一種更靈活且結構化的方案**:以方法為核心設計,格式輕量、請求與 JSON 高度相容,極適合需要明確業務流程邏輯的應用系統。
除了架構彈性,**JSON-RPC 更具備資料編碼上的延展性**。在 `Bee.NET` 的設計中,JSON-RPC 的資料傳輸流程可支援 MessagePack 序列化、壓縮與加密,確保資料在內部系統或跨網路傳輸時兼顧「效能」、「安全」與「易於維護」。相較於 protobuf,MessagePack 在動態物件結構與 .NET 環境中更具開發友善性,且不需維護 .proto 檔案,開發流程更簡潔。
`Bee.NET` 架構同時支援「近端除錯」與「遠端部署」兩種呼叫模式,能大幅提升開發效率並降低部署成本。本文將以 [`jsonrpc-sample`](https://github.com/jeff377/jsonrpc-sample) 專案為例,展示如何構建一套模組化、可維護、具備資料編碼與雙模式呼叫能力的 JSON‑RPC 架構。
📦 專案來源:[jsonrpc-sample on GitHub](https://github.com/jeff377/jsonrpc-sample)
---
## 🧱 為何選擇 N‑Tier 架構與近/遠端雙模式?
在企業級系統(如 ERP/HRM)中,常見的 N‑Tier 架構會將應用程式邏輯分層:
1. 表現層(UI)
2. API Connector 層(處理呼叫與資料封裝)
3. API Service 層(處理驗證、例外)
4. 業務邏輯層(核心流程邏輯)
5. 資料存取層(DB 存取)
這樣的架構具備以下優勢:
- 模組分離、開發維護容易
- 可切換 **近端開發除錯**(直連 DLL)與 **遠端部署呼叫**(透過 JSON-RPC)
- 資料傳輸可整合序列化、壓縮、加密處理,提升安全與效能
---
## 🐝 `Bee.NET` 的架構設計理念簡介
以「模組分工」為設計主軸,具備以下核心元件:
- `Bee.Connect`:支援近端/遠端雙模式 JSON-RPC 呼叫
- `Bee.Api.AspNetCore`:處理 JSON-RPC API 請求
- `Bee.Business`、`Bee.Db`:業務與資料存取層
- 支援資料傳輸的完整編碼流程(序列化 → 壓縮 → 加密)
---
## 🧰 實作 JSON-RPC Server 與 Client
### Step 1:準備 `System.Settings.xml`
設定內容包含:
- `AllowedTypeNamespaces`:限制反序列化來源,防止反序化攻擊
- `ApiPayloadOptions`:定義 API 傳遞資料的序列化、壓縮、加密方法
- `BusinessObjectProvider`:指定業務邏輯物件載入方式
---
### Step 2:定義傳入參數及回傳結果的類別(Custom.Define)
```csharp
public class HelloArgs { public string UserName { get; set; } }
public class HelloResult { public string Message { get; set; } }
```
---
### Step 3:實作業務邏輯(Custom.Business)
```csharp
public class EmployeeBusinessObject
{
public HelloResult Hello(HelloArgs args)
{
return new HelloResult { Message = $"Hello, {args.UserName}" };
}
}
```
### Step 4:ProgId 對應業務邏輯物件
實作 IBusinessObjectProvider.CreateFormBusinessObject 方法,判斷 ProgId 建立對應的業務邏輯物件
```csharp
public IFormBusinessObject CreateFormBusinessObject(Guid accessToken, string progId)
{
switch (progId)
{
case "Employee":
return new EmployeeBusinessObject(accessToken, progId);
default:
return new FormBusinessObject(accessToken, progId);
}
}
```
---
### Step 5:啟動 JSON-RPC Server(JsonRpcServer)
```csharp
app.BackendInitialize(app.Configuration);
```
---
### Step 6:撰寫 JSON-RPC Client(JsonRpcClient)
透過 Connecotr 指定 ProgId 連接對應的業務邏輯物件,執行指定方法。
```csharp
var connector = ClientInfo.CreateFormApiConnector("Employee");
var args = new HelloArgs() { UserName = "Jeff" };
var result = connector.Execute<HelloResult>("Hello", args);
Console.WriteLine($"Message: {result.Message}");
```
可在開發時切換為「近端」模式,直接載入 DLL 呼叫,除錯更便利。
---
## 💬 JSON-RPC 請求格式示例
以下為 `Hello` 方法的 JSON-RPC 呼叫範例,使用 POST 傳送:
```json
{
"jsonrpc": "2.0",
"method": "Employee.Hello",
"params": {
"value": {
"$type": "Custom.Define.HelloArgs, Custom.Define",
"userName": "Jeff"
}
},
"id": "uuid"
}
```
📌 **說明:**
- `"jsonrpc": "2.0"`:指定使用 JSON-RPC 2.0 協議版本
- `"method"`:格式為 `ProgID.Method`,此例為 `Employee.Hello`
- `"params.value"`:實際傳入的參數物件
- `"$type"`:為 .NET 反序列化時所需型別資訊(含命名空間與組件)
- `"id"`:用於請求/回應配對的識別碼,可為 UUID、整數或字串
此格式將由 `Bee.NET` 的 `Connector` 自動產生並包裝,開發者無需手動組裝 JSON,但瞭解其結構有助於除錯與跨平台整合。
---
### 🌐 API 呼叫情境
`Bee.NET` 所建構的 JSON-RPC 架構設計,支援以下兩種主要情境:
#### 1. 內部系統呼叫(高效最佳化)
企業內部的開發程式(如 WinForms/WPF、行動應用、後端服務等)可透過 `Connector` 類別呼叫 API,支援近端與遠端雙模式,並自動處理參數的序列化、壓縮與加密,提供一致、最佳化的呼叫體驗。
#### 2. 第三方系統整合(開放且簡潔)
對於外部系統或異質平台,亦可使用標準 HTTP POST 呼叫 JSON-RPC 接口,傳送未編碼的 JSON 原始格式。透過明確的參數結構與型別註記,實現跨平台整合需求。
---
## ✅ 結語
透過 `Bee.NET` 的模組設計與 JSON-RPC 支援,我們能:
- 快速建置 N-Tier 架構
- 靈活切換開發與部署模式
- 強化資料傳輸效率與安全性
## 📚 延伸閱讀
- [企業系統的 N-Tier 架構設計](https://hackmd.io/@jeff377/enterprise-n-tier)
- [基於企業系統架構的 .NET 開發框架](https://hackmd.io/@jeff377/bee-net-framework)
- [JSON-RPC vs gRPC vs REST 技術比較表](https://hackmd.io/@jeff377/jsonrpc-grpc-rest-comparison)
- [Protobuf vs MessagePack 序列化格式比較](https://hackmd.io/@jeff377/protobuf-vs-messagepack)
---
**📢 歡迎轉載,請註明出處**
**📬 歡迎追蹤我的技術筆記與實戰經驗分享**
[Facebook](https://www.facebook.com/profile.php?id=61574839666569) | [HackMD](https://hackmd.io/@jeff377) | [GitHub](https://github.com/jeff377) | [NuGet](https://www.nuget.org/profiles/jeff377)