go-micro微服务框架
背景
已经学习了微服务之间通信采用的通信协议,如何实现服务的注册和发现,搭建服务管理集群,以及服务与服务之间的RPC通信方式。具体的内容包括:protobuf协议,consul及docker部署consul集群,gRPC框架的使用等具体的实现方案。
以上这些具体的方案都是为了解决微服务实践过程中具体的某个问题而提出的,实现微 ...
Go gRPC进阶-gRPC转换HTTP(十)
前言
我们通常把RPC用作内部通信,而使用Restful Api进行外部通信。为了避免写两套应用,我们使用grpc-gateway把gRPC转成HTTP。服务接收到HTTP请求后,grpc-gateway把它转成gRPC进行处理,然后以JSON形式返回数据。本篇代码以上篇为基础,最终转成的Restful Api支持bearer token验证、数据验证,并添加swagger文档。
gRPC转 ...
Go中的map和指针
本文参考:https://www.liwenzhou.com/posts/Go/08_map/
MAP(映射)
Go语言中提供的映射关系容器为map,其内部使用散列表(hash)实现。(类似于Python中的字典dict)
映射概述
map是一种无序的基于key-value的数据结构,Go语言中map是引用类型,必须初始化后才能使用。
创建map
Go语言中map的定义语法如下:
map[keyType]val ...
Go gRPC进阶-proto数据验证(九)
前言
上篇介绍了go-grpc-middleware的grpc_zap、grpc_auth和grpc_recovery使用,本篇将介绍grpc_validator,它可以对gRPC数据的输入和输出进行验证。
创建proto文件,添加验证规则
这里使用第三方插件go-proto-validators自动生成验证规则。
go get github.com/mwitkow/go-proto-validators
1.新建simple.proto文件
syntax ...
go跳出多层循环的几种方式
前言
比如这样的需求, 遍历一个 切片, 切片内容是切片1, 需求是判断切片1中某个是否有相应数据, 有就返回
正文
我们需要考虑的是在写两层遍历时如何在获取结果后结束这两层遍历
变量法
设置一个变量, 在外层监听该变量, 获取到结果后修改该变量
func main() {
t := [][]int{{1, 2, 3, 4, 5}, {5, 6, 7, 8, 9}}
s := false ...
Go gRPC进阶-go-grpc-middleware使用(八)
前言
上篇介绍了gRPC中TLS认证和自定义方法认证,最后还简单介绍了gRPC拦截器的使用。gRPC自身只能设置一个拦截器,所有逻辑都写一起会比较乱。本篇简单介绍go-grpc-middleware的使用,包括grpc_zap、grpc_auth和grpc_recovery。
go-grpc-middleware简介
go-grpc-middleware封装了认证(auth), 日志( logging), 消息(me ...
Golang——详解Go语言代码规范
本文始发于个人公众号:TechFlow,原创不易,求个关注
今天是Golang专题的第二篇,我们来看看Go的语言规范。
在我们继续今天的内容之前,先来回答一个问题。
有同学在后台问我,为什么说Golang更适合分布式系统的开发?它和Java相比有什么优势吗?
其实回答这个问题需要涉及很多概念,比如操作系统当中关于进程、线程、协 ...
深度解密 Go 语言之 sync.Pool
最近在工作中碰到了 GC 的问题:项目中大量重复地创建许多对象,造成 GC 的工作量巨大,CPU 频繁掉底。准备使用 sync.Pool 来缓存对象,减轻 GC 的消耗。为了用起来更顺畅,我特地研究了一番,形成此文。本文从使用到源码解析,循序渐进,一一道来。
本文基于 Go 1.14
目录是什么有什么用怎么用简单的例子fmt 包如何用poo ...
Go语言的GPM调度器是什么?
😋我是平也,这有一个专注Gopher技术成长的开源项目「go home」
导读
相信很多人都听说过Go语言天然支持高并发,原因是内部有协程(goroutine)加持,可以在一个进程中启动成千上万个协程。那么,它凭什么做到如此高的并发呢?那就需要先了解什么是并发模型。
并发模型
著名的C++专家Herb Sutter曾经说过“免费的午餐已 ...
Go gRPC进阶-TLS认证+自定义方法认证(七)
前言
前面篇章的gRPC都是明文传输的,容易被篡改数据。本章将介绍如何为gRPC添加安全机制,包括TLS证书认证和Token认证。
TLS证书认证
什么是TLS
TLS(Transport Layer Security,安全传输层),TLS是建立在传输层TCP协议之上的协议,服务于应用层,它的前身是SSL(Secure Socket Layer,安全套接字层),它实现了将应用层的 ...
Go gRPC教程-双向流式RPC(五)
前言
上一篇介绍了客户端流式RPC,客户端不断的向服务端发送数据流,在发送结束或流关闭后,由服务端返回一个响应。本篇将介绍双向流式RPC。
双向流式RPC:客户端和服务端双方使用读写流去发送一个消息序列,两个流独立操作,双方可以同时发送和同时接收。
情景模拟:双方对话(可以一问一答、一问多答、多问一答,形式灵活 ...
Go gRPC教程-服务端流式RPC(三)
前言
上一篇介绍了简单模式RPC,当数据量大或者需要不断传输数据时候,我们应该使用流式RPC,它允许我们边处理边传输数据。本篇先介绍服务端流式RPC。
服务端流式RPC:客户端发送请求到服务器,拿到一个流去读取返回的消息序列。 客户端读取返回的流,直到里面没有任何消息。
情景模拟:实时获取股票走势。
1.客户端要获取 ...
Go 普通指针类型、unsafe.Pointer、uintptr之间的关系
Golang指针
*类型:普通指针类型,用于传递对象地址,不能进行指针运算。
unsafe.Pointer:通用指针类型,用于转换不同类型的指针,不能进行指针运算,不能读取内存存储的值(必须转换到某一类型的普通指针)。
uintptr:用于指针运算,GC 不把 uintptr 当指针,uintptr 无法持有对象。uintptr 类型的目标会被回收。
unsafe ...
Go内存对齐
如何得到一个对象所占内存大小?
fmt.Println(unsafe.Sizeof(int64(0))) // "8"
type SizeOfA struct {
A int
}
unsafe.Sizeof(SizeOfA{0}) // 8
type SizeOfC struct {
A byte // 1字节
C int32 // 4字节
}
unsafe.Sizeof(SizeOfC{0, 0}) // 8
unsafe.Alignof(SizeOfC{0, 0}) // 4
结构体中A byte占1 ...
Go gRPC教程-简单RPC(二)
前言
gRPC主要有4种请求和响应模式,分别是简单模式(Simple RPC)、服务端流式(Server-side streaming RPC)、客户端流式(Client-side streaming RPC)、和双向流式(Bidirectional streaming RPC)。
简单模式(Simple RPC):客户端发起请求并等待服务端响应。
服务端流式(Server-side streaming RPC):客户端发送请 ...
Go gRPC教程-环境安装(一)
前言
gRPC 是一个高性能、开源和通用的 RPC 框架,面向移动和 HTTP/2 设计,带来诸如双向流、流控、头部压缩、单 TCP 连接上的多复用请求等特。这些特性使得其在移动设备上表现更好,更省电和节省空间占用。
在 gRPC 里客户端应用可以像调用本地对象一样直接调用另一台不同的机器上服务端应用的方法,使得您能够更容易 ...
go语言系列-redis
Redis的使用
Redis 基本介绍
Redis是NoSQL数据库,不是传统的关系型数据库 官网: https://redis.io/ 和 http://www.redis.cn/
Redis:REmote DIctionary Server(远程字典服务器),Redis性能非常高,单机能够达到15w qps,通常适合做缓存,也可以持久化。
是完全开源免费的,高性能的(key/value)分布式内存数据库,基于 ...
Go Hijack黑科技
最近在看Go标准库里面的rpc源码,发现了下面一段代码:
// ServeHTTP implements an http.Handler that answers RPC requests.
func (server *Server) ServeHTTP(w http.ResponseWriter, req *http.Request) {
if req.Method != "CONNECT" {
w.Header().Set("Content-Type", "text/plain; charset=utf-8")
w.WriteHead ...
go的匿名函数
1、go的匿名函数,
//匿名函数,就是函数不带函数名字呢!func(int)(int)
//闭包通过匿名函数实现
func OFFBag() {
a, str := 10, "闭包"
//匿名函数定义,形成一个闭包,函数里面可以使用变量a和Str
f1 := func() { //自动推导
fmt.Println("a= ", a)
fmt.Println("str= ", str)
}
...
quic-go测试
@page { margin: 0.79in }
p { margin-bottom: 0.1in; direction: ltr; line-height: 120%; text-align: justify; orphans: 0; widows: 0 }
p.western { font-family: "Calibri", serif; font-size: 10pt; so-language: en-US }
p.cjk { font-family: "宋体"; font-size: 10pt; so-language: zh-CN }
p.ctl { font-size: 12 ...