今年你参与开源了吗?

hi 大家好,今天给大家推荐一些值得学习的优秀开源项目,包括C, C++,Golang,Java等后台开发主流语言,大家可以抽点时间学习一下这些优秀项目的代码设计和实现

b4a228262db472399777e58df02e20be.png

C经典开源项目

1.Libev

libev是一个全功能和高性能的事件驱动库,基于epoll,kqueue等OS提供的基础设施。其以高效出名,它可以将IO事件,定时器,和信号统一起来,统一放在事件处理这一套框架下处理。基于Reactor模式,效率较高,并且代码精简(4.15版本8000多行),是学习事件驱动编程的很好的资源。

特点

  • 不使用全局变量,而是每个函数都有一个循环上下文。

  • 对每种事件类型使用小的观察器(一个I/O观察器在x86_64机器上使用56字节,而用libevent的话使用136字节)。

  • 没有http库等组件。libev的功能非常少。

  • 允许更多事件类型,例如基于wall clock或者单调时间的定时器、线程间中断等等。

更简单地说,libev的设计遵循UNIX工具箱的哲学,尽可能好地只做一件事。

整体架构:

d611e990403930c82fb9fa70928f3472.png

开源地址:

https://github.com/enki/libev

2. Redis

0c7bbd0c1164de5622875518cd51bd6c.png

Redis 是一种经典的开源内存Key-Value数据结构存储,用作数据库、缓存和消息代理。Redis 提供了数据结构,例如字符串、散列、列表、集合、带有范围查询的排序集合、位图、超级日志、地理空间索引和流。Redis 内置复制、Lua 脚本、LRU 驱逐、事务和不同级别的磁盘持久化,并通过 Redis Sentinel 和 Redis Cluster 自动分区提供高可用性。

代码架构:

28b7f34ec67ed80236da3d6552465f01.png

开源地址:

https://github.com/redis/redis

3. Nginx

794a6164b0e97c8f34111e15bcaa8cd5.png

Nginx是一款轻量级的Web服务器、反向代理服务器,由于它的内存占用少,启动极快,高并发能力强,在互联网项目中广泛应用。

特点:

  • Nginx可以部署在网络上使用FastCGI脚本、SCGI处理程序、WSGI应用服务器或Phusion Passenger模块的动态HTTP内容,并可作为软件负载均衡器。

  • Nginx使用异步事件驱动的方法来处理请求。Nginx的模块化事件驱动架构可以在高负载下提供更可预测的性能。

  • Nginx是一款面向性能设计的HTTP服务器,相较于Apache、lighttpd具有占有内存少,稳定性高等优势。与旧版本(≤2.2)的Apache不同,Nginx不采用每客户机一线程的设计模型,而是充分使用异步逻辑从而削减了上下文调度开销,所以并发服务能力更强。整体采用模块化设计,有丰富的模块库和第三方模块库,配置灵活。在Linux操作系统下,Nginx使用epoll事件模型,得益于此,Nginx在Linux操作系统下效率相当高。同时Nginx在OpenBSD或FreeBSD操作系统上采用类似于epoll的高效事件模型kqueue。

整体架构:

d3a1330c8067558db8c8227eb217f118.png

开源地址:

https://github.com/nginx/nginx

4.SQLite

SQLite是一个开源的嵌入式关系数据库,实现自包容、零配置、支持事务的SQL数据库引擎。其特点是高度便携、使用方便、结构紧凑、高效、可靠。足够小,大致3万行C代码,250K。

整体架构:

9309221e493cfe0c685a10f62681b549.png

开源地址:

http://www.sqlite.org/

5.Linux

Linux 是一套免费使用和自由传播的类 Unix 操作系统,是一个基于 POSIX 和 UNIX 的多用户、多任务、支持多线程和多 CPU 的操作系统。Linux 能运行主要的 UNIX 工具软件、应用程序和网络协议。它支持 32 位和 64 位硬件。Linux 继承了 Unix 以网络为核心的设计思想,是一个性能稳定的多用户网络操作系统,目前最为流行后台服务器操作系统。

整体架构:

31288a0bb8fd1527bd66bf76930c418f.png

开源地址:

https://www.kernel.org/

C++开源项目

    1.TinyWebServer(初学者)

这是一个帮助初学者快速实现网络编程、搭建属于自己的轻量级Web服务器的小项目。

项目虽小但真的五脏俱全:

  • 使用线程池、非阻塞Socket、epoll(ET/LT均实现)、事件处理(Reactor及模拟Proactor)的并发模型。

  • 使用状态机解析HTTP请求报文,支持解析GET和POST请求

  • 访问服务器数据库实现web端用户注册、登录功能,可以请求服务器图片和视频文件

  • 实现同步/异步日志系统,记录服务器运行状态

  • 经Webbench压力测试可以实现上万的并发连接数据交换

   代码地址:

https://github.com/qinguoyi/TinyWebServer

2.sylar

C++高性能分布式服务器框架,功能最全webserver/websocket server,自定义tcp_server(包含日志模块,配置模块,线程模块,协程模块,协程调度模块,io协程调度模块,hook模块,socket模块,bytearray序列化,http模块,TcpServer模块,Websocket模块,Https模块等, Smtp邮件模块, MySQL, SQLite3, ORM,Redis,Zookeeper)。

优点:

  • 基于epoll的IO复用机制实现Reactor模式,采用边缘触发(ET)模式,和非阻塞模式

  • 由于采用ET模式,read、write和accept的时候必须采用循环的方式,直到error==EAGAIN为止,防止漏读等清况,这样的效率会比LT模式高很多,减少了触发次数

  • Version-0.1.0基于单线程实现,Version-0.2.0利用线程池实现多IO线程,Version-0.3.0实现通用worker线程池,基于one loop per thread的IO模式,Version-0.4.0增加定时器,Version-0.5.0增加简易协程实现和异步日志实现

  • 线程模型将划分为主线程、IO线程和worker线程,主线程接收客户端连接(accept),并通过Round-Robin策略分发给IO线程,IO线程负责连接管理(即事件监听和读写操作),worker线程负责业务计算任务(即对数据进行处理,应用层处理复杂的时候可以开启)基于时间轮实现定时器功能,定时剔除不活跃连接,时间轮的插入、删除复杂度为O(1),执行复杂度取决于每个桶上的链表长

  • 采用智能指针管理多线程下的对象资源增加简易协程实现,目前版本基于ucontext.h(供了解学习,尚未应用到本项目中)From:

  • simple-coroutine增加简易C++异步日志库 From: simple-log

  • 支持HTTP长连接

  • 支持优雅关闭连接

  • 通常情况下,由客户端主动发起FIN关闭连接客户端发送FIN关闭连接后,服务器把数据发完才close,而不是直接暴力close,如果连接出错,则服务器可以直接close.

代码地址:

https://github.com/sylar-yin/sylar

3. OpenSSL

一个强大的安全套接字层密码库,加密HTTPS,加密SSH都贼好用,同时它还可以用于跨平台密码工具。

OpenSSL实现了以下功能:

  • 数据保密性:信息加密就是把明码的输入文件用加密算法转换成加密的文件以实现数据的保密。加密的过程需要用到密钥来加密数据然后再解密。

  • 数据完整性:加密也能保证数据的一致性。例如:消息验证码(MAC),能够校验用户提供的加密信息,接收者可以用MAC来校验加密数据,保证数据在传输过程中没有被篡改过。

  • 安全验证:加密的另外一个用途是用来作为个人的标识,用户的密钥可以作为他的安全验证的标识。SSL是利用公开密钥的加密技术(RSA)来作为用户端与服务器端在传送机密资料时的加密通讯协定。

代码地址:

https://www.openssl.org/source

4.LevelDB 

LevelDB 是一个由 Google 编写的快速键值存储库,它提供了从字符串键到字符串值的有序映射。

LevelDB 有以下优点:

  • 提供应用程序运行上下文,方便跟踪调试

  • 可扩展的、多种方式记录日志,包括命令行、文件、回卷文件、内存、syslog服务器、Win事件日志等

  • 可以动态控制日志记录级别,在效率和功能中进行调整

  • 所有配置可以通过配置文件进行动态调整

  • 支持Java、C++、C、python等多种语言

整体架构:

637925226af349f163eb5b5ce965e792.png

  • MemTable:内存数据结构,具体实现是 SkipList。接受用户的读写请求,新的数据修改会首先在这里写入。

  • Immutable MemTable:当 MemTable 的大小达到设定的阈值时,会变成 Immutable MemTable,只接受读操作,不再接受写操作,后续由后台线程 Flush 到磁盘上。

  • SST Files:Sorted String Table Files,磁盘数据存储文件。分为 Level0 到 LevelN 多层,每一层包含多个 SST 文件,文件内数据有序。Level0 直接由 Immutable Memtable Flush 得到,其它每一层的数据由上一层进行 Compaction 得到。

  • Manifest Files:Manifest 文件中记录 SST 文件在不同 Level 的分布,单个 SST 文件的最大、最小 key,以及其他一些 LevelDB 需要的元信息。由于 LevelDB 支持 snapshot,需要维护多版本,因此可能同时存在多个 Manifest 文件。

  • Current File:由于 Manifest 文件可能存在多个,Current 记录的是当前的 Manifest 文件名。

  • Log Files (WAL):用于防止 MemTable 丢数据的日志文件。

开源地址:

https://github.com/google/leveldb

5.Chromium

Chromium是由Google主导开发的网页浏览器。以BSD许可证等多重自由版权发行并开放源代码,Chromium的开发可能早自2006年即开始. Chromium 是Google 的Chrome浏览器背后的引擎,其目的是为了创建一个安全、稳定和快速的通用浏览器.

整体架构:

7146d7e8a4373456d6bb579c58c1b805.png

chromium的代码目录包含这些模块:

base:通用代码集和基础组件实现库,包含字符串、文件、线程、消息队列等工具类集合。

cc:负责渲染绘制,chrome为什么高效就是因为有它。chrome:浏览器界面模块,大量调用了cc提供的接口。

content:多进程沙盒浏览器莫款,管理多进程和多线程。

gpu,OpenGL封装实现:CommandBuffer和OpenGL的兼容支持模块。

net:网络功能实现模块。

media:多媒体封装代码,实现视频播放等功能。

mojo:跨语言(C++ / Java / JavaScript)跨平台的进程间对象通信模块,类似AIDL的功能。

skia:图形库。

third_party:排版引擎。

ui:UI库。

ipc: 网络进程通信模块。

v8,V8 JavaScript 引擎库。

以上每一个模块要想真正理解,都得花很大的功夫,简单用一张图来说明以上模块的关系:

1909f79fe6980e7e9d5c109c309e2206.png

开源地址:

https://chromium.googlesource.com/chromium/src.git

Go经典开源项目

Golang有哪些好像优秀的项目呢?列举一下我收集到的golang开发的优秀项目。

1.docker

golang头号优秀项目,通过虚拟化技术实现的操作系统与应用的隔离,也称为容器。

特点:

  • Docker是世界领先的软件容器平台。

  • Docker使用Google公司推出的Go语言进行开发实现,基于Linux内核的cgroup,namespace,以及AUFS类的UnionFS等技术,对进程进行封装隔离,属于操作系统层面的虚拟化技术。由于隔离的进程独立于宿主和其它的隔离的进程,因此也称其为容器。Docke最初实现是基于LXC。

  • Docker能够自动执行重复性任务,例如搭建和配置开发环境,从而解放了开发人员以便他们专注在真正重要的事情上:构建杰出的软件。

  • 用户可以方便地创建和使用容器,把自己的应用放入容器。容器还可以进行版本管理、复制、分享、修改,就像管理普通的代码一样。

整体架构:

64e8fb792eababec0f055412e7e5d3c9.png

开源地址:

https://github.com/docker

2.kubernetes

Kubernetes(常简称为K8s)是用于自动部署、扩展和管理“容器化(containerized)应用程序”的开源系统。

特点:

  • 跨主机编排容器

  • 更充分地利用硬件资源来最大化地满足企业应用的需求

  • 可移植 : 支持公有云,私有云,混合云,多重云

  • 可扩展 : 模块化,插件化,可挂载,可组合,支持各种形式的扩展

  • 自动化 : 自动部署,自动重启,自动复制,自动伸缩/扩展,通过声明式语法提供了

整体架构:

9208716db646b7ef9bb150e13c3a2af4.png

  • etcd保存了整个集群的状态;

  • apiserver提供了资源操作的唯一入口,并提供认证、授权、访问控制、API注册和发现等机制;

  • controller manager负责维护集群的状态,比如故障检测、自动扩展、滚动更新等;

  • scheduler负责资源的调度,按照预定的调度策略将Pod调度到相应的机器上;

  • kubelet负责维护容器的生命周期,同时也负责Volume(CVI)和网络(CNI)的管理;

  • Container runtime负责镜像管理以及Pod和容器的真正运行(CRI);

  • kube-proxy负责为Service提供cluster内部的服务发现和负载均衡;

Kubernetes设计理念和功能其实就是一个类似Linux的分层架构,如下图所示:

ae43a169c5c98bb299f5dcddba802312.png

  • 核心层:Kubernetes最核心的功能,对外提供API构建高层的应用,对内提供插件式应用执行环境

  • 应用层:部署(无状态应用、有状态应用、批处理任务、集群应用等)和路由(服务发现、DNS解析等)

  • 管理层:系统度量(如基础设施、容器和网络的度量),自动化(如自动扩展、动态Provision等)以及策略管理(RBAC、Quota、PSP、NetworkPolicy等)

  • 接口层:kubectl命令行工具、客户端SDK以及集群联邦

  • 生态系统:在接口层之上的庞大容器集群管理调度的生态系统,可以划分为两个范畴

    Kubernetes外部:日志、监控、配置管理、CI、CD、Workflow、FaaS、OTS应用、ChatOps等

    Kubernetes内部:CRI、CNI、CVI、镜像仓库、Cloud Provider、集群自身的配置和管理等

开源地址:

https://github.com/kubernetes/kubernetes

3.etcd

etcd 是 CoreOS 团队于 2013 年 6 月发起的开源项目,它的目标是构建一个高可用的分布式键值(key-value)数据库。

特点:

  • 简单:定义明确、面向用户的 API (gRPC)

  • 安全:具有可选客户端证书身份验证的自动 TLS

  • 快速:基准测试为 10,000 次写入/秒

  • 可靠:使用 Raft 正确分布

  • etcd 是用 Go 编写的,使用Raft共识算法来管理高可用的复制日志。

  • 许多公司在生产中使用 etcd ,在关键部署场景中,开发团队支持它,在这些场景中,etcd 经常与Kubernetes、locksmith、vulcand、Doorman等应用程序合作。严格的测试进一步确保了可靠性。


整体架构:

8e6115c0b9aa0376edabcb752d1de986.png

  • httpserver
    etcd node之间进行通信,接收来自其他node的消息;

  • raft
    实现分布式一致性raft协议, raft模块与server模块的通信采用了四个channel:

    • propc:处理client来的命令

    • recvc:处理http消息

    • readyc: 消息经过raft处理之后封装成Ready交给server处理

    • advanceC:server处理一条消息之后通知raft

  • WAL
    server为了防止数据丢失而实现的write ahead log,与很多数据库的实现类似

  • snapshotter

    防止wal的无限制增长,定期生成snap文件仅保留 term,index以及key value data;

  • mvcc

    实现多版本的并发控制,使用revision(main和sub)来描述一个key的整个过程,从创建到删除。mvcc中还包含了watcher,用于实现监听key,prefix, range的变化。

  • backend & boltdb

    持久化key value到boltdb数据库

  • raftlog

    raftlog模块包含unstable和raft的snapshot,unstable保存log entries,但是entries数量比较多的时候,就需要compact,创建一个snapshot,这里的snapshot还是保存在memory中的。raft模块会定时收集entries交给server处理。

开源地址:
https://github.com/etcd-io/etcd

4.Tidb

TiDB(“Ti”代表 Titanium)是一个开源的 NewSQL 数据库,支持混合事务和分析处理 (HTAP) 工作负载。它兼容 MySQL,具有水平可扩展性、强一致性和高可用性。

特点:

  • 水平可扩展性

    TiDB 通过简单地添加新节点来扩展 SQL 处理和存储。这使得基础设施容量规划比仅垂直扩展的传统关系数据库更容易且更具成本效益。

  • MySQL 兼容语法

    TiDB 就像是您的应用程序的 MySQL 5.7 服务器。您可以继续使用所有现有的 MySQL 客户端库,并且在许多情况下,您不需要更改应用程序中的任何一行代码。由于 TiDB 是从头开始构建的,而不是 MySQL 的 fork,请查看已知兼容性差异列表。

  • 分布式事务

    TiDB 在内部将表分片成基于范围的小块,我们称之为“区域”。每个 Region 默认大小约为 100 MiB,TiDB 使用优化的两阶段提交来确保 Region 以事务一致的方式维护。

  • 云原生

    TiDB 旨在在云中工作——公共、私有或混合——使部署、供应、操作和维护变得简单。TiDB 的存储层,称为 TiKV,是一个Cloud Native Computing Foundation (CNCF) 毕业项目。TiDB 平台的架构还允许 SQL 处理和存储以非常云友好的方式相互独立扩展。

  • 最小化 ETL

    TiDB 旨在支持事务处理 (OLTP) 和分析处理 (OLAP) 工作负载。这意味着,虽然传统上您可能在 MySQL 上进行交易,然后将 (ETL) 数据提取、转换和加载到列存储中以进行分析处理,但不再需要此步骤。

  • 高可用性

    TiDB 使用 Raft 共识算法来确保数据在 Raft 组中的整个存储中的高可用和安全复制。如果发生故障,Raft 组会自动为故障成员选举新的领导者,并在无需任何人工干预的情况下自愈 TiDB 集群。故障和自愈操作对应用程序也是透明的。

整体架构:

e007712e42c63943f5a2e12ca157cf03.png

开源地址:

https://github.com/pingcap/tidb

5.Netpoll

Netpoll是字节跳动内部的 Golang 高性能、I/O 非阻塞的网络库,专注于 RPC 场景。

开源社区目前缺少专注于 RPC 方案的 Go 网络库。类似的项目如:evio、gnet 等,均面向 Redis、Haproxy 这样的场景。因此 Netpoll 应运而生,它借鉴了 evio 和 Netty 的优秀设计,具有出色的性能,更适用于微服务架构。

整体架构:

af97fc872ce03e86219785120811b3ff.png

  • netpoll 将 Reactor 以 1:N 的形式组合成主从模式。

  • MainReactor 主要管理 Listener,负责监听端口,建立新连接;

  • SubReactor 负责管理 Connection,监听分配到的所有连接,并将所有触发的事件提交到协程池里进行处理。

  • netpoll 在 I/O Task 中引入了主动的内存管理,向上层提供 NoCopy 的调用接口,由此支持 NoCopy RPC。

  • 使用协程池集中处理 I/O Task,减少 goroutine 数量和调度开销。

开源地址:

https://github.com/cloudwego/netpoll

Java经典开源项目

这里推荐一些最值得阅读优秀的Java开源项目。

1.Netty

Netty是一个Java NIO技术的开源异步事件驱动的网络编程框架,用于快速开发可维护的高性能协议服务器和客户端。

d77c71070b37804e1a23d5f812aaa5e2.png

往通俗了讲,可以将Netty理解为:一个将Java NIO进行了大量封装,并大大降低Java NIO使用难度和上手门槛的超牛逼框架。

特点:

设计

  • 各种传输类型的统一 API - 阻塞和非阻塞套接字

  • 基于灵活和可扩展的事件模型,允许清晰的关注点分离

  • 高度可定制的线程模型——单线程、一个或多个线程池,如 SEDA

  • 真正的无连接数据报套接字支持(自 3.1 起)

便于使用

  • 有据可查的 Javadoc、用户指南和示例

  • 没有额外的依赖,JDK 5 (Netty 3.x) 或 6 (Netty 4.x) 就足够了

    • 注意:某些组件(例如 HTTP/2)可能有更多要求。 有关更多信息,请参阅 要求页面。

表现

  • 更高的吞吐量,更低的延迟

  • 更少的资源消耗

  • 最小化不必要的内存复制

安全

  • 完整的 SSL/TLS 和 StartTLS 支

开源地址:

https://github.com/netty/netty

2.J2EE框架 Spring

star:45.1k; fork:31.8k

e5f5b1ba18c038b6416c95718d67a546.png

Spring Framework 是一个开源的Java/Java EE全功能栈(full-stack)的应用程序框架,以Apache许可证形式发布,也有.NET平台上的移植版本。该框架基于 Expert One-on-One Java EE Design and Development(ISBN 0-7645-4385-7)一书中的代码,最初由 Rod Johnson 和 Juergen Hoeller等开发。Spring Framework 提供了一个简易的开发方式,这种开发方式,将避免那些可能致使底层代码变得繁杂混乱的大量的属性文件和帮助类。

Spring 中包含的关键特性:

  • 强大的基于 JavaBeans 的采用控制翻转(Inversion of Control,IoC)原则的配置管理,使得应用程序的组建更加快捷简易。

  • 一个可用于从 applet 到 Java EE 等不同运行环境的核心 Bean 工厂。

  • 数据库事务的一般化抽象层,允许宣告式(Declarative)事务管理器,简化事务的划分使之与底层无关。

  • 内建的针对 JTA 和 单个 JDBC 数据源的一般化策略,使 Spring 的事务支持不要求 Java EE 环境,这与一般的 JTA 或者 EJB CMT 相反。

  • JDBC 抽象层提供了有针对性的异常等级(不再从SQL异常中提取原始代码), 简化了错误处理, 大大减少了程序员的编码量. 再次利用JDBC时,你无需再写出另一个 '终止' (finally) 模块. 并且面向JDBC的异常与Spring 通用数据访问对象 (Data Access Object) 异常等级相一致.

  • 以资源容器,DAO 实现和事务策略等形式与 Hibernate,JDO 和 iBATIS SQL Maps 集成。利用众多的翻转控制方便特性来全面支持, 解决了许多典型的Hibernate集成问题. 所有这些全部遵从Spring通用事务处理和通用数据访问对象异常等级规范.

  • 灵活的基于核心 Spring 功能的 MVC 网页应用程序框架。开发者通过策略接口将拥有对该框架的高度控制,因而该框架将适应于多种呈现(View)技术,例如 JSP,FreeMarker,Velocity,Tiles,iText 以及 POI。值得注意的是,Spring 中间层可以轻易地结合于任何基于 MVC 框架的网页层,例如 Struts,WebWork,或 Tapestry。

  • 提供诸如事务管理等服务的面向方面编程框架。

开源地址:

https://github.com/spring-projects/spring-framework

3.Android 开源框架 EventBus Android

star:23.1k; fork:4.6k

5ff5a69cbcc2159b35a59b9c1e5de75b.png

如果你学习过设计模式,那么当想通知其他组件某些事情发生时你一定会使用观察者模式。好了,既然能想到这个设计模式,那么就来看一个屌爆天的Android开源框架EventBus。主要功能是替代Intent、Handler、BroadCast在Fragment、Activity、Service、线程之间传递消息。他的最牛逼优点是开销小,代码简洁,解耦代码。

特点:

  • 简化组件之间的通信

  • 分离事件发送者和接收者

  • 在 UI 工件(例如活动、片段)和后台线程中表现良好

  • 避免复杂且容易出错的依赖关系和生命周期问题

  • 很快;专为高性能而优化

  • 很小(~60k jar)

  • 是在实践中被证明通过应用与1,000,000,000+安装

  • 具有交付线程、订阅者优先级等高级功能。

开源地址:

https://github.com/greenrobot/EventBus

4.Java 设计模式 java-design-patterns

star:71.4k;fork:22.2k

2dc5eff349a735d3e5dd7e1d06945a3e.png

设计模式是程序员在设计应用程序或系统时解决常见问题的最佳实践,重用设计模式有助于防止可能导致重大问题的细微问题,同时熟悉模式的程序员和架构师的代码也更具可读性。

开源地址:

https://github.com/iluwatar/java-design-patterns

参考

https://www.jianshu.com/p/2614fdb5d1c3

https://www.jianshu.com/p/6e49aa5182f0

https://walterzhaojr.github.io/

https://www.zhihu.com/question/26415445

- END -


看完一键三连在看转发,点赞

是对文章最大的赞赏,极客重生感谢你62c418503c63fd44fec70b57b8a17ce7.png

推荐阅读

2027725b9f82a209b9fac05e29c37f71.png

基本功为什么如此重要!

0ad357a9a57978fc2e23c05a6b39e8b3.png

深入理解虚拟化

590c1225e1ae8604a49d2d245d24af0d.png

深入理解Golang 编程思维和工程实战


e5e052978ed6c42c80500c01054afb34.png

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值