Go微服务: 基于ProtoBuf实现GRPC的微服务调用

【gRPC】:快速上手gRPC与protobuf 快速上手gRPC与protobuf简单demo实例 阅读详情

基于 proto 的 GRPC 实现微服务调用


1 )环境准备

  • 新建 demo 项目,并初始化 $ go mod init demo
  • 在 demo 项目中,分别创建三个包: protos, server, client 并用 go mod 初始化
    • $ mkdir protos server client
    • $ cd protos && go mod init protos
    • $ cd ../server && go mod init server
    • $ cd ../client && go mod init client
  • 基于 workspace 处理三个包的关联
  • 新建 demo/protos/greeter.proto
    syntax = "proto3";
    option go_package="./greeter";
    
    service Greeter {
        rpc SayHello(HelloReq) returns (HelloRes);
    }
    message HelloReq {
        string name=1;
    }
    message HelloRes {
        string message=1;
    }
    
  • 新建 demo/protos/greeter 目录
  • 在 demo/protos 下执行 $ protoc --go_out=./greeter --go_opt=paths=source_relative --go-grpc_out=./greeter --go-grpc_opt=paths=source_relative ./greeter.proto
  • 这时候生成 demo/protos/greeter包,里面就是 greeter_grpc.pb.go 和 greeter.pb.go

2 )创建服务端程序

  • 新建 demo/server/main.go

    package main
    
    import (
        "context"
        "fmt"
        "protos/greeter"
        "net"
        "google.golang.org/grpc"
    )
    
    // 1、定义远程调用的结构体和方法 我们这个结构体需要实现 GreeterServer 的接口
    type Hello struct{
        // 嵌入UnimplementedGreeterServer来提供默认实现  
        greeter.UnimplementedGreeterServer  
    }
    
    func (this Hello) SayHello(c context.Context, req *greeter.HelloReq) (*greeter.HelloRes, error) {
        fmt.Println(req)
        return &greeter.HelloRes{
            Message: "回复:你好" + req.Name,
        }, nil
    
    }
    func main() {
        // 1. 初始一个 grpc 对象
        grpcServer := grpc.NewServer()
        // 2. 注册服务
        greeter.RegisterGreeterServer(grpcServer, &Hello{})
        // 3.  设置监听, 指定 IP、port
        listener, err := net.Listen("tcp", "127.0.0.1:8080")
        if err != nil {
            fmt.Println(err)
        }
        // 4. 退出关闭监听
        defer listener.Close()
        // 5. 启动服务
        grpcServer.Serve(listener)
    }
    
  • 把它运行起来

3 )创建客户端程序

  • 新建 demo/client/main.go

    package main
    
    import (
        "fmt"
        "protos/greeter"
        "context"
        "google.golang.org/grpc"
        "google.golang.org/grpc/credentials/insecure"
    )
    
    func main() {
        // 1、连接服务器
        // credentials.NewClientTLSFromFile :从输入的证书文件中为客户端构造TLS凭证
        // grpc.WithTransportCredentials :配置连接级别的安全凭证(例如,TLS/SSL),返回一个 DialOption,用于连接服务
        grpcClient, err := grpc.Dial("127.0.0.1:8080", grpc.WithTransportCredentials(insecure.NewCredentials()))
        if err != nil {
            fmt.Println(err)
        }
        // 2、注册客户端
        client := greeter.NewGreeterClient(grpcClient)
        res, _ := client.SayHello(context.Background(), &greeter.HelloReq{
            Name: "张三",
        })
        // fmt.Printf("%#v\r\n", res)
        fmt.Println(res.Message)
    }
    
  • 运行起来这个客户端,即可看到客户端打印出来的服务端回复信息,同时服务端自身也打印出来了

应用场景


1 )概述

  • 这里模拟一些常用的业务场景, 比如添加用户和获取用户列表这两项功能接口
  • 参考上述环境准备,分别创建proto文件,服务端和客户端

2 )proto 文件

  • 创建 demo/protos/users/users.proto

    syntax="proto3";
    option go_package="./users";
    
    service Users {
        rpc AddUser(AddUserReq) returns (AddUserRes);
        rpc GetUser(GetUserReq) returns (GetUserRes);
    }
    
    message UsersModel {
        string name = 1;
        int32 age = 2;
    }
    
    message AddUserReq {
        UsersModel user = 1;
    }
    
    message AddUserRes {
        string message = 1;
        bool success = 2;
    }
    
    message GetUserReq {
    }
    
    message GetUserRes {
        repeated UsersModel userList =1 ;
    }
    
  • 进入 protos/users 目录下

    • 执行 $ protoc --go_out=. --go_opt=paths=source_relative --go-grpc_out=. --go-grpc_opt=paths=source_relative ./users.proto
  • 此时生成了 protos/users/users.pb.go, protos/users/users_grpc.pb.go

  • 这里的命令和上面环境搭建里的不同,就是把 一个服务的3个文件放在一个包里

3 )服务端

  • 创建 demo/server/main.go

    package main
    
    import (
    	"context"
    	"fmt"
    	"protos/users"
    	"net"
    	"strconv"
    	"google.golang.org/grpc"
    )
    
    type Users struct{
    	users.UnimplementedUsersServer
    }
    
    func (g Users) AddUser(c context.Context, req *users.AddUserReq) (*users.AddUserRes, error) {
    	fmt.Println(req)
    	return &users.AddUserRes{
    		Success: true,
    		Message: "增加用户成功",
    	}, nil
    }
    
    func (g Users) GetUser(c context.Context, req *users.GetUserReq) (*users.GetUserRes, error) {
    	var tempList []*users.UsersModel
    	for i := 0; i < 10; i++ {
    		tempList = append(tempList, &users.UsersModel{
    			Name:   "商品" + strconv.Itoa(i),
    			Age:   int32(i),
    		})
    	}
    	return &users.GetUserRes{
    		UserList: tempList,
    	}, nil
    }
    func main() {
    	// 1、获取Grpc示例
    	grpcServer := grpc.NewServer()
    	// 2、注册服务
    	users.RegisterUsersServer(grpcServer, &Users{})
    	// 3、监听端口
    	listener, err := net.Listen("tcp", "127.0.0.1:9000")
    	if err != nil {
    		fmt.Println(err)
    	}
    	// 4、退出服务的时候关闭监听
    	defer listener.Close()
    	// 5、启动服务
    	grpcServer.Serve(listener)
    }
    
  • 这里在server包中执行 $ go mod tidy

  • 之后运行起来 $ go run main.go

4 ) 客户端

  • 创建 demo/client/main.go
    package main
    
    import (
    	"protos/users"
    	"context"
    	"fmt"
    	"google.golang.org/grpc"
    	"google.golang.org/grpc/credentials/insecure"
    )
    
    func main() {
    	// 1、建立连接
    	grpcClient, err := grpc.Dial("127.0.0.1:9000", grpc.WithTransportCredentials(insecure.NewCredentials()))
    	if err != nil {
    		fmt.Println(err)
    	}
    
    	// 2、注册客户端
    	client := users.NewUsersClient(grpcClient)
    
    	// 3. 调用接口1:增加用户
    	res1, _ := client.AddUser(context.Background(), &users.AddUserReq {
    		User: &users.UsersModel {
    			Name:   "测试",
    			Age:   20,
    		},
    	})
    	fmt.Println(res1)
    
    	fmt.Println()
    
    	// 4. 调用接口2:获取数据
    	res2, _ := client.GetUser(context.Background(), &users.GetUserReq{})
    
    	fmt.Println(res2.UserList)
    }
    
    • 这里在server包中执行 $ go mod tidy
  • 之后运行起来 $ go run main.go
  • 可以看到服务端和客户端的控制台上都打印了出来
  • 由此可见,再多一些功能封装和集合数据库就是一个基础的微服务调用模式

参考

Golang gRPC+Protobuf:高效序列化的秘密 在当今的软件开发中,不同服务之间的通信至关重要。我们的目的就是要探索一种高效的服务间通信和数据序列化方案。本文的范围涵盖了Golang语言下gRPC和Protobuf的基本概念、工作原理、实际应用等方面,帮助读者全面了解如何利用它们实现高效的序列化。本文首先会介绍gRPC和Protobuf的核心概念,让大家对它们有一个初步的认识;接着详细讲解它们的工作原理和架构,包括算法原理、数学模型等;然后通过项目实战,展示如何在实际代码中运用;再探讨它们的实际应用场景; 阅读详情

相关推荐

Go 语言微服务架构搭建:基于 gRPC 和 Protobuf 的高效通信实践

微服务架构是一种将应用拆分为一组小的、独立的服务的架构模式。每个微服务都围绕一个特定的业务功能构建,具有自己的数据库、业务逻辑和 API。松耦合:服务之间通过 API 进行交互,独立部署和扩展。可伸缩性:每个服务可以单独扩展,适应不同的负载。技术多样性:不同的微服务可以使用不同的技术栈。然而,随着微服务数量的增多,服务间的通信变得复杂,如何高效、安全、可靠地进行服务间通信成为微服务架构设计中的一个关键问题。gRPC。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 1248

[golang 微服务] 4. gRPC介绍,Protobuf结合gRPC 创建微服务

gRPC介绍, Protobuf结合gRPC创建微服务,gRPC实现微服务案例

资深系统架构,深耕高并发研发与 AI 大模型工程化落地。技术栈以 Python (AI/NLP/RAG/Agent) 与 Golang (高并发架构) 为双核心,兼具 PHP 大型应用经验。专注算法落地、复杂系统设计及团队技术赋能 2901

AD2S1210与DSP28335 SPI通信中的GPIO配置陷阱与解决

本文深入剖析了AD2S1210与DSP28335进行SPI通信时,因GPIO输入限定配置不当导致数据整体右移的典型问题。文章指出,错误地将MISO引脚配置为带采样周期的同步模式是根本原因,并提供了将输入选择限制正确设置为异步模式的解决方案。同时,总结了不同应用场景下GPIO输入限定的配置原则,为高速同步通信的稳定实现提供了关键指导。

weixin_29163857的博客 146

微服务之间的最佳调用方式

再说写数据,如果在创建一个“Order”时需要创建一个新的“Customer”或要修改“Customer”的信息,那么可以在界面上跳转到用户创建页面,然后在“Customer Service”创建用户之后再发”用户已创建“的消息,“Order Service”接到消息,更新本地“Customer”表。直到十年之后,微服务出来之后,人们发现它其实内部就是微服务,而且微服务的设计需要用它的思想来指导,于是就又重新焕发了青春,而且这次更猛,已经到了每个谈论微服务的人都不得不谈论DDD的地步。再举一个购物的例子。

z_ssyy的博客 906

从原理到实践:详解RGBD相机深度与彩色图像对齐(D2C)算法

本文深入解析了RGBD相机深度与彩色图像对齐(D2C)算法的原理与实现。针对自组装相机中深度图与彩色图不匹配的核心痛点,文章从相机模型、坐标系变换等数学基础讲起,剖析了传统点映射算法的缺陷,并重点介绍了高效的矩形区域映射算法。该算法通过将深度像素视为矩形区域进行映射,有效解决了空洞和遮挡问题,并附有可直接复用的C++代码与优化技巧,为三维重建、机器人视觉等应用奠定坚实基础。

weixin_28363123的博客 243

智能车竞赛飞檐走壁组赛道制作全攻略:从电磁线铺设到立体元素搭建

本文提供了智能车竞赛飞檐走壁组赛道制作的完整指南。从电磁线选材、电流控制与精准铺设等基础入手,详细解析了垂直墙面、圆筒、跷跷板等核心立体元素的构建技巧与过渡处理。重点分享了确保赛道稳定、符合规则且便于调试的实战经验,帮助参赛队伍搭建可靠的立体赛道,为车模算法调试奠定坚实基础。

weixin_29292535的博客 1292

GRPC工具开发

本工具思路:上传proto文件,解析成java类,利用反射获取想要的service和method,发送GRPC请求。

Luohuals的博客 318

PDF批量加水印 与 去除水印实践

我们可以给PDF加图片水印或文字水印,要去除图片水印,一般只需要删除最后一个图片对象即可。要去除文字水印,需要保证主体内容和文字水印在/Contents中位于不同的对象内,这样我们只需要删除文字水印对应的对象即可删除水印。而对于主体内容和文字水印已经混合在一个对象时,本文的提供的方法则无能为力,需要进一步深入分析PDF细节。

小小明-代码实体的专栏 2763

Go微服务(二)——Protobuf详细入门

Protobuf详细入门:Protobuf是Protocol Buffers的简称,它是Google公司开发的⼀种数据描述语⾔,并于2008年对外开源。

脑袋装水的博客 2209

不会ps,你也可以成为ps高手,最强傻瓜式人像一键磨皮美白瘦脸美妆PS插件

比如:美肤是用来去斑点的,如果效果不太理想,就加大百分比,反之就减小。瘦脸如果脸胖的就打开,正常的就关闭。所谓的一键调节,要不只能调节一种效果,要不就是个预设,然后让你自己再调。同时,该软件还加入了贴心的批量处理功能,能同时处理上千张照片,让您喝着茶也能将工作做完。、自动检测照片中的人脸,包括鼻子,嘴巴,耳朵,眼睛和眉毛。、依托强大的脸部识别功能,可以高效的对人物全身皮肤进行智能识别,处理,使肤质平滑、过渡均匀。,这是网上下载的模糊照片,经过简单处理,你可以发现,眼睛变的更亮,皮肤更白,眼袋消失。

心语家园 - www.xinyucn.cc 2901

【机器人学】常用的小车底盘运动学模型推导(附C++代码)

认知有限,望大家多多包涵,有什么问题也希望能够与大家多交流,共同成长!本文先对小车底盘运动学模型介绍做个简单的介绍,具体内容后续再更,其他模块可以参考去我其他文章提示:以下是本篇文章正文内容对于小车的分析,仅仅考虑XY轴的线速度和Z轴的角速度,不考虑和横滚和俯仰的速度,【防盗标记–盒子君hzj】也不考虑Z轴的高度变化【即:车底盘的运动可以用三个独立变量来描述:x轴平动、y轴平动、yaw轴转动】

qq_35635374的博客 1932

go实现gRPC服务

定义服务接口、接收和响应的消息类型均在.proto文件中定义,以下代码中,定义了一个服务Greeter,服务中定义了一个rpc方法SayHello,该方法接收一个HelloRequest类型的消息,并返回一个HelloReply类型的响应。// 指定protoc版本// 指定自动生成go代码时的包名// 指定包名,防止命名冲突// 定义Greeter服务// 定义SayHello方法// 定义HelloRequest消息,消息中包括一个string类型的name字段。

Golang丨系统架构丨微服务丨物联网 1683

【ComfyUI】SD1.5 + ControlNet 边缘检测融合动漫转真人

本文介绍了一个基于ComfyUI的动漫转真人图像生成工作流,通过多模型协同实现高质量的二次元图像转换。该工作流集成了Canny线稿预处理、ControlNet结构控制、VAE编码解码和人脸精细化处理等核心环节,采用majicmixRealistic_v7作为主模型,配合yolov8、SAM等辅助模型。整个流程包含11个标准化步骤,从图像输入、预处理到最终超分输出,通过ControlNet引导和CLIP语义控制确保生成图像的写实感和结构准确性,特别针对人脸区域进行专业优化,最终可输出高分辨率写实人像。

Mr数据杨 1129

2026 Go微服务全栈实战:Gin框架+gRPC通信+Consul服务注册发现+Nacos配置中心+GORM数据库操作+ProtoBuf+负载均衡+优雅停机完整指南

Go微服务全栈开发实战指南(2026) 本文提供基于Go语言的微服务全栈开发完整解决方案,涵盖以下核心技术组件: 核心架构 采用Gin框架构建Web层 使用gRPC实现高效服务间通信 Consul实现服务注册与发现 Nacos作为分布式配置中心 关键技术点 数据库操作:GORM集成与连接池优化 协议定义:ProtoBuf代码生成规范 负载均衡:轮询策略实现 运维保障:优雅停机机制 健康检查:服务状态监控 开发流程 从Proto定义到服务注册的全链路实现 动态配置管理方案 生产级连接池调优建议 健康检查与负载

猫头虎技术团队:授渔优于赠鱼,兴趣引领智慧,探索之乐尤显珍贵。商务合作+:Libin9iOak ,万粉变现+:优快云WF,猫头虎承诺每年免费为100名C站创作者做账号流量诊断服务!全网搜:猫头虎技术团队,点击文章底部名片或直接私信我一切皆可谈,快找虎哥! 2471

【Bug已解决】Codex 报错 MCP client for context7 failed to start: program not found 解决方案

方案适用场景推荐指数改用绝对路径Windows 上最常见、最有效的解决方式⭐⭐⭐⭐⭐提前全局安装避免依赖 npx减少运行时网络下载的不确定性⭐⭐⭐⭐使用 .cmd 后缀Windows 平台快速尝试⭐⭐⭐⭐开启调试日志需要更精确定位失败原因⭐⭐⭐⭐统一封装启动脚本需要跨平台兼容多个 MCP 服务⭐⭐⭐报错的本质是Codex 启动 MCP 子进程时,无法正确定位配置文件中写的简写命令名对应的可执行文件,尤其容易发生在 Windows 平台上使用npx这类简写命令的场景。

一键难忘的博客 5815

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

gRPC实战:从ProtoBuf定义到微服务通信的完整流程(附代码示例)

本文详细介绍了gRPC从ProtoBuf定义到微服务通信的完整流程,包括环境配置、ProtoBuf服务定义、gRPC服务端与客户端实现、同步与异步调用对比,以及生产环境最佳实践。通过代码示例和问题解决方案,帮助开发者高效构建高性能微服务通信系统。

y7z8a9的博客 1006

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

Go 微服务 RPC 实践:从 IDL 定义到 SDK 调用的完整链路

RPC(远程过程调用)是企业微服务架构的核心技术,通过IDL定义接口契约并自动生成SDK,实现高效跨服务通信。主要流程包括:定义Protobuf格式IDL、平台生成包含客户端初始化和接口方法的Go SDK、项目集成调用。相比HTTP,RPC具有二进制传输、强接口约束、高性能等优势,适合内部微服务通信。企业实践中通常基于gRPC等成熟框架,结合服务发现机制,实现高可用调用。关键原则是内部服务采用RPC保证性能,对外接口使用HTTP确保通用性。

m0_73884648的博客 1080

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

gRPC实战:从零构建时间服务与Hello World案例

本文通过构建时间服务和Hello World两个实战案例,详细介绍了gRPC的核心开发流程。从编写.proto文件定义接口,到使用protoc生成代码骨架,再到实现服务端逻辑与客户端调用,手把手演示了如何利用gRPC实现高效的远程函数调用,帮助开发者快速入门并掌握这一微服务通信利器。

7up55的博客 1081

【微服务】微服务、gRPC和protobuf是什么,及其联系

Protobuf是一种数据格式,定义了“服务和消息的结构”。它是基础,用来告诉服务端和客户端“如何传递数据”。gRPC是通信工具,利用 Protobuf 定义的结构,实现服务之间的高效调用。微服务是架构模式,将系统拆分成独立服务,这些服务之间通常通过 gRPC 通信。微服务是一种架构风格,把一个完整的应用拆分成多个小的服务,每个服务只负责一种特定的功能。用户服务:处理用户的注册、登录等操作。订单服务:负责下单、查询订单。商品服务:管理商品信息。支付服务:处理支付操作。微服务。

m0_74282926的博客 1690

【go微服务】如何快速掌握grpc开发

在 gRPC 里客户端应用可以像调用本地对象一样直接调用另一台不同的机器上服务端应用的方法,使得您能够更容易地创建分布式应用和服务。 与许多 RPC 系统类似,gRPC 也是基于以下理念:定义一个服务,指定其能够被远程调用的方法(包含参数和返回类型)。 在服务端实现这个接口,并运行一个 gRPC 服务器来处理客户端调用。在客户端拥有一个存根能够像服务端一样的方法。

景天科技苑 9万+

Golang——gRPC与ProtoBuf介绍

微服务架构中,由于每个服务对应的代码库是独立运行的,无法直接调用,彼此之间的通信就是一个大问题。gRPC可以实现微服务,将大的项目拆分为多个小且独立的业务模块,也就是服务,各个服务将使用高效的protobuf协议进行RPC调用,gRPC默认使用protocol buffers,这个是google开源的一套成熟的结构数据序列化机制,当然也可以使用其它数据结构如JSON。可以用proto files创建gRPC服务,用message类型来定义方法参数和返回类型。

weixin_57023347的博客 2363

grpc教程(golang版)

RPC是的简称,中文叫远程过程调用,简单的说,就是调用远程方法和调用本地方法一样那么grpc就是由google开发的一个高性能、通用的开源RPC框架gRPC是一种现代开源高性能远程过程调用(RPC)框架,可在任何环境中运行。它可以高效地连接数据中心内的服务,并支持负载平衡、跟踪、健康检查和身份验证等插件功能。它适用于分布式计算的最后一英里,以连接设备、移动应用程序和浏览器到后端服务。公司已使用gRPC连接其环境中的多个服务,从连接少数服务到跨多种语言的数据中心内数百种服务。

qq_22321199的专栏 6493

Go 微服务基础:Protobuf & gRPC

Go 微服务基础:Protobuf & gRPC 这篇文章写的稍微有点乱,因为写作过程中思路有大断流。 本文历时很多天,期间我的两大主要开发环境 —— Python 和 Golang 都炸了,顺便,包管理工具 Homebrew 也出了点小问题(一切都是因为一条没经过深思的错误的 brew upgrade 命令)。尝试手动修复,搞了一天,无果。没办法 Time Machine 恢复了一下,由于最近几天都没备份????,S/L 大法不太灵,它一下子给我回到了十天前。各种手动检查、清理、git pull,

clownote 1027

Go微服务: 基于GRPC结合Consul实现微服务调用

刷新发现 127.0.0.1:8500 这个 consul 注册中心面板出来了一个新的服务。以上的调用,可以进行适当的封装来满足不同业务的调用,仅供演示。主要关注 main 函数中,注册consul服务相关代码。当然结合数据库操作封装功能完成闭环调用,不再赘述。新建 demo/server/main.go。新建 demo/client/main.go。发现服务端,客户端控制台都打印输出出来了。在 demo/client 下执行 $

Wang的专栏 1371

Java中使用gRPC+Protobuf实现高效远程调用

这里使用的是proto3 版本的语法。proto3 是 Protocol Buffers 的第三个主要版本,相对于之前的 proto2 版本,它更为简化,去除了一些特性以提高简洁性和性能。文件目录文件内容// 基于proto3版本// 生成java代码的包路径// grpc服务// 一个查询接口// 定义接口入参数// 定义接口返回参数通过使用gRPC和Protobuf,在Java中实现了高效的远程调用。

qq_50254557的博客 2803

[gRPC实现go调用go]

下载Protocol Buffers:https://github.com/protocolbuffers/protobuf/releases检查安装//定义了我们使用的Protocol Buffers版本。simple";//***在java端请注释本行***//表明我们定义了一个命名为Simple的服务(接口),内部有一个远程rpc方法,名字为SayHello。//我们只要在server端实现这个接口,在实现类中书写我们的业务代码。在client端调用这个接口。//请求的结构体。

qq_45467608的博客 1754
上一篇: Go微服务: 基于ProtoBuf实现序列化和反序列化
下一篇: Go微服务: 基于Go Micro框架实现微服务调用
Wang's Blog
博客等级 码龄12年 7433粉丝 2421原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

打赏作者

Wang's Blog

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

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

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

打赏作者

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

抵扣说明:

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

余额充值