这个项目初衷是为了初步了解rpc的设计细节,然后试着升级我们公司内部的rpc框架。
- 一个轻量级分布式RPC框架
- 轻量级分布式 RPC 框架
- 公司内部使用
SCF
框架
Bean
验证BeanValidateInterceptor- 发布服务到
zookeeper
中客户端,服务端 - 客户端支持异步调用AsyncRpcInvoker
这里没有采用配置文件来声明某某方法异步调用,而是通过代码来实现。
IUserService userService = ProxyFactory.create(IUserService.class, "UserService");
//同步调用
User user = userService.getUserByID(123L);
//异步调用:需要返回值
Future<User> future = AsyncRpcInvoker.asyncForResult(() -> userService.getUserByID(123L));
//异步调用:不需要返回值
AsyncRpcInvoker.asyncForNoneResult(() -> userService.addUser(user));
- 服务端支持回声测试IEchoService
IUserService userService = ProxyFactory.create(IUserService.class, "UserService");
IEchoService echoService = (IEchoService) userService;
System.out.println("echo:" + echoService.$echo("Hello World"));
浏览器打开http://localhost:9092(自己配置的域名+端口,默认是localhost:9092)可以看到所有对外公开的json-rpc服务。 通过http://localhost:9092/XXService可以看到所有对外公开的方法和需要的参数
- 注解RpcService声明对外的访问路径
- 注解HttpMethod声明对外的方法名称和功能
- 注解Param声明对外的方法的参数名称
- 编写接口IHelloWorld
- 编写实现HelloWorld
这里唯一需要注意的是实现上标记了注解RpcService,
value
属性标记的是对外暴露哪个服务,因为一个实现类可能不止实现了一个接口。该注解可以重复标记在一个类上。
- 编写服务端配置文件hello_world_server.xml
<?xml version="1.0" encoding="UTF-8"?>
<rpc-server>
<!-- rpc服务名称为HelloWorldService;监听localhost的9091端口 -->
<server name="HelloWorldService" host="localhost" port="9091" />
<!-- 对外提供服务的实现类列表 -->
<services>
<!-- 实现类的完整名称:包名.类名 -->
<service class="com.ifengxue.rpc.example.impl.HelloWorld" />
</services>
</rpc-server>
- 启动服务端HelloWorldServer
public class HelloWorldServer {
public static void main(String[] args) {
/**
* 服务器的配置文件
*/
String rpcConfigPath = "example/conf/hello_world_server.xml";
/**
* 配置log4j
*/
PropertyConfigurator.configure("example/conf/log4j_server.properties");
/**
* 启动服务器
*/
ServerApp.main(new String[] {"--conf:" + rpcConfigPath});
}
}
- 编写客户端配置文件hello_world_client.xml
<?xml version="1.0" encoding="UTF-8"?>
<rpc-client>
<!-- 服务生产者注册中心:xml配置注册中心 -->
<register-center class="com.ifengxue.rpc.client.register.XmlRegisterCenter">
<!-- 配置HelloWorldService的服务地址 -->
<service-nodes>
<service-node serviceName="HelloWorldService" host="localhost" port="9091" />
</service-nodes>
</register-center>
</rpc-client>
- 客户端调用服务端发布的方法HelloWorldClient
public static void main(String[] args) {
/**
* 配置log4j
*/
PropertyConfigurator.configure("example/conf/log4j_client.properties");
/**
* 客户端配置文件
*/
String rpcConfigPath = "example/conf/hello_world_client.xml";
/**
* 初始化客户端配置文件
*/
ProxyFactory.initConfig(rpcConfigPath);
/**
* 创建服务接口代理
*/
IHelloWorld helloWorld = ProxyFactory.create(IHelloWorld.class, "HelloWorldService");
/**
* 调用服务提供的方法
*/
helloWorld.sayHelloWorld();
System.exit(0);
}