你将会学到 一个完整的gRPC流实例,包括单向流与双向流的操作 如何实现gRPC流服务端代码 如何实现gRPC流客户端代码 准备 新建一个文件夹 go-grpc-simple-stream 在go-grpc-simple文件夹下建立三个目录: client, proto,server 使用 go mod 管理代码 在 go-grpc-simple-stream 目录下执行 go mod init go-grpc-simple-stream 编写 proto 文件 在 go-grpc-simple-stream/proto 目录下新建 hello.proto 文件 syntax = "proto3"; package hello; service HelloService { // 定义一个服务端推送客户的单向流 rpc ServerToClient(StreamRequest) returns (stream StreamResponse){}; // 定义一个客户端推送服务端的单向流 rpc ClientToServer(stream StreamRequest) returns (StreamResponse){}; // 定义一个服务端与客户端的双向流 rpc AllStream(stream StreamRequest) returns (stream StreamResponse){}; } // stream 请求结构 message StreamRequest { string data = 1; } // stream 响应结构 message StreamResponse { string data = 1; } 生成 pb go 代码 在 go-grpc-simple-stream/proto 目录下新建 gen.
你将会学到 一个完整的gRPC实例 如何实现gRPC服务端代码 如何实现gRPC客户端代码 准备 新建一个文件夹 go-grpc-simple 在go-grpc-simple文件夹下建立三个目录: client, proto,server 使用 go mod 管理代码 在 go-grpc-simple 目录下执行 go mod init grpc-simple 编写 proto 文件 在 go-grpc-simple/proto 目录下新建 hello.proto 文件 // 选择 proto3 语法 syntax = "proto3"; // 定义一个包名 package hello; // 定义一个 service 服务,相当于 GO 接口定义 service HelloService { // 以 rpc 开头,定义未实现的方法名称。 必须要有一个请求 message 和响应 message // rpc, returns 都是关键字 rpc Hello(StringRequest) returns (StringResponse){}; } // message 相当于一个结构体,里面定义字段属性, 先类型后变量名,然后序列号。 // protoful 编码是通过成员的唯一编号来绑定对应的数据。 // 定义一个请求结构体 message StringRequest { string value = 1; } // 定义一个响应结构体 message StringResponse { string result = 1; } 生成 pb go 代码 在 go-grpc-simple/proto 目录下新建 gen.
Protobuf 是 Protobuf Buffers 的简称,它是 Google 公司开发的一种数据描述语言,并于2008年开源。 可用作为设计安全的跨语言 RPC 接口的基础工具。 目前 Protobuf 已经发展到第3版本,即 syntax = "proto3"; 你将会学到 如何编写 protobuf 文件 如何通过protoc工具生成 go 代码 编写 protobuf 文件 先定义语法版本 再定义package 定义一个 service 定义一组 request,response 的 message 创建 hello.proto 文件 第一行结尾需要写上分号; service 相当于定义接口, rpc 定义未实现的接口方法 message 相当于定义一个结构体,里面定义字段属性, 先类型后变量名,然后序列号。 每一行数据类型后需要写一个编号,从1开始,因为编码是通过成员的唯一编号来绑定对应的数据。 推荐使用请求message后加上Request关键字, 如StringRequest 推荐使用响应message后加上Response关键字,如StringResponse // 选择 proto3 语法 syntax = "proto3"; // 定义一个包名为 hello package hello; // 定义一个 service 服务名为 HelloService,相当于 GO 接口定义 service HelloService { // 以 rpc 开头,定义未实现的方法名称。 必须要有一个请求 message 和响应 message // rpc, returns 都是关键字 rpc Hello(StringRequest) returns (StringResponse){}; } // message 相当于一个结构体,里面定义字段属性, 先类型后变量名,然后序列号。 // protoful 编码是通过成员的唯一编号来绑定对应的数据。 // 定义一个请求结构体 message StringRequest { string value = 1; } // 定义一个响应结构体 message StringResponse { string result = 1; } 标量类型 以下只列出常用的类型对应关系。更多参考最下面的链接
什么是gRPC RPC 是远程过程调用 (Remote Procedure Call)的缩写。在 RPC 中,客户端应用程序可以直接调用不同机器上的服务器应用程序上的方法,就像它是本地对象一样,使您可以更轻松地创建分布式应用程序和服务。 gRPC 是 Google 开源的基于 Protobuf 和 Http2.0 协议的通信框架,底层由netty提供。 是一款语言中立、平台中立、开源的远程过程调用(RPC)系统。 特点 基于HTTP/2协议实现,实现多路复用,双向流等特点。 基于 Protobuf 协议,支持多种语言。 参考 gRPC 官方文档中文版 推荐学习 gRPC入门 简介 gRPC入门 Protobuf gRPC入门 搭建完整gRPC gRPC入门 实现双向流

书籍 BOOK

拒绝某度盘,支持蓝凑盘, 欢迎留言,提供资源。只提供最优质的资源。 序列 书名 备注 1 高性能MySQL(第3版) 带目录 2 设计模式之禅 带目录,第1版本
排查问题 使用top 再按大写M, 对内存采用降序显示,一目了然看到谁占用内存最高。 定位到rsyslogd进程占用内存25.7%,非常可怕,需要急需解决掉它。 什么是rsyslog: 系统提供的多线性日志系统,参考: https://www.rsyslog.com/ 解决问题 rsyslogd是它的守护进程,可以通过systemctl status rsyslog 查看运行状态 红色显示错误信息。 使用journalctl --verify 检查系统日志卷文件损坏情况 如果检查出来有红色的文件,则直接删除即可。 删除/var/lib/rsyslog/imjournal.state 文件 重启rsyslogd进程, systemctl restart rsyslog 然后使用 top 查看,内存占用率是否没有啦。 避免再次发生 修改/etc/rsyslog.conf 文件 最后行添加2行代码 $imjournalRatelimitInterval 0 $imjournalRatelimitBurst 0 重启服务:systemctl restart rsyslog 关闭 journal 压缩配置 vim /etc/systemd/journald.conf # 找到 #Compress=yes 修改成 no Compress=no # 重启服务 systemctl restart systemd-journald
适合于 CentOS 系统 docker 一键安装 curl -sSL https://cdn.jsdelivr.net/gh/yezihack/assets/sh/docker-install.sh |sudo sh #!/bin/bash ################ # CentOS 一键安装 # From: sgfoot.com ################# # 卸载旧版本 sudo yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-latest-logrotate \ docker-logrotate \ docker-engine # 设置仓库 sudo yum install -y yum-utils \ device-mapper-persistent-data \ lvm2 # 使用阿里源地址 sudo yum-config-manager \ --add-repo \ http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo # 安装 Docker Engine sudo yum install docker-ce docker-ce-cli containerd.io -y # 启动 systemctl start docker # 测试一下 sudo docker run hello-world echo "安装完毕" docker-compose 安装 docker-compose 是负责 docker 编排使用的
仅适合用 CentOS 7 node_export 安装 linux 服务器信息等资源收集安装包 一键安装 curl -sSL http://s1.sgfoot.com/sh/node_exporter.sh |sh 验证 netstat -nplt |grep node_exporter 配置nginx安全访问 如果涉及到外网访问则需要配置密码访问 参考:nginx 添加权限验证 htpasswd -bc /etc/nginx/htpasswd.users sgfoot sgfoot.pass # sgfoot 是帐号名 # sgfoot.pass 是密码 nginx 的vhost配置 node_exporter.conf server { listen 80; server_name node_exporter.io; location / { auth_basic "Prometheus"; auth_basic_user_file /etc/nginx/htpasswd.users;# 验证文件 proxy_pass http://127.0.0.1:9100; } } 添加 prometheus 节点 配置 host vim /etc/hosts 127.0.0.1 mysqld_exporter.io vim /data/local/prometheus/prometheus.yml 在 node_exporter.targets 添加 host:port scrape_configs: - job_name: 'node_exporter' static_configs: - targets: ['sgfoot.
什么是docker Docker 是 dotCloud 公司开源的一款产品,2013年开源(基于golang开发)。 Docker 英文意思是“搬运工", 是一种容器化技术,将您的运行软件封到一个沙盒里,随意搬运的应用容器引擎。 容器技术是所有云应用的基石,也把互联网升到到下一代。足以说明 docker 的强大之处。 Google 自2004年开始使用容器技术,对Docker的贡献之大,开源了Cgroup和Imctfy项目,还开源了容器管理系统 Kubernetes. 向开源致敬! Docker 架构 采用 c/s 模式体系架构, Docker 客户端与 Docker Daemon 守护进程通信。 Docker Daemon: 是Docker服务端的守护进程, 用来监听 Docker API 的请求和管理 Docker 对象,比如镜像、容器、网络和 Volume。 Docker Client: docker client 是我们和 Docker 进行交互的最主要的方式方法 Docker Registry:用来存储 Docker 镜像的仓库 Images:镜像,镜像是一个只读模板 Containers:容器,容器是一个镜像的可运行的实例,容器可以拥有自己的 root 文件系统、自己的网络配置、自己的进程空间,甚至自己的用户 ID 空间 底层技术支持:Namespaces(做隔离)、CGroups(做资源限制)、UnionFS(镜像和容器的分层) Docker 核心技术 Docker 的基础是 Linux 容器(LXC) 等技术 三大底层技术实现 Docker 的关键技术 Namespaces 解决了进程,网络及文件系统的隔离 命名空间(namespaces)是 Linux 为我们提供的用于分离进程树、网络接口、挂载点以及进程间通信等资源的方法 CGroups 解决了CPU,内存等资源隔离 Namespaces 并不能够为我们提供物理资源上的隔离。比如CPU,内存等。这样会导致多个Docker抢占物理资源。 Control Groups(简称 CGroups)就是能够隔离宿主机器上的物理资源,例如 CPU、内存、磁盘 I/O 和网络带宽。 UnionFS 解决了镜像隔离 Union File System,联合文件系统 将多个不同位置的目录联合挂载到同一个目录,将相同的部分合并
本篇主要介绍,基本数据类型、控制语句和数据结构及函数、方法、接口等知识。为后面学习打下基础,有个基本的认识。也为您将来进阶做准备。 基础语法 之前我们在Go 实践教程-工具及运行(三)写过一个“hello world”程序,讲解了三个概念:package,import,main 注释 写代码时必不可少需要写一些代码注释,方便以后回过头来看程序。Go里面提供两种方法注释 // 单行注释 (注意 //之后需要一个空格,之于为什么,go doc 方便自动生成文档抓取注释) /* 多行注释,在这里面都属于被注释的内容 */ 标识符 标识符用来命名变量,类型等程序实体。允许由大小写字母(a-z|A-Z)和数据(0~9)及下划线(_)组成,但第一个字符必须由字母和下划线组成 a := 10 // ok _a := 22 // ok case := "abc"// 无效变量 error 9a := 10 // 无效变量 error 变量命名 Go 语言的变量命名比较独特,如果你熟悉其它语言你会不习惯的。 先变量名 后跟类型名称 全局变量 必须有 var 关键字 import main var num int func main() { } // 优雅的方法,适合多个变量, 也适用于import 里 var ( num int age int name string ) // 等价于 var num int var age int var name string 函数内的局部变量