干翻RPC系列之HesssionRPC:HesssionRPC的开发体验和源码分析

简介: 干翻RPC系列之HesssionRPC:HesssionRPC的开发体验和源码分析

一:前言

上述我们已经提到了,RPC的设计的核心内容包括四个:通信方式+传输协议+序列化方式+远程服务类代理。

远程服务类代理的最终目的就是要向本地方法那样调用去调用远端的服务和方法。

Hession是比较久远的一个技术,包含了上述的四个核心问题。他在做代理设计的时候,HessionProxyFactory做服务代理。将服务端提供的API包中的Service接口也就是Service.class传入到方法当中。另外就是远端服务的URL

我们使用这个HessionProcyFactory创建代理的时候,只要是提供了这些参数,HessionProcyFactory就可以创建出具体的代理对象。

二:Hession RPC开发

1:环境搭建

我们建立一个项目rpc-lesson作为父项目,将src删除掉,仅仅起到一个管理的作用,我们在父项目中的pom中进行依赖管理。

创建一个web模块。搞定父子项目配置。通过web maven创建的web的servlet的scheme有点老,咱们重新创建一个web.xml换个新版本即可。

2:依赖引入

引入依赖的时候,我们需要引入一个Javax.servlet这样的jar

这个jar的scope属性是provided,编译需要此包,但是部署到运行环境的时候是不会将这个jar包带到Tomcat当中的,因为Tomcat当中的lib当中已经提供了这个jar包,是不需要我们提供的,但是我们编写代码和编译代码的时候是需要这个东西的。

引入核心的jar包,我们需要引入Hessian的jar包,最终的pox如下:

<dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.13.1</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>3.1.0</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>1.7.32</version>
        </dependency>
        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-classic</artifactId>
            <version>1.2.9</version>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.22</version>
        </dependency>
        <dependency>
            <groupId>com.caucho</groupId>
            <artifactId>hessian</artifactId>
            <version>4.0.38</version>
        </dependency>
    </dependencies>

三:开发步骤

1:开发服务

A:注意事项

开发服务注意:

1:我们当前的服务是提供service

2:必须定义接口

3:必须将自定义的数据类型实现序列化接口

具体代码如下:

B:自定义数据类型
@Data
@ToString(callSuper = true)
@NoArgsConstructor
@AllArgsConstructor
public class User implements Serializable {
    private String name;
    private String password;
}
C:服务代码
@Slf4j
public class UserServiceImpl implements UserService {
    @Override
    public boolean login(String name, String password) {
        log.debug("login method invoke name {} password {}", name, password);
        return false;
    }
    @Override
    public void register(User user) {
        log.debug("register method invoke {} ", user);
    }
}

2:发布服务

A:web.xml修改
<servlet>
        <servlet-name>userServiceRPC</servlet-name>
        <servlet-class>com.caucho.hessian.server.HessianServlet</servlet-class>
        <init-param>
            <param-name>home-api</param-name>
            <param-value>com.suns.service.UserService</param-value>
        </init-param>
        <init-param>
            <param-name>home-class</param-name>
            <param-value>com.suns.service.UserServiceImpl</param-value>
        </init-param>
    </servlet>
    <servlet-mapping>
        <servlet-name>userServiceRPC</servlet-name>
        <url-pattern>/userServiceRPC</url-pattern>
    </servlet-mapping>

3:客户端开发

A:开发客户端代码
public static void main(String[] args) throws MalformedURLException {
        HessianProxyFactory hessianProxyFactory = new HessianProxyFactory();
        //创建远端RPC服务的代理对象
        String URL = "http://localhost:8989/rpc-hessian/userServiceRPC";
        UserService userService = (UserService) hessianProxyFactory.create(UserService.class, URL);
        // 向调用本地方法一样的去调用远端的服务。
        boolean userServiceRet = userService.login("xiaohei", "123456");
        log.debug("userServiceRet value is {} ", userServiceRet);
    }

4:RPC测试

RPC一定是走网络的远程过程调用,一定有两个JVM进程实例。

A:启动服务器实例

B:使用main函数启动客户端实例

C:客戶端結果

这就证明此时确实RPC通信成功了。完成了基于网络,两个JVM实例之间的网络通讯。

如果需要暴露其他的服务,重新来一遍即可了。

四:HessionRPC的核心源代码

我们这里只关注客户端部分是如何创建代理对象的。

稍后补充

五:HessionRPC序列化

稍后补充

相关文章
|
8月前
|
负载均衡 Dubbo Java
RPC框架-dubbo:架构及源码分析-初篇
在自学或面试dubbo时,相关的问题有很多,例如dubbo 的基本工作原理,这是使用过dubbo后应该知道的。包括dubbo的分层架构、长短链接选择、二进制协议支持;之后是使用方式(服务的注册、发现、调用方式),基础配置(超时时间、线程数),这些是最基本的。 在这些问题之后,就可以继续深入底层:关于连接方式,使用长连接还是短连接?为什么? dubbo的二进制协议支持哪些,之间有什么区别/优缺点等等,也可以考察在使用过程中遇到过哪些问题,是如何解决的。这些都需要深入理解,并且有真实、长时间使用经验。
173 0
|
消息中间件 Java RocketMQ
RocketMQ源码分析-Rpc通信模块(remoting)二
今天继续RocketMQ-Rpc通信模块(remoting)的源码分析。上一章提到了主要的start()方法执行流程,如果有不清楚的地方可以一起讨论哈,这篇文章会继续解读主要方法,按照惯例先看看NettyRemotingAbstract的类图,看类图知方法。和NettyEventExecutor以及MQ的交互流程。 按照惯例先看看NettyRemotingAbstract的类图,看类图知方法,文中会挑重要方法和主要流程解读。
408 0
RocketMQ源码分析-Rpc通信模块(remoting)二
|
消息中间件 编解码 网络协议
RocketMQ源码分析-Rpc通信模块(remoting)一
上篇文章分析了Rocketmq的nameServer的源码,在继续分析源码之前,先考虑一个问题,设计一个mq并且是高性能的mq最最核心的问题是什么,我个人认为主要是有俩个方面,1:消息的网络传输,2:消息的读写,这两个决定了mq的高性能。
480 0
RocketMQ源码分析-Rpc通信模块(remoting)一
|
编解码 JSON 网络协议
透视RPC协议:SOFA-BOLT协议源码分析
最近在看Netty相关的资料,刚好SOFA-BOLT是一个比较成熟的Netty自定义协议栈实现,于是决定研读SOFA-BOLT的源码,详细分析其协议的组成,简单分析其客户端和服务端的源码实现。当前阅读的源码是2021-08左右的SOFA-BOLT仓库的master分支源码。
293 0
透视RPC协议:SOFA-BOLT协议源码分析
|
缓存
spark2.1.0之源码分析——RPC客户端TransportClient详解
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/beliefer/article/details/82143001 提示:阅读本文前最好先阅读: 《Spark2.
1644 0
|
数据安全/隐私保护
spark2.1.0之源码分析——RPC服务端引导程序TransportServerBootstrap
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/beliefer/article/details/81867045 提示:阅读本文前最好先阅读: 《Spark2.
1404 0
|
分布式计算 Spark
spark2.1.0之源码分析——服务端RPC处理器RpcHandler详解
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/beliefer/article/details/81624875   提示:阅读本文前最好先阅读: 《Spark2.
2036 0
|
分布式计算 Spark
spark2.1.0之源码分析——RPC传输管道处理器详解
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/beliefer/article/details/81326016 提示:阅读本文前最好先阅读: 《Spark2.
1650 0
spark2.1.0之源码分析——RPC管道初始化
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/beliefer/article/details/81197447 提示:阅读本文前最好先阅读: 《Spark2.
1528 0
spark2.1.0之源码分析——RPC服务器TransportServer
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/beliefer/article/details/81062342 提示:阅读本文前最好先阅读: 《Spark2.
1493 0