OF.JsonRpc (.NET輕量級服務框架)


項目代碼:https://gitee.com/OFProject/OF.JsonRpc

本項目是依據 《JSON-RPC 2.0 Specification》 的 .NET 實現, 它是基於 HTTP (也能支持本地調用和TCP)方式實現的輕量級松耦合的遠程調用服務框架,提供了高效可用、無侵入式的方式搭建自己的服務平台,可以快速開發、調試、發布、調用服務,保持輕量級及可定制性。可以基於它構建 .NET 平台的微服務或 API。

重要特性

  • 支持目前支持 HTTP 和本地調用
  • 強大的自動生成服務描述能力
  • 支持 RSA 和自定義授權機制
  • 支持自定義上下文

如何開發實現服務

1.創建新的或使用原有的 Class Library 工程,如 OF.Microservices.DemoService,該工程並不強制要求引用外部依賴包 OF.JsonRpc.dll ,然后在項目屬性中進行設置, build 屬性頁 > Output > 勾選中 Xml documentation file,以便能自動生成在線文檔。

2.在剛才創建的 OF.JsonRpc 工程中,創建一個自己的的服務類,並寫一個 public的方法,寫加入相應的注釋,如下:

namespace OF.Microservices.DemoService
{
    /// <summary>
    /// 演示服務1
    /// </summary>
    public class Demo1
    {
        /// <summary>
        /// 輸出兩個參數的值
        /// </summary>
        /// <param name="param1">參數1</param>
        /// <param name="param2">參數2</param>
        /// <returns>返回參數1和參數2的信息</returns>
        public string Method1(string param1, string param2)
        {
            return $"param1: {param1}, param2: {param2}";
        }
    }
}

3.將本項目中的工程 OF.Microservices.Host 設為 IIS 的 Web 站點。並配置 jsonrpc.config 文件,在 serviceAssemblies 節點下配置需要暴露的服務實現 dll 程序集名稱,jsonrpc.config 配置文件示例如下:

<?xml version="1.0" encoding="utf-8" ?>
<jsonrpc>
  <serviceAssemblies>
    <add assembly="OF.Microservices.DemoService" domain="Demo" methodMode="allPublic" subdomainTrimChars="Service" />
  </serviceAssemblies>
</jsonrpc>

4.然后用瀏覽器打開該網站的根地址,如:http://localhost:60282 即可查看服務的說明文檔。

5.服務暴露的地址形如: http://localhost:60282/json.rpc

客戶端 C# 的調用

詳細請參見 OF.JsonRpc\OF.JsonRpc.ClientTest\CallDemoTest.cs 中的代碼。需要在客戶端引入 OF.JsonRpc.Client 程序集,並在 app.config/web.config 配置服務地址:

<configuration>
  <appSettings>
    <add key="JsonRpcServiceUrl" value="http://localhost:60282/json.rpc" />
  </appSettings>

調用的代碼很簡單,並不需要定義什么接口,完全松耦合的方式,Rpc.Call對應的參數為方法名及按順序的參數即可。 示例如下:

// 調用服務,輸入2個參數,返回一個字符串
var result1 = Rpc.Call<string>(
    "Demo.Demo1.Method1",
    "Jack","John");

// 調用服務,無返回值
Rpc.Call("Demo.Demo1.Method2", "Jack");

// 調用服務,返回一個匿名 dynamic 對象
var result = Rpc.Call<dynamic>(
    "Demo.Demo1.Method3", //JSON-RPC方法名
    new 
    {
        Name = "Jack",
        Email = "Jack@gmail.com",
        MobilePhone = "12306"
    }); // JSON-RPC的參數,
Console.WriteLine("result value, OrderNumber:" + result.OrderId);
Console.WriteLine("Customer.UserName:" + result.Customer.Name);
Console.WriteLine("Customer.Email:" + result.Customer.Email);
Console.WriteLine("Customer.MobilePhone:" + result.Customer.MobilePhone);

// 異常處理
try
{
    var result1 = Rpc.Call<string>(
        "Demo.Demo1.Method1",
        "Jack","John");
    Console.WriteLine("result value:" + result1);
}
catch (JsonRpcException jsonRpcException)
{
    if (jsonRpcException.code == 32000)
        Console.WriteLine("result business excetion:" + jsonRpcException.message);
    else
        Console.WriteLine("調用服務發生異常,{0}, {1}", jsonRpcException.message, jsonRpcException.data);
}

// 將參數為命名的對象屬性進行調用
string result2 = Rpc.CallWithDeclaredParams<string>(
   "Demo.Demo1.Method1",
   new { param2 = "John", param1 = "Jack" });

 

瀏覽 JSON-RPC Help 文檔

打開瀏覽器地址: http://localhost:60282 后進行文檔首頁,可以過濾

 help-index

進入方法的詳細說明: 

help-method

進入參數或返回值的類型說明: 

help-type

Java 調用

因為使用的統一的 JSON-RPC HTTP 協議,所以使用一些三方的庫,推薦:https://github.com/briandilley/jsonrpc4j

JsonRpcHttpClient client = new JsonRpcHttpClient(
    new URL("http://example.com/UserService.json"));

User user = client.invoke("createUser", new Object[] { "bob", "the builder" }, User.class);

Javascript 調用

,所以使用一些三方的庫,推薦:https://github.com/datagraph/jquery-jsonrpc

示例:

$.jsonRPC.request('method.name', {
  params: params,
  success: function(result) {
    // Do something with the result here
    // It comes back as an RPC 2.0 compatible response object
  },
  error: function(result) {
    // Result is an RPC 2.0 compatible response object
  }
});

TODOLIST

  • 引入 Zookeeper 作為服務發現機制的選擇之一
  • 支持跨服務調用的分布式事務支持
  • 加入 .NET Core 版本
  • 可以不用 IIS 宿主


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM