[架构之路-58]:目标系统 - 平台软件 - 中间件软件(嵌入式)与中间件平台(中台)以及中间件的发展阶段与提供服务的方式

目录

第1章 中间件概述

1.1 嵌入式软件总体架构

1.2 什么是中间件软件

1.3 中间件的基本功能

1.4 中间件为应用程序提供服务的基本方式

1.5 中间件的发展历程

1.6 中间件的层次

1.7 三大基础中间件

第2章 中间件的分类

2.1 事务式中间件

2.2 过程式中间件

2.3 面向消息的中间件

2.4 面向对象中间件

2.5 Web应用服务器

2.6 其他

第3章 中台(大平台、小产品)

3.1 业务中台 (类似于嵌入式系统中的业务平台,不同的业务不同的业务平台)

3.2 数据中台(类似嵌入式系统中的数据库平台)

3.3  组织中台(类似嵌入式系统中前端负载均衡器)

第4章 基站中间件总体架构

4.1 概述

4.2 中间件的好处

4.3 按中间件存在的形态分类

第5章 基站中间件五大类API服务

5.1 内核空间BOS服务(POSIX接口封装)=》跨进程间通信

5.2 用户空间的服务工具

5.3 基本API服务之trace和log服务

5.4 基本API服务之Driver =》 映射设备驱动服务

5.5 基本API服务之SOC抽象层CAL ( Core Abstract Layer)


第1章 中间件概述

1.1 嵌入式软件总体架构

1.2 什么是中间件软件

中间件(middleware)是基础软件的一大类,属于可复用软件的范畴。

顾名思义,中间件处于操作系统软件与用户的应用软件的中间。与用户空间驱动处于并列的位置。

用户空间驱动负责对硬件设备与业务相关的功能配置(主要通过配置芯片的寄存器来实现)、与业务相关功能状态的监控、在用户空间数据的收发、以及为应用软件提供硬件抽象层的接口(HAL:硬件抽象层接口)。以便于应用软件不需要关注具体硬件的型号、硬件寄存器的定义等硬件相关的细节。为应用程序使用嵌入式系统的各种硬件服务(CPU和RAM之外)提供便利。

 中间件层:负责对Linux OS和libc库提供的CPU计算相关的服务(CPU和RAM)进行封装,为应用程序使用嵌入式系统的各种软件服务提供便利:

  • 提供本机的CPU和RAM资源
  • 提供分布式CPU和RAM资源

中间件最大的作用是支撑分布式、跨平台、跨操作系统的应用程序。

如果是单机版,中间件的作用就会得到极大的弱化,应用程序可以直接使用基础中间件libc或STL或boost库即可,增强或扩展中间件的需求并没有那么强烈。

基站系统中的中间件支持分布式应用的,属于扩展中间件

基站系统有两个大的网元BBU和RRU,另外BBU有系统板基带板,运行在这些硬件和操作系统之上的应用软件有着强烈的跨板的通信需求。而中间件软件正好能够满足这种应用需求。

另外,基站还支持云部署应用程序需要运行在分布式的云平台之上,中间件的作用就更加突出。

中间件是介于应用系统系统软件之间的一类软件。

它使用系统软件所提供的基础服务(功能),衔接网络上应用系统的各个部分或不同的应用,能够达到资源共享、功能共享的目的。它并没有很严格的定义,但是普遍接受IDC的定义:中间件是一种独立系统软件服务程序分布式应用软件借助这种软件在不同的技术之间共享资源,中间件位于客户机服务器的操作系统之上,管理计算资源网络通信

从这个意义上可以用一个等式来表示中间件:中间件 = 平台+通信,这也就限定了只有用于分布式系统中才能叫中间件,同时也把它与OS支撑软件实用软件区分开来。

中间件是一类连接软件组件和应用的计算机软件,它包括一组服务一组API。以便于运行在一台或多台机器上的多个软件通过网络进行交互。该技术所提供的互操作性,推动了一致分布式体系架构的演进,该架构通常用于支持并简化那些复杂的分布式应用程序,它包括web服务器、事务监控器和消息队列软件。

近年来,人类生活中越来越多的领域已经变得离不开计算机、网络技术以及通信技术。并且随着计算机技术的快速发展,更多的应用软件被要求在许多不同的网络协议不同的硬件生产厂商以及不一样的网络平台和环境上运营。这导致了软件开发者需要面临数据离散、操作困难、系统匹配程度低,以及需要开发多种应用程序来达到运营的目的。所以,中间件技术的产生,在极大程度上减轻了应用程序开发者的负担,使得网络的运行更有效率。

1.3 中间件的基本功能

中间件是独立系统级软件,连接操作系统层和应用程序层,将不同操作系统提供应用的接口标准化,协议统一化,屏蔽具体操作的细节,中间件一般提供如下功能:

(1)通信支持

软件系统中最基本的诉求,就像人需要交流是基本诉求一样,通信手段的有效性程度,决定了整个系统信息交流有效性的程度。没有消息交流的系统就是一座孤岛。

中间件为其所支持的应用软件提供平台化的运行环境,该环境屏蔽底层通信之间的接口差异,实现互操作,所以通信支持中间件一个最基本的功能,嵌入式系统的基础设施,就像一个社会的交通网、通信网、社交网一样。

早期应用与分布式的中间件交互主要的通信方式为:(1)远程调用和(2)消息两种方式。

通信模块中,远程调用通过网络进行通信,通过支持数据的转换通信服务,从而屏蔽不同的操作系统和网络协议。远程调用是提供给予过程的服务访问,为上层系统只提供非常简单的编程接口或过程调用模型。

消息提供异步交互的机制。 

(2)应用支持

        中间件的目的就是服务上层应用,提供应用层不同服务之间的互操作机制(应用层程序之间相互发送和接收收据)。它为上层应用开发提供统一的平台和运行环境,并封装不同操作系统提供API接口,向应用提供统一的标准接口,使应用的开发和运行与操作系统无关,实现其独立性。

        中间件松耦合的结构,标准的封装服务和接口,有效的互操作机制,从而给应用结构化和开发方法提供有力的支持。 

(3)公共服务

        公共服务是对应用软件中共性功能或约束的提取。将这些共性的功能或者约束分类实现,并支持复用,作为公共服务,提供给应用程序使用。

        通过提供标准、统一的公共服务,可减少上层应用的开发工作量,缩短应用的开发时间,并有助于提高应用软件的质量。

1.4 中间件为应用程序提供服务的基本方式

(1)基于远程过程调用的复用

(2)基于Web服务(通过URL从服务器获取服务)

(3)基于消息的服务(如进程间通信的服务、线程间通信的服务)

(4)基于API函数调用的服务(如定时器服务、Log服务)

1.5 中间件的发展历程

中间件的目的是屏蔽分布式环境中异构的OS网络协议,它必须能够提供分布式环境下的分布式通信服务与分布式计算,将这种通信服务称为中间平台,另外,OS和网络协议称为基础平台

中间件技术的发展,主要经历了三个阶段:

  • 面向远程过程调用的分布计算技术中间件( Remote Procedure Call,RPC)  =》 远程函数调用。
  • 面向消息的分布计算技术中间件(Mes-sage Oriented Middleware,MOM)。
  • 面向对象请求代理中间件。

其中面向消息的中间件技术最为成熟,最常见。

1.6 中间件的层次

基础中间件:解决同一个操作系统管辖下的不同进程、线程之间通信的服务需求,该中间件不会跨越不同的操作系统 。

集成中间件:解决跨越或屏蔽不同操作系统之间的通信诉求,构建在异系统之上。

行业领域应用平台:构建在异系统的集成中间件之上,为特定的行业应用构建的平台。

1.7 三大基础中间件

三大基础中间件分别为交易中间件消息中间件应用服务器中间件,其中:

(1)交易(事务)中间件

        是专门针对联机业务处理系统而设计的,是所有中间件类型中理论较为成熟、功能和性能界定比较清晰的中间件产品。

联机业务:是指操作员的终端直接与主要相联,业务数据实时性地进入到主机的数据库中。

联机事务处理 (OLTP) :使用计算机系统对事务数据进行管理称为联机事务处理 (OLTP)。 OLTP 系统在组织的日常运营中发生业务交互时对其进行记录,并且支持对该数据进行查询来做出推断。

事务数据是指一种信息,用于跟踪与组织活动相关的交互。 这些交互通常是业务事务,如从客户收到的付款、对供应商进行的付款、从库存移动的产品、接受的订单或交付的服务。 表示事务本身的事务事件通常包含时间维度、一些数值和对其他数据的引用。

事务通常需要原子性一致性。 原子性意味着整个事务始终作为一个工作单元成功或失败,永远不会处于半完成状态。 如果无法完成某个事务,数据库系统必须回退任何已作为该事务的一部分完成的步骤。

        在联机(在线)业务处理系统中,需处理大量并发进程,涉及到操作系统文件系统数据通讯数据库管理等,通过交易中间件可降低联机业务处理系统的开发难度,提高系统运行的安全稳定性。

        交易(买卖)中间件主要应用在金融、财税、运输、电力、电信等行业中,如银行业务系统、电信计费系统等。

(2)消息队列(Message Quequing)中间件(主要应用于嵌入式系统数据路由)

消息是两台计算机间传送的数据单位,消息队列在将消息从它的源中继到它的目标时充当中间人,主要目的是提供路由并保证消息的传递

消息队列是在消息传输过程中保存消息的容器,消息中间件即为消息队列的承载形式。

如果发送消息时接收者不可用,消息队列会保留消息,直到可以成功地传递它。

消息可以承载的数据内容包括:

  • 管理面数据
  • 控制面数据
  • 数据面数据

消息队列主要解决:

  • 软件实体之间的耦合性问题 
  • 软件实体之间的异步性问题
  • 缓解大量并发数据问题

(3)分布式应用服务器中间件(主要应用于互联网Web服务器)

位于客户浏览器Web Client服务器端的数据库之间,为应用程序提供业务逻辑的代码。

应用服务器通过组件的应用程序接口将商业应用逻辑曝露给客户端的程序,同时为应用提供运行平台和系统服务,并管理对数据库的范围。

对于高端需求分布式应用服务器具有高可用性监视、集群化、负载平衡、集成冗余和高性能分布式应用服务,以及对复杂的数据库访问的支持等功能。

目前,市场上应用服务器平台中有J2EE,WebLogic,Glassfish,JBoss企业应用平台,以及Apache Tomcat和Apache Geronimo等。
 

第2章 中间件的分类

2.1 事务式中间件

事务式中间件又称事务处理管理程序,是当前用的最广泛的中间件之一,其主要功能是提供联机事务处理所需要的通信、并发访问控制事务控制、资源管理、安全管理、负载平衡、故障恢复和其他必要的服务。

随着分布计算技术的发展,分布应用系统对大规模的事务处理也提出了需求。事务处理监控程序位于客户和服务器之间,完成事务管理与协调、负载平衡、失效恢复等任务,以提高系统的整体性能。

事务式中间件支持大量客户进程的并发访问,具有极强的扩展性。由于事务式中间件具有可靠性高、极强的扩展性等特点,主要应用于电信、金融、飞机订票系统、证券等拥有大量客户的领域。 

2.2 过程式中间件

过程式中间件又称远程过程调用中间件。

过程中间件一般从逻辑上分为两部分:客户和服务器。

客户和服务器是一个逻辑概念,既可以运行在同一计算机上,也可以运行在不同的计算机上,甚至客户和服务器底层的操作系统也可以不同。客户机和服务器之间的通信可以使用同步通信,也可以采用线程式异步调用。所以过程式中间件有较好的异构支持能力,简单易用,但由于客户和服务器之间采用访问连接,所以在易剪裁性和容错方面有一定的局限性。 

2.3 面向消息的中间件

面向消息的中间件,简称为消息中间件,是一类以消息为载体进行通信的中间件,利用高效可靠的消息机制来实现不同应用间大量的数据交换。

按其通信模型的不同,消息中间件的通信模型有两类:消息队列消息传递

通过这两种消息模型,不同应用之间的通信和网络的复杂性脱离,摆脱对不同通信协议的依赖,可以在复杂的网络环境中高可靠、高效率的实现安全的异步通信。消息中间件的非直接连接,支持多种通信规程,达到多个系统之间的数据的共享和同步。面向消息中间件是一类常用的中间件。 

2.4 面向对象中间件

面向对象中间件又称分布对象中间件,是分布式计算技术面向对象技术发展的结合,简称对象中间件。分布对象模型是面向对象模型在分布异构环境下的自然拓广。面向对象中间件给应用层提供各种不同形式的通信服务,通过这些服务,上层应用对事务处理、分布式数据访问,对象管理等处理更简单易行。OMG组织是分布对象技术标准化方面的国际组织,它制定出了CORBA等标准。 

2.5 Web应用服务器(针对互联网服务)

Web应用服务器是Web服务器应用服务器相结合的产物。应用服务器中间件可以说是软件的基础设施,利用构件化技术将应用软件整合到一个确定的协同工作环境中,并提供多种通信机制,事务处理能力,及应用的开发管理功能。由于直接支持三层或多层应用系统的开发,应用服务器受到了广大用户的欢迎,是中间件市场上竞争的热点,J2EE架构是应用服务器方面的主流标准。 

2.6 其他

新的应用需求、新的技术创新、新的应用领域促成了新的中间件产品的出现。如,ASAAC在研究标准航空电子体系结构时提出的通用系统管理GSM,属于典型的嵌入式航电系统的中间件,互联网云技术的发展云计算中间件、物流网的中间件等随着应用市场的需求应运而生。

第3章 中台(大平台、小产品)=》 云平台

企业面向客户的前台(类似嵌入式式系统的应用程序)面向企业资产的后台(类似嵌入式系统的操作系统和硬件设备)存在需求矛盾时,为了满足前台客户的快速迭代需求和后台资源的稳定性需求,中台概念应运而生。中台的核心是当前台需求来临时,中台能快速的进行响应,重复适配、匹配、整合稳定的内部资源(类似嵌入式系统的计算资源、硬件资源等),从而提升企业整体(类似嵌入式软硬件系统)的研发效率,降低创新成本,提高工作效率。

中台,互联网术语,一般应用于大型企业。

一般是指搭建一个灵活快速应对变化的架构,快速实现前端提的需求,避免重复建设,达到提高工作效率目的。

中台,作为平台型组织的一部分,是在前台业务部门后台资源部门之间的组织模块。这些模块多半是传统组织中所谓的成本中心cost center,它们负责把后台的资源整合成前台打仗所需的“中间件”,方便随需调用。

(1)前台:各种不同的业务前台。

(2)中台:支撑各种业务的中台。

(3)后台:组织内部各种现有的资源(与业务无关的通用资源,被业务中台整合成与业务相关的资源)

中台更多的是一种“思想”、是一种“思维模型”

前台、中台、后台是相对的,在不同的系统中,前台、中台、后台含义不同。

在嵌入式系统中:前台是各种应用程序;中台是中间件和用户空间硬件设备驱动;后台是操作系统libc或C++库。

在互联网应用中:前台就是Web页面;中台就是提供各种业务的框架(大中台);后台就是各种虚拟机。

在企业内:前台是一个能赚钱的部门中台就是各种成本中心;后台是企业的职能部门和软硬件资源、人力资源。

中台分为三类:业务中台数据中台组织中台。 

3.1 业务中台 (类似于嵌入式系统中的业务平台,不同的业务不同的业务平台)

多半是传统的成本中心,把后台的资源整合成前台打仗需要的“中间件”,方便被随需调用。

典型的业务中台如字节跳动的直播中台腾讯的技术中台等。

“业务中台”也被称为“有形的中台”,因为是有实体部门存在的。

3.2 数据中台(类似嵌入式系统中的数据库平台)

数据中台为不同的业务提供数据存储和数据分析的服务)

数据中台应该被称之为“业务中台的数据化”,其让内部资源和内部能力在极度共享后形成数据汇集,并基于算法进行智能决策,以支持业务中台组织中台的运作。

简单地受,数据中台,就是把企业内部(类似嵌入式系统中的计算、内存、硬件外设)的各种有形也无形的资源进行量化,形成大数据,并使用特定的算法对数据进行分析和智能决策,为业务中台提供数字的信息和决策结果。

有了数字中台,企业的物理资源都本量化成一个个数字。业务中台不在基于物理资源进行调度,而是基于数字化后的资产进行资源的整合,满足客户的需求。有数字中台负责把数字资源转换为对应的物理资源。

3.3  组织中台(类似嵌入式系统中前端负载均衡器

财务、人力、战略等部门向前台派出业务伙伴(BusinessPartner, BP)组成的团队。BP团队会进入前台的小团队,用专业视角共同作战,同时也代表后台高效配置资源和政策。

“组织中台”也被称为“无形的中台”,就是因为没有实体部门,像水一样,无孔不入地渗透到每个业务单元。

组织中台,类似于“总前委”,负责根据客户的需求和企业内部的资源,快速的决策

第4章 基站中间件总体架构

4.1 概述

基站软件的中间件处于Linux OS和基站应用程序(OAM/网络应用/L2/L3软件,L1独立于Linux OS)之间的程序,为应用程序提供各种底层服务。

4.2 中间件的好处

(1)可移植性

方便应用程序在不同硬件平台的移植,在产品的持续迭代中,硬件不断的迭代更新,通过中间件,可以屏蔽硬件持续迭代变化。

嵌入式系统的硬件和操作系统都会不断的演进,通过中间件,可以隔离硬件平台与易变的应用程序。

没有中间件在应用程序和特定的硬件平台之间进行缓冲,硬件平台的一点变动,都可能影响应用程序的代码 。

(2)易用性

中间件为应用程序提供了更加便捷的方式使用Linux操作系统的各种软硬件服务,提升了应用程序的开发效率。

没有中间件,应用程序员需要使用操作系统、Libc和C++、线程库等各种库最原始的API函数时,需要了解底层库函数的使用的细节,这对关于业务的应用程序员是一种挑战,同时当有大量的应用程序员都关注这些底层函数库的细节的时候,也是精力上的巨大浪费。

4.3 按中间件存在的形态分类

(1)API静态函数库

  • OS POSIX库的进一步封装(内核空间)
  • 用户空间库的进一步封装
  1. gLibc库的进一步封装 (用户空间)
  2. C++库的进一步封装 (用户空间)
  3. Boost库的进一步封装(用户空间)
  4. pThread库的进一步封装(用户空间)
  5. 各种工具链使用(用户空间)
  6. 其他库(用户空间)
  • 用户空间的服务

备注:这些中间件代码是在调用这些函数的进程空间中执行的。

(2)运行在应用程序进程空间中的线程

这些中间件线程,可以运行在应用程序的进程空间,为应用程序提供服务。

不同的应用程序,如果需要,会在自己的进程空间创建这些线程的实例。如

  • LEC:负责监控并收集某个进程内执行过程的出错信息(abort signal)
  • BCI:负责为每个进程提供独立的在线命令行机制
  • Btime:负责为每个进程提供独立的定时器服务,管理进程内所有线程创建的定时器,并执行定时服务程序,这个定时器服务程序是属于进程的,因此,能够访问进程内的全局变量。
  • UMSG:提供线程间消息通信机制,为进程内的线程创建消息队列机制,应用程序可以使用该消息队列接收消息。
  • Pub/Sub:为进程空间的所有线程提供一个注册定向发布机制。

(3)运行在自己独立进程空间中的后台进程

  • Laucher:启动进程,根据配置文件的配置,负责启动指定的应用程序进程,并把他们绑定到指定的核上。
  • xxx_proxy:提供特定功能的代理服务,比如DSP与主控CPU的代理。
  • Lec mon:Linux Error Collector,负责管理文件系统中的错误日志文件的分割与迁移。
  • lec snap:负责监控所有进程的错误执行(如SIGHUP信号),负责收集进程执行异常时的上下文(通过执行配置的命令序列),并存储成snapshot文件,供程序分析软件异常。
  • watchdog:多核软件看门狗服务,每个core有一个独立的线程进行监控,实现对不同的cpu core进行喂狗服务。某个CPU core程序走飞时,看门狗就无法喂狗,超时后,试图通过重启系统恢复系统。
  • std out:该进程复杂把终端的打印信息(串口或ssh)重定向到指定的文件中,便于程序员查看调试信息。

第5章 基站中间件五大类API服务

5.1 内核空间BOS服务(POSIX接口封装)=》跨进程间通信

  • 内核消息队列
  • 信号量
  • 互斥量
  • 定时器
  • 单向链表
  • 双向链表
  • 共享内存
  • 文件操作
  • socket

5.2 用户空间的服务工具

(1)Buffer工具

  • Ring Buffer:循环缓冲区,用于L2和L1 proxy之间的数据承载
  • 缓冲区管理:为了降低malloc申请和释放内存的开销以及克服内存碎片的问题,可以预先在用户 空间向内核申请一个大的内存空间,然后按照特定的大小进行组织和管理。供应用程序申请,这样,应用程序就不需要向内核申请缓冲区。该缓冲区为所有的进程共享。这种方法,非常适合一个进程内所有线程的通信。

(2)调试工具

  • Trace服务:日志服务,通过trace服务,可以确保所有的线程打印的log是按照时间排序的,是按照特定的格式组织的。
  • Coredump服务:提供dumpDSP和FPGA 上下文的服务。
  • LEC:一组工具,用于收集出错信息。
  • OPTF (Optimized Files):RAM文件系统,把Falsh文件重定向到RAM中。
  • BCI:命令行解释器,有了个解释器,每个应用程序可以定义自己的命令行。

(3)通信工具

  • Pub/Sub:提供publish/subscribe机制
  • UMesg:是对TIPC的封装,提供跨板间通信的机制
  • eMSG:对UMesg进一步封装,提供更简化的跨板间通信的机制

    透明进程间通信(Transparent Inter-process Communication,缩写为TIPC)是一种用于进程间通信的网络通信协议,原本是为集群间通信特别设计的。它允许设计人员能够创建可以和其它应用快速可靠地通信应用,无须考虑在其它需要通信的应用在集群环境中的位置

 TIPC项目是TIPC协议的开源实现。TIPC项目组正在关注TIPC的演化,并致力于开发一个自由的可移植的TIPC协议实现。

在Linux和VxWorks中,TIPC已经可用,对Solaris的支持则正在开发当中。用C或C++编写的应用能够创建AF_TIPC协议簇的套接字(Socket)来使用TIPC协议,为Perl, Python和Ruby的插件现在也可使用。

TIPC 协议从Linux kernel版本2.6.16开始已经在内核支持,也可以作为模块置于之前版本的内核。其他操作系统中也有支持,包括Wind RiverVxWorks和Sun Microsystems的Solaris

和大多数如IP等网络协议不同,地址并不是与接口关联,而是和整个物理节点关联。一个节点也只能拥有整个网络中唯一的一个地址。

地址模式映射到逻辑网络拓扑。易读的标识为<Z.C.N>方式,其中Z表示Zone(集群)C代表Cluster,N代表(节点)Node.在内部,地址用一个32位的整数表示,高8位最高有效位表示Zone,中间12位表示Cluster,最后12位最低有效位表示节点(Node)。

(4)程序管理工具

  • Embryo:这个一个管理应用程序的框架程序,一个应用程序,可能会依赖其他的动态链接库so. 通过Embryo框架,可以方便的管理应用程序和依赖程序的关系。启动程序会先加载依赖库,再执行可执行程序。

(5)网络工具

  • IPIF:IP协议栈接口,用于设置网络接口的IP地址。

5.3 基本API服务之trace和log服务

存储或打印trace或日志log,是嵌入式系统一个非常有用的机制,没有该机制,只能使用printf把日志信息打印到屏幕上。有了trace或log服务,应用程序可以把日志打印到指定的文件中,还可以为日志分级等。

(1)code trace:跟踪工具,可以按照指定的等级,记录代码详细的执行流程。code trace的等级可以动态设置。这对于实时调试和跟踪目标系统的执行非常有帮助,每个应用程序都可以根据自身的逻辑,在代码中调用该工具,按照指定的等级条件code trace。该信息实时地显示到终端上,而不是飞行记录中。

(2)log:跟踪工具,用于把错误信息添加到飞行日志中。

(3)飞行记录:用于记录和捕捉系统中的各种异常事件和软件log事件,并把这些信息记录到系统文件中,用于程序员查找和定位问题。

  • software logs
  • software errors
  • alarms
  • hardware errors
  • initialization
  • internal messages
  • external messages
  • user defined event

5.4 基本API服务之Driver =》 映射设备驱动服务

硬件设备驱动程序可以封装成中间件的接口,提供给应用程序。

也可以直接通过后HAL接口,提供给应用程序。

5.5 基本API服务之SOC抽象层CAL ( Core Abstract Layer)

这些接口提供了访问SOC内部硬件资源的接口,特别是SOC芯片内部各种加速器硬件。

CAL与SOC的硬件密切相关。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

文火冰糖的硅基工坊

你的鼓励是我前进的动力

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

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

打赏作者

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

抵扣说明:

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

余额充值