gRPC安全认证

在 gRPC 作为服务间通信的过程中为了数据安全我们一般要进行安全认证,比如 HTTP Restful Api 经常需要做接口之间调用的认证,我们来看下 gRPC 的认证方式。 安全证书认证 gRPC 建立于 HTTP/2 所以对 TLS 支持,我们可以使用服务端客户端双向证书验证通信来提供安全可靠的 gRPC。这里假如我们已经生成好了服务端和客户端的证书和私钥文件,并已经通过根证书做了签名。 我们先来看下服务端大概代码 server.go: package main import ( ...... ) ...... func main() { certificate, err := tls.LoadX509KeyPair("server.crt", "server.key") if err != nil { log.Fatal(err) } certPool := x509.NewCertPool() ca, err := ioutil.ReadFile("ca.crt") if err != nil { log.Fatal(err) } if ok := certPool.AppendCertsFromPEM(ca); !ok { log.Fatal("failed to append certs") } creds := credentials.NewTLS(&tls.Config{ Certificates: []tls.

阅读全文

Go实践微服务 -- 服务发现

服务的注册发现对于微服务来说是一个非常重要的环节,在单一架构应用中,service 之间的互相调用,通过一个固定的 host 和 port 来发起 REST 或者 RPC 来调用,但是在微服务架构中,各个服务往往是动态变化的,所以需要一个服务发现机制来发送客户端的请求到动态的 service 实例中去。 在利用 go micro 来实现服务发现便利很多,micro 中默认支持使用 Consul 来做服务发现,当然它使用插件机制(go-plugins)还支持 Etcd, Gossip, NATS 等其他的第三方服务注册发现工具。在每个服务启动的时候,都将自己注册到 registry 上,退出时也自动解注册,具体实现我们可以来看一下go-micro/service.go的相关代码片段: ...... func (s *service) run(exit chan bool) { if s.opts.RegisterInterval <= time.Duration(0) { return } //定时注册自己 t := time.NewTicker(s.opts.RegisterInterval) for { select { case <-t.C: err := s.opts.Server.Register() if err != nil { log.Log("service run Server.Register error: ", err) } case <-exit: t.Stop() return } } } .

阅读全文

在之前介绍了《Go 实践微服务 – gRPC 配置和使用》,通过 gRPC 直接编写微服务有点麻烦,比如都需要手动指定服务地址和端口,不便于管理,也需要自己来实现服务注册和发现的逻辑,同时对于网关以及监控等都是微服务架构和实施中不可避免的。所以引入 go-micro,go-micro 是一个插件式的 RPC 框架,它是Micro生态的一部分,Micro 是一个简化分布式开发的微服务生态系统,它为开发分布式应用程序提供了基本的构建模块。 Go Micro 抽象出分布式系统的细节。以下是主要功能。 服务发现 - 通过服务发现自动注册和名称解析 负载平衡 - 基于发现构建的服务的智能客户端负载平衡 同步通信 - 基于 RPC 的通信,支持双向流 异步通信 - 为事件驱动架构内置的 Pub/Sub 接口 消息编码 - 基于带有 protobuf 和 json 的内容类型的动态编码 服务接口 - 所有功能都打包在一个简单的高级界面中,用于开发微服务 通过写一个船运的示例看下 go-micro 如何来写一个微服务。 安装 protoc-gen-micro go get github.com/micro/protoc-gen-micro 编写 proto 文件来定义服务 consignment-service/proto/consignment/consignment.proto syntax = "proto3"; package go.micro.srv.consignment; // 定义货轮服务 service ShippingService { // 托运一批货物 rpc CreateConsignment (Consignment) returns (Response) { } // 查看货物信息 rpc GetConsignments (GetRequest) returns (Response) { } } // 货物信息 message Consignment { string id = 1; // ID string description = 2; // 描述 int32 weight = 3; // 重量 repeated Container containers = 4; // 集装箱,多个 string vessel_id = 5; // 承运货轮ID } // 集装箱 message Container { string id = 1; // 编号 string customer_id = 2; // 客户ID string origin = 3; // 出发地 string user_id = 4; // 集装箱所属用户ID } // 托运结果 message Response { bool created = 1; // 托运结果 Consignment consignment = 2; // 新托运的货物 repeated Consignment consignments = 3; // 所有托运的货物 } message GetRequest { } 生成 gRPC 代码 consignment-service/Makefile

阅读全文

gRPC 是一个高性能、开源和通用的 RPC 框架,面向移动和 HTTP/2 设计。 它有很多特点,如双向流、流控、头部压缩、单 TCP 连接上的多复用请求,节省带宽、降低 TCP 链接次数、节省 CPU 使用和延长电池寿命等。强大的 IDL,默认采用Protocol Buffers数据序列化协议,支持多种开发语言以及移动端。gRPC 既能够在客户端应用,也能够在服务器端应用,从而以透明的方式实现客户端和服务器端的通信和简化通信系统的构建,很容易去构建分布式应用和微服务架构模式。 各大主流的 RPC 框架的性能比较可以参考这一篇《流行的 rpc 框架 benchmark 2018 新春版》 我很久前写过一篇《Thrift 应用总结》 安装 protobuf 编译器 官方推荐使用 protobuf 3,我用的是 Mac,所以可以直接用 brew 安装 3.X 版本 brew info protobuf brew install protobuf 安装完可以看下版本号 protoc --version libprotoc 3.5.1 当然也可以通过编译安装 #去下载Protocol Buffers v3.5.1的release包 brew info automake brew info libtool # 没有这两个就安装 ./autogen.sh # 检查没问题了 ./configure make -j8 make check make install 安装 Golang for protobuf 插件 go get -u -v github.

阅读全文

作者的图片

Ryan是菜鸟 | LNMP技术栈笔记

一步一个脚印,一直在路上!记录LNMP技术栈,Web架构,区块链等笔记

菜鸟码农

南京