gRPC实践
服务端服务端实现约定的接口并提供服务 监控端口,net.Listen() 创建grpc.server,grpc.NewServer() 为grpc.server注册服务,pb.RegisterHelloServer() grpc.server等待接收请求,grpc.server.Serve() 123456789101112131415161718192021222324252627282930313233343536package mainimport ( "context" "google.golang.org/grpc" "log" pb "myapp/proto2" "net")type HelloService struct{}func (hs HelloService) SayHello(ctx context.Context, in *pb.HelloRequest) (*pb.HelloResponse, error) { log....
gRPC服务定义
grpc可以定义四类服务,服务端实现约定的接口并提供服务,客户端按照约定调用方法请求服务 单项 RPC即客户端发送一个请求给服务端,从服务端获取一个应答,就像一次普通的函数调用。 12rpc SayHello(HelloReqeust) returns (HelloResponse) {} 服务端流式 RPC即客户端发送一个请求给服务端,可获取一个数据流用来读取一系列消息。客户端从返回的数据流里一直读取直到没有更多消息为止。 12rpc LotsOfReplies(HelloRequest) returns (stream HelloResponse){} 客户端流式 RPC即客户端用提供的一个数据流写入并发送一系列消息给服务端。一旦客户端完成消息写入,就等待服务端读取这些消息并返回应答。 12rpc LotsOfGreetings(stream HelloRequest) returns (HelloResponse) {} 双向流式 RPC即两边都可以分别通过一个读写数据流来发送一系列消息。这两个数据流操作是相...
gRPC拦截器 Interceptor
grpc的拦截器可以在处理请求之前,对请求数据先做一些处理 在前面里例子中,使用token的认证方式是在具体的服务接口中实现,想象一下,如果你有100个接口,难道每个接口都要加上这个认证的代码吗,这是不可能的,使用拦截的方式的,在调用具体的接口之前,统一处理 拦截器是定义在服务端,参数选项是grpc.UnaryInterceptor(intercetor),如下: 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879package mainimport ( "context" "google.golang.org/grpc" "google.golang.org/grpc/codes" "google.golang.org/grpc/credentials" ...
gRPC安全认证
支持的授权机制 SSL/TLS OAuth 2.0 API 生成私钥和公钥12openssl genrsa -out server.key 2048openssl req -new -x509 -sha256 -key server.key -out server.pem -days 3650 代码改造服务端12creds, _ := credentials.NewServerTLSFromFile("server.pem", "server.key")grpc.NewServer(grpc.Creds(creds)) 客户端123// xx是生成公钥是时填写的Common Namecreds,_ := credentials.NewClientTLSFromFile("server.pem","xx")grpc.Dial(":9502", grpc.WithTransportCredentials(creds)) 使用自定义认证方式客户端客户端每次调用,toke...
gRPC的protobuf语法
protobuf语法 指定版本syntax = "proto3",需要双引号 指定包名package proto,不需要双引号 除了service,message,enum之外,其他语句都需要以;结束 1234567891011121314151617181920syntax = "proto3"; // 指定proto版本package proto; // 指定包名,生成的*.pb.go文件的包名// 定义Hello服务service Hello { // 定义SayHello方法 rpc SayHello(HelloRequest) returns (HelloReply) {}}// HelloRequest 请求结构message HelloRequest { string name = 1; repeated subjects = 2; // 表示subjects可以出现多次或0次,go语言用数组[]string表示}// HelloReply...
gRPC的HTTP协议转换
etcd3改用grpc后为了兼容原来的api,同时要提供http/json方式的API,为了满足这个需求,要么开发两套API,要么实现一种转换机制,他们选择了后者,而我们选择跟随他们的脚步。 123456789101112131415161718192021222324252627282930313233343536373839syntax = "proto3";package proto;import "google/api/annotations.proto";service Hello { rpc SayHello(HelloRequest) returns (HelloReply) { option (google.api.http) = { post: "/example/echo" body: "*" }; }}message MyMessage { option (google.api.my_o...
30 Go操作kafka
参考文献 原文链接 Kafka 是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者规模的网站中的所有动作流数据,具有高性能、持久化、多副本备份、横向扩展等特点。本文介绍了如何使用 Go 语言发送和接收 kafka 消息。 1 saramaGo 语言中连接 kafka 使用第三方库: github.com/Shopify/sarama。 下载及安装 1go get github.com/Shopify/sarama 注意事项: sarama v1.20 之后的版本加入了 zstd 压缩算法,需要用到 cgo,在 Windows 平台编译时会提示类似如下错误: 12# github.com/DataDog/zstdexec: "gcc":executable file not found in %PATH% 所以在 Windows 平台请使用 v1.19 版本的 sarama 。 2 连接 kafka 发送消息123456789101112131415161718192021222324252627282930313233...
1-GORM
原文地址:GORM入门指南 原文地址:GORM CRUD指南 《GORM 中文文档》 《MySql 中文文档》 下列示例中的 gorm 是导师 Fork 的,GORM 的原始路径是:https://github.com/go-gorm/gorm .1 GORM 介绍gorm 是一个使用 Go 语言编写的 ORM 框架。它文档齐全,对开发者友好,支持主流数据库。 对象关系映射(英语:Object Relational Mapping,简称ORM,或O/RM,或O/R mapping),是一种程序设计技术,用于实现面向对象编程语言里不同类型系统的数据之间的转换。从效果上说,它其实是创建了一个可在编程语言里使用的“虚拟对象数据库”。 Github 地址 GORM 中文文档 .2 安装1go get -u github.com/jinzhu/gorm .3 连接数据库连接不同的数据库都需要导入对应数据库驱动程序,GORM 已经贴心的为我们包装了一些驱动程序,只需要按如下方式导入需要的数据库驱动即可: 1234import _ "github.c...
14 Redis使用场景
https://blog.csdn.net/zh15732621679/article/details/80614091 1 Redis使用场景计数器可以对 String 进行自增自减运算,从而实现计数器功能。 Redis 这种内存型数据库的读写性能非常高,很适合存储频繁读写的计数量。 缓存将热点数据放到内存中,设置内存的最大使用量以及淘汰策略来保证缓存的命中率。 查找表例如 DNS 记录就很适合使用 Redis 进行存储。 查找表和缓存类似,也是利用了 Redis 快速的查找特性。但是查找表的内容不能失效,而缓存的内容可以失效,因为缓存不作为可靠的数据来源。 消息队列List 是一个双向链表,可以通过 lpush 和 rpop 写入和读取消息 不过最好使用 Kafka、RabbitMQ等消息中间件。 会话缓存可以使用 Redis 来统一存储多台应用服务器的会话信息。 当应用服务器不再存储用户的会话信息,也就不再具有状态,一个用户可以请求任意一个应用服务器,从而更容易实现高可用性以及可伸缩性。 分布式锁实现在分布式场景下,无法使用单机环境下的锁来对多个节点上的进程进行同步。 ...













