TCP-IP学习笔记八:RPC(Netty和Spring)实现webServer框架

基于netty框架的WebServer实现 阅读详情

TCP/IP学习笔记八:RPC(Netty和Spring)实现webServer框架

标签(空格分隔): RPC webService


基于RPC和NIO实现webService框架

    webService的核心就是解决远程调用,现在基于RPC实现这种远程调用。

主要使用的是动态代理和反射机制实现客户端基于接口的远程调用。使用Netty和Spring进行开发RPC架构的webService。

详细开发思路和步骤在代码中以注释的形式展现。

说明:本实例没有考虑服务器端的接口有多个实现类的情况。

一、服务器端

将服务的启动(NIOServerBootstrap)交给Spring管理,Spring启动时进行初始化服务。

1.NIOServerBootstrap中的动态数据(port,channelHandlerAdapter)通过构造注入的方式进行传递。

2.NIOServerBootstrap 的start方法用子线程启动。如果不使用线程开启,会导致主线程阻塞。因为我们将启动引导交给Spring管理,在Spring初始化时开启,NIOServerBootstrap的启动会导致初始化阻塞,无法初始化其他启动项。

3.ServerRequestResponseHander实现ApplicationContextAware    拿到Spring工厂,实现ApplicationContextAwareSpring会自动注入工厂到ApplicationContext中

4.ServerRequestResponseHander的channelRead方法中,判断返回值是否为空(有些方法有返回值,有些方法返回值为void。result为空返回给客户端会报空指针)引入一个NullWritable类(单例【饿汉式】)。
  • 服务的启动引导类

    package com.motui.rpc.Server;
    
    import com.motui.rpc.common.ObjectCodec;
    
    import io.netty.bootstrap.ServerBootstrap;
    import io.netty.channel.ChannelFuture;
    import io.netty.channel.ChannelHandlerAdapter;
    import io.netty.channel.ChannelInitializer;
    import io.netty.channel.EventLoopGroup;
    import io.netty.channel.nio.NioEventLoopGroup;
    import io.netty.channel.socket.SocketChannel;
    import io.netty.channel.socket.nio.NioServerSocketChannel;
    import io.netty.handler.codec.LengthFieldBasedFrameDecoder;
    import io.netty.handler.codec.LengthFieldPrepender;
    
    /**
     * 服务的引导类
     * @author MOTUI
     *
     */
    public class NIOServerBootstrap {
         
         
    
        private int port;   //端口号
        private ChannelHandlerAdapter channelHandlerAdapter;    //IO事件处理类
        private ServerBootstrap serverBootstrap;    //NIOServerSocketChannel的服务引导
        private EventLoopGroup boss;    //线程池 boss(请求转发) worker(IO事件处理)
        private EventLoopGroup worker;  //worker(IO事件处理)
    
        /**
         * 构造函数
         * 初始化参数
         * @param port  服务器端口号
         * @param channelHandlerAdapter IO事件处理类
         */
        public NIOServerBootstrap(int port, ChannelHandlerAdapter channelHandlerAdapter) {
            super();
            this.port = port;
            this.channelHandlerAdapter = channelHandlerAdapter;
    
            //初始化参数
            serverBootstrap = new ServerBootstrap();
            boss = new NioEventLoopGroup();
            worker = new NioEventLoopGroup();
            //绑定线程池
            serverBootstrap.group(boss, worker);
            //设置服务类
            serverBootstrap.channel(NioServerSocketChannel.class);
    
        }
        /**
         * 开启服务
         * 如果不使用线程开启,会导致主线程阻塞。
         * 因为我们将启动引导交给Spring管理,在Spring初始化时开启,NIOServerBootstrap的启动会导致初始化阻塞,
         * 无法初始化其他启动项。
         */
        public void start(){
    
            new Thread(){
                @Override
                public void run() {
                    try {
                        //绑定IO处理事件
                        serverBootstrap.childHandler(new ChannelInitializer<SocketChannel>(){
    
                            @Override
                            protected void initChannel(SocketChannel ch) throws Exception {
    
                                ch.pipeline().addLast(new LengthFieldPrepender(2));
                                ch.pipeline().addLast(new LengthFieldBasedFrameDecoder(65535, 0, 2, 0, 2));
                                ch.pipeline().addLast(new ObjectCodec());
                                //将channelHandlerAdapter添加到队列
                                ch.pipeline().addLast(NIOServerBootstrap.this.channelHandlerAdapter);
                            }
                        });
    
                        //绑定服务器启动端口
                        System.out.println("服务器开始监听:"+NIOServerBootstrap.this.port+
Netty框架介绍并编写WebSocket服务端与客户端 阅读详情

相关推荐

TCP-IP学习笔记四:NIO的网络编程-多线程实例

TCP/IP学习笔记四:NIO的网络编程-多线程实例标签(空格分隔): 网络编程 NIO 多线程NIO的多线程编程 对于单线程的程序来说,我们无法达到并行处理,我们要向达到并行处理,必定会使用多线程,但是我们哪些代码使用子线程呢?我们可以对单线程程序进行分析,在程序中最耗时的操作就是I/O操作(读和写)。找到入口就进行改造程序。 服务器端修改代码:package com.socket.nio3

MoTui的博客 6981

使用jboss netty 创建高性能webservice客户端及服务端

NULL 博文链接:https://jonenine.iteye.com/blog/2170673

baffalotech:一个基于Netty开发的服务容器,支持servlet,tcp,webservice,可以方便的与Spring Cloud集成,快速发布基于各种协议的接口

BaffaloTech Integration 简介 随着微服务的兴起,越来越多的项目采用微服务架构,而其中很大一部分是采用spring cloud全家桶实现。另外一方面,这些项目不同程度的是需要第三方系统的接入。这些对接方式可能80%以上都是基于http、webservice、tcp协议;安全认证方式也不尽相同。BaffaoTech Integration是基于Netty开发的、可以作为Spring Boot内嵌服务器的NIO高性能Servlet容器,可以和SpringCloud无缝集成。 特点 支持http,webservice,tcp协议 基于Spring Boot开发,原生支持Spring Boot所有的功能 容易集成Spring Cloud的组件,例如Eureka、配置中心、zipkin、ribbon等等 http接口符合servlet规范,较低的学习成本 可以在一个jvm里面开

springboot+webservice搭建webservice服务端及使用java客户端两种方式进行调用webservice接口

springboot+webservice搭建webservice服务端及使用java客户端两种方式进行调用webservice接口

Springboot-Netty-Tcp-demo.zip

后端开发

netty4服务端客户端实例

通过netty4实现的简单的服务端与客户端的源代码,采用IntelliJ IDEA 2018.1.3开发工具,该例子可以帮助你入门netty框架。

UFS电源管理实战:如何优化手机存储的功耗与性能(附实测数据)

本文深入探讨了UFS电源管理的实战优化策略,旨在平衡手机存储的功耗与性能。通过解析UFS核心电压域与工作状态,重点介绍了通过动态调整bActiveICCLevel(活动电流等级)来实现精细控制,并结合实测数据与场景驱动的智能策略,为Android系统与硬件工程师提供了降低功耗、提升流畅度的有效方法。

weixin_29214559的博客 504

SQL 通过sum() over(order by ,rownum)实现财务现金日记账实例

SELECT 类型,to_char(发生日期,'yyyy-MM-dd') 发生日期,期初余额,借方金额,贷方金额, (CASE WHEN 借方金额>0 THEN '借' WHEN 贷方金额>0 THEN '贷' ELSE '平' END) 方向, sum(收支金额) over(order by 发生日期, rownum) 余额 FROM( SELECT LX 类型,账户,账号,摘要,发生日期,单据ID, ...

qq_41451794的博客 1021

华为IC岗笔试刷题含答案(2)

又做了几套题,记录了部分及答案,如有错误,欢迎评论指正。

Ingrid的博客 1万+

为什么你的XGBoost多分类效果不如预期?可能是这5个参数没调对

本文深度剖析了XGBoost模型在处理多分类问题时效果不佳的五大关键参数陷阱。针对多分类问题的独特性,文章提供了max_depth、learning_rate、采样参数及正则化参数等核心参数的量化调整策略与诊断方法,帮助开发者精准调优,有效提升模型在各类别上的均衡性能与泛化能力。

weixin_29182481的博客 295

【用unity实现100个游戏之16】Unity程序化生成随机2D地牢游戏1(附项目源码)

关于使用TileMap生成随机2D地图,其实之前已经有做过类似的,感兴趣可以看看 但是随着学习深入,发现之前做的比较粗糙和不够全面,最近又在外网看到

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 2213

YOLOv11改进策略【Conv和Transformer】| IJCAI 2024 利用FreqFormer中的SFA 空间 - 频率注意力和CTA 通道转置注意力 二次改进C3k2

在FreqFormer模型中,SFA(Spatial-Frequency Attention)和CTA(Channel Transposed Attention)模块是关键组成部分,它们针对传统Transformer在图像超分辨率任务中的不足而设计,旨在更好地恢复高频细节,提升模型性能。

Limiiiing的博客 758

【在 WSL2 GUI 中使用 pulseaudio 播放声音】

最近在搞一个Linux项目,由于WSL2中需要用到声音外放,无奈只能潜心研究。后来就使用了一种折中的方式替代,那就是pulseaudio。目前来讲WSL2对硬件外设的支持还是不太友好,关于USB的支持我之前在其他文章中已经论述过了,这里不讨论。1、Windows11别忘记打开声音2、可能有一定延迟,因为是通过网络传输的。3、效果的话只能见仁见智了,如果不能满足要求就安装一个实实在在的Ubuntu吧!

jiexijihe945的博客 4530

AMD SDP 优快云 系列文章设计

摘要 本文档规划了7篇AMD SDP协议解析系列文章的技术博客设计方案。基于《Scalable Data Port (SDP) Specification》1.5.0版本(122页),面向SoC/NoC领域的RTL设计与验证工程师,构建从基础概念到验证实现的知识体系。 系列文章严格遵循协议规范边界,采用五类证据标签区分内容来源(规范原文、勘误、验证推导等),禁止补充未定义的实现细节。包含端口控制、事务传输、一致性协议等核心内容,最终落实到验证平台设计与覆盖率模型。 每篇文章采用统一模板:明确规范依据、问题导

元直的博客 158

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

上一篇: TCP-IP学习笔记七:Netty使用--简单通信编程3
下一篇: IntelliJ IDEA 搭建Spring源码阅读环境
motui
博客等级 码龄10年 84粉丝 42原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值