微服务/API前端开发时代之 BFF 速学入门教程

BFF——服务于前端的后端 BFF——服务于前端的后端 以前我在谈论graphql的时候提到过BFF(Back-end For Front-end),每每都是一笔而过,这次就专门开一期,简介一下BFF——服务于前端的后端。 前端演化史 Web 1.0 故事都得从long long ago说起,让我们先来回顾web 1.0,那时候的网站如下所示: Web 1.0 第一代Web架构很简单,纯后端网页渲染;就是客户端每次向服务器请求都会返回一个特定的html页面,js都没啥大用场。我学生时代流行的JSP就属于这个范. 阅读详情

什么是BFF(Backends For Frontends)

顾名思义,它是前端的后端(服务器)。专门为前端而调用API,或者生成 HTML 的服务器。看到这里你可能会想,“这与传统的Web应用服务器有什么不同?”。本质上是一样的,只是专门为前端打造这一点不同而已。

首先,Web应用服务器有如下几种用途:

  • 从数据库和全文搜索引擎等中间件获取和更新数据

  • 创建一个页面

  • 作为HTTP接口从用户那里获取输入信息

在这里,从数据库和全文搜索引擎中获取和更新数据的部分旨在进行管理,同时确保数据的完整性和可靠性。构建页面的部分和获取用户输入信息的部分对应于用户界面(UI),目的是提升用户体验(UX)。

前者作为后端(Backends),而后者作为前端(Frontends),通过前后端的划分让开发者专注于各自的专业领域,这样的架构设计被称为“BFF”。

轮廓图如下所示

114781fdca7b43aa8593613716dfc9ac.png

像这样,BFF往往采取“设置在反向代理和后端API服务器之间”的配置。反向代理是一个用来替代Web应用服务器,进行静态文件压缩和缓存的服务器。后端API服务器主要与数据库、全文搜索引擎等中间件配合,起到操作资源和管理数据的作用。

BFF负责UI/UX相关的功能,比如在这两个服务器之间建立一个页面,接受用户的输入信息并发送给后端。

BFF 产生的技术背景和历史背景

技术背景

在前端领域的快速发展状态下,前端的开发早已从MVC的传统模式转变为现如今的前后端分离架构。

MVC的开发模式中,前后端开发过分耦合,导致开发效率低下,分工不均。出于解耦的目的,提出了前后端分离的架构。前端通过AJAX调用后端接口进行交互,实现前后端项目分离。

49469efd6c688f622a23c96be9bd13db.png

随着前端领域的不断扩大,后端服务在复杂的前端业务背景下,为兼容不同的业务逻辑变得臃肿而难以维护。

在这样的背景下,后端微服务架构逐渐成熟,领域之间的解耦也成为后端服务的主流。然而,前端需要自身去实现数据的聚合、裁剪等功能。虽然我们可以通过前端去请求不同的服务然后做数据的操作,但是由于不同的生态下,会存在一定的限制,例如微信小程序的域名数量限制。并且,服务的底层协议也会存在一定的限制,如RPC协议。为此,BFF中间层架构是一个比较不错的选择。

BFF(Back-end for Front-end) - 服务于前端的后端。

934d87d9be53714a5eff17ee33ae1a77.png

历史背景

在21世纪初,使用 JavaScript 进行 HTTP 请求的Ajax 通信概念开始普及,Web 应用逐渐变得丰富,且具有更强的交互性。随着富Web应用数量的增加,以及更多的处理集中在了客户端,服务器端越来越多地使用了仅发送和接收数据的 API 。

2507555a3f2b224df6dd26a242137707.png

此外,随着除 Web 应用之外的客户端(例如移动应用)数量的增加,服务器端需要构建专注于某一个领域的 API。它已经演变为“专门处理特定资源的架构”,因为它被称为微服务。

bf7177a773d40831d1f7d86ccc91d381.png

但是,随着客户端的更加多样化,创建满足所有客户端需求的 API 服务器变得越来越困难。你创建的移动应用和 Web 应用,UI 也各不相同,不同的客户端上所需要展现的内容也可能不同。例如,你创建了一个 Web 应用,由于屏幕尺寸的不同,用户可以看到的信息在 PC 和智能手机上可能会有所不同,甚至 UI 可能与移动应用完全不同。

此外,Web 应用具有环境限制,例如在 HTTP/1.1 中可以同时请求的请求数限制为 6。

针对这些情况,出现了一种架构,将响应每个客户端请求的服务器放置在前端,充当与后端API服务器的桥梁。这是因为 BFF 具有构建 HTML 和减少请求数量等优点。

65dbd762864d416e0a423bf414f86b21.png

这样,一种叫做“BFF”的架构就诞生了。

前端工程师还是后端工程师,谁来负责?

BFF 通常由负责客户端的前端工程师开发。由于BFF是服务器,可能会认为会由后端工程师开发,但既然是帮助构建和操作UI的服务器,那就是前端工程师的职责范围.

在 BFF 架构中,后端工程师负责基于 API 管理资源。

084d066d8ab512d9bc007e8a899efb1a.png

BFF能做什么

既然BFF架构相对于基本的前后端分离能解决一些复杂的业务问题,但是具体能做什么?

构建SSR服务解决C端网站SEO和白屏问题

当我们需要开发一个C端项目(面向用户)的时候,页面的快速响应和搜索引擎优化(SEO) 是我们必须着手去解决的问题。但是SPA页面的特性会导致页面一定的白屏时间。SPA页面下源码如下:

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="utf-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width,initial-scale=1.0" />
    <link rel="icon" href="<%= BASE_URL %>favicon.ico" />
   />
    <title><%= VUE_APP_TITLE %></title>
  </head>
  <body>
    <div id="app"></div>
  </body>
</html>

当用户打开页面时,页面展示白屏,通过AJAX请求后端服务加载数据后构建DOM,展示页面。

ad0244d0cb4c226fd8b33d4d1a5df470.png同时,对于爬虫来说,获取的内容也仅仅是模版文件的内容。

解决

在BFF中间层中,我们可以用SSR(服务端渲染) 的方式去解决以上问题。具体实现参考官方文档

import express from 'express'
import { createSSRApp } from 'vue'
import { renderToString } from 'vue/server-renderer'

const server = express()

server.get('/', (req, res) => {
  const app = createSSRApp({
    data: () => ({ count: 1 }),
    template: ``
  })

  renderToString(app).then((html) => {
    res.send(`
    <template></template>
    `)
  })
})

server.listen(3000)
04c0be0e8ef145a79e60116e80a1ebf0.png

在这个过程中,就不会存在等待AJAX请求的时间。同时,渲染的DOM结构是完整的HTML而不是仅是模版的HTML。

应对不同端对同一API的不同需求

我们可能存在这样的需求:应对不同的客户端开放不同的权限和功能,如小程序端仅支持阅读而不能添加评论,如果需要评论信息,只能在APP端进行。

面对这样的需求,微服务架构下的BE(后端开发)可能不会为了这样的功能单独实现。所以我们可以通过BFF层实现自己的业务逻辑判断,实现服务自治。

032c5cf7564f05f0c8f35a2bd6a26e9b.png

主要目的是对不同的客户端进行特定的业务处理;同时,集中处理统一逻辑,降低开发成本。

聚合不同服务API的数据

我们经常会遇到一个页面的初始化需要多个接口的数据,甚至是不同服务的数据。比如用户服务、订单服务等。

通常,这些服务以依赖的关系去请求,如订单服务需要依赖用户的信息。

d1958a247a121f1fb5ab3828a86050a5.png使用BFF架构去优化网站:减少请求数,这样就可以在客户端只发送一个请求,由BFF层去做一些数据的融合和多服务请求的操作。

d8d9c388c3a1d0ee29e927acf57b9966.png同时,在数据BFF返回数据的过程中,我们可以移除部分不需要的冗余数据。

定制自己的登陆和权限控制方案

最近在做一个B端的项目,项目有这样一个需求:根据不同的角色,实现接口访问控制。关于登陆的实现可参考之前的文章关于如何基于Google OAuth2.0 搭建系统鉴权

但是,对于服务提供方来说,我只是提供服务的,并不会对权限进行控制。所以,需要实现这个需求,只能自身从BFF层考虑。

实现

整体实现基于NestJS+Typescript。

定义一个装饰器

实现Nest自定义的装饰,用于Controller层队接口进行校验拦截。

import { SetMetadata } from '@nestjs/common'

export const Permissions = (...permissions: string[]) => SetMetadata('permissions', permissions)

实现守卫

守卫的目的就是实现拦截的手段。

async canActivate(context: ExecutionContext): Promise<boolean> {
    const roles: string[] = this.reflector.get('permissions', context.getHandler())
    if (!roles) {
      return true
    }
    // 获取请求Req
    const req = context.switchToHttp().getRequest<any>()
    const token = req.headers['Authorization'] || req.headers['authorization']
    if (!token) {
      throw new UnauthorizedException()
    }
    
    // 业务代码
    //
    //
    //
    
      return this.hasPermission(permissions || [], roles)
    }
  }

控制层使用

@Post()
  @Permissions('0101')
  async getBizData(@Body() data: QueryDto) {
    return this.myService.getBis(data)
  }

BFF所带来的问题

当一个架构能从一个方面带来了优势的同时,必定也会牺牲其他方面

资源问题

当BFF层多了,资源使用就成了问题,毕竟会多一个服务。尤其是使用SSR服务端渲染的时候,随着QPS(每秒请求数,就是说服务器在一秒的时间内处理了多少个请求。)的波动,CPU的使用和内存总是会有比较高的波动。不过这方面考虑使用服务提供商的伸缩性服务。

维护问题

随着BFF层的使用,前端也不仅仅只是需要关注浏览器端的知识点。同时也需要掌握后端服务的知识,如数据库、服务器、并发问题等等。会使得前端的同学维护起来较为困难。

但是,也建议大家跳出自己的舒适圈。

服务链路问题

在引入BFF层之前,可能只是单纯的服务调用。服务之间的依赖在前端比较清晰。

在使用BFF层架构之后,流程变得繁琐,要同时走前端、服务端的研发流程,多端发布、互相依赖,导致流程繁琐。出现问题的时候,需要清晰的链路追踪,这里一定要将日志的链路完善好,避免造成问题排查的困难。

原文地址:https://juejin.cn/post/7008440419054780446#heading-3 https://juejin.cn/post/7065687335517552671#comment

源码

最后, 送人玫瑰,手留余香,觉得有收获的朋友可以点赞,关注一波 ,我们组建了高级前端交流群,如果您热爱技术,想一起讨论技术,交流进步,不管是面试题,工作中的问题,难点热点都可以在交流群交流,为了拿到大Offer,邀请您进群,入群就送前端精选100本电子书以及 阿里面试前端精选资料 添加 下方小助手二维码或者扫描二维码 就可以进群。让我们一起学习进步.

5f23543c8a7ca473bfcfef868d5a0a0e.png


推荐阅读

(点击标题可跳转阅读)

[极客前沿]-你不知道的 React 18 新特性

[极客前沿]-写给前端的 K8s 上手指南

[极客前沿]-写给前端的Docker上手指南

[面试必问]-你不知道的 React Hooks 那些糟心事

[面试必问]-一文彻底搞懂 React 调度机制原理

[面试必问]-一文彻底搞懂 React 合成事件原理

[面试必问]-全网最简单的React Hooks源码解析

[面试必问]-一文掌握 Webpack 编译流程

[面试必问]-一文深度剖析 Axios 源码

[面试必问]-一文掌握JavaScript函数式编程重点

[面试必问]-阿里,网易,滴滴,头条等20家面试真题

[面试必问]-全网最全 React16.0-16.8 特性总结

[架构分享]- 微前端qiankun+docker+nginx自动化部署

[架构分享]-石墨文档 Websocket 百万长连接技术实践

[自我提升]-Javascript条件逻辑设计重构

[自我提升]-送给React开发者十九条性能优化建议

[自我提升]-页面可视化工具的前世今生

[大前端之路]-连前端都看得懂的《Nginx 入门指南》

[软实力提升]-金三银四,如何写一份面试官心中的简历

觉得本文对你有帮助?请分享给更多人

关注「React中文社区」加星标,每天进步

c1e4ff7491ed47bb3b6be7a795f4df7a.png   

点个赞👍🏻,顺便点个 在看 支持下我吧

[微服务/API时代的前端开发] BFF入门--5个实用的BFF使用案例 前言 在本系列“微服务/API时代的前端开发”中,我们将介绍当前备受关注的BFF(Backends For Frontends)。这一篇,我们将介绍 BFF 的五个典型使用案例。 在之前的[微服务/API时代的前端开发] BFF超入门--Netflix、Twitter、Recruit选择BFF的理由一文中,我介绍了BFF的概要和案例。 可能很难理解 BFF 是做什么的,简单地说,API 服务器负责业务领域的逻辑部分,而 BFF 是支持用户界面的服务器。如果Web应用可以使用领域逻辑简单地创建... 阅读详情

相关推荐

后端架构模式之-BFF(Backend-For-Frontend)

在传统架构中,前端通常直接与一个通用的后端 API(如 RESTful 或 GraphQL API)交互,而 BFF 引入了一层专门的后端,让不同类型的前端(Web、iOS、Android、小程序等)有各自独立的 BFF 层。,为不同前端提供定制化 API,以优化数据传输、减少 API 调用次数、提升前端开发效率,并降低后端改动对前端的影响。: ✅ 需要支持多个前端(Web、移动端、小程序等)。,它为特定的前端应用(Web、移动端、桌面端等)提供。,作为前端与通用后端(或微服务)之间的中间层。

踏踏实实,贵在坚持 3763

前端BFF中间件是什么?

原文地址:https://www.jianshu.com/p/eb1875c62ad3 本文主要内容: 什么是 BFF BFF 解决了什么问题 使用 BFF 的正确姿势 实战中的玩法 什么是 BFF BFF,即 Backend For Frontend(服务于前端的后端),也就是服务器设计 API 时会考虑前端的使用,并在服务端直接进行业务逻辑的处理,又称为用户体验适配器。BFF 只是一种逻辑分层,而非一种技术,虽然 BFF 是一个新名词,但它的理念由来已久。 BFF 解决了什么问题.

_ 4495

微服务 BFF 架构设计

BFF即 Backends For Frontends (服务于前端的后端),由于微服务众多,需要一个统一入口根据不同的业务场景作为前端集成使用。面向后端:BFF 隔离了因不同渠道前端 UI 展示对后端 API 的需求,企业可以在后端构建核心业务领域能力面向前端:BFF 可以根据已有的后端 API,快速满足不同渠道的前端在 UI 展示上的需求,来不断提升用户体验同时,BFF 可以帮助企业进行微服务架构的迁移或者演进。

Java+GO+JS全栈工程师-鹤冲天的博客:编程辅导~商务合作~技术交流 3602

「Web架构模式」模式:前端的后端(BFF)

面向用户界面和外部方的单用途边缘服务介绍随着web的出现和成功,交付用户界面的实际方式已经从厚客户端应用程序转变为通过web交付的界面,这一趋势也使基于SAAS的解决方案总体上得以发展。通过web提供用户界面的好处是巨大的——主要是因为发布新功能的成本大大降低了,因为客户端安装的成本(在大多数情况下)被完全消除了。然而,这个简单的世界并没有持续太久,不久之后,手机时代就到来了。现在我们有麻烦了。我...

全网:架构师研究会 1890

BFF调研-1

前端开发中存在的难问题 多端应用,不同类型客户端对数据、API有个性化的需求 服务聚合,单一后端为多个前端团队提供接口,导致跨团队协作低效,资源协调困难 问题:服务端设计的接口究竟是面向UI,还是面向通用服务? BFF 解决方案: Backends For Frontends, 简称BFF。 BFF最适合的场景,为第三方提供定制API等差异化场景,每个用户体验(客户端)对应一个后端, BFF...

多啦的博客 4588

微服务架构中的BFF到底是啥?又是如何演化而来的?

一、从一个MyShop开始说起 为了讲清BFF是个啥,这里引用一个案例,来跟大家分享一下,并尽力说清楚BFF是啥,又是如何演化出来的。 假设我们在一个开发团队中,开发了一个叫做MyShop的电商项目,它采用的是微服务的架构风格。它经历过几次架构调整,我们就跟着它的调整来看看BFF是怎么演化出来的。 假设v1版本在七八年之前,MyShop已经采用了服务化的架构,它的客户端也主要还是以传统的Web应用为主。在当时,它的SOA架构已经算是跟上了潮流。 转眼之间,来到了四五年前,MyShop升级为.

Java圈全能架构师的博客 1561

微服务架构中的BFF到底是啥?

一、从一个MyShop开始说起 为了讲清BFF是个啥,这里引用我在波波老师的课程《Spring Boot与K8s云原生应用开发》中学到的一个案例,来跟大家分享一下,并尽力说清楚BFF是啥,又是如何演化出来的。 假设我们在一个开发团队中,开发了一个叫做MyShop的电商项目,它采用的是微服务的架构风格。它经历过几次架构调整,我们就跟着它的调整来看看BFF是怎么演化出来的。 假设v1版本在七八年之前,MyShop已经采用了服务化的架构,它的客户端也主要还是以传统的Web应用为主。在当时,它的SOA架构

Itmylove8的博客 1万+

Node做BFF中间层架构优化前端开发体验并提升系统整体性能。

在使用 Node.js 构建 BFF(Backend for Frontend)层架构时,核心思想是为前端应用(如 Web、移动端或桌面应用)提供定制化的 API 接口,将后端复杂的服务逻辑抽象化、聚合化,从而优化前端开发体验并提升系统整体性能。

专研技术的大学生:会点Java和前端 2205

[微服务/API时代的前端开发] BFF超入门--Netflix、Twitter、Recruit选择BFF的理由

前言 在本系列“微服务/API时代的前端开发”中,我们将介绍当前备受关注的BFF(Backends For Frontends)。这一篇,我们将主要介绍BFF的概要和例子,作为“超入门”。第2部分将介绍如何创建BFF,第3部分将介绍由前端开发人员使用BFF创建微服务/API的过程。 目标读者是那些Web应用开发经验的人、前端开发人员、以及那些正在构建微服务的人。 什么是BFF(Backends For Frontends)? 顾名思义,它是前端的后端(服务器)。专门为前端而调用API,或者生成 ..

weixin_45987961的博客 1662

BFF和网关是如何演化出来的?

介绍 BFF(Backend for Frontend)和网关Gateway是微服务架构中的两个重要概念,这两个概念相对比较新,有些开发人员甚至是架构师都不甚理解。 本文用假想的公司案例+图示的方式,解释BFF和网关是什么,它们是怎么演化出来的。希望对架构师设计和落地微服务架构有所启发。 服务化架构V1 我们先把时间推回到大致2011年左右。假设有一家有一定业务体量的电商公司CoolShop,在这...

架构师波波的专栏 4783

【系统架构】BFF层

BFF:Backends For Frontends(服务于前端的后端)。 BFF是一种Web架构,微服务设计系列丛书的作者 Sam Newman曾在他的博客中写了一篇相关文章《Pattern: Backends For Frontends》。 服务端设计API时会考虑到不同设备的需求,即为不同设备提供不同API接口,虽然它们可能实现相同功能,但因不同设备的特殊性,它们对服务端的API访问也各有其特点,需区别处理。在计算机科学中,所有问题都可以通过加一层来解决,于是 BFF 架构设计应运而生。

欢迎指错||纠正||建议||水评+点赞&&评论&&关注&&转发 1773

【有料】微服务架构中的BFF到底是啥?

在《技术中台与业务中台都是啥玩意》一文中留下一个问题:BFF是啥?为啥在API网关和业务中台之间加入了一层BFF?考虑到在实际工作中,我的大部分同事都问过这个问题,这里我也总结一下进行答复。为了讲清BFF是个啥,这里引用我在波波老师的课程《Spring Boot与K8s云原生应用开发》中学到的一个案例,来跟大家分享一下,并尽力说清楚BFF是啥,又是如何演化出来的。假设我们在一个开发团队中,开发了一个叫做MyShop的电商项目,它采用的是微服务的架构风格。它经历过几次架构调整,我们就跟着它的调整来看看BFF是

daobuxinzi的博客 2825

FPGA实战:用Verilog实现Costas环载波同步(附Vivado2019.2仿真步骤)

本文详细介绍了如何在FPGA上使用Verilog实现Costas环载波同步,包括核心原理、Vivado2019.2工程配置、代码实现及仿真验证。通过正交下变频、相位误差检测和环路滤波等关键模块的设计,帮助开发者掌握数字通信系统中的载波同步技术,并提供了实用的调试和优化技巧。

k0l1m2n3o的博客 134

BFF架构

BFF架构

在所有的事情背后,要有一颗坚定的的本心,要有一颗应对变革和提升自我的本心,世界瞬息万变,本心要坚持到底,保持学习,时刻复盘 2461

LayaNative源码编译

修改好后的LayaNative2.0需要重新编译生成Android和iOS所需要的动态库文件。

末之 1358

RK3568部署YOLOv8的7种方法对比:量化vs非量化的性能实测与优化建议

本文针对RK3568平台,深度对比了YOLOv8模型的七种部署方法,重点分析了量化与非量化策略的性能差异。通过实测数据,详细评估了不同方法在推理速度、CPU占用、内存消耗及模型精度上的表现,并提供了从模型结构调整到系统级优化的具体建议,为边缘AI部署选型提供实用参考。

weixin_29099217的博客 527

速来围观,一分钟快速了解 BFF

BFF,既Backend For Frontend。 中文翻译过来的意思是前端的后端。 关于前后端日常描述: 后端同学追求的服务下沉,解耦,微服务化。一条message 需要几个接口返回。[前端:能给组装一下吗?, 后端:都返你了,自己拼一下吧…别人也这么用的…] 前端追求用户体验 [前端:少一次http请求,多写个接口难吗? 后端:没必须浪费时间在重写,不差这个一个请求…] 总结: 前端和后端同学都说的各自有道理,就看谁有时间来处理了,那到底有没有一种解决场景可以化解这种尴尬的场景,于是就有了BFF, 1

Baron的技术blog 8300

Label Studio保姆级教程:从零搭建医疗影像标注平台(DICOM格式支持)

本文提供基于Label Studio从零搭建医疗影像标注平台的保姆级教程。针对DICOM格式支持,详细阐述了环境部署、DICOM深度集成与预处理、团队协作权限管理以及质量审核闭环等核心环节,旨在构建一个高效、可落地的医疗AI数据标注解决方案,助力模型落地。

nft7creator的博客 304

[微服务/API时代的前端开发] BFF进阶--实践中常见的3种反模式

实践中常见的3种反模式前言【反模式1】导致缺乏沟通的“稀疏沟通”【反模式2】BFF处理过度的“Fat Front”【反模式3】 最后阶段一次性发布的“Big Bang Joint”组织问题与架构设计之间有着密切的关系前端开发的未来 前言 上一篇介绍了BFF相关的5个使用案例。本篇将结合笔者在实际项目中多次采用BFF的经验来说明反模式出现的原因和相应的解决方法。 BFF 是一种架构模式,但并不是任何情况都适用。如果对它的优缺点了解不够透彻,就冒然采用的话,你可能会后悔。我在实际项目中多次采用了BFF,但并非所

前端探险家的博客 726

【nvidia-B200 生产环境】NVIDIA 570.124.06+Cuda12.8 Ubuntu22.04 nccl-test 一键部署脚本(免修改复制即用)

目录1. 初始化与日志记录2. 安装基础工具与配置更新3. NVIDIA 驱动安装 570.124.064. 安装 Mellanox OFED 24.10-2.1.8.05. 安装 CUDA 12.86. 安装 NCCL 和测试7. 配置 rc.local 和其他优化8. B200 单独步骤9. 最终测试与重启10. 完整生产脚本,复制即可直接使用总结 功能: 设置日志目录和日志文件路径。 使用 命令将标准输出和错误输出同时写入日志文件和终端。 记录脚本开始时间,并计算开始的秒数

jundao1997的专栏 2797

2023华为od机试C卷【最富裕的小家庭】Java&Go 实现

在一颗树中,每个节点代表一个家庭成员,节点的数字表示其个人的财富值,一个节点及其直接相连的子节点被定义为个小家庭。现给你一颗树,请计算出最富裕的小家庭的财富和。

MISAYAONE的博客 1902
上一篇: 几个贼吓人的公众号,各个硬核。
下一篇: 结合SOLID设计原则,浅谈如何提升前端代码质量
React 中文社区
博客等级 码龄6年 119粉丝 41原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值