CNCF 计划为支持分布式、可扩展的应用需要的组件和组装方式提出一种规范,期望定义能够支持云原生应用和容器的整个基础设施堆栈。为了真正理解 CNCF 的既定目标,我们还需要了解它旗下的项目内容。
正如基金会目标中所描述的任务、角色以及价值观,基金会自创立以来名下已经管理了多个云端原生技术项目,包括:
– Kubernetes :集群中管理跨多台主机容器化应用的开源系统;
介绍可以参考这里
– Prometheus :专注于时间序列数据,为客户端依赖及第三方数据消费提供广泛集成支持的开源监控解决方案;
介绍可以参考这里
– OpenTracing:与厂商无关的分布式追踪开源标准;
标准(中文版)参考这里
– Fluentd:创建统一日志层的开源数据收集器。
安装实践参考这里
– Linkerd:为微服务提供可靠性支持、自动化负载均衡、服务发现和运行时可恢复性的开源“服务网格”项目;
介绍参考这里
– gRPC:现代化高性能开源远程调用框架;
– CoreDNS:快速灵活的构建 DNS 服务器的方案;
实践参考这里
– containerd:将容器运行时及其管理功能从 Docker Daemon 剥离的镜像管理和容器执行技术;
介绍参考这里
– rkt:帮助开发者打包应用和依赖包,简化搭环境等部署工作,提高容器安全性和易用性的容器引擎。
介绍参考这里
CNCF 包含的明星项目如此之多,其中广为人知的有 Kubernetes、Prometheus 和目前炙手可热的 gRPC。
cncf社区
gRPC 是一个现代化高性能开源远程过程调用(RPC)框架。CoreOS 的分布式键值存储 etcd 就使用了 gRPC 进行点对点通讯,Docker 的便携式容器运行时 containerd 也通过 gRPC 暴露其功能,同时 containerd 本身也被捐献给了 CNCF。在 gRPC 中可以使用 Protocol Buffers 来定义服务的接口,Protocol Buffers 是一个强大的二进制序列化工具和语言。gRPC 也和诸多语言进行了集成,并可以自动生成特定语言的客户端和服务端接口。
./configure --prefix=your_pb_install_path
make
make install
set your_pb_install_path to your $PATH
protoc --version
libprotoc 3.0.0
go get -u github.com/golang/protobuf/proto
go get -u github.com/golang/protobuf/protoc-gen-go
go get google.golang.org/grpc
这里的实践参考了网上的教程:
1.使用examples给出的demo helloworld进行实践,使用protoc命令生成相关文件
protoc --go_out=plugins=grpc:. helloworld.proto
这里生成了对应的pb.go文件,使用plugins选项提供对grpc的支持、生成service的接口
2.服务器端代码如下:
package main
import (
"log"
"net"
pb "your_path_to_gen_pb_dir/helloworld"
"golang.org/x/net/context"
"google.golang.org/grpc"
)
const (
port = ":50051"
)
// server is used to implement helloworld.GreeterServer.
type server struct{}
// SayHello implements helloworld.GreeterServer
func (s *server) SayHello(ctx context.Context, in *pb.HelloRequest) (*pb.HelloReply, error) {
return &pb.HelloReply{Message: "Hello " + in.Name}, 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
s.Serve(lis)
}
3.客户端代码
package main
import (
"log"
"os"
pb "your_path_to_gen_pb_dir/helloworld"
"golang.org/x/net/context"
"google.golang.org/grpc"
)
const (
address = "localhost:50051"
defaultName = "world"
)
func main() {
//启动一个与server的连接
conn, err := grpc.Dial(address, grpc.WithInsecure())
if err != nil {
log.Fatalf("did not connect: %v", err)
}
defer conn.Close()
//创建一个client
c := pb.NewGreeterClient(conn)
name := defaultName
if len(os.Args) > 1 {
name = os.Args[1]
}
r, err := c.SayHello(context.Background(), &pb.HelloRequest{Name: name})
if err != nil {
log.Fatalf("could not greet: %v", err)
}
log.Printf("Greeting: %s", r.Message)
}
4.依次运行服务器和客户端
./greeter_server &
./greeter_client
如果在命令行中显示
Greeting:hello world
则是成功
更多关于gRPC的资料可以详细参考这里
拓展学习参考这里