Netty笔记6:Netty组件
Netty笔记1:线程模型
Netty笔记2:零拷贝
Netty笔记3:NIO编程
Netty笔记4:Epoll
Netty笔记5:Netty开发实例
Netty笔记6:Netty组件
Netty笔记7:ChannelPromise通知处理
Netty笔记8:ByteBuf使用介绍
Netty笔记9:粘包半包
Netty笔记10:LengthFieldBasedFrameDecoder
Netty笔记11:编解码器
Netty笔记12:模拟Web服务器
Netty笔记13:序列化
文章目录
- EventLoop
- ChannelHandler生命周期
- ChannelPiple与ChannelHandler
- ChannelHandlerContext
- ChannelHandler
- ChannelInboundHandler
- ChannelOutboundHandler
- HandlerAdapter
- 共享Handler
Bootstrap
:是Netty框架的启动类和主入口类,分为客户端(Bootstrap)和服务器端(ServerBootstrap)两种。
EventLoop
:可以看成一个线程,我们的那些操作都是在这个上面执行;
EventLoopGroup
:线程组,管理EventLoop
的;
NioSocketChannel/NioServerSocketChannel
:channel
是NIO中的基本构造,所以在Netty
中,自然也有;
ChannelHandler
:事件用于通知Netty
改变状态,触发对应处理器,如连接激活、读取、错误等这些事件,都会分给ChannelHander
处理,我们只需要实现对应的方法,就行;Netty
也定义了一些预定义好的实现,包括各种协议(如Http,SSL/TLS)的ChannelHandler
;
ChannelPiple
:每个Channel
都有自己的ChannelPiple
,作为ChannelHandler
的容器,从网络到业务处理,再到网络,也就是从入站到出站,业务处理都是在piple
中流转,Handler
执行的顺序也是他们被添加的顺序。
ChannelFuture
:Netty
中的所有操作都是异步的,它实现于JDK中的Future
;
EventLoop
在当前的线程模型中,它可能有多个Channel
共享,这使得可以通过尽可能少的Thread
支撑大量的Channel
;
EventLoopGroup
负责每个新创建的Channel
分配一个EventLoop
,一旦Channel
被分配给了EventLoop
,那么他们关系会延续到这个Channel
关闭销毁;
需要注意的一点:因为多个Channel
共享一个EventLoop
,也就是一个线程,那么ThreadLocal
遍历也是共享。
ChannelHandler生命周期
ChannelHandler
被添加到ChannelPiple
中或者被从ChannelPiple
中移除会调用下面的方法,并且都会接受一个ChannelHandlerContext
的参数:
handlerAdded
:channelHandler添加时被调用;handlerRemoved
:被移除时调用;exceptionCaught
:产生错误时调用;
ChannelPiple与ChannelHandler
ChannelPiple
其实是以双向链表的形式进行维护和管理。
之前提到过出站入站,就是数据从网络到达piple
,为入站,数据从piple
出去到网络,为出站,出入站均有对应的事件handler
处理,并且,如果业务没有特殊要求,可以不用区分出入站的handler
。
ChannelHandlerContext
在ChannelHandler
和ChannelPiple
传递的上下文对象,更像是链表中的node
对象,它对数据进行了保证,并且包含pre
和next
传递Handler
。
当添加ChannelHandle
时,ChannelPiple
都会创建一个ChannelHandlerContext
,而handler
呈链表形式,并不是handler
与handler
间是链表结构,它本身是处理器,不应有链表的形式,所以,就有我们的ChannelHandlerContext
来管理链表,它具有pre
和next
,所以只要通过context
就可以找到下一个handler
。
ChannelHandler
我们的业务就写在这ChannelHandler
下;
它有两个重要的子接口:
- ChannelInboundHandler:处理入站数据以及各种状态变化,从
handler
列表头部开始执行,addLast
的顺序 - ChanneloutboundHandler:处理出站数据并且允许拦截所有的操作,从
handler
列表尾部开始执行,addLast
的逆序;
注意:他们的执行顺序,他们通过addLast
添加的方式一样,但是执行顺序是相反的。
ChannelInboundHandler
// 当channel已经注册到EventLoop,并能够处理IO时调用
void channelRegistered(ChannelHandlerContext var1) throws Exception;
// 当Channel从它的EventLoop注销并且无法处理任何IO时被调用void channelUnregistered(ChannelHandlerContext var1) throws Exception;
// 当channel处于活动状态时被调用;channel已经连接/绑定并且已经就行;void channelActive(ChannelHandlerContext var1) throws Exception;
// 当channel离开活动状态并且不再连接它的原出处节点时被调用void channelInactive(ChannelHandlerContext var1) throws Exception;
// 当channel读取数据时调用void channelRead(ChannelHandlerContext var1, Object var2) throws Exception;
// 当channel的读操作完成时调用void channelReadComplete(ChannelHandlerContext var1) throws Exception;
// 当方法fireUserEvnetTriggered()被调用时调用void userEventTriggered(ChannelHandlerContext var1, Object var2) throws Exception;
// 当channel可写状态发生改变时被调用,可通过调用channel的isWriteable()方法检测channel是否可写void channelWritabilityChanged(ChannelHandlerContext var1) throws Exception;
// 当出现异常时调用void exceptionCaught(ChannelHandlerContext var1, Throwable var2) throws Exception;
ChannelOutboundHandler
// 当请求将channel绑定到本地地址时被调用
void bind(ChannelHandlerContext var1, SocketAddress var2, ChannelPromise var3) throws Exception;
// 当将channel连接到远程节点时被调用void connect(ChannelHandlerContext var1, SocketAddress var2, SocketAddress var3, ChannelPromise var4) throws Exception;
// 当将channel从远程节点断开时被调用void disconnect(ChannelHandlerContext var1, ChannelPromise var2) throws Exception;
// 当请求关闭channel时被调用void close(ChannelHandlerContext var1, ChannelPromise var2) throws Exception;
// 当请求将channel从EventLoop注销时被调用void deregister(ChannelHandlerContext var1, ChannelPromise var2) throws Exception;
// 当从channel读取数据时被调用
// 注意,他是发出读数据的请求,不是读数据void read(ChannelHandlerContext var1) throws Exception;
// 当请求通过channel写数据到远程节点时被调用void write(ChannelHandlerContext var1, Object var2, ChannelPromise var3) throws Exception;
// 当请求通过channel将入队数据冲刷到远程节点时被调用void flush(ChannelHandlerContext var1) throws Exception;
为什么OutHandler
会有read
方法,出站需要读取数据吗?
这里它并不是读取数据,而是读取数据的请求操作,Netty会将其打包成一个事件,有了事件在模式循环下被识别到,进而触发inboundHnadler
,属于出站事件。(可以参考Reactor模型理解)
HandlerAdapter
对应出站入站,有ChannelOutboundHandlerAdapter
和ChannelInboundHandlerAdapter
,是Netty为我们实现的抽象类,我们可以继承它扩展我们自己的业务;
共享Handler
如果需要将handler
置为全局的,也就是共享的,那么需要加上注解:@ChannelHandler.Sharable
。
这里要注意的是注释说明:
Indicates that the same instance of the annotated ChannelHandler can be added to one or more ChannelPipelines multiple times without a race condition.
If this annotation is not specified, you have to create a new handler instance every time you add it to a pipeline because it has unshared state such as member variables.
This annotation is provided for documentation purpose, just like the JCIP annotations .表明同一个被注解的ChannelHandler实例可以无竞态条件地被多次添加到一个或多个ChannelPipeline中。
如果未指定此注解,则每次将其添加到管道中时都必须创建一个新的处理器实例,因为它具有未共享的状态,例如成员变量。
此注解仅用于文档目的,就像JCIP注解一样。
通过他的注释可以知道,添加这个共享注解,是可以在线程无竞争的条件下被多次使用,也就是需要保证线程安全,这是因为,如果被该注解标注的ChannelHandler中存在非线程安全的变量被使用,那么多个线程并发时,就无法保证该Channel能够正常的输出结果。
然后就是没有Sharable
注解的话,每次添加都是一个新的实例,不会有问题。
相关文章:
Netty笔记6:Netty组件
Netty笔记1:线程模型 Netty笔记2:零拷贝 Netty笔记3:NIO编程 Netty笔记4:Epoll Netty笔记5:Netty开发实例 Netty笔记6:Netty组件 Netty笔记7:ChannelPromise通知处理 Netty笔记8…...
大模型学习笔记------Llama 3模型架构简介
大模型学习笔记------Llama 3模型架构 1、整体网络结构2、主要创新点3、其他关键改进点 LLaMA(Large Language Model Meta AI)系列模型是Meta发布并开源,分别在2023年2月、2023年7月和2024年4月发布了经历了LLaMA 1、LLaMA 2和LLaMA 3模型。本文只讲相对比较成熟、性…...
DeepSeek本地接口调用(Ollama)
前言 上篇博文,我们通过Ollama搭建了本地的DeepSeek模型,本文主要是方便开发人员,如何通过代码或工具,通过API接口调用本地deepSeek模型 前文:DeepSeek-R1本地搭建_deepseek 本地部署-CSDN博客 注:本文不仅…...
C语言:51单片机 基础知识
一、单片机概述 单片机的组成及其特点 单片机是指在一块芯片上集成了CPU、ROM、RAM、定时器/计数器和多种I/O接口电路等,具有一定规模的微型计算机。 特点: 1、单片机的存储器以ROM、RAM严格分工。 2、采用面向控制的指令系统。 3、单片机的I/O口引脚通…...
DAIR-V2X-R数据集服务器下载
【官方github链接】https://github.com/ylwhxht/V2X-R 点击并登录 选择并点击下载 浏览器弹窗,右键选择复制下载链接 ------------------------------------服务器下载----------------------------------------- 登录服务器,选在要下载的文件夹复制路…...
Kali CentOs 7代理
工具v2↓ kali_IP段v2端口例子<1> kali_IP段v2端口例子<2> CentOs 7 //编辑配置文件 vi /etc/profile//在该配置文件的最后添加代理配置 export http_proxyhttp://ip:port //代理服务器ip地址和端口号 export https_proxyhttp://ip:port //代理服务器ip地址和…...
LabVIEW虚拟频谱分析仪
在电子技术快速发展的今天,频谱分析已成为信号优化与故障诊断的核心手段。传统频谱分析仪虽功能强大,但价格高昂且体积笨重,难以满足现场调试或移动场景的需求。 基于LabVIEW开发的虚拟频谱分析仪通过软件替代硬件功能,显著降低成…...
商城源码的框架
商城源码的框架通常是基于某种Web开发框架或者电子商务平台来构建的。以下是一些常见的商城源码框架: WooCommerce:基于WordPress的电子商务插件,适用于小型到中型的在线商店。 Magento:一个功能强大和灵活的开源电子商务平台&am…...
关联封号率降70%!2025最新IP隔离方案实操手册
高效运营安全防护,跨境卖家必看的风险规避指南 跨境账号管理的核心挑战:关联封号风险激增 2024年,随着全球电商平台对账号合规的审查日益严苛,“关联封号”已成为跨境卖家最头疼的问题之一。无论是同一IP登录多账号、员工操作失误…...
Qwen2-Audio系列学习笔记
模型介绍 GitHub - QwenLM/Qwen2-Audio: The official repo of Qwen2-Audio chat & pretrained large audio language model proposed by Alibaba Cloud. https://arxiv.org/pdf/2407.10759 https://zhuanlan.zhihu.com/p/712987238 We introduce the latest progress o…...
高频 SQL 50 题(基础版)_1341. 电影评分
高频 SQL 50 题(基础版)_1341. 电影评分 思路 思路 (select Users.name results from Users left join MovieRating on Users.user_id MovieRating.user_id group by(Users.name) order by count(MovieRating.movie_id) desc,Users.name asc limit 1) u…...
C#批量压缩并上载CSV数据文件到Box企业云盘
C# .NET 8实现Windows下批量压缩csv文件为zip文件,然后异步上传到box企业云服务网盘路径,实现异常处理和写入运行状态日志,参数来自ini配置文件。 C# .NET 8代码示例,包含INI配置读取、CSV文件压缩、Box上传、异步处理和日志记录…...
pyside6学习专栏(九):在PySide6中使用PySide6.QtCharts绘制6种不同的图表的示例代码
PySide6的QtCharts类支持绘制各种型状的图表,如面积区域图、饼状图、折线图、直方图、线条曲线图、离散点图等,下面的代码是采用示例数据绘制这6种图表的示例代码,并可实现动画显示效果,实际使用时参照代码中示例数据的格式将实际数据替换即可…...
阿里万相,正式开源
大家好,我是小悟。 阿里万相正式开源啦。这就像是AI界突然开启了一扇通往宝藏的大门,而且还是免费向所有人敞开的那种。 你想想看,在这个科技飞速发展的时代,AI就像是拥有神奇魔法的魔法师,不断地给我们带来各种意想…...
Golang语法特性总结
1.认识Golang代码特性 package main //1.包含main函数的文件就是一个main包--当前程序的包名// import "fmt" // import "time" import("fmt""time" )//3.同时包含多个包 4.强制代码风格:函数的 { 一定和函数名在同一行,否…...
AI绘画软件Stable Diffusion详解教程(6):文生图、提示词细说与绘图案例
文生图即以文字描述来生成图像,这是目前所有AI绘画软件的基本功能之一。要想画一副好的图片,除了选择好的模型,在文生图中,提示词特别关键。 一、什么是提示词(Prompt) 提示词又称创意、关键词、咒语、ca…...
getline的使用(L1-059敲笨钟)
在 C 中,getline 函数主要有两种常用的形式,分别是 <iostream> 头文件中的 std::getline 用于从输入流读取一行字符串,以及 <cstdio> 头文件中的 std::getline(C11 引入)用于从文件流读取一行。下面分别介…...
Python数据可视化
1.Python 数据可视化全指南 🚀 数据可视化是数据分析和机器学习的关键环节,Python 提供了丰富的可视化库,如 Matplotlib、Seaborn、Plotly、Pandas 内置可视化等。以下是 Python 可视化的核心内容及最佳实践。 2. 基础可视化库 2.1 Matplot…...
探秘基带算法:从原理到5G时代的通信变革【五】CORDIC算法
文章目录 2.4 CORDIC算法2.4.1 CORDIC算法的基本原理2.4.2 方法论与分类体系旋转模式矢量模式线性模式 2.4.3 **CORDIC 算法中的误差来源****角度逼近误差的分析****缩放效应误差的分析****精度需求与迭代次数的关系****常见应用场景下的迭代次数建议****总结** 2.4.4优缺点分析…...
golang介绍,特点,项目结构,基本变量类型与声明介绍(数组,切片,映射),控制流语句介绍(条件,循环,switch case)
目录 golang 介绍 面向并发 面向组合 特点 项目结构 图示 入口文件 main.go 基本变量类型与声明 介绍 声明变量 常量 字符串(string) 字符串格式化 空接口类型 数组 切片 创建对象 追加元素 复制切片 map(映射) 创建对象 使用 多重赋值 控制流语句…...
大语言模型学习--本地部署DeepSeek
本地部署一个DeepSeek大语言模型 研究学习一下。 本地快速部署大模型的一个工具 先根据操作系统版本下载Ollama客户端 1.Ollama安装 ollama是一个开源的大型语言模型(LLM)本地化部署与管理工具,旨在简化在本地计算机上运行和管理大语言模型…...
力扣-动态规划-53 最大子数组和
思路 dp数组定义:以i为结尾的字符串的最大子数组和为dp[i]递推公式: dp[i] max(nums[i], dp[i-1] nums[i]);dp数组初始化:dp[0] nums[0];遍历顺序:顺序时间复杂度: 代码 class Solution { public:int maxS…...
论文阅读和代码实现EfficientDet(BiFPN)
BiFPN 采用双向特征融合,让 P3 和 P4 不仅能获取来自 Backbone 的信息,还可以有效吸收 P5 的高级语义特征,增强小目标的判别能力 通过 加权特征融合(Weighted Feature Fusion),BiFPN 让 P3 层能够 自动调整…...
[杂学笔记] 封装、继承、多态,堆和栈的区别,堆和栈的区别 ,托管与非托管 ,c++的垃圾回收机制 , 实现一个单例模式 注意事项
文章目录 1.封装、继承、多态2. 堆和栈的区别3.指针和引用的区别4. 托管与非托管5. c的垃圾回收机制6. 实现一个单例模式 注意事项 1.封装、继承、多态 封装就是将数据和内部的方法封装到一个类中,对外隐藏内部实现细节,但是留下了公共接口提供给外部使…...
c++ std::bind、std::bind_front使用笔记
c std::bind、std::bind_front使用笔记 std::bind 和 std::bind_front 的使用说明std::bind (C11 引入)std::bind_front (C20 引入) 应用场景应用注意事项应用注意事项的例子 std::bind 和 std::bind_front 的使用说明 std::bind (C11 引入) std::bind 用于创建一个新的可调用…...
神策数据严正声明
近日,我们发现有不法分子冒充神策网络科技(北京)有限公司(以下简称”神策数据”)的名义,发布虚假的招聘广告、面试邀请,企图误导求职者并进行不法行为。对此,我司发布严正声明&#…...
vue+elementui 实现上传文件/导入文件的功能
vueelementui 实现上传文件/导入文件的功能 1. 上传组件 <el-form-item label"上传文件:"><el-uploadaction"":file-list"fileList":show-file-list"false":http-request"handUpLoad"drag:limit"…...
FastGPT 引申:知识库辅助开发(代码符号自动提取与文件匹配工具详解)
文章目录 FastGPT 引申:知识库辅助开发(代码符号自动提取与文件匹配工具详解)1. 符号提取 prompt2. 文件查询 prompt3. 总结 FastGPT 引申:知识库辅助开发(代码符号自动提取与文件匹配工具详解) 在开发过程…...
李国杰院士 “七问” DeepSeek:深度剖析 AI 发展新态势
李国杰院士 “七问” DeepSeek:深度剖析 AI 发展新态势 在人工智能领域的探索之路上,李国杰院士凭借深厚的学术造诣和前瞻性的眼光,成为指引方向的重要灯塔。 李国杰院士任职于中国科学院计算技术研究所,担任研究员一职。他不仅是…...
C#中泛型的协变和逆变
协变: 在泛型接口中,使用out关键字可以声明协变。这意味着接口的泛型参数只能作为返回类型出现,而不能作为方法的参数类型。 示例:泛型接口中的协变 假设我们有一个基类Animal和一个派生类Dog: csharp复制 public…...
transformer架构解析{掩码,(自)注意力机制,多头(自)注意力机制}(含代码)-3
目录 前言 掩码张量 什么是掩码张量 掩码张量的作用 生成掩码张量实现 注意力机制 学习目标 注意力计算规则 注意力和自注意力 注意力机制 注意力机制计算规则的代码实现 多头注意力机制 学习目标 什么是多头注意力机制 多头注意力计算机制的作用 多头注意力机…...
SpringBoot生成唯一ID的方式
1.为什么要生成唯一ID? 数据唯一性:每个记录都需要有一个独一无二的标识符来确保数据的唯一性。这可以避免重复的数据行,并有助于准确地查询、更新或删除特定的记录。 数据完整性:通过使用唯一ID,可以保证数据库中的数…...
认识时钟树
时钟源 高速外部震荡器HSE 低速外部震荡器LSE 高速内部震荡器HSI 低速内部震荡器LSI 易混淆点: RC(Resistor-Capacitor,电阻-电容振荡器)一般是内部时钟源 RTC(Real-Time Clock,实时时钟)…...
NLP如何训练AI模型以理解知识
一、自然语言处理(NLP)的定义与核心目标 1. 什么是自然语言处理? NLP是计算机科学与人工智能的交叉领域,旨在让机器具备以下能力: • 理解:解析人类语言(文本或语音)的语法、语义和…...
linux如何在某个文件夹下查看所有文件(层级只到当前文件夹的两层)并找到‘XXXX’ 这个单词
问了AI写的不错,记录一下,排查一些报错的时候比较好用 在 Linux 中,您可以通过命令行工具查看某个文件夹下的所有文件(限制到当前文件夹及其子文件夹两层深度),并搜索包含特定单词(如 XXXXX&am…...
Android 常见View的防抖
在开发Android应用时,我们经常会遇到用户快速点击按钮或者频繁触发某个事件的情况。这种行为可能会导致不必要的重复操作,例如多次提交表单、重复加载数据等。为了避免这些问题,我们需要对这些事件进行防抖处理。本文将详细介绍如何在Kotlin中…...
Unity打包到webgl鼠标图标大小不正确
我使用了自定义鼠标纹理,打包出来发现鼠标特别的大,位置也不对劲 研究了一下,不考虑浏览器界面缩放的话,可以直接改import settings的最大尺寸,改成合适的尺寸。 暂时先这样解决吧 最后贴一个设置鼠标图标的代码 pub…...
CentOS 7中安装Dify
Dify 是一个开源的 LLM 应用开发平台。其直观的界面结合了 AI 工作流、RAG 管道、Agent、模型管理、可观测性功能等,让您可以快速从原型到生产。尤其是我们本地部署DeepSeek等大模型时,会需要用到Dify来帮我们快捷的开发和应用。 大家可以参考学习它的中…...
爬蟲動態IP代理與數據採集穩定性
對於從事爬蟲開發的人來說,IP代理的使用直接影響了爬蟲的效率和穩定性。爬蟲的本質是模擬用戶訪問網站,通過抓取網頁內容來獲取所需數據。但大多數網站為了保護自己的數據或防止濫用,會設置諸如IP訪問頻率限制、登錄驗證甚至封禁等反爬蟲措施…...
excel 斜向拆分单元格
右键-合并单元格 右键-设置单元格格式-边框 在设置好分割线后,你可以开始输入文字。 需要注意的是,文字并不会自动分成上下两行。 为了达到你期望的效果,你可以通过 同过左对齐、上对齐 空格键或使用【AltEnter】组合键来调整单元格中内容的…...
React Native 实现滑一点点内容区块指示器也滑一点点
效果图如上,内容滑一点点,指示器也按比例话一点点,列表宽度跟数据有关。 实现思路如下: 1.监听列表滑动事件,获取列表横向滑动距离,假设为A; 2.获取列表的宽度,及列表可滑动的宽度…...
解决Vscode项目同时运行两个项目终端无法自动叠加的问题
终端(如命令行工具或服务进程)无法自动“叠加”使用同一资源(如端口号、进程ID等)的核心原因在于操作系统的资源管理机制和网络协议规范的限制。以下是具体分析: 以下是解决 VSCode 同时运行两个项目时终端被前一个占…...
vuex中的state是响应式的吗?
在 Vue.js 中,Vuex 的 state 是响应式的。这意味着当你更改 state 中的数据时,依赖于这些数据的 Vue 组件会自动更新。这是通过 Vue 的响应式系统实现的,该系统使用了 ES6 的 Proxy 对象来监听数据的变化。 当你在 Vuex 中定义了一个 state …...
k8s面试题总结(九)
1.K8s中pod删除失败,有哪些情况?如何解决? Pod删除失败的情况: (1) Pod被其他资源(如Deployment,ReplicaSet)引用,无法删除pod 解决:先删除引用该pod的资源,再删除pod…...
【JQuery—前端快速入门】JQuery 操作元素
JQuery 操作元素 1. 获取/修改元素内容 三个简单的获取元素的方法: 这三个方法即可以获取元素的内容,又可以设置元素的内容. 有参数时,就进行元素的值设置,没有参数时,就进行元素内容的获取. 接下来,我们需…...
三维数据可视化与表面重建:Marching Cubes算法的原理与应用
1. 引言 随着现代医学影像技术的飞速发展,三维数据的可视化与重建已成为医学研究、临床诊断和手术规划的重要工具。在众多三维重建算法中,Marching Cubes算法因其高效、稳定的特性成为从离散数据场中提取等值面的经典方法。本报告将深入探讨Marching Cu…...
网络变压器的主要电性参数与测试方法(2)
Hqst盈盛(华强盛)电子导读:网络变压器的主要电性参数与测试方法(2).. 今天我们继续来看看网络变压器的2个主要电性参数与它的测试方法: 1. 线圈间分布电容Cp:线圈间杂散静电容 测试条件:100KHz/0.1…...
端到端自动驾驶——cnn网络搭建
论文参考:https://arxiv.org/abs/1604.07316 demo 今天主要来看一个如何通过图像直接到控制的自动驾驶端到端的项目,首先需要配置好我的仿真环境,下载软件udacity: https://d17h27t6h515a5.cloudfront.net/topher/2016/November…...
# 【Unity】【游戏开发】赛车游戏中碰撞加速的实现方法
背景 在赛车类游戏开发中,常常需要实现赛车在碰撞某些道具或对象后加速的功能。例如,当赛车经过加速带或碰撞加速道具时,速度会瞬间增加,使游戏更具动态性和可玩性。本文将介绍一种通用的实现方式,并分析其逻辑。 分析 加速的核心逻辑如下: 判断碰撞条件:检测赛车是否…...
Dubbo本地服务调试
本地服务之间调试 参考这个文档: Dubbo本地调试 注意事项 本地主服务调用本地另外一个子服务,dubbo端口号与子服务的WEB端口号不一致。要查看子服务dubbo的配置文件,设置的rpc端口号是多少主服务中,最好在dubbo的配置文件&…...