Skip to content

carter-ya/simple_rpc

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

66 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

simple rpc

这个项目初衷是为了初步了解rpc的设计细节,然后试着升级我们公司内部的rpc框架。

参考

功能

  1. Bean验证BeanValidateInterceptor
  2. 发布服务到zookeeper客户端,服务端
  3. 客户端支持异步调用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));
  1. 服务端支持回声测试IEchoService
    IUserService userService = ProxyFactory.create(IUserService.class, "UserService");
    IEchoService echoService = (IEchoService) userService;
    System.out.println("echo:" + echoService.$echo("Hello World"));
  1. 部分实现了json-rpc规范SimpleJSONRequestDispatcher

浏览器打开http://localhost:9092(自己配置的域名+端口,默认是localhost:9092)可以看到所有对外公开的json-rpc服务。 通过http://localhost:9092/XXService可以看到所有对外公开的方法和需要的参数

  • 注解RpcService声明对外的访问路径
  • 注解HttpMethod声明对外的方法名称和功能
  • 注解Param声明对外的方法的参数名称

例子

Hello World

  1. 编写接口IHelloWorld
  2. 编写实现HelloWorld

这里唯一需要注意的是实现上标记了注解RpcServicevalue属性标记的是对外暴露哪个服务,因为一个实现类可能不止实现了一个接口。该注解可以重复标记在一个类上。

  1. 编写服务端配置文件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>
  1. 启动服务端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});
    }
}
  1. 编写客户端配置文件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>
  1. 客户端调用服务端发布的方法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);
    }

回声测试EchoServiceClient

异步调用AsyncUserClient

About

No description or website provided.

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages