cncf 技术栈自由实践

cncf 技术栈自由实践

一、cncf 技术栈

cncf 技术栈

  • CNCF 是一个开源软件基金会,致力于使云原生计算具有普遍性和可持续性。 云原生计算使用开源软件技术栈将应用程序部署为微服务,将每个部分打包到自己的容器中,并动态编排这些容器以优化资源利用率。 云原生技术使软件开发人员能够更快地构建出色的产品。

1. CNCF 项目

CNCF 包含多个项目:

  • 由于篇幅问题,以下只介绍其中的几个,若想了解全部可浏览 CNCF 技术栈
    在这里插入图片描述

Kubernetes

  • Kubernetes 是世界上最受欢迎的容器编排平台和第一个 CNCF 项目。 Kubernetes 帮助用户构建、扩展和管理应用程序及其动态生命周期。 集群调度功能可让开发人员构建云原生应用,更加关注代码而不是操作。(关于 Kubernetes 的部署可参考笔者的另一篇博客 服务计算 HW 10 部署 Kubernetes

Prometheus

  • Prometheus 为云原生应用程序提供实时监控、警报和时间序列数据库功能(包括强大的查询和可视化能力),并与许多流行的开源数据导入、导出工具集成。 它已经成为监控基于容器的基础设施的标准,并且随着用户需求的而不断添加主要功能。

OpenTracing

  • Tracing 是基于微服务环境的关键部分,用于追踪跨服务请求的行为。 OpenTracing 是一种分布式追踪 API,可用于各种流行的开源的和商业的追踪工具。

Fluentd

  • Fluentd 是一个统一的日志记录工具,可收集来自任何数据源(包括数据库、应用程序服务器、最终用户设备)的数据,并与众多警报、分析和存储工具配合使用。

gRPC
在这里插入图片描述

  • gRPC 是由 Google 开发的高性能 RPC(远程过程调用)框架,针对连接跨语言、云和数据中心的服务以及将移动设备连接到后端的云原生计算环境的大规模、多平台性质进行了服务优化。

2. RPC

  • 广义上来讲,所有本应用程序外的调用都可以归类为RPC。由于不在本地执行,都有三个特点:

需要事先约定调用的语义(接口语法)
需要网络传输
需要约定网络传输中的内容格式

  • RPC 框架实际是提供了一套机制,使得应用程序之间可以进行通信,而且也遵从 server/client 模型。使用的时候客户端调用 server 端提供的接口就像是调用本地的函数一样。
  • RPC 调用的过程示意图如下:
    在这里插入图片描述

二、gRPC

1. 什么是 gRPC

gRPC 官方文档中文版
在这里插入图片描述

  • grpc 是 Google 在发布的,基于HTTP 2.0传输层协议承载的,一款高性能、开源的通用RPC框架,其源码是由 C 语言编写的。
  • 在 gRPC 里客户端应用可以像调用本地对象一样直接调用另一台不同的机器上服务端应用的方法,使得用户能够更容易地创建分布式应用和服务。
  • 用 gRPC 来进行远程服务调用就仅仅需要 gRPC Stub(Client)用 Proto Request 向远方的 gRPC Server 发起服务调用,然后远方的 gRPC Server 通过 Proto Response(s) 将调用结果返回给 gRPC Stub。
    在这里插入图片描述
  • 它的特性如下:
① 基于 HTTP/2
  • 由于 gRPC 基于 HTTP 2.0 标准设计,弥补了 HTTP1.1 的不足,带来了更多强大功能,如多路复用、二进制帧、头部压缩、推送机制。这些功能给设备带来重大益处。gRPC 既能够在客户端应用,也能够在服务器端应用,从而以透明的方式实现两端的通信和简化通信系统的构建。
② 使用 ProtoBuf
  • ProtoBuf 能够将数据进行序列化,并广泛应用在数据存储、通信协议等方面。压缩和传输效率高,语法简单,表达力强。Protobuf 进行数据编码,能提高数据压缩率。
  • gRPC 可以通过 protobuf 来定义接口,从而可以有更加严格的接口约束条件,通过 protobuf 可以将数据序列化为二进制编码,这会大幅减少需要传输的数据量,从而大幅提高性能。
  • 有了 gRPC, 我们可以一次性的在一个 .proto 文件中定义服务并使用任何支持它的语言去实现客户端和服务器,反过来,它们可以在各种环境中,gRPC 帮你解决了不同语言及环境间通信的复杂性。使用 protocol buffers 还能获得其他好处,包括高效的序列号,简单的 IDL 以及容易进行接口更新。
③ 多语言支持
  • gRPC 支持多种语言,并能够基于语言自动生成客户端和服务端功能库。
  • 作为一个以跨语言为目标的序列化方案,不管什么语言,都能以同一份 proto 文件作为约定,不用A语言写一份,B语言写一份,各个依赖的服务将 proto 文件原样拷贝一份即可。

2. 安装 gRPC

① 系统环境
  • 硬件信息:virtual box 虚拟机(内存5G、磁盘20G)
  • 操作系统:Centos 7
  • 编程语言:go version go1.13.1 linux/amd64
② 安装 protobuf

Protocol Buffers 是 Google 开发的一种跨语言、跨平台、可扩展的用于序列化数据协议。它是一种灵活、高效的数据格式,与XML、JSON类似,在一些高性能且对响应速度有要求的数据传输场景非常适用,在 gRPC 的框架中主要有三个作用:

定义数据结构
定义服务接口
通过序列化和反序列化,提升传输效率

  • 先从 github 上下载最新版的 protobuf 下载地址
  • 安装依赖
yum install -y gcc-c++ autoconf libtool
yum groupinstall -y "Development Tools"
  • 编译安装
unzip protobuf-all-3.14.0.zip
cd protobuf-3.14.0/
./configure
make
make install
  • 查看版本,检查安装
protoc --version
  • 可能会报错 error while loading shared libraries: libprotobuf.so.8: cannot open
  • 需要配置 LD_LIBRARY_PATH
  • 新建 ld 指向文件 /etc/ld.so.conf.d/libprotobuf.conf,内容如下:
# vim /etc/ld.so.conf.d/libprotobuf.conf
/usr/local/lib
  • 执行命令
sudo ldconfig
  • 添加路径
# vim /etc/profile
LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH
# source /etc/profile
  • 安装成功
    在这里插入图片描述

3. 使用 gRPC

gRPC 的使用包括:

  1. 通过 protobuf 来定义接口和数据类型
  2. 编写 gRPC 服务端代码
  3. 编写 gRPC 客户端代码
  4. 使用 protoc 命令生成相关文件。
  • 官方自带有个 HelloWorld 的 Demo,可以编译这个 Demo 看是否已经安装成功
    在这里插入图片描述
① helloworld.proto
  • 通过 protobuf 定义接口和数据类型
    在这里插入图片描述
  • 使用 gRPC protobuf 生成工具生成对应语言的库函数
  • 运行 protocol buffer 编译器,plugins 选项选择 grpc,生成相应的服务接口
protoc --go_out=plugins=grpc:. helloworld.proto
  • 指令会自动生成文件夹中的 helloworld_pb.go 和 helloworld_grpc_pb.go
  • 其中包含了用于填充、序列化、提取 HelloRequest 和 HelloResponse 消息类型的类。
    在这里插入图片描述
② Client
  • 创建一个 gRPC dial,指定我们要连接的主机名和服务器端口。然后用这个 dial 创建存根实例。
const (
	address     = "localhost:50051"
	defaultName = "world"
)

func main() {
	// Set up a connection to the server. 启动一个与 server 的连接
	conn, err := grpc.Dial(address, grpc.WithInsecure(), grpc.WithBlock())
	if err != nil {
		log.Fatalf("did not connect: %v", err)
	}
	defer conn.Close()
	// 创建一个 client
	c := pb.NewGreeterClient(conn)

	// Contact the server and print out its response.
	name := defaultName
	if len(os.Args) > 1 {
		name = os.Args[1]
	}
	ctx, cancel := context.WithTimeout(context.Background(), time.Second)
	defer cancel()
	r, err := c.SayHello(ctx, &pb.HelloRequest{Name: name})
	if err != nil {
		log.Fatalf("could not greet: %v", err)
	}
	log.Printf("Greeting: %s", r.GetMessage())
}

  • 创建并填充一个 HelloRequest 发送给服务端
  • 请求调用存根的 SayHello(),如果 RPC 成功,会得到一个填充的 HelloReply

③ Server
  • 实现了 Greeter 服务端所需要的行为。有一个 server 结构。
  • 服务端代码中有一个 SayHello 方法,可以让服务端从远程服客户端接收一个包含用户名的 HelloRequest 消息后,在 HelloReply 里发送回一个 Greeter。实现了 proto 服务定义生成的 GreeterServer 接口
// server is used to implement helloworld.GreeterServer.
type server struct {
	pb.UnimplementedGreeterServer
}

// SayHello implements helloworld.GreeterServer
func (s *server) SayHello(ctx context.Context, in *pb.HelloRequest) (*pb.HelloReply, error) {
	log.Printf("Received: %v", in.GetName())
	return &pb.HelloReply{Message: "Hello " + in.GetName()}, nil
}

func main() {
	lis, err := net.Listen("tcp", port)
	if err != nil {
		log.Fatalf("failed to listen: %v", err)
	}
	// 创建 server
	s := grpc.NewServer()
	// 将新定义的 server s 注册到结构 server 上
	pb.RegisterGreeterServer(s, &server{})
	// 将创建的 net.Listener 传给 s.Serve
	if err := s.Serve(lis); err != nil {
		log.Fatalf("failed to serve: %v", err)
	}
}
  • 构建并填充一个在接口定义的 HelloReply 应答对象,然后将 HelloReply 返回给客户端

④ 演示
  • 在终端里先执行 server 端代码,接着执行 client 端代码,如果命令行中显示以下说明则运行成功。
  • 客户端:
    在这里插入图片描述
  • 服务端:
    在这里插入图片描述

三、参考文章

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值