rpc 第一弹 服务注册与客户端请求

来源:互联网 发布:centos 别名 编辑:程序博客网 时间:2024/06/06 00:50

引入

最近一直在研究rpc,或者说在学习使用一些框架,比如spring系列的有阿里的dubbo,springcloud等,实验了一些奇怪的东西。虽然没有看源码,但是大致了解了这些东西。自问自答吧。

在我们发布服务的时候,一般会发布一个api包,那么通过这个jar包,服务器是怎么被客户端调用的?

比如说在dubbo中

provider.xml

<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"    xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"    xsi:schemaLocation="http://www.springframework.org/schema/beans        http://www.springframework.org/schema/beans/spring-beans.xsd        http://code.alibabatech.com/schema/dubbo        http://code.alibabatech.com/schema/dubbo/dubbo.xsd">    <!-- 提供方应用信息,用于计算依赖关系 -->    <dubbo:application name="hello-world-app"  />    <!-- 使用multicast广播注册中心暴露服务地址 -->    <dubbo:registry address="multicast://224.5.6.7:1234" />    <!-- 用dubbo协议在20880端口暴露服务 -->    <dubbo:protocol name="dubbo" port="20880" />    <!-- 声明需要暴露的服务接口 -->    <dubbo:service interface="com.alibaba.dubbo.demo.DemoService" ref="demoService" />    <!-- 和本地bean一样实现服务 -->    <bean id="demoService" class="com.alibaba.dubbo.demo.provider.DemoServiceImpl" /></beans>

client.xml

<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"    xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"    xsi:schemaLocation="http://www.springframework.org/schema/beans        http://www.springframework.org/schema/beans/spring-beans.xsd        http://code.alibabatech.com/schema/dubbo        http://code.alibabatech.com/schema/dubbo/dubbo.xsd">    <!-- 消费方应用名,用于计算依赖关系,不是匹配条件,不要与提供方一样 -->    <dubbo:application name="consumer-of-helloworld-app"  />    <!-- 使用multicast广播注册中心暴露发现服务地址 -->    <dubbo:registry address="multicast://224.5.6.7:1234" />    <!-- 生成远程服务代理,可以和本地bean一样使用demoService -->    <dubbo:reference id="demoService" interface="com.alibaba.dubbo.demo.DemoService" /></beans>

通过以上我们可以看出,服务提供方需要暴露一个端口,监听请求,客户端会拿到这个端口,进行请求。而它们是通过注册中心相互连接的。

在很久很久之前,在我还没有注册中心的概念的时候,知道的就是我这边服务提供者提供服务和端口,那你客户端还要每一次问我的最新地址,每一次迁移什么的都麻烦死了。这个注册中心就正好解决了这个问题。扯远了,其实今天并不想说注册中心的。。。话多 好吧

服务器端

服务端做了什么?
1. 监听端口
2. 解析客户端请求
3. 执行服务
4. 返回结果

好,差不多就是这个四步,什么高可用,服务器容灾,算是扩展不算是原理的,。。。。
服务器怎么做呢
那么先说一下我的理解吧
1. 开启一个端口,确定暴露协议
开启端口监听请求毋庸置疑,那么拿到请求了肯定需要解析请求,这样就需要我们指定协议了。。
2. 扫描注册的服务
实例化一个服务实现类,爱包装就包装,不包装就直接通过反射实现,反正据我所知的在java中都是使用的反射实现的。
3. 返回结果
从上一步得到了结果,通过各种序列化后,自己选用协议,返回。。。。

客户端

客户端又称为消费者 。。废话
客户端在请求的时候仍然会扫描它需要什么借口,据我发现,我司里面的是扫描所有的api包的带了某注解的接口,然后生成对应的代理类。
在dubbo中,我们可以看到是按需生成代理类,按需的好点的地方就是应用启动的时候会变快,因为不用生成代理类啊。。。方法区也不会有溢出的风险,虽然现在还没有在生产环境上见过由于代理导致的方法区溢出,但是还是需慎重啊。。。。
客户端的就上面解释完了。。。

  1. 根据配置扫描api包或者从xml加载
  2. 代理接口
    你不代理怎么注入啊,你能注入接口吗。。。当然最重要的原因是通过代理之后,我们每一次调用接口,我们的代理对象会帮助我们请求服务器,然后返回服务器的结果

其实通过很久的积淀已经可以解释清楚了这些原理了。沉住气,坚持下来还是有收获的。

0 0