GRPC理解与实践
GRPC理解与实践
gRPC 是google开源的,可以在任何环境中运行的现代开源高性能 RPC 框架。
概念理解RPC
首先是需要对RPC进行了解。
RPC(Remote Procedure Call)远程过程调用,简单的理解是一个节点请求另一个节点提供的服务。即本机调用其他服务器的方法就像调用本地的一样,其本质是本机发送一个请求给远程服务器,远程服务器运行方法并将运行结果完整的按照格式发送回调用者。
需要注意的是,RPC只是一种思想,实现RPC的有很多,就连http也能勉强叫做实现类RPC。
GRPC
GRPC是Google对RPC的一个实现。用户只需关注服务,调用的过程(数据序列化、网络通讯等问题由框架解决)。
在 gRPC 里客户端应用可以像调用本地对象一样直接调用另一台不同的机器上服务端应用的方法,使得您能够更容易地创建分布式应用和服务。与许多 RPC 系统类似,gRPC 也是基于以下理念:定义一个服务,指定其能够被远程调用的方法(包含参数和返回类型)。在服务端实现这个接口,并运行一个 gRPC 服务器来处理客户端调用。在客户端拥有一个存根能够像服务端一样的方法。
p ...
protocol-buffers简述
protocol-buffers简述
Protocol Buffers(简称:ProtoBuf)是一种序列化数据结构的协议。对于透过管道(pipeline)或存储资料进行通信的程序开发上是很有用的。这个方法包含一个接口描述语言,描述一些数据结构,并提供程序工具根据这些描述产生代码,用于将这些数据结构产生或解析资料流。
简述就是:一种序列化的协议。可配合GRPC使用传输数据。
文档结构
protobuf版本
package包,用法同其他语言的包
import导入其他prot file,同py的import
message定义请求响应的数据结构
service定义grpc的请求方法
注释,同C语言
数据类型基本数据类型
.proto
说明
Python
double
float
float
float
int32
使用变长编码,对负数编码效率低, 如果你的变量可能是负数,可以使用sint32
int
int64
使用变长编码,对负数编码效率低,如果你的变量可能是负数,可以使用sint64
int/long
uint32
使用变长编码
int/long
...
Makefile的简单使用
MakeFile的简单使用
makefile具体来说就是很复杂,但简单理解就可以当做shell脚本来使,且是跨平台的脚本。
Makefile结构说明Makefile里主要包含了五个东西:变量定义、显式规则、隐晦规则、文件指示和注释。
变量的定义。在Makefile中我们要定义一系列的变量,变量一般都是字符串,这个有点像C语言中的宏,当Makefile被执行时,其中的变量都会被扩展到相应的引用位置上。
显式规则。显式规则说明了,如何生成一个或多的的目标文件。这是由Makefile的书写者明显指出,要生成的文件,文件的依赖文件,生成的命令。 (脚本必备!)
隐晦规则。由于我们的make有自动推导的功能,所以隐晦的规则可以让我们比较粗糙地简略地书写Makefile,这是由make所支持的。
文件指示。其包括了三个部分,一个是在一个Makefile中引用另一个Makefile,就像C语言中的include一样。
注释。Makefile中只有行注释,和UNIX的Shell脚本一样,其注释是用“#”字符。
简要教程以一个C语言的编译运行为例:
1234567#include &l ...
基于Go的反向代理简单实现
基于Go的反向代理简单实现基础web服务简单实现两个web服务,分别监听9091和9092端口。
1234567891011121314151617181920212223242526272829303132333435363738package mainimport ( "fmt" "log" "net/http" "os" "os/signal" "strings")type web1Handler struct {}func (h *web1Handler) ServeHTTP(w http.ResponseWriter,r *http.Request){ w.Write([]byte("hello web1"))}type web2Handler struct {}func (h *web2Handler) ServeHTTP(w http.ResponseWriter,r ...
docker-compose详解
docker-compose详解
Compose 是用于定义和运行多容器 Docker 应用程序的工具。通过 Compose,您可以使用 YML 文件来配置应用程序需要的所有服务。然后,使用一个命令,就可以从 YML 文件配置中创建并启动所有服务。
基本使用步骤
使用 Dockerfile 定义应用程序的环境。
使用 docker-compose.yml 定义构成应用程序的服务,这样它们可以在隔离环境中一起运行。
最后,执行 docker-compose up 命令来启动并运行整个应用程序。
docker、docker compose的安装参见百度,Dockerfile的书写见上文。
yml 配置指令参考version
指定本 yml 依从的 compose 哪个版本制定的。
build
使用Dockerfile构建镜像并运行,指定构建镜像的路径。
例如 webapp 服务,指定为从上下文路径 ./dir/Dockerfile 所构建的镜像:
1234version: "3.7"services: webapp: build: ./dir
image ...
Dockerfile详解
Dockerfile详解
本文基于win10 docker 讲述Dockerfile的书写,并举例示范。
Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明。
基本步骤
创建名为Dockerfile的文件
书写Dockerfile文件
构建镜像,如:docker build -t nginx:v3 . (.代表当前目录,nginx:v3是Dockerfile中定义的镜像标签)
运行docker镜像:docker run -d nginx:v3
命令介绍FROM
引用最基础的镜像,即构建的基础镜像。
1FROM nginx:latest
RUN
用于执行后面跟着的命令行命令。
123456RUN <命令行命令>RUN go build ./main.go或者:RUN ["可执行文件", "参数1", "参数2"]RUN ["go", "build", "./main.go"]
&& 可用于 ...
Go同步原语与锁
建议搭配Go并发编程一起使用。
锁是一种并发编程中的同步原语(Synchronization Primitives),它能保证多个 Goroutine 在访问同一片内存时不会出现竞争条件(Race condition)等问题。
目录
context
锁
channel
上下文Context
context是 goroutine 的上下文,包含 goroutine 的运行状态、环境、现场等信息。主要用来在 goroutine 之间传递上下文信息,包括:取消信号、超时时间、截止时间、k-v 等。
context.Context 类型的值可以协调多个 groutine 中的代码执行“取消”操作,并且可以存储键值对。最重要的是它是并发安全的。与它协作的 API 都可以由外部控制执行“取消”操作,例如:取消一个 HTTP 请求的执行。
12345678910111213type Context interface { // 当 context 被取消或者到了 deadline,返回一个被关闭的 channel Done() <-chan struct ...
Go-IO标准库
Go IO标准库操作Go 语言中,为了方便开发者使用,将 IO 操作封装在了如下几个包中:
os.FileInfo 为文件信息接口
io 为 IO 原语(I/O primitives)提供基本的接口
io/ioutil 封装一些实用的 I/O 函数
fmt 实现格式化 I/O,类似 C 语言中的 printf 和 scanf
bufio 实现带缓冲I/O
文件信息接口属性12345678type FileInfo interface { Name() string // 文件的名字 Size() int64 // 普通文件返回值表示其大小;其他文件的返回值含义各系统不同 Mode() FileMode // 文件的模式位 (例-rw-rw-r--) ModTime() time.Time // 文件的修改时间 IsDir() bool // 等价于Mode().IsDir() Sys() interface{} // 底层数据来源(可以返回nil) ...
Go并发基础实践
GO并发基础实践
此文只记录GO并发的理论,及对IO的并发实践。同步与锁参见Go同步一文。
基础理论CSP:通信顺序进程,是 Go 语言采用的并发同步模型,是一种形式语言,用来描述并发系统间进行交互的模式。
Actor 模型:参与者模型采用了 everything is an actor 哲学。所有参与者都是独立的运行单元,参与者可以修改自己的私有状态,参与者之间只能通过发送消息通信(避免任何锁的使用)。
goroutine一个 goroutine 是一个轻量级的可独立工作的单元。通过 go 语句启动。goroutine 有自己独立的调用栈,会按需伸缩,可以并发调度大量 goroutine,每个 goroutine 自身大约占用 4K 空间。可以类比为非常轻量级的线程,例如协程。一个程序可能只有一个线程,但是会有大量 goroutine 被调度到这个线程上。
操作系统在物理处理器上调度线程来运行,Go 语言为每个物理处理器分配一个逻辑处理器,Go 语言的运行时会在逻辑处理器上调度 goroutine 来运行。
阻塞系统调用(如打开文件),goroutine 会从逻辑处理器上分离,线 ...
MIT6.824-MapReduce实验总结
MIT 6.824 Lab 1: MapReduce 试验总结
需要注意的是,在试验前,推荐先行阅读MapReduce论文,及MIT6.824第一章节关于MapReduce的介绍。
该实验不推荐在Win上实现!
本实验并非完整的MapReduce的实现,而是给出Map和Reduce函数(WordCount) 以及RPC等相关操作,要求模仿给定的Example的样子,实现master和worker互相通讯完成单词统计任务。
推荐先行了解GRPC调用过程和Go 动态库编译。
对官方案例的分析12345git clone git://g.csail.mit.edu/6.824-golabs-2020 6.824cd 6.824cd src/maingo build -buildmode=plugin ../mrapps/wc.gogo run mrsequential.go wc.so pg*.txt
首先可以看到的是,官方以及给定了很朴素的map和reduce函数,即../mrapps/wc.go文件
1234567891011121314151617181920212223 ...