Hprose (High Performance Remote Object Service Engine)是一款先进的轻量级、跨语言、跨平台、无侵入式、高性能动态远程对象调用引擎库。它不仅简单易用,而且功能强大。
也是一个跨语言的RPC框架,但由于库的质量参差不齐,一些语言的库并不完善。这里以C#为例来实现一个简单的服务端和客户端程序。
创建项目# 新建解决方案,包含两个项目
server
控制台程序,服务端
client
控制台程序,客户端
然后,通过Nuget分别为两个项目安装Hprose.RPC
库。
这里并不需要再创建额外的服务接口项目,只需要手动定义一个接口即可。
创建服务接口# 在server
和client
项目下都新建一个接口,作为服务接口
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
复制 与Thrift
和gRPC
相比,Hprose
实现起来要简单很多,暂时还没有尝试跨语言调用,不知道是不是同样简单。