go-chassis
https://github.com/go-chassis/go-chassis
要求:Go version>=1.12 and GO111MODULE=on
Go chassis是一个go语言微服务开发框架
go chassis特性:
插件化注册中心: 默认支持Service Center,kubernetes,istio
动态治理框架: 通过此框架,开发者可实现进程运行时配置热加载
插件化协议: 开发者可实现自己的RPC协议,默认实现了 http 和highway(RPC)
熔断降级: 支持根据超时,并发,错误率等进行服务的熔断
容错:支持重试次数等配置,并支持backoff退让重试,
路由管理: 可根据流量权重和Header匹配等配置规则,轻松实现金丝雀发布
客户端负载均衡: 支持定制策略
限流: 支持客户端和服务端限流
插件化Cipher: 支持开发者自定义加解密工具,并应用于AKSK和TLS 证书
处理链: 可支持在通信的过程中加入定制的业务逻辑
Metrics: 支持自动导出Prometheus格式的运行时监控数据
Tracing: 使用opentracing,支持用户快速对接不同分布式追踪系统
Logger: 日志工具支持扩展并下沉到不同存储中
治理: 可通过动态治理框架,在运行时热加载,熔断,负载均衡,路由等配置信息
请求处理过程:
不同协议请求进入到各协议Server,Server将具体的协议请求转换为Invocation统一抽象模型,并传入Handler chain,在这里Chassis已经默认实现了很多的Handler,比如熔断,限流等,最终再进入Transport handler,使用具体的协议客户端传输到目标。
Rest service
(1)编写一个结构来保存http逻辑和url模式
(2)编写url模式
(3)修改配置文件chassis.yaml
(4)注册
chassis.RegisterSchema("rest", &RestFulHello{})
(5)修改配置文件microservice.yaml
service_description:
name: RESTServer # name your provider
(6)启动服务
func main() {
//start all server you register in server/schemas.
if err := chassis.Init(); err != nil {
lager.Logger.Error("Init failed.", err)
return
}
chassis.Run()
}
gRPC service
schemas
`-- helloworld
`-- helloworld.proto
(1)写proto文件
syntax = "proto3";
package helloworld;
// The greeting service definition.
service Greeter {
// Sends a greeting
rpc SayHello (HelloRequest) returns (HelloReply) {}
}
// The request message containing the user's name.
message HelloRequest {
string name = 1;
}
// The response message containing the greetings
message HelloReply {
string message = 1;
}
(2)protoc --go_out=plugins=grpc:. helloworld.proto
protoc --go_out=plugins=grpc:. helloworld.proto
schemas
`-- helloworld
|-- helloworld.pb.go
`-- helloworld.proto
(3)手动更改helloworld.pb.go中的一个变量, 必须将_Greeter_serviceDesc改为Greeter_serviceDesc
var _Greeter_serviceDesc = grpc.ServiceDesc{
ServiceName: "helloworld.Greeter", // use this as the schemaID when consumer call provider
HandlerType: (*GreeterServer)(nil),
Methods: []grpc.MethodDesc{
{
MethodName: "SayHello",
Handler: _Greeter_SayHello_Handler,
},
},
Streams: []grpc.StreamDesc{},
Metadata: "helloworld.proto",
}
(4)写接口,将业务逻辑注册到go chassis
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
}
//注册
chassis.RegisterSchema("grpc", &Server{}, server.WithRPCServiceDesc(&pb.Greeter_serviceDesc))
(5)修改配置文件chassis.yaml,最小配置项需要配置服务中心,以及指定需要启动的协议服务器
cse:
service:
registry:
address: http://127.0.0.1:30100
protocols:
grpc:
listenAddress: 127.0.0.1:5000
(6) 修改microservice.yaml,为这个微服务起个名字
service_description:
name: RPCServer
(7)启动服务
func main() {
//start all server you register in server/schemas.
if err := chassis.Init(); err != nil {
lager.Logger.Errorf("Init failed: %s", err)
return
}
chassis.Run()
}