权重配置踩坑实录,90%工程师忽略的Dubbo负载均衡细节

第一章:权重配置踩坑实录,90%工程师忽略的Dubbo负载均衡细节

在 Dubbo 服务治理中,权重配置是实现灰度发布、流量控制和性能调优的关键手段。然而,大量开发者在实际使用中忽略了权重生效的前提条件,导致配置无效或行为异常。

权重未生效的常见原因

  • Dubbo消费者缓存了提供者地址列表,动态调整权重后未触发刷新
  • 注册中心未支持权重元数据传递(如Nacos需开启metadata-report)
  • 负载均衡策略未正确选择为WeightedRandomLoadBalance

正确配置服务权重的步骤

  1. 在服务提供者端通过JVM参数或配置文件设置权重
  2. 确保注册中心支持并开启了元数据上报功能
  3. 验证消费者端是否实时感知权重变更
<dubbo:service interface="com.example.DemoService" ref="demoServiceImpl">
    <dubbo:parameter key="weight" value="200"/> <!-- 设置权重为200 -->
</dubbo:service>
上述配置将服务实例的调用权重设为200,默认为100。值越大,被选中的概率越高。但需注意,该配置仅在下一次服务发现时生效,已有连接不会自动重连。

不同负载均衡策略下的权重行为对比

策略名称类名是否支持权重
随机RandomLoadBalance是(默认)
轮询RoundRobinLoadBalance
最少活跃调用LeastActiveLoadBalance
graph TD A[服务启动] --> B{注册中心支持元数据?} B -->|是| C[上报权重信息] B -->|否| D[权重配置失效] C --> E[消费者拉取地址列表] E --> F[负载均衡器应用权重策略] F --> G[发起调用]

第二章:Dubbo负载均衡核心机制解析

2.1 负载均衡策略总体架构与扩展点设计

负载均衡策略的核心在于将请求合理分发至后端服务节点,同时具备良好的可扩展性。整体架构采用插件化设计,支持多种调度算法的动态注册与切换。
核心组件结构
  • 调度器(Scheduler):负责选择目标节点
  • 健康检查模块:实时探测节点可用状态
  • 扩展点接口:允许自定义权重计算、节点筛选逻辑
扩展点代码示例

type LoadBalancer interface {
    Select(nodes []*Node) *Node
    RegisterPlugin(plugin Plugin)
}
该接口定义了负载均衡器的基本行为。Select 方法根据当前节点列表选择一个服务实例;RegisterPlugin 支持运行时注入自定义插件,例如基于响应延迟的动态权重调整策略,提升系统灵活性。
策略对比表
策略类型适用场景扩展能力
轮询节点性能均等
加权最少连接异构集群

2.2 权重在RandomLoadBalance中的实现原理

RandomLoadBalance 是一种基于权重的随机负载均衡算法,其核心思想是根据服务提供者的权重值来调整被选中的概率。
权重影响选择概率
服务实例的权重越大,被选中的机会越高。例如,若三个节点权重分别为 1、2、3,则总权重为 6,对应被选中的理论概率分别为 1/6、2/6、3/6。
加权随机算法实现

public Invoker<?> select(List<Invoker<?>> invokers) {
    int totalWeight = invokers.stream().mapToInt(this::getWeight).sum();
    Random random = new Random();
    int offset = random.nextInt(totalWeight);
    for (Invoker<?> invoker : invokers) {
        offset -= getWeight(invoker);
        if (offset < 0) return invoker;
    }
    return invokers.get(0);
}
该代码通过累减偏移量的方式实现加权随机选择。首先计算总权重,生成一个随机偏移量,然后逐个减去各节点权重,当偏移量小于0时返回当前节点,从而保证高权重节点更可能被选中。

2.3 LeastActiveLoadBalance中权重的动态调节作用

在负载均衡策略中,LeastActiveLoadBalance通过实时统计各服务实例的活跃请求数,优先将新请求分配给当前负载最低的节点。其核心优势在于引入了权重的动态调节机制,使性能更强或负载更低的实例能被更高效地利用。
动态权重调整逻辑
权重并非静态配置,而是结合实例响应时间与当前活跃调用数动态计算:

int weight = getWeight(invoker, invocation);
if (active > 0) {
    weight = weight * activePrevRatio / active;
}
上述代码片段中,`active`表示当前活跃请求数,`activePrevRatio`为历史活跃度比例因子。当某实例处理速度快、活跃数低时,其实际分配权重会提升,从而获得更高调用概率。
调节效果对比
实例静态权重活跃请求数动态调整后权重
A100250
B1001010
可见,尽管A与B初始权重相同,但因A负载更低,最终获得更高调度优先级。

2.4 ConsistentHashLoadBalance与权重兼容性分析

一致性哈希负载均衡原理
ConsistentHashLoadBalance 通过构建哈希环实现节点均匀分布,请求根据 Key 映射到环上最近的节点,显著降低节点增减时的数据迁移量。
权重兼容性机制
传统一致性哈希难以直接支持权重,但可通过虚拟节点扩展实现。每个物理节点按权重生成多个虚拟节点,从而在哈希环上占据与其权重成正比的位置数量。
  1. 计算各节点权重比例,如 A:3, B:1 → A生成3个虚拟节点,B生成1个
  2. 将虚拟节点映射至哈希环,提升高权重要素的命中概率
  3. 请求Key经哈希后顺时针查找,定位至首个虚拟节点对应的实际实例

// VirtualNode represents a virtual node on the hash ring
type VirtualNode struct {
    RealAddr string
    Index    int
}
// Hash calculates hash value for key
func (vh *VirtualNode) Hash(key string) uint32 {
    h := crc32.ChecksumIEEE([]byte(key + "-" + vh.RealAddr + fmt.Sprint(vh.Index)))
    return h
}
上述代码通过拼接真实地址与索引生成差异化哈希值,确保同一物理节点的多个虚拟节点分散在环的不同位置,实现加权负载均衡。

2.5 源码级剖析:WeightedRoundRobin如何支撑权重轮询

核心数据结构设计
WeightedRoundRobin 调度算法通过为每个服务节点维护权重与当前调度值,实现按权重分配请求。关键字段包括节点权重 weight、当前调度计数 currentWeight
type Node struct {
    Name           string
    Weight         int
    CurrentWeight  int
}
CurrentWeight 在每次调度中动态调整,确保高权重节点被更频繁选中。
调度流程解析
调度器遍历所有节点,累加权重并找出最大 currentWeight 节点:
  1. 所有节点的 currentWeight 增加其原始 weight
  2. 选择 currentWeight 最大的节点作为本次目标
  3. 该节点的 currentWeight 减去总权重和
节点权重初始 currentWeight
A40
B20
C10
此机制保障了长期调度比例严格对齐配置权重。

第三章:权重配置常见误区与典型问题

3.1 静态权重设置忽视JVM预热导致流量倾斜

在微服务架构中,负载均衡常采用静态权重分配策略。然而,该方式未考虑JVM刚启动时的预热阶段,导致新生实例因立即承担高流量而性能滞后,引发流量倾斜。
JVM预热机制的影响
Java应用在启动初期需进行类加载、JIT编译等操作,此时处理能力仅为稳定期的30%~50%。若此时分配全量请求,极易造成响应延迟甚至超时。
动态权重调整示例
可通过服务注册时标记预热状态,结合时间衰减函数逐步提升权重:

// 基于启动时间计算权重比例
long uptime = System.currentTimeMillis() - startTime;
int weight = (int) Math.min(maxWeight, maxWeight * 0.8 * uptime / 60000); // 60秒线性增长
上述代码实现60秒内权重线性上升,避免新实例突增流量。其中startTime为服务启动时间戳,maxWeight为最大权重值。
  • 静态权重无法反映实例真实负载能力
  • JVM预热期间GC频率更高,处理吞吐下降
  • 建议结合健康检查与动态权重插件实现平滑上线

3.2 动态权重未结合实际机器性能引发雪崩

在微服务架构中,动态权重常用于负载均衡策略,通过实时响应请求处理能力分配流量。然而,若权重计算未纳入机器的实际性能指标(如 CPU 负载、内存使用率或网络吞吐),极易导致高负载节点接收过多请求。
典型问题场景
  • 新上线的高性能服务器与旧机器被赋予相同基础权重
  • 突发流量下,动态算法仅依据请求数调整,忽略系统资源瓶颈
  • 某节点因短暂 GC 停顿被持续打满,触发级联失败
改进方案示例
func CalculateWeight(stats *NodeStats) int {
    // 综合CPU使用率、内存和活跃连接数
    cpuScore := 100 - stats.CPUUsage
    memScore := 100 - stats.MemoryUsage
    connScore := 100 - (stats.ActiveConns * 100 / stats.MaxConns)
    return (cpuScore + memScore + connScore) / 3
}
该函数将多维硬件状态归一化为综合评分,确保调度器不会将过多流量导向真实负载较高的实例,从而避免雪崩效应。

3.3 注册中心权重覆盖逻辑导致配置失效

在微服务架构中,注册中心动态管理服务实例的权重以实现流量调度。然而,当客户端本地配置了固定权重时,注册中心的全局权重策略可能因覆盖逻辑不当而被忽略。
权重配置冲突场景
  • 服务A在Nacos中设置权重为0.8用于灰度发布
  • 客户端启动时通过本地配置文件强制指定权重为1.0
  • 客户端注册后,本地值覆盖注册中心策略,导致灰度失效
典型代码示例

spring:
  cloud:
    nacos:
      discovery:
        weight: 1.0 # 本地硬编码权重,覆盖中心配置
该配置项优先级高于注册中心动态值,造成配置漂移。应通过元数据方式从注册中心拉取权重,避免本地固化。
解决方案建议
方案说明
禁用本地权重移除配置文件中的 weight 字段
启用动态加载通过监听器实时获取注册中心权重变化

第四章:生产环境下的权重调优实践

4.1 基于压测数据科学设定初始权重值

在负载均衡策略中,初始权重值的设定直接影响系统在高并发场景下的稳定性与资源利用率。传统静态赋值方式难以适应动态变化的服务器性能表现,因此需依托压测数据进行科学建模。
压测指标采集
通过 JMeter 或 wrk 对各服务节点执行标准化压力测试,采集关键性能指标:
  • 平均响应时间(RT)
  • 每秒请求数(RPS)
  • 错误率
  • CPU 与内存占用率
权重计算模型
采用归一化方法将多维指标融合为综合性能评分:
// 示例:基于响应时间和吞吐量计算相对权重
func calculateWeight(rt, rps []float64) []int {
    var scores []float64
    maxRT := max(rt)
    maxRPS := max(rps)
    for i := range rt {
        normalizedRT := rt[i] / maxRT
        normalizedRPS := rps[i] / maxRPS
        score := (1 - normalizedRT) * 0.4 + normalizedRPS * 0.6 // 权重系数可调
        scores = append(scores, score)
    }
    return normalizeToInt(scores, 10, 100) // 映射到 [10,100]
}
该函数将响应时间与吞吐量加权合并,输出标准化后的整数权重,确保高性能节点获得更高流量分配优先级。

4.2 利用Nacos/Dashboard动态调整实现弹性扩缩容

在微服务架构中,利用 Nacos 配置中心与 Dashboard 可视化界面,可实现服务实例的动态扩缩容。通过监听配置变更,服务能实时响应负载变化。
配置监听与响应机制
应用启动时注册至 Nacos,并监听特定配置项:
// 注册并监听配置
configService.addListener("service-scale.yaml", listener);
当 Dashboard 修改配置时,Nacos 推送更新,触发本地扩容逻辑。
弹性策略执行流程

用户请求 → Dashboard 调整副本数 → Nacos 配置更新 → 服务实例感知 → 动态创建/销毁线程池或上报注册中心扩缩容意图

参数说明
replicas目标副本数量,由 Dashboard 设置
trigger-condition触发条件,如 CPU > 80%

4.3 结合监控指标(RT、QPS)实现智能权重分配

在高并发服务治理中,基于实时监控指标动态调整节点权重是提升系统稳定性的关键手段。通过采集各实例的响应时间(RT)和每秒查询率(QPS),可构建自适应负载均衡策略。
权重计算模型
采用归一化方法对 RT 和 QPS 进行加权评分:
  • RT 越低,健康度越高
  • QPS 合理区间内越高,服务能力越强
动态权重配置示例
func CalculateWeight(rt, qps float64) int {
    // RT 标准化:以 100ms 为基准,每增加 10ms 扣 5 分
    rtScore := math.Max(0, 100 - (rt-100)/10*5)
    // QPS 加分项:每 100 请求加 1 分,上限 50
    qpsScore := math.Min(50, qps/100)
    return int(rtScore*0.7 + qpsScore*0.3) // 综合得分
}
该函数将 RT 和 QPS 融合为单一权重值,侧重响应性能,兼顾吞吐能力,用于服务注册中心动态更新节点权重。

4.4 多版本灰度发布中的权重渐进式切换方案

在微服务架构中,多版本共存是实现平滑升级的关键。权重渐进式切换通过动态调节流量分配,逐步将请求从旧版本迁移至新版本,降低发布风险。
流量权重配置示例
version: v1
  weight: 80
version: v2
  weight: 20
上述配置表示 80% 的流量由 v1 版本处理,20% 流向 v2。可通过控制平面实时调整权重,实现分钟级灰度推进。
渐进策略执行流程
请求入口 → 路由引擎 → 按权重分流 → v1/v2 实例集群 → 监控反馈
监控系统实时采集新版本的错误率与延迟指标,若超出阈值则暂停权重提升,确保系统稳定性。
权重调整时间表
阶段时间窗v1 权重v2 权重
初始灰度T+0100%0%
首次切流T+5min90%10%
全量切换T+30min0%100%

第五章:总结与避坑指南

常见配置陷阱与应对策略
在微服务部署中,环境变量未正确加载是高频问题。例如,Kubernetes 中 ConfigMap 更新后,Pod 并不会自动重启,需手动触发滚动更新:
apiVersion: apps/v1
kind: Deployment
spec:
  template:
    metadata:
      annotations:
        configHash: <calculated-hash>  # 触发滚动更新的关键
性能瓶颈识别路径
使用 pprof 分析 Go 服务 CPU 占用过高时,应优先检查 Goroutine 泄漏:
import _ "net/http/pprof"

// 启动调试端口
go func() {
    log.Println(http.ListenAndServe("localhost:6060", nil))
}()
通过访问 http://localhost:6060/debug/pprof/goroutine?debug=1 可获取当前协程堆栈。
依赖管理最佳实践
避免因版本漂移导致的生产事故,推荐使用以下 go.mod 配置模式:
  • 明确锁定主版本,如 require github.com/gin-gonic/gin v1.9.1
  • 禁用间接依赖自动升级:exclude golang.org/x/crypto v0.0.0-20220101
  • 定期执行 go list -m -u all 检查可升级模块
监控告警设计误区
许多团队仅监控 HTTP 状态码,忽略业务级异常。应结合 Prometheus 自定义指标:
指标类型示例告警阈值
Counterlogin_failure_total>5/min
Gaugeactive_sessions<10(低峰期)
源码直接下载地址: https://pan.quark.cn/s/a4b39357ea24 过采样与欠采样构成了数字信号处理领域中两种基础的采样策略,它们在工程实践应用时各自展现出独特的长处与短处及适用情境。以下将深入阐释这两种采样方法的运作机制,并对它们在实际操作中的区别进行细致对比。 我们首先阐释过采样的核心概念。过采样(Oversampling)一般是指运用高于必要标准频率对模拟信号实施采样。举例而言,当信号频率为70MHz且信号带宽为20MHz时,依据奈奎斯特采样准则,理论上采样频率只需略高于40MHz(即信号带宽频率的两倍)即可达成无失真采样。然而,在现实操作中,系统构造者常常会采用超过140MSPS(每秒百万次采样)的采样速率,这通常超出理论所需。过采样的主要不利之处涵盖:提升ADC输出数据速率,引发FPGA的时序挑战;增大功耗、ADC及FPGA的制造成本。尽管存在这些不足,过采样依然具备其有利之处,例如可提供处理增益、频率规划的伸缩性以及能够处理更宽的信号带宽。 接下来,我们探讨欠采样的基本原理。欠采样(Undersampling)是指以低于理论标准频率对信号进行采样,这在处理高输入信号频率时尤为有效。例如,针对70MHz的中频(IF)信号,通过欠采样能够采用低于40MHz的采样频率进行采样,从而将数据速率降至FPGA,减少时序挑战,节省能量消耗成本。实现欠采样的关键设计考量在于它能够在系统设计中达成所需的ADC动态性能。 欠采样的优势体现为能够简化硬件构造,比如降低对高速数据捕获的需求,并且在设计条件允许时,可选用较慢的ADC来削减成本。然而,欠采样技术也存在其局限性,例如在ADC的非理想表现可能导致非线性失真,诸如二阶(HD2)三阶(HD3)谐...
源码链接: https://pan.quark.cn/s/3523d8c4b5d2 ### Qt5.9.1开发的应用程序转换为可安装`.exe`文件的详细流程 #### 一、概述 本资料将系统性地阐述如何将基于Qt5.9.1版本或其他Qt框架版本开发的应用程序转化为可直接安装的`.exe`安装文件。这一过程不仅适用于Qt5.9.1版本,对其他版本的Qt框架开发的应用同样适用。 #### 二、前期准备 在开展相关操作前,需确保已达成以下准备要求: 1. **开发环境配置**: 利用Qt5.9.1或其他版本完成应用程序的开发工作,并保证能够顺利编译出可执行程序。 2. **NSIS安装**: NSIS(Nullsoft Scriptable Install System)作为一个开源的Windows安装系统,能够支持创建专业的安装程序。用户可从官方渠道或可靠来源获取最新版的NSIS并进行安装。 #### 三、制作可执行程序的流程 ##### 3.1 打包应用程序文件 需要将已开发好的Qt应用程序的所有组件资源整合到一个文件夹中,例如命名为`Qt_Video`。确保该文件夹内包含所有必要的库文件资源文件,以便应用程序能够独立运行。 ##### 3.2 压缩文件随后,将整个`Qt_Video`文件夹压缩成`.zip`格式的文件。这一步骤可通过Windows内置的压缩工具或第三方软件完成。 ##### 3.3 创建安装文件接下来,借助NSIS将压缩文件转化为安装文件。具体操作如下: 1. **启动NSIS**: 运行NSIS软件并进入其主界面。 2. **选择基于ZIP的安装模式**: 在主界面中选取“**Installer based on ZIP file**...
内容概要:本文介绍了一种结合单像素检测与数据融合技术的千亿体素级多维荧光成像方法,并提供了完整的Matlab代码实现。该方法融合压缩感知理论与单像素成像原理,通过优化测量矩阵设计、重构算法及多维度数据融合策略,实现了在大幅降低数据采集量的前提下,完成高分辨率、高通量的三维荧光成像,特别适用于大规模生物样本的快速、高效成像需求。文中系统阐述了成像系统的建模过程、关键算法的设计思路以及重建性能的优化路径,充分展现了其在超高体素规模下的成像能力与精确重构优势。; 适合人群:面向具备信号处理、光学成像或生物医学工程等相关专业背景的研究生、科研人员及工程技术开发者,尤其适合熟悉Matlab编程并致力于先进成像技术研究与算法复现的专业人士。; 使用场景及目标:①应用于大规模生物组织的三维荧光成像,显著提升成像效率与图像质量;②为单像素成像、压缩感知与多源数据融合等前沿技术提供可复现、可扩展的算法框架;③支撑高维医学影像重建、新型显微成像系统开发及相关科研与工程实践。; 阅读建议:建议结合所提供的Matlab代码进行模块化分析,重点理解测量过程的数学建模与图像重构算法的实现细节,宜在掌握基本理论的基础上开展仿真实验与参数调优,以深入把握核心技术原理与工程实现要点。
下载代码方式:https://pan.quark.cn/s/a4b39357ea24 Node.js 是一种开放源代码且能够在多种操作系统上运行的 JavaScript 执行环境,它使得开发人员能够在服务器端执行 JavaScript 代码。Node.js 采用了 V8 引擎,该引擎是由 Google 为 Chrome 浏览器开发的一个高性能的 JavaScript 解释器。Node.js 的 16.x 版本在其发展历程中占据着重要位置,其中包含了众多新功能以及性能上的改进。标题 "Nodejs16-x64 windows安装包" 指向的是专为 Windows 操作系统设计的 64 位版本的 Node.js 16 安装程序。在 Windows 平台上安装 Node.js 的 64 位版本对于处理大量数据或运行需要高性能的应用程序来说尤为关键,因为 64 位系统能够更有效地利用硬件资源。描述 "Nodejs-16 x64位windows 安装包" 明确了该安装程序是为 Windows 用户准备的,特别是对于那些需要运行 64 位应用程序的用户。x64 表明该版本兼容 64 位架构,意味着它能够充分利用 64 位计算机的内存处理能力。标签 "Node Nodejs nodejs16" 提供了关于此安装包的核心信息,表明它与 Node.js 相关,并且具体指的是 v16 版本。这些标签有助于进行搜索分类,从而方便用户找到他们所需要的特定版本。压缩包文件 "node-v16.18.0-x64.msi" 代表实际的安装文件,其中 "v16.18.0" 指示了 Node.js 的具体版本号,"x64" 再次强调了其适用于 64 位系统,而 ".msi" 后缀表明这是一...
源码链接: https://pan.quark.cn/s/3af847fbbec7 在计算机科学与编程领域中,十六进制(Hexadecimal)以及二进制(Binary)是两种关键性的数值表示方法。十六进制属于一种基于16的计数系统,它运用0至9的数字以及字母A至F(分别象征10至15的数值)来呈现数值,与此同时,二进制则是一种基于2的计数系统,仅采用01两个符号。掌握这两种进制之间的相互转换对于深入理解计算机内部运作机制具有决定性意义,因为计算机在底层数据的存储与处理环节通常都是以二进制的形式来进行的。将十六进制转换成二进制的过程可以通过以下几个环节得以完成: 1. **单个十六进制符号的转换**:每一个十六进制符号对应着4位二进制序列。具体而言: - 十六进制中的`0`在二进制表达为`0000` - 十六进制中的`1`在二进制表达为`0001` - 十六进制中的`2`在二进制表达为`0010` - 依此类推 - 十六进制中的`9`在二进制表达为`1001` - 十六进制中的`A`或`a`在二进制表达为`1010` - 十六进制中的`B`或`b`在二进制表达为`1011` - 十六进制中的`C`或`c`在二进制表达为`1100` - 十六进制中的`D`或`d`在二进制表达为`1101` - 十六进制中的`E`或`e`在二进制表达为`1110` - 十六进制中的`F`或`f`在二进制表达为`1111` 2. **多位十六进制符号的转换**:针对一个由多个十六进制符号组成的数值,我们可以逐个符号进行转换,并将得到的二进制序列依次拼接。例如,十六进制数`3F`转换成二进制形式为`00111111`。 3. **编程实现方法**:在编程实践过程中,众多编程语言提...
下载代码方式:https://pan.quark.cn/s/a4b39357ea24 **Vue.js 框架全面解析** Vue.js 是一种轻量级且高性能的前端JavaScript框架,因其便捷性、适应性可扩展性而备受开发者青睐。在“nodejs+vue”的在线购物平台中,Vue.js 主要承担构建用户界面的任务,并提供数据绑定、组件化、路由管理等关键功能。 1. **数据绑定**:Vue.js 的核心优势之一是双向数据绑定,它借助 `v-model` 指令将视图与数据模型建立联系,确保视图层的变动能即时同步到数据模型,同时数据模型的变化也能实时反映在视图上。在在线购物平台中,这一特性可用于商品列表的动态展示购物车状态的即时调整。 2. **组件化**:Vue.js 提供了功能强大的组件体系,允许开发者将用户界面拆分为独立且可复用的模块。例如,在在线购物平台中,商品展示模块、购物车功能、支付流程等均可封装为组件,从而提升代码的复用性可维护性。 3. **指令与过滤器**:Vue.js 中的指令如 `v-if`、`v-for` `v-bind` 用于控制元素的渲染方式及行为,过滤器则能对数据进行格式化处理,例如货币显示、时间格式转换等。在在线购物平台中,这些功能有助于更有效地展示商品信息并优化用户交互体验。 4. **计算属性与侦听器**:计算属性能够监测多个数据源并输出计算结果,而侦听器则能在数据变动时执行指定操作。在在线购物平台中,计算属性可用于自动计算购物车总金额,侦听器则可响应库存变动并实时更新商品状态。 5. **Vue Router 路由管理**:在单页应用(SPA)环境中,Vue Router 是不可或缺的组件,它负责管理页面间的导航...
打开链接下载源码: https://pan.quark.cn/s/a4b39357ea24 我的世界开发者中文指南 MCBBS关站致使大量教程失效,恳请各位读者协助指南联系相关作者及时迁移教程。 点击右上方的“Watch”按钮以实时获取中文指南的更新情况,点击右上方“Star”按钮以支持中文指南的编撰。 欢迎各位在此提交各类我的世界开发相关教程、资料、文档、类库。 欢迎加入我的世界开发讨论Q群:345538010 发布定制或承接定制请加入我的世界定制交流Q群:1047988033 目录 提问的方法 常用网站与资源 Java基础 Forge模组 NeoForge模组 Bukkit/Spigot插件 Fabric模组 BungeeCord插件 Sponge插件 数据包 Java版启动器 基岩版服务端 基岩版Addons 基岩版模组 网易基岩版 着色器包 过时资源 版权声明 提问的方法 当你遇到使用搜索引擎、查阅相关文档、进行Debug(如果没有做过上述操作的话,请立刻去做)也无法解决的问题的时候,你可能会向他人求助。 当你提问时,请确保你准确提供了以下信息: 准确描述你的需求实际问题情况。 准确描述你所在的平台的信息。 例如: - Java 版本 - 所用开发工具及其版本(如IntelliJ IDEA、Eclipse) - 所用自动化构建工具及其版本(如Maven、Gradle) - Minecraft 版本 - Bukkit/Spigot/Forge/Sponge/Fabric 任一所在平台及其版本 - 依赖的类库、模组或插件及其版本 提供你的源代码或SSCCE(最小化、完整、可验证的问题示例),将源代码包括项目描述文件完整上传至源码托管平台(如码云、)。 提供你的完整日...
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值