Alibaba Spring Cloud 十二 Nacos 灰度发布

使用nacos进行灰度发布 一、前言 本文,引入Discovery【探索】微服务框架搭建一个简单的灰度发布demo,Discovery微服务框架源码即在源码,里面根据不同的使用者,有很多demo。如下: Discovery【探索】微服务框架指南示例说明 对于入门级玩家,参考指南示例极简版,分支为simple。涉及到指南篇里的灰度路由和发布的基本功能,参考新手快速入门 对于熟练级玩家,参考指南示例精进版,分支为master。除上述《极简版》功能外,涉及到指南篇里的绝大多数高级功能 对于骨灰级玩家,参考指南示例高级版,分支为p. 阅读详情
AI摘要

在微服务架构中,灰度发布可降低上线新功能风险。Nacos本身无灰度发布一键功能,需借助其标签、分组、元数据与Spring Cloud生态实现。本文介绍了使用Nacos标签、Group/Namespace、配置中心实现灰度的方法,还提及结合Spring Cloud Gateway/Zuul动态路由,最后给出灰度发布实施建议。

在微服务架构中,灰度发布(也称“金丝雀发布”或“蓝绿发布”)可以帮助我们在上线新功能时,将流量逐步引入到新版本,从而减少大规模变更带来的风险。Nacos 本身提供了服务注册和配置管理的能力,但并不直接内置“灰度发布”一键功能。通常,我们需要借助 Nacos 的标签 / 分组 / 元数据 与 Spring Cloud 生态(如 Gateway、LoadBalancer 等) 共同实现灰度的效果。

下面从几个常见思路出发,介绍如何在 Nacos 上进行灰度发布。


1. 使用 Nacos 标签(Metadata)实现灰度

1.1 原理

  • 服务实例标签(Metadata):
    在微服务启动时,将实例的某些信息(如版本、环境)放入 Nacos 的 metadata 中。
    例如:
    spring:
      cloud:
        nacos:
          discovery:
            server-addr: 127.0.0.1:8848
            metadata:
              version: v2  # 表示此实例的版本信息
    
  • 消费者端匹配标签:
    在调用其他微服务时,根据不同的元数据路由到对应版本的服务实例。
  • 灰度思路:
    部署一部分实例使用新版本(v2),另一部分使用旧版本(v1)。然后让调用端有选择地访问不同版本,从而实现灰度。

1.2 配置示例

(1) 在提供者服务中设置元数据

spring:
  application:
    name: product-service
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
        metadata
Spring Cloud Alibaba Nacos 之 灰度发布(思路分享) 在netflix全家桶相继凉凉后,Ribbon组件确一直坚挺包括在Spring Cloud Alibaba Nacos中也在使用。其实要基于Nacos做灰度发布,也是在Ribbon上做手脚。 第一步扩展Metadata Predicate public abstract class DiscoveryEnabledPredicate extends AbstractServerPredicate ... 阅读详情

相关推荐

Spring Cloud Alibaba 面试题及答案整理,最新面试题

如果Nacos在配置的时间内未收到某服务实例的心跳,会认为该实例不可用,从服务列表中移除。Spring Cloud Alibaba的Dubbo更深入地集成了Spring Cloud生态,提供了与Spring Cloud组件的无缝对接。Nacos提供动态的配置服务,允许应用在运行时动态调整配置而无需重启,支持配置的版本管理和回滚,以适应持续集成和持续部署(CI/CD)的需要。当 Nacos 中的配置信息发生变化时,Nacos Config 客户端会自动获取最新配置,并可以动态地更新到应用中,无需重启服务。

知识极客 9302

Spring Cloud Alibaba 全链路灰度发布实战指南

配置 LoadBalancer@Beanname);核心灰度算法实现@Override// 从Header或ThreadLocal获取// 简化示例,实际从上下文动态获取。

一起修行,不孤单。这里有编程语言、开发工具、学习方法论和踩坑笔记。用简单的话说复杂的事,陪你从小白到进阶。周更干货,欢迎一起成长! 732

Alibaba Spring Cloud 十一 Nacos 服务注册、发现与配置管理中心

Nacos(Naming and Configuration Service)是阿里巴巴开源的服务注册、发现与配置管理中心,也是 Spring Cloud Alibaba 生态下的重要组件之一

空 892

Spring Cloud Alibaba gateway ribbon 自定义负载均衡规则。发散灰度发布,金丝雀测试等

上一篇介绍了,ribbon的组件。本篇要自己写一个灰度方案。其实就是一个很简单的思维扩散。 需求 前端header请求携带version字段。路由服务根据version去需要对应版本的服务集合,进行或轮询或hash或权重的负载。请求路由到服务上,如果还要调用下游服务,也按照version规则去路由下游服务器。前端未携带版本按照后端服务最高version版本进行路由。 分析如果自己动手写一个灰度方案...

qq_35809876的博客 3277

Nacos服务发现原理与Spring Cloud Alibaba集成实战

服务发现是微服务架构中实现动态寻址与流量调度的基础能力,其核心在于注册中心如何保障服务元数据的一致性、实时性与可治理性。Nacos凭借CP/AP可切换架构、Raft共识算法与丰富的服务元数据模型,超越传统AP型注册中心(如Eureka),支撑灰度发布、权重路由、故障隔离等高级治理场景。结合Spring Cloud Alibaba的深度封装,开发者可通过标准注解无缝接入gRPC推送、本地缓存、命名空间隔离等能力。本文围绕Nacos服务发现的通信协议(gRPC/Long-Polling)、数据同步机制(Raft

weixin_33805992的博客 373

【Spring Cloud Alibaba】基于Spring Boot 3.x 搭建教程

本教程主要介绍如何基于搭建一个微服务项目,适合熟练使用框架,并且有进一步尝试新版本及学习搭建微服务项目的同学。致力于提供微服务开发的一站式解决方案。该项目包含开发分布式应用微服务的必需组件,方便开发者通过编程模型轻松使用这些组件来开发分布式应用服务。依托,我们只需要添加一些注解和少量配置,就可以将应用接入阿里微服务解决方案,通过阿里中间件来迅速搭建分布式应用系统。此外,阿里云同时还提供了SpringCloudAlibaba企业版。

m0_74825502的博客 1134

SpringCloud-Alibaba之Nacos共享配置、灰度配置

一个系统中微服务数量增加后,配置文件相应增加,多个配置文件中会存在相同的配置,那么我们可以将相同的配置独立出来,作为该系统中各个服务的共享配置文件,每个服务都可以通过Nacos进行共享配置的读取。配置加载的优先级spring.cloud.nacos.config.shared-dataids参数用来配置多个共享配置的Data Id,多个的时候用用逗号分隔。共享配置可以看到,spring.cloud.nacos.config.ext-config配置是一个数组List类型。

2401_83703835的博客 1006

Spring Cloud Alibaba 源码深度解析:Nacos 服务发现与 Sentinel 流控实现原理

在微服务架构中,服务治理是保障系统稳定性的核心,主要解决服务如何被找到以及如何被保护两大问题。服务发现通过注册中心实现服务的自动注册与发现,其底层通常采用心跳机制和长轮询推送来保证数据的最终一致性。流量控制则是通过实时统计请求指标并应用规则来防止系统过载,其中滑动时间窗口算法能有效平滑流量,解决临界突变问题。这些技术为构建高可用的分布式系统提供了基础保障。本文聚焦于 Spring Cloud Alibaba 生态下的两个关键组件:Nacos 实现了高效的服务注册与发现,其客户端通过周期性心跳维持实例健康,并

weixin_30425949的博客 497

Spring AI 与 Spring Cloud Alibaba 2025.0.0 兼容性缝合指南

Spring Boot 微服务中,大模型集成(如 Spring AI)与云原生基础设施(如 Spring Cloud Alibaba)的协同运行,依赖于配置加载时序、服务元数据契约和 Bean 生命周期的一致性。当 Spring Cloud Alibaba 升级至 2025.0.0,其基于 Spring Boot 3.3 的 BootstrapContext 重构与 Nacos 元数据强校验机制,会与 Spring AI 的自动装配逻辑产生时序冲突和初始化断点。典型表现为 ChatClient 初始化失败、

weixin_30588675的博客 310

Spring Cloud Alibaba微服务重构实战:从单体到微服务的渐进式演进

微服务架构是一种将单一应用程序拆分为一组小型、独立服务的软件架构风格,其核心原理是通过服务解耦实现独立部署、扩展和技术异构。这种架构的技术价值在于提升系统弹性、故障隔离能力和团队交付效率,尤其适用于应对高并发、快速迭代的业务场景。在工程实践中,面对单体应用的技术债务和性能瓶颈,采用渐进式重构策略是关键。通过领域驱动设计(DDD)划分服务边界,结合Spring Cloud Alibaba生态(如Nacos、Sentinel),可以在项目中期平滑完成架构升级。本文以Spring Boot单体应用重构为例,详细演

weixin_34068198的博客 370

微服务与云原生实战:Spring Cloud Alibaba 与 Kubernetes 深度整合指南

Spring Cloud Alibaba 与 Kubernetes 的整合为现代微服务架构提供了​​完整解决方案​​。通过 Nacos 实现服务发现与配置管理,Sentinel 实现流量控制,Seata 处理分布式事务,结合 Kubernetes 的容器编排能力,可以构建出高可用、高性能、易扩展的微服务系统。​​未来发展趋势​​​云原生深度融合​​:与 Kubernetes 生态更深度集成,如 Nacos Operator、Sentinel Operator​​Serverless 支持​。

2202_75574430的博客 1151

Spring Cloud Alibaba 全链路灰度发布实战

摘要:本文介绍了基于Spring Cloud Alibaba的全链路灰度发布实现方案。通过Nacos服务注册中心为实例打标,结合Spring Cloud Gateway实现流量标签识别和透传,利用自定义LoadBalancer策略完成标签匹配路由。文章详细演示了电商系统案例,包括环境配置、负载均衡策略实现、标签透传机制及测试验证方法。该方案支持灰度流量在调用链中全程隔离,并提供了权重路由、动态配置等优化方向,适用于微服务架构下的平滑发布场景。

wjianwei666的专栏 440

Spring Cloud Alibaba 的服务注册中心 Nacos 介绍

作者:禅与计算机程序设计艺术 1.简介 Nacos 是阿里巴巴开源的基于微服务的动态服务发现、配置和管理的服务中心,它不仅支持多数据中心和跨云环境,还支持 Kubernetes 和mesos 等容器管理平台。本文将从以下方面介绍 Nacos: 概念理解及功能特性

AI天才研究院 2859

基于Nacos元数据实现灰度发布,可以按照最小粒度灰度发布

使用方式 案例1: Nacos元数据配置 {"idDeptSign":"040101","ip":"192.168.1.2","springCloud":"register"} 前端请求头设置参数publicParam {"idDeptSign":"040101","ip":"192.168.1.2","idEmp":"12342134"} idDeptSign和ip值都相等,则会有灰度服务 案例2: Nacos元数据配置 {"idDeptSign":"040101","ip":"192.168.1.2","springCloud":"register"} 前端请求头设置参数publicParam {"idDeptSign":"040101","ip":"192.168.1.3","idEmp":"12342134"} ip不相等,所以不会走灰度配置 总结: 前端请求头的json内容key值如果和Nacos元数据json的key值相等,则value值必须相等,否则不走灰度服务。如果key值不相等,则不进行匹配

团结引擎+OpenHarmony 记录 (持续更新中)

获取不到的原因是因为二者不在同一个线程中,所以数据没有同步。而 globalThis.context 数据进行了同步。(TuanjieMainWorkerHandler.ts中可以看到)在进行绘制 UI 的时候 ,如果组件有 Native API 就可能不会显示出来,例如 web 控件就不能展示出来,刚加上权限的时候 会报错 因为缺少 reason ,添加上就不会报错了。只有纯 UI 控件是可以展示出来的,注释掉 web控件后就可以。

m_cainiaokuaifei的博客 1491

别再卡在Google验证了!用Header Editor插件5分钟搞定TryHackMe注册(附最新.json规则)

本文提供了使用Header Editor插件快速解决TryHackMe注册时Google验证失败问题的详细指南。通过导入特定的JSON规则文件,用户可以轻松绕过网络限制,5分钟内完成账号注册,无需复杂设置。文章包含完整的配置步骤、常见问题解决方案以及安全使用建议。

weixin_30736301的博客 462

宝塔面板 python管理器2.0安装Mrdoc

自从python管理器从1.9升级2.0后,导致原教程不能使用。 故关于2.0新开教程如下。 关于python管理器2.0 最大的区别在于: python管理器2.0不再需要进入虚拟环境,直接在当前环境进行操作,但是需要指定python路径及pip路径。 1、新建mrdoc工程目录,下载源码: 新建目录【mrdoc】,进入mrdoc目录,并在宝塔ssh或或远程ssh中执行 ,下载源码 git clone https://gitee.com/yang_lite/MrDoc.git .

debj031634的专栏 5992

【Ultrascale+ MPSOC学习记录】10、PS端以太网使用lwip

还是参考ALINX教程,学习PS端以太网如何使用,从教程中可以看到,开发板使用了一个xilinx默认不支持的phy JL2121,所以需要修改lwip的库源码。

ryo891012的博客 880

Win10 Rational Rose 安装教程

在此教程中我们需要四个文件,点此下载[提取码:ig33] 其中第一个为2007的安装包,第二个为破解文件 前言 很多小伙伴反应说会出现几天后就到期的问题,包括我也出现了该问题,如果你已在其他地方安装好了文件且破解成功,且但几天后到期,如果可以使用更改时间的方式打开,那么可以跳过接下来的教程,直接看第三节,我们采用批处理的形式一键完成从修改时间到打开最后改回来的方法解决此问题 一、安装软件 解压缩两个安装包,进入 Rational Rose文件夹 选择setup.exe开始安装 按照图示依次点击

CoderJiang 2万+

从理论到实践:全面解析Cmk(设备能力指数)的应用与优化

本文全面解析了设备能力指数Cmk的核心概念、计算逻辑与关键应用场景。Cmk作为衡量设备本身固有加工能力的黄金标准,在设备验收、大修后验证及过程能力根因分析中至关重要。文章通过实战案例,详细阐述了执行Cmk测试的“五大固定”黄金法则、数据计算分析方法,并提供了Cmk不达标时的系统性排查与优化策略,帮助制造企业实现预防性质量管理。

jump7的博客 523

Unity Addressable资源缓存路径自定义指南:告别C盘爆满烦恼

本文详细介绍了如何自定义Unity Addressable系统的资源缓存路径,解决其默认存储在C盘导致的磁盘空间不足问题。通过配置CacheInitializationSettings并编写编辑器脚本,开发者可以将缓存迁移至项目目录,实现资源的集中管理,提升团队协作效率与开发环境一致性。

pytorch8learner的博客 475

华为OD机试 - 城市聚集度(Python/JS/C/C++ 2025 A卷 200分)

华为OD机试 2025A卷题库疯狂收录中,刷题。

学Java,找哪吒 1130

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

上一篇: Alibaba Spring Cloud 十一 Nacos 服务注册、发现与配置管理中心
下一篇: Alibaba Spring Cloud 十三 Nacos,Gateway,Nginx 部署架构与负载均衡方案
十方来财
十方来财 新星创作者: 编程框架技术领域 新星创作者: 编程框架技术领域
博客等级 码龄14年 8358粉丝 346原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

十方来财

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值