架构解密从分布式到微服务:经典的网络文件系统NFS

分布式文件系统之NFS 在文件系统这个领域,早期的分布式实现更多的是用来实现「共享」,而不是「容错」。与之相对的另一种方式是:哪个文件被client打开了,访问到文件的哪个位置了(即"offset"),server通通都不记录,由client自己维护,并在发送读写文件请求时,包含所需的全部信息(self-contained),即。最早的分布式文件系统诞生自上世纪70年代,目前依然在使用的FTP算是其中老资格的代表,但FTP的使用涉及文件的上传和下载,而随后出现的NFS,提供了像访问本地文件一样访问远程文件的方式。 阅读详情

经典的网络文件系统NFS

分布式文件系统是分布式系统领域发展最早、应用领域众多、不断推陈出新的基础设施之一。前面提到的NFS就是个古老并且生命力顽强的分布式文件系统,它于1984年诞生在Sun的实验室里(比HTTP还古老),因为基于TCP/IP 设计,所以成为第1个现代化的网络文件系统。时至今日,NFS已经演变成UNIX系统中强大且使用广泛的网络文件系统,并且成功进入虚拟化领域,成为虚拟化基础设施中的重要组成部分。除了虚机,当前流行的Docker容器也支持远程的NFS Volume。

如下图所示,以NFS为代表的网络文件系统的核心思想,是将某个远程 Server 上的指定文件目录映射(Mount)到本机文件系统的某个目录上,使得从客户端看来,访问远程文件与本地文件没有什么区别,并且所有针对本地文件的IO读写的程序不用修改任何代码,就可以直接用于远程文件的读写。因为对最终用户及程序开发者透明,所以NFS有扎实的群众基础,并因此而“长寿”。

架构解密从分布式到微服务:经典的网络文件系统NFS

 

那么,NFS是如何实现与Linux本地文件系统无缝对接的呢?这要从Linux 的虚拟文件系统说起。由于在 Linux世界里允许众多不同的文件系统共存,比如 EXT3、EXT4、XFS、Btrfs及特别适合Docker容器存储的Overlayfs,因此为了支持各种实际的文件系统,Linux在内核层面设计了一套虚拟文件系统(Virtual File System,VFS),VFS定义了所有文件系统都必须支持的一套与文件相关的数据结构和基本接口,每个具体的文件系统都必须实现对应的 VFS 接口,才能被VFS纳入,成为操作系统支持的文件系统。正是由于VFS的存在,NFS才可以很方便地实现与本机其他文件系统的无缝对接。如下图所示,当用户程序访问一个NFS 映射的文件时,VFS将请求转发给本机的NFS Client进程,这是NFS的一个守护进程(Daemon进程),它在收到请求以后,就通过RPC远程过程调用的方式与远程的NFS Server通信,通过网络传输方式获取远程文件的内容,最后返回给用户的进程。

架构解密从分布式到微服务:经典的网络文件系统NFS

 

NFS为了保证文件传输的效率,默认采用UDP而不是TCP,这与FTP 不同。此外,为了解决分布式情况下的文件共享冲突问题,NFS也提供了对分布式文件共享锁的支持。NFS的配置过程也不复杂,首先是在Server 服务器端启动NFS的服务端进程,确定哪些目录可以开放给客户端挂载;其次,Client客户端机器选择挂载哪些目录,一旦挂载好,访问起来就跟本地文件一样了。下面的命令是挂载192.168.0.100的/usr/local/test目录到本机的/usr/local/test目录:

mount -t nfs 192.168.0.100 :/usr/local/test /usr/local/test

从NFS 的架构体系来看,它可以把任意数量的服务器上的文件系统无缝接入本地服务器,形成一个星状的分布式文件系统。从数据分片的思想来看,NFS其实是一种完全由用户自定义分片路由的分布式文件系统,假设我们有10台服务器(192.168.0.1~192.168.0.10),每台都有2TB的本地磁盘(/storage),则为了将20TB的文件存储到这10台服务器上,我们可以在Client服务器上建立10个目录作为分片目录(/storage/1-/storage/10)分别映射到这10台服务器的某一台上。

本文给大家讲解的内容是架构解密从分布式到微服务:深入解析分布式文件存储,经典的网络文件系统NFS

  1. 下篇文章给大家讲解的是架构解密从分布式到微服务:深入解析分布式文件存储,高性能计算领域的分布式文件系统;
  2. 觉得文章不错的朋友可以转发此文关注小编;
  3. 感谢大家的支持!
使用TinyProxy搭建代理服务器 背景 办公电脑所在网络无法连接外网,机房服务器可以连接外网,通过服务器代理上网; 一、CentOS下TinyProxy安装–搭建代理服务器 TinyProxy是个轻量级简单的HTTP/HTTPS代理程序,GitHub和官网,安装方式这里主要介绍两种 CentOS下yum安装,参考:TinyProxy安装 Docker安装 先安装docker环境yum install docker -y 二、Win10下使用 ... 阅读详情

相关推荐

数字IC后端设计实现 | PR工具中到底应该如何控制density和congestion?(ICC2&Innovus)

数字IC后端设计实现中到底应该如何控制cell density和congestion?(ICC2和Innovus两种解决方案)

weixin_37584728的博客 7113

分布式文件系统-NFS

Linux中的网络文件系统NFS (Network File System)是一种分布式文件系统协议,它允许用户在网络上远程访问和操作文件,就好像这些文件存储在本地计算机上一样。NFS最初由Sun Microsystems在1980年代开发,现在已成为UNIX和Linux操作系统中普遍支持的标准组件。

邢宇宇的博客 2074

Windows Server 2012 R2虚拟机安装全攻略:从镜像选择到网络配置一步到位

本文提供Windows Server 2012 R2虚拟机安装全攻略,涵盖从镜像选择到网络配置的完整流程。详细讲解在Oracle VM VirtualBox中的安装步骤、TCP/IP网络设置、系统优化及常见问题解决方案,帮助用户快速搭建可立即投入使用的服务器环境。特别适合IT初学者和系统管理员学习传统服务器应用的部署与配置。

weixin_28363123的博客 538

分布式文件系统协议:NFS(Network File System)网络文件系统

NFS允许不同计算机通过网络共享资源,特别是文件和目录,就像它们是本地存储的一部分一样。使用NFS的客户端可以挂载远程服务器上的文件系统,使得用户能够以透明的方式访问远程数据,实现跨多个系统的文件共享。

par@ish的博客 3400

手机拍照也能玩高光谱?教你用TensorFlow Lite在Android上实现实时RGB转高光谱

本文介绍了如何利用TensorFlow Lite在Android设备上实现实时RGB到高光谱的图像重构技术。通过深度学习模型优化和移动端部署策略,使智能手机具备专业级光谱分析能力,适用于农业检测、化妆品分析等多个领域。

weixin_29091105的博客 247

Kinect V1结构光激光散斑原理及样式

   对 intel realsense F200 和 Kinect V1的coding pattern原理进行调研,知二者都使用light coding的方式,该方法与传统的coded structure light不同:传统编码结构光(空间编码,时间编码)最终使用的是三角测量的原理计算深度信息;light coding通过投射具有高度伪随机性的激光散斑,会随着不同距离变换不同

松间明月 1万+

Kubernetes 卷存储 NFS | nfs搭建配置 原理介绍 nfs作为存储卷使用

NFS(Network File System)是一种分布式文件系统协议,允许客户端远程访问服务器上的文件,实现数据共享。它整合多个存储设备为统一文件系统,方便数据存储和管理,支持负载均衡和故障转移,确保服务高可用和可扩展。但需注意,NFS依赖网络环境,网络状况影响其性能,且配置管理需技术经验。nfs端口:2049RPC端口:111wnfs原理工作原理主要基于客户端-服务器架构。在NFS环境中,服务器端运行NFS服务,将本地文件系统中的文件共享给网络上的其他计算机。

weixin_48711696的博客 2190

【AI大模型应用开发】【RAG评估】0. 综述:一文了解RAG评估方法、工具与指标

本文主要总结了当前比较流行的RAG评估方法和指标。当前AI技术的快速发展,RAG和RAG评估是当前比较有前景的发展方向,不断有新的评估工具和理论被提出,让我们持续跟进,了解这些工具和理论,从而在使用时知道如何选择。

同学小张的博客 6828

全网首发,20年架构师手写《架构解密:从分布式到微服务》开源

本篇首先从分布式架构的基本概念入手,介绍了分布式系统的特点、挑战和常见解决方案。接着,作者详细讲解了分布式系统中的关键技术,包括负载均衡、分布式缓存、分布式数据库等,帮助读者理解和应用这些技术。随后,本书重点聚焦于微服务架构的设计与实践。作者从微服务架构的优势和挑战出发,深入剖析了微服务架构的核心概念和原则,并通过实际案例演示了如何进行微服务拆分、服务治理、服务间通信等方面的设计与实现。本书的特点之一是作者注重实践,通过丰富的示例和案例,读者可以更加深入地理解架构设计的过程和技巧。

知识分享官 1072

腾讯面试——机器学习岗面试总结

先写合并两个有序数组,接着写合并n个有序的数组,假设总共m个数,讲了一个思路两两合并直到只剩下一个数组,分析一下时间复杂度(MlogN),面试官不满意,然后想了一下说了另一个思路,用n个指针开始指向各个数组的首端,用一个优先队列维护他们的最小值,每次拿出最小值的指针然后插入该指针的下一个值。感觉跟二面面试官聊得还是挺开心的,他详细地介绍了他们部门所做的业务,然后问了一下什么时候能来实现,我说只能暑假七八两个月,他觉得有点晚,这样子不利于转正,有些人都实习半年的,回去讨论一下,正式批之前给我答复。

FPGA/MATLAB学习教程/源码/项目合作开发 1232

使用virtuoso gds转lef操作方法

2) 然后,需要创建Pin,这里Pin的概念不同于label/text,是有实际金属的,二者的区别类似于pr中的port和terminal。1) 首先,需要画prBoundary,这个用drawing层的prBoundary画是不行的,不过建议pr阶段就把prBoundary转到gds里,在virtuoso layout中画prBoundary就比较容易。另外,用Create - Create Pin也可以创建pin,更适用于PG pin,操作时先给pg shape打label,最好放正中间。

m0_61544122的博客 1380

赞!期待已久的《架构解密:从分布式到微服务》终于出第2版了

微服务、云原生、Kubernetes、Service Mesh 是分布式领域的热点技术,它们并不是凭空出现的,一定继承了某些“前辈”的优点。我们不仅要了解这些技术,还要深入理解其发展脉络、原理等,才能游刃有余地将其用于现有的项目开发或老系统改造中。 以下是这位资深架构师的笔记内容: 由于内容过多,为了避免影响到大家的阅读体验,在此只以截图展示部分内容。有需要获取完整版的朋友点赞后,私信【笔记】即可(一定要记得关注我,不然没办法回复陌生人私信) 第1章:深入理解网络 讲解分布式的基础一-网络, 对

热衷技术的Java程序员 1524

VC中sqlite的使用

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

技术探讨,阿里高级架构师帮你架构解密:从分布式到微服务

分布式架构与微服务平台是当今IT界的关键技术,也是资深软件工程师和系统架构师必须掌握的核心技术。本书以从传统分布式架构迁移到基于容器技术的微服务架构为主线,全面、透彻地介绍了与分布式架构及微服务相关的知识和技术。本书一开始并没有提及分布式的枯燥理论,而是讲述了一段精彩的IT发展史,其中重点讲述了大型机、UNIX小机器的没落与X86平台的崛起,从而巧妙地引出CPU、 内存、网络、存储的分布式演进过程,这恰恰是分布式软件系统赖以运行的“物质基础”。

m0_49496327的博客 466

Devexpress16.2.6破解工具

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

深度学习工具包 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")

京东年薪百万级开发架构师首推必读:架构解密,从分布式到微服务

分布式架构与微服务平台是当今IT界的关键技术,也是资深软件工程师和系统架构师必须掌握的核心技术。本书以从传统分布式架构迁移到基于容器技术的微服务架构为主线,全面、透彻地介绍了与分布式架构及微服务相关的知识和技术。本书一开始并没有提及分布式的枯燥理论,而是讲述了一段精彩的IT发展史,其中重点讲述了大型机、UNIX小机器的没落与X86平台的崛起,从而巧妙地引出CPU、 内存、网络、存储的分布式演进过程,这恰恰是分布式软件系统赖以运行的“物质基础”。然后简明扼要地介绍了进行系统架构所必需的网络基础,并详细介绍了分

+W❤:bjmsb2019 340

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

绝世巨作,阿里架构师著作的《架构解密:从分布式到微服务》来了

一、什么是架构 把一个整体(完成人类生存的所有工作)切分成不同的部分(分工),由不同角色来完成这些分工,并通过建立不同部分相互沟通的机制,使得这些部分能够有机的结合为一个整体,并完成这个整体所需要的所有活动,这就是架构。 1.边界划分:根据要解决的问题,对目标系统的边界进行界定。 2.能力划分:对目标系统按某个原则的进行切分。切分的原则,要便于不同的角色,对切分出来的部分,并行或串行开展工作,一般并行才能减少时间。 3.交互机制:并对这些切分出来的部分,设立沟通机制。 4.根据3,使得这些部分之间能够进行

m0_72327953的博客 396

Java高级架构师对分布式和微服务技术探讨,阿里高级架构师帮你架构解密:从分布式到微服务

分布式架构与微服务平台是当今IT界的关键技术,也是资深软件工程师和系统架构师必须掌握的核心技术。本书以从传统分布式架构迁移到基于容器技术的微服务架构为主线,全面、透彻地介绍了与分布式架构及微服务相关的知识和技术。本书一开始并没有提及分布式的枯燥理论,而是讲述了一段精彩的IT发展史,其中重点讲述了大型机、UNIX小机器的没落与X86平台的崛起,从而巧妙地引出CPU、 内存、网络、存储的分布式演进过程,这恰恰是分布式软件系统赖以运行的“物质基础”。然后简明扼要地介绍了进行系统架构所必需的网络基础,并详细介绍了分

weixin_68320784的博客 886

旷世巨作!20年架构师手写的《架构解密:从分布式到微服务》

分布式架构与微服务平台是当今IT界的关键技术,也是资深软件工程师和系统架构师必须掌握的核心技术。本书详细介绍了分布式系统中的经典理论,对内存、soa架构、分布式存储、分布式计算、全文检索和消息队列中间件进行了深度解析。不论你是有十几年研发经验及架构经验的IT老手,还是刚入门系统架构的IT新手,本书都能对你理解分布式架构和微服务架构大有助益。

m0_73311735的博客 138

旷世巨作,20年架构师手写《架构解密:从分布式到微服务》

分布式架构与微服务平台是当今IT界的关键技术,也是资深软件工程师和系统架构师必须掌握的核心技术。本书详细介绍了分布式系统中的经典理论,对内存、soa架构、分布式存储、分布式计算、全文检索和消息队列中间件进行了深度解析。不论你是有十几年研发经验及架构经验的IT老手,还是刚入门系统架构的IT新手,本书都能对你理解分布式架构和微服务架构大有助益。需要完整文档查询学习的小伙伴点击文末下方传送门即可免费获取!!!

jjc4261的博客 191
上一篇: 架构解密从分布式到微服务:深入浅析内存,内存缓存技术分析
下一篇: 架构解密分布式到微服务企业级分布式文件系统GlusterFS
退休的汤姆
博客等级 码龄7年 1657粉丝 1051原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值