gRPC 和 REST 之间有何区别

gRPC vs.REST

除了架构风格外,gRPC 和 REST 还有其他内在的差异。

客户端-服务器耦合
REST 是松散耦合,这意味着客户端和服务器不需要了解对方的实施状况。这种松耦合使得 API 更容易随着时间的推移而发展。这是因为更改服务器定义并不一定需要更改客户端的代码。

gRPC 是紧密耦合,这意味着客户端和服务器必须有权访问同一 proto 文件。对文件的任何更新都需要在服务器和客户端上进行更新。

代码生成
gRPC 提供一系列内置的客户端和服务器端原生代码生成功能。由于协议缓冲区编译器 protoc 的存在,可以生成多个语言的代码。在 proto 文件中定义结构后,gRPC 生成客户端和服务器端代码。代码生成可以减少 API 开发的时间。

另一方面,REST 不提供任何内置的代码生成机制,因此如果开发人员需要此功能,就必须使用其他第三方工具。

双向流式传输
gRPC 提供双向流式传输通信。这意味着客户端和服务器都可以在单个连接上同时发送和接收多个请求和响应。

REST 不提供此功能。

何时使用:gRPC vs.REST

REST 是目前最受欢迎的 Web 服务和微服务架构的 API 架构。REST 之所以受欢迎,是因为其实施简单,且具有数据结构映射、可读性和灵活性等特点。无论是用于 Web 服务开发还是内部微服务,新手程序员都可以很轻松地开始为其应用程序开发 RESTful API。

以下是 REST API 的应用场景:

  1. 基于 Web 的架构
  2. 面向公众的 API,便于外部用户理解
  3. 简单数据通信

与 REST 不同,gRPC 专为支持开发人员为分布式数据中心的微服务架构创建高性能 API 而设计。它更适合需要实时流式传输和大量数据加载的内部系统。当 API 不太可能随着时间的推移而发生变化时,gRPC 也非常适合包含多种编程语言的微服务架构。

gRPC API 更适合以下用例:

  1. 高性能系统
  2. 高数据负载
  3. 实时或流式传输应用程序

关于 Web 软件开发的说明
虽然 HTTP 是核心 Web 协议,但不同版本的 HTTP 在 Web 浏览器和 Web 服务器上的采用程度各不相同。

gRPC API 总是使用 HTTP 2,而 REST API 通常使用 HTTP 1.1,这两者并非同一个 HTTP 协议。虽然 HTTP 2 现在是一种常见的 Web 协议,但它不像 HTTP 1.1 那样具有通用的浏览器支持。对于需要支持 Web 应用程序的开发人员来说,这种受限的浏览器支持使得 gRPC 成为不那么有吸引力的选择。

gRPC接口规范

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
syntax = "proto3";

package fromatob;

// FromAtoB is a simplified version of fromAtoB’s backend API.
service FromAtoB {
rpc Lookup(LookupRequest) returns (Coordinate) {}
}

// A LookupRequest is a request to look up the coordinates for a city by name.
message LookupRequest {
string name = 1;
}

// A Coordinate identifies a location on Earth by latitude and longitude.
message Coordinate {
// Latitude is the degrees latitude of the location, in the range [-90, 90].
double latitude = 1;

// Longitude is the degrees longitude of the location, in the range [-180, 180].
double longitude = 2;
}

/images/grpc-vs-rest.png

总结

gRPC 支持流式传输,天生支持HTTP2,有结果时就可以返回无须等待所有结果都获取再一起返回。

双向流式传输

接口规范清晰

HTTP/2 为长期实时通信流提供基础。 gRPC 为通过 HTTP/2 进行流式传输提供一流支持。

基于web架构的简单数据通信更适合REST,追求高性能高数据负载或流式传输的更适合gRPC

参考

gRPC官网

https://aws.amazon.com/cn/compare/the-difference-between-grpc-and-rest/

https://www.infoq.cn/article/ye16sg5idqi-vsihs43e

https://learn.microsoft.com/zh-cn/aspnet/core/grpc/comparison?view=aspnetcore-8.0

grpcurl

go语言学习资料

go 学习网站

go 官网

https://go.dev/wiki/

https://awesome-go.com/

DigitalOcean go tutorials

https://tonybai.com/articles/

十分钟入门 go 语言

https://www.topgoer.com/

https://colobu.com/

go 入门指南

go 语言圣经

https://github.com/jincheng9/go-tutorial

go 中文学习文档

go 语言必知必会

从零开发企业级 go 应用

go 语言 101

go 语言编程之旅

https://golang.design/under-the-hood/

go 语言设计与实现

go 核心 36 讲

go 语言手册

go 语言圣经

https://www.practical-go-lessons.com/chap-41-design-recommendations

https://blog.logrocket.com/tag/go/

https://dave.cheney.net/

https://www.codingexplorations.com/blog/category/go

https://100go.co/20-slice/

https://medium.com/tag/go

https://github.com/dariubs/GoBooks

https://www.freecodecamp.org/news/tag/go/

https://github.com/polaris1119/The-Golang-Standard-Library-by-Example

https://github.com/techschool/simplebank

https://books.halfrost.com/leetcode/

go 学习路线图

/images/go-roadmap.png

go 第三方库

https://libraries.io/languages/Go

A Commander for modern Go CLI interactions

https://github.com/gorilla/mux

go tools library like lodash

blog

https:/www.bytesizego.com/blog

https://evolveasdev.com/blogs/guide/the-ultimate-guide-for-deploying-go-applications-to-production

web.dev web 开发

web.dev 介绍

web.dev网站提供各种内容,由 Chrome 团队成员及外部专家撰写,可协助您顺利踏上这一旅程。

网站地址 https://web.dev/about?hl=zh-cn

内容涵盖html, css, javascript

javascript

javascript promise 介绍 https://web.dev/articles/promises?hl=zh-cn

javascript fetchAPI 介绍 https://web.dev/articles/introduction-to-fetch?hl=zh-cn

css

css响应式设计 https://web.dev/learn/design

css性能 https://web.dev/learn/performance

fix git submodule no url

在使用hexo第三方主题,推送到gitub进行CI/CD的时候,报了下面这个错误

No url found for submodule path 'themes/sky' in .gitmodules

/images/git-submodule-error

原因在于安装主题的时候只是按照常用的git clone方式,导致github获取不到git子仓库地址。

可参考netlify.com上面的回答, 解决办法

  1. 删除theme文件夹

  2. 将这次变更到git

  3. 重新用git submodule的方式clone仓库

  4. 更新submodule

  5. 可以用 git submodule status 来检查是否成功,.gitmodules 是否创建了

/images/git-submodule-error

参考

https://answers.netlify.com/t/error-checking-out-submodules-fatal-no-url-found-for-submodule-path-website-in-gitmodules/16435/7

使用hexo建立博客

安装hexo

1
npm install -g hexo-cli

使用hexo初始化

1
2
3
hexo init <project_name>
cd <project_name>
npm install

根目录下的_config.yml是你系统的配置文件, source下的_posts文件夹是文章的存放路径

_config.yml优先级

Hexo 配置文件中的 theme_config 的优先级最高,其次是 _config.[theme].yml 文件。 最后是位于主题目录下的 _config.yml 文件。比如默认有个_config_landscape.yml主题配置文件

写作配置

默认用title生成文件,可以在_config.yml中配置生成带日期的前缀,修改new_post_name即可。

1
new_post_name: :year-:month-:day-:title.md # File name of new posts

标签的语法:

1
2
3
4
5
tags: 
- hexo
- dd
categories:
- 其他

新建文章

使用 hexo new "blog_title" 命令来新建一篇博客,生成的文件在source/_posts目录下

运行

1
hexo server

生成静态文件

1
hexo generate

完成后部署

1
hexo deploy --generate

指南

https://hexo.io/zh-cn/docs/

sky主题