简介

Hprose(High Performance Remote Object Service Engine)是一款先进的轻量级、跨语言、跨平台、无侵入式、高性能动态远程对象调用引擎库。它不仅简单易用,而且功能强大。

也是一个跨语言的RPC框架,但由于库的质量参差不齐,一些语言的库并不完善。这里以C#为例来实现一个简单的服务端和客户端程序。

创建项目

新建解决方案,包含两个项目

  • server

    控制台程序,服务端

  • client

    控制台程序,客户端

然后,通过Nuget分别为两个项目安装Hprose.RPC库。

这里并不需要再创建额外的服务接口项目,只需要手动定义一个接口即可。

创建服务接口

serverclient项目下都新建一个接口,作为服务接口

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
// IHello.cs
public class ServiceVersion
{
    public string Name { get; set; }
    public string Version { get; set; }

    public ServiceVersion() { }

    public ServiceVersion(string name, string ver)
    {
        Name = name;
        Version = ver;
    }
}

// 服务接口
public interface IHello
{
    ServiceVersion GetVersion();
    List<string> SayHello(string name);
}

IHello里面的两个接口函数就是服务接口了。

服务端程序

依旧是服务端实现接口,客户端来调用,在server项目下新建类Hello.cs

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// Hello.cs
namespace server
{
    using System.Collections.Generic;

    public class Hello : IHello
    {
        public ServiceVersion GetVersion()
        {
            return new ServiceVersion("Hello Service", "0.0.1.21");
        }

        public List<string> SayHello(string name)
        {
            return new List<string>()
            {
                $"你好 {name}",
                $"Hello {name}",
                $"Hola {name}",
                $"Bonjour {name}",
                $"こんにちは {name}",
                $"hallo {name}"
            };
        }
    }
}

编写服务启动程序

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
namespace server
{
    using Hprose.RPC;
    using System.Net;

    class Program
    {
        static void Main()
        {
            HttpListener server = new HttpListener();
            server.Prefixes.Add("http://localhost:10240/");
            server.Start();

            Service service = new Service().Bind(server).AddInstanceMethods(new Hello());

            System.Console.WriteLine("Server listening at http://localhost:10240/ \n Press any key exit ...");
            System.Console.ReadKey();
            server.Stop();
        }
    }
}

客户端程序

由于client项目刚刚也定义了IHello接口,这里就可以直接调用接口函数了。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
namespace client
{
    using Hprose.RPC;

    class Program
    {
        static void Main()
        {
            Client cli = new Client("http://localhost:10240/");
            IHello hello = cli.UseService<IHello>();

            ServiceVersion ver = hello.GetVersion();
            System.Console.WriteLine("Remote Service Version: {0} - v{1}", ver.Name, ver.Version);

            var hellos = hello.SayHello("Hprose");

            foreach (string item in hellos)
            {
                System.Console.WriteLine(item);
            }

            System.Console.ReadKey();
        }
    }
}

运行测试

先启动服务端程序,再启动客户端程序,可以看到客户端输出

Remote Service Version: Hello Service - v0.0.1.21
你好 Hprose
Hello Hprose
Hola Hprose
Bonjour Hprose
こんにちは Hprose
hallo Hprose

ThriftgRPC相比,Hprose实现起来要简单很多,暂时还没有尝试跨语言调用,不知道是不是同样简单。