Go 语言项目开发实战
孔令飞
腾讯云资深工程师,前Red Hat、联想云工程师
新⼈⾸单¥69.9
2757 人已学习
课程目录
已更新 15 讲 / 共 54 讲
0/4登录后,你可以任选4讲全文学习。
开篇词 (1讲)
开篇词 | 从 0 开始搭建一个企业级 Go 应用
免费
课前必学 (3讲)
01 | IAM系统概述:我们要实现什么样的 Go 项目?
02 | 环境准备:如何安装和配置一个基本的 Go 开发环境?
03 | 项目部署:如何快速部署 IAM 系统?
实战第 1 站:规范设计 (8讲)
04 | 规范设计(上):项目开发杂乱无章,如何规范?
05 | 规范设计(下):commit 信息风格迥异、难以阅读,如何规范?
06 | 目录结构设计:如何组织一个可维护、可扩展的代码目录?
07 | 工作流设计:如何设计合理的多人开发模式?
08 | 研发流程设计(上):如何设计 Go 项目的开发流程?
09 | 研发流程设计(下):如何管理应用的生命周期?
10 | 设计方法:怎么写出优雅的 Go 项目?
11 | 设计模式:Go常用设计模式概述
实战第2站:基础功能设计或开发 (2讲)
12 | API 风格(上):如何设计RESTful API?
13 | API 风格(下):RPC API介绍
特别放送 (1讲)
特别放送 | 给你一份清晰、可直接套用的Go编码规范
Go 语言项目开发实战
15
15
1.0x
00:00/00:00
登录|注册

13 | API 风格(下):RPC API介绍

你好,我是孔令飞。这一讲,我们继续来看下如何设计应用的 API 风格。
上一讲,我介绍了 REST API 风格,这一讲我来介绍下另外一种常用的 API 风格,RPC。在 Go 项目开发中,如果业务对性能要求比较高,并且需要提供给多种编程语言调用,这时候就可以考虑使用 RPC API 接口。RPC 在 Go 项目开发中用得也非常多,需要我们认真掌握。

RPC 介绍

根据维基百科的定义,RPC(Remote Procedure Call),即远程过程调用,是一个计算机通信协议。该协议允许运行于一台计算机的程序调用另一台计算机的子程序,而程序员不用额外地为这个交互作用编程。
通俗来讲,就是服务端实现了一个函数,客户端使用 RPC 框架提供的接口,像调用本地函数一样调用这个函数,并获取返回值。RPC 屏蔽了底层的网络通信细节,使得开发人员无需关注网络编程的细节,可以将更多的时间和精力放在业务逻辑本身的实现上,从而提高开发效率。
RPC 的调用过程如下图所示:
RPC 调用具体流程如下:
Client 通过本地调用,调用 Client Stub。
Client Stub 将参数打包(也叫 Marshalling)成一个消息,然后发送这个消息。
Client 所在的 OS 将消息发送给 Server。
Server 端接收到消息后,将消息传递给 Server Stub。
Server Stub 将消息解包(也叫 Unmarshalling)得到参数。
Server Stub 调用服务端的子程序(函数),处理完后,将最终结果按照相反的步骤返回给 Client。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/1000字
划线
笔记
复制
该试读文章来自付费专栏《Go 语言项目开发实战》,如需阅读全部文章,
请订阅文章所属专栏新⼈⾸单¥69.9
立即订阅
登录 后留言

精选留言(10)

  • pedro
    假定希望用RPC作为内部API的通讯,同时也想对外提供RESTful API,又不想写两套,可以使用gRPC Gateway 插件,在生成RPC的同时也生成RESTful web server。
    2021-06-24
    3
  • 柠柠
    RPC 与 RESTful 共通逻辑抽象出来 Service 层,RPC server 和 RESTful server 初始化or 启动时时都需要指定 service,真正提供服务的是 Service 层
    2021-06-25
  • 💎A
    https://www.bookstack.cn/read/API-design-guide/API-design-guide-04-%E6%A0%87%E5%87%86%E6%96%B9%E6%B3%95.md 我又来做贡献了
    2021-06-25
  • learner2021
    哪里设置错误了?
    [going@dev server]$ pwd
    /home/going/workspace/golang/src/github.com/marmotedu/gopractise-demo/apistyle/greeter/server
    [going@dev server]$ go run main.go
    main.go:8:2: no required module provides package github.com/marmotedu/gopractise-demo/apistyle/greeter/helloworld: go.mod file not found in current directory or any parent directory; see 'go help modules'
    main.go:9:2: no required module provides package google.golang.org/grpc: go.mod file not found in current directory or any parent directory; see 'go help modules'
    2021-06-24
  • kkgo
    老师有对比过grpc和rpcx之间的性能,稳定性方面不? 看官方说明rpcx性能是grpc的2倍
    2021-06-24
  • helloworld
    优秀👍
    2021-06-24
  • Star°时光℡
    protoc -I. --go_out=plugins=grpc:$GOPATH/src helloworld.proto
    执行命令后无任何输出,也没有产生helloworld.pb.go文件
    2021-06-24
  • Star°时光℡
    protoc -I. --go_out=plugins=grpc:$GOPATH/src helloworld.proto
    ```
    [root@dev helloword]# ls
    helloworld.proto
    [root@dev helloword]# cat helloworld.proto
    syntax = "proto3";

    option go_package = "github.com/marmotedu/gopractise-demo/apistyle/greeter/helloworld";

    package helloworld;

    // the greeting service definition
    service Greeter {
        // sends a greeting
        rpc SayHello (HelloRequest) returns (HelloReply) {}
    }

    // the request message containing the user's name.
    message HelloRequest {
        string name = 1;
    }

    // the response message containing the greetings
    message HelloReply {
        string message = 1;
    }[root@dev helloword]# protoc -I. --go_out=plugins=grpc:$GOPATH/src helloworld.proto
    [root@dev helloword]# ls
    helloworld.proto
    ```
    2021-06-24
  • 夏夜星语
    之前自己还用jsonrpc 写rpc, 现在用这个感觉完全接口更规范,更简单
    2021-06-24
  • 不明真相的群众
    你有一个 gRPC 服务,但是却希望该服务同时也能提供 RESTful API 接口,这该如何实现?
    ---------------------------
    在封装一层?
    2021-06-24
收起评论
10
返回
顶部