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

2024-08-28 06:08

本文主要是介绍rpc 第一弹 服务注册与客户端请求,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

引入

最近一直在研究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. 代理接口
    你不代理怎么注入啊,你能注入接口吗。。。当然最重要的原因是通过代理之后,我们每一次调用接口,我们的代理对象会帮助我们请求服务器,然后返回服务器的结果

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

这篇关于rpc 第一弹 服务注册与客户端请求的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1113946

相关文章

Python手搓邮件发送客户端

《Python手搓邮件发送客户端》这篇文章主要为大家详细介绍了如何使用Python手搓邮件发送客户端,支持发送邮件,附件,定时发送以及个性化邮件正文,感兴趣的可以了解下... 目录1. 简介2.主要功能2.1.邮件发送功能2.2.个性签名功能2.3.定时发送功能2. 4.附件管理2.5.配置加载功能2.6.

Java后端接口中提取请求头中的Cookie和Token的方法

《Java后端接口中提取请求头中的Cookie和Token的方法》在现代Web开发中,HTTP请求头(Header)是客户端与服务器之间传递信息的重要方式之一,本文将详细介绍如何在Java后端(以Sp... 目录引言1. 背景1.1 什么是 HTTP 请求头?1.2 为什么需要提取请求头?2. 使用 Spr

Redis连接失败:客户端IP不在白名单中的问题分析与解决方案

《Redis连接失败:客户端IP不在白名单中的问题分析与解决方案》在现代分布式系统中,Redis作为一种高性能的内存数据库,被广泛应用于缓存、消息队列、会话存储等场景,然而,在实际使用过程中,我们可能... 目录一、问题背景二、错误分析1. 错误信息解读2. 根本原因三、解决方案1. 将客户端IP添加到Re

SpringBoot实现websocket服务端及客户端的详细过程

《SpringBoot实现websocket服务端及客户端的详细过程》文章介绍了WebSocket通信过程、服务端和客户端的实现,以及可能遇到的问题及解决方案,感兴趣的朋友一起看看吧... 目录一、WebSocket通信过程二、服务端实现1.pom文件添加依赖2.启用Springboot对WebSocket

SpringBoot中Get请求和POST请求接收参数示例详解

《SpringBoot中Get请求和POST请求接收参数示例详解》文章详细介绍了SpringBoot中Get请求和POST请求的参数接收方式,包括方法形参接收参数、实体类接收参数、HttpServle... 目录1、Get请求1.1 方法形参接收参数 这种方式一般适用参数比较少的情况,并且前后端参数名称必须

QT实现TCP客户端自动连接

《QT实现TCP客户端自动连接》这篇文章主要为大家详细介绍了QT中一个TCP客户端自动连接的测试模型,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录版本 1:没有取消按钮 测试效果测试代码版本 2:有取消按钮测试效果测试代码版本 1:没有取消按钮 测试效果缺陷:无法手动停

Nacos客户端本地缓存和故障转移方式

《Nacos客户端本地缓存和故障转移方式》Nacos客户端在从Server获得服务时,若出现故障,会通过ServiceInfoHolder和FailoverReactor进行故障转移,ServiceI... 目录1. ServiceInfoHolder本地缓存目录2. FailoverReactorinit

Java Websocket实例【服务端与客户端实现全双工通讯】

Java Websocket实例【服务端与客户端实现全双工通讯】 现很多网站为了实现即时通讯,所用的技术都是轮询(polling)。轮询是在特定的的时间间隔(如每1秒),由浏览器对服务器发 出HTTP request,然后由服务器返回最新的数据给客服端的浏览器。这种传统的HTTP request 的模式带来很明显的缺点 – 浏 览器需要不断的向服务器发出请求,然而HTTP

Java http请求示例

使用HttpURLConnection public static String httpGet(String host) {HttpURLConnection connection = null;try {URL url = new URL(host);connection = (HttpURLConnection) url.openConnection();connection.setReq

10 Source-Get-Post-JsonP 网络请求

划重点 使用vue-resource.js库 进行网络请求操作POST : this.$http.post ( … )GET : this.$http.get ( … ) 小鸡炖蘑菇 <!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-w