TCP-IP学习笔记九:通过Spring打造通用RPC架构webService

TCP-IP学习笔记八:RPC(Netty和Spring)实现webServer框架 TCP/IP学习笔记八:RPC(Netty和Spring)实现webServer框架标签(空格分隔): RPC webService基于RPC和NIO实现webService框架 webService的核心就是解决远程调用,现在基于RPC实现这种远程调用。主要使用的是动态代理和反射机制实现客户端基于接口的远程调用。使用Netty和Spring进行开发RPC架构的webService。详细开发思 阅读详情

TCP-IP学习笔记九:通过Spring打造通用RPC架构webService

标签(空格分隔): RPC-IP


在前几篇的学习中我们得到了一个简单的RPC机构的webService程序。在学习Spring的过程中,想到可以用过Spring对我们的程序进行扩展我们利用Spring提供的接口进行扩展,是的我们的程序更具有通用性。

Spring可以通过配置文件进行扩展的注入Bean,同时也可以通过java代码进行注入Bean。Spring为我们提供了BeanFactoryPostProcessor接口,Spring在加载的时候就会加载这个接口的实现类中的postProcessBeanFactory方法,达到注入Bean的效果。(了解Spring注入Bean的过程的同学应该很快想到是怎么样的过程,Spring在读取配置文件xml之后,对xml文件进行解析,进而加载到BeanDefinition对象中,然后加载到容器中。。。)这个过程类似Spring提供的扫描的功能。

知道这个特性之后我们可以通过这个接口在Spring工厂加载的时候将我们的代理类加载到容器中,同时通过配置文件将我们的接口注入到容器中。

下面就在代码中解释我们的程序升级:

新建一个类BeanScanner实现BeanFactoryPostProcessor接口

package com.motui.rpc.client;

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.beans.factory.support.AbstractBeanDefinition;
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
import org.springframework.beans.factory.support.DefaultListableBeanFactory;

import java.util.Map;

/**
 * Created by MOTUI on 2016/10/20.
 */
public class BeanScanner implements BeanFactoryPostProcessor {


    //key是Bean的名称,value是具体的接口全限定名
    private Map<String,Class> beanInterfaces;

    //客户端名称
    private String clientName;

    //提供set方法,使用set注入。同时也可以通过构造注入,自行扩展。
    public void setBeanInterfaces(Map<String, Class> beanInterfaces) {
        this.beanInterfaces = beanInterfaces;
    }

    public void setClientName(String clientName) {
        this.clientName = clientName;
    }

    @Override
    public void postProcessBeanFactory(ConfigurableListableBeanFactory configurableListableBeanFactory) throws BeansException {
        //DefaultListableBeanFactory,spring默认的IoC容器
        DefaultListableBeanFactory beanFactory = (DefaultListableBeanFactory) configurableListableBeanFactory;

        //遍历Map构造BeanDefinition
        for (Map.Entry<String,Class> entity: beanInterfaces.entrySet()) {
            String beanName = entity.getKey();
            Class targetInterface = entity.getValue();

            //和<bean class="com.motui.rpc.client.FactoryBeanProxy">同理
            BeanDefinitionBuilder beanDefinitionBuilder = BeanDefinitionBuilder.genericBeanDefinition(com.motui.rpc.client.FactoryBeanProxy.class);

            //【特别注意】以下的注入方式是根据FactoryBeanProxy类的参数注入类型决定

            // <constructor-arg index="0" value="com.motui.service.IUserService"/>同理
            beanDefinitionBuilder.addConstructorArgValue(targetInterface);
            //<property name="client" ref="client"/>同理
            beanDefinitionBuilder.addPropertyReference("client",clientName);

            //获得BeanDefinition
            AbstractBeanDefinition beanDefinition = beanDefinitionBuilder.getBeanDefinition();

            //注册BeanDefin
            beanFactory.registerBeanDefinition(beanName,beanDefinition);
        }

    }
}

客户端配置文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
                           http://www.springframework.org/schema/beans/spring-beans-4.1.xsd">

    <!-- 配置代理bean -->
    <bean class="com.motui.rpc.client.BeanScanner">
        <property name="beanInterfaces">
            <map>
                <entry key="authentication" value="com.motui.IAuthentication"/>
                .....
                .....
            </map>
        </property>
        <property name="clientName" value="client"/>
    </bean>

    <bean id="client" class="com.motui.rpc.client.RemoteRPCClient">
        <constructor-arg index="0" value="192.168.1.110"/>
        <constructor-arg index="1" value="8989"/>
    </bean>
</beans>

总结:

在学习Spring源码过程中渐渐体会到Spring的强大之处,也感受到了开源的魅力。在接下来的日子中会分享对Spring源码的分析和理解。也建议大家多看源码,体会大神们开发的经验和思想。
远程通信协议RMI原理 远程通信协议RMI原理 1 前言 在分布式服务框架中,一个最基础的问题就是远程服务是怎么通讯的,在Java领域中有很多可实现远程通讯的技术,例如:RMI、MINA、ESB、Burlap、Hessian、SOAP、EJB和JMS 等,这些名词之间到底是些什么关系呢,它们背后到底是基于什么原理实现的呢,了解这些是实现分布式服务框架的基础知识,而如果在性能上有高的要求的话,那深入了解这些技术背后的机制就是必须的了解RPC,全称为Remote Procedure Call,即远程过程调用,它是一个计算机通信协议。它 阅读详情

相关推荐

小红书图文AI创作:输入主题,一键生成图文(coze工作流教程+获取)

输入主题,工作流一键生成小红书风格图文,30s一条,可批量生成

2301_79384090的博客 2798

架构-Java-Netty:Netty框架

ylbtech-架构-Java-Netty:Netty框架 Netty是由JBOSS提供的一个java开源框架。Netty提供异步的、事件驱动的网络应用程序框架和工具,用以快速开发高性能、高可靠性的网络服务器和客户端程序。 也就是说,Netty 是一个基于NIO的客户、服务器端编程框架,使用Netty 可以确保你快速和简单的开发出一个网络应用,例如实现了某种协议的客户、...

weixin_30697239的博客 380

基于Python的MGWR多尺度地理加权回归模型

多尺度地理加权回归(MGWR)变量之间的关系在地理空间上不是均一的,所有特征变量的影响都在不同的空间范围(带宽)内变化,某些变量可能表现出局部性影响(小带宽),某些变量可能表现出全局性影响(大带宽),通过优化每个特征变量的带宽,捕捉到空间关系的多尺度特性,得到更细致的模型解释。

weixin_61965078的博客 3852

SpringBoot接口

RESTful接口web服务HTTP协议简介工作原理HTTP请求过程HTTP请求方式HTTP报头RESTful接口项目实例项目创建测试总结参考 HTTP协议 简介   HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于从万维网(WWW:World Wide Web )服务器传输超文本到本地浏览器的传送协议。。   HTTP是一个基于TCP/IP通信协议来传递数据HTML 文件, 图片文件, 查询结果等 工作原理 HTTP协议工作于客户端-服务端架构上。

weixin_47554309的博客 1886

搭建ipv6并发代理池

我开了个知识星球,把将本期搭建写成shell脚本已放到了里面,有需要的小伙伴可以自行去取,jd的参数,阿里bxet纯算、快手滑块,Pdd—Anti,ikuai,b站login之-极验3文字,某音ab,瑞数456vmp补环境等等,主要是某些大佬加我问成品,很多人都打着白嫖的手段去加我好友为目的,问完基本就以后没有任何的交集,这样的交好友雀氏没有任何意义。不如我直接开个星球,里面直接放我逆向的成品以及逆向的思路,这样大家各取所需,我也有点收益,意义更明确点,免得浪费大家的时间。我是pve下的ubuntu。

weixin_44697518的博客 1471

在 Linux 虚拟机中手动安装 VMware Tools

对于 Linux 虚拟机,您可以从命令行手动安装 VMware Tools。对于 Linux 的较高发行版,请使用集成的 open-vm-tools 版本。 前提条件 有关 open-vm-tools 的操作系统兼容性的详细信息,请参见《VMware 兼容性指南》,网址为VMware Compatibility Guide - System Search。 开启虚拟机。 确认客户机操作系统正在运行。 因为 VMware Tools 安装程序是使用 Perl 编写的,请确认已在客户机操作系统中安..

m0_62526815的博客 1755

spring 远程接口访问及集群方案(二)

针对spring远程接口访问,本文给出一个实际的例子供参考,如果有不足之处,尚请原谅   RMI调用的过程,我的理解大致如下: 1   客户端和服务器端约定好要用于远程调用的方法的接口(包括方法名和输入输出参数)。 2      服务器端将远程服务绑定到某个端口,进行TCP/IP监听(例如监听地址为rmi://127.0.0.1:1099)。 3      客户端与服务器建立TCP/IP...

大河湾的专栏 332

手把手教你用Ubuntu Desktop搭建个人L2TP服务器,手机电脑都能连(Network Manager配置详解)

本文详细介绍了在Ubuntu Desktop上使用Network Manager图形化配置L2TP服务器的方法,实现手机、电脑等多设备安全连接。从环境准备、图形界面设置到各平台客户端配置,提供一站式解决方案,并包含常见问题排查与安全增强措施,帮助用户快速搭建个人远程访问网络。

weixin_30555125的博客 119

BeanDefinition 及其构造方式 BeanDefinitionBuilder, AbstractBeanDefinition

BeanDefinition 是个接口,AbstractBeanDefinition 是这个接口的实现类,很多常见的 bean 属性在 AbstractBeanDefinition 中。这是经典的工厂模式,抽象出接口去规范工厂生产的实体类的行为。另外 GenericBeanDefinition 只是子类实现,大部分的属性在 AbstractBeanDefinition 中。/*** bean 对应的 class(用一个 Class 对象来表示)/*** bean 的作用范围。

JellyfishMIX 的博客 3469

Claude Code与Codex深度对比:终端AI编程助手选型指南

大语言模型驱动的AI编程助手已成为开发者提效的重要工具,它们基于自然语言交互,自动完成代码生成、重构和调试。这类工具依赖上下文理解与工程实践,不同产品在交互模式、模型接入和任务执行上差异显著。从终端CLI编程场景出发,梳理AI编程助手的设计原理与技术价值,重点对比Anthropic Claude Code与OpenAI Codex在安装配置、上下文管理、第三方模型接入(如DeepSeek)以及高频报错处理上的实际表现。无论你是新手还是资深工程师,理解这些差异有助于根据自身工作流选择合适工具,或在两者间灵活切

weixin_33755649的博客 3138

YOLOv8剪枝 lamp剪枝测试精度仅掉0.7个点,速度提高11.8fps!

该摘要介绍了LAMP剪枝方法的创新点和理论分析,重点突出了其最小化L2失真和分层自适应剪枝的特性。LAMP通过引入ξ变量在最坏情况下优化剪枝失真,并简化了计算过程。文章还提供了代码移植的具体步骤,包括创建compress.py文件和相关配置说明。

FJN110的博客 1112

BeanDefinitionBuilder 使用

【代码】BeanDefinitionBuilder 使用。

面朝大海,春暖花开 1729

1、JMP脚本编程全面指南:从基础到高级应用

本博客全面介绍了JMP脚本编程的各个方面,从JMP基础和JSL入门,到数据类型、数据结构、编程方法、数据表操作、图形与三维场景脚本,再到应用程序创建与扩展功能。内容涵盖脚本工具使用、常见任务实现、兼容性说明及未来发展趋势,旨在帮助用户掌握JMP脚本语言的强大功能,提升数据分析的自动化与定制化能力。适合从初学者到高级用户的深入学习与实践参考。

flink9streamer的博客 266

33.服务之间的调用之RPC、Restful深入理解

RPC、REST API深入理解一:RPCRPC 即远程过程调用(Remote Procedure Call Protocol,简称RPC),像调用本地服务(方法)一样调用服务器的服务(方法)。通常的实现有 XML-RPC , JSON-RPC , 通信方式基本相同, 所不同的只是传输数据的格式.RPC是分布式架构的核心,按响应方式分如下两种:同步调用:客户端调用服务方方法,等待直到服务方返回结果...

郑学炜的技术博客 5万+

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

springboot webservice接口调用_接口自动化测试总结1

目前我们公司接口使用的是SCF协议,SCF是58自主研发的RPC框架,致力于在分布式环境下提供高性能,高可靠和透明化的RPC远程调用方案。接口协议目前广泛使用的有http协议和RPC协议和webservice,在了解如何写这三种接口自动化框架前,需要搞明白什么是http协议,什么是RPC协议,以及什么是webservice以及三者的差异点。HTTP协议http协议是基于应用层的超文本传输协议,ht...

weixin_39636718的博客 677

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

webservice(pers)

1.     Java远程方法调用 Java远程方法调用,即Java RMI(Java Remote Method Invocation)是Java编程语言里,一种用于实现远程过程调用的应用程序编程接口。 1.1   远程调用方案比较 1、Java RMI (Remote Method Invocation) 2、EJB远程接口调用 3、WebService,如jax-ws axis x

习惯沉淀的专栏 575

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

dubbo知识点总结 持续更新

Dubbo 支持哪些协议,每种协议的应用场景,优缺点?  dubbo: 单一长连接和 NIO 异步通讯,适合大并发小数据量的服务调用, 以及消费者远大于提供者。传输协议 TCP,异步,Hessian 序列化;  rmi: 采用 JDK 标准的 rmi 协议实现,传输参数和返回参数对象需要实现 Serializable 接口,使用 java 标准序列化机制,使用阻塞式短连接,传输数 ...

少说,多做。 5422

Dubbo分布式服务框架

Dubbo

asmall_cat的博客 498

java调用webservice_【Java面试题】Dubbo高频面试28题含答案

Dubbo是当前国内热门的RPC框架,在Java技术面试中会经常被问到其基本原理、配置调优等知识点,知识或掌握这些配置项的存在,对工作亦是事半功倍。整理了一些经常被面试官问到的Dubbo题目,建议了解、收藏备用,如果你基本能回答,说明你对dubbo了解得足够全面。1.Dubbo是什么?Dubbo 是一个分布式、高性能、透明化的 RPC 服务框架,提供服务自动注册、自动发现等高效服务治理方案, 可以...

weixin_39914499的博客 196

Dubbo

对dubbo的一些理解和介绍

weixin_56939868的博客 159

个人整理dubbo相关面试题

文章目录Dubbo 是什么?Dubbo能做什么?Dubbo的核心功能?Dubbo的架构设计?Dubbo支持哪些协议,每种协议的应用场景,优缺点?Dubbo与Spring的关系?Dubbo 的注册中心集群挂掉,发布者和订阅者之间还能通信么?Dubbo集群提供了哪些负载均衡策略?Dubbo的集群容错方案有哪些?Dubbo服务之间的调用是阻塞的吗?Dubbo在安全机制方面是如何解决? Dubbo 是什么? Dubbo是阿里巴巴开源的基于 Java 的高性能 RPC 分布式服务框架,现已成为 Apache 基金会孵

你就像甜甜的益达 271

Dubbo服务框架相关知识点

采用 JDK 标准的 rmi 协议实现,传输参数和返回参数对象需要实现 Serializable 接口,使用 java 标准序列化机制,使用阻塞式短连接,传输数据包大小混合,消费者和提供者个数差不多,可传文件,传输协议 TCP。采用 JDK 标准的 rmi 协议实现,传输参数和返回参数对象需要实现 Serializable 接口,使用 java 标准序列化机制,使用阻塞式短连接,传输数据包大小混合,消费者和提供者个数差不多,可传文件,传输协议 TCP。如果消费方超时,服务端线程不会定制,会产生警告。

m0_52514893的博客 112

史上超详细全面30道Dubbo面试笔试题(答案详解)

dubbo:单一长连接和 NIO 异步通讯,适合大并发小数据量的服务调用,以及消费者远大于提供者。传输协议 TCP,异步,Hessian 序列化;rmi:采用 JDK 标准的 rmi 协议实现,传输参数和返回参数对象需要实现Serializable 接口,使用 java 标准序列化机制,使用阻塞式短连接,传输数据包大小混合,消费者和提供者个数差不多,可传文件,传输协议 TCP。多个短连接,TCP 协议传输,同步传输,适用常规的远程服务调用和 rmi 互操作。

m0_57042151的博客 164

这些Dubbo面试题你都掌握了吗,还是略知一二

前言: 随着金九银十的到来,很多人都在备战着,都想要进大厂,之前也有发一些面试的文章,发现还是很多人需要的,所以今天准备了一些Dubbo的面试专题分享给大家,希望可以帮助到大家。 1.Dubbo 支持哪些协议,每种协议的应用场景,优缺点? dubbo:单一长连接和 NIO 异步通讯,适合大并发小数据量的服务调用, 以及消费者远大于提供者。传输协议 TCP,异步,Hessian 序...

Javazhoumou的博客 272

Dubbo入门---搭建一个最简单的Demo框架

Dubbo入门---搭建一个最简单的Demo框架     Dubbo开始于电商系统,因此在这里先从电商系统的演变讲起。 单一应用框架(ORM) 当网站流量很小时,只需一个应用,将所有功能如下单支付等都部署在一起,以减少部署节点和成本。 缺点:单一的系统架构,使得在开发过程中,占用的资源越来越多,而且随着流量的增加越来越难以维护 垂直应用框架(MVC)

梦想起飞的地方......... 373
上一篇: nginx代理服务器的搭建
下一篇: Spring Data Redis 单节点和集群配置和RedisTemplate用法
motui
博客等级 码龄10年 84粉丝 42原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值