什么是 chassis?
Chassis,是一种微服务模式。在这种模式中,用户并不需要自己去处理构建微服务过程中外部配置、日志、健康检查、分布式追踪等,而是将他们交给专门的框架来处理。用户可以更聚焦业务逻辑本身,简单、快速的开发微服务。
阅读此文,你可以得到什么?
1.chassis 运行时做了什么2.chassis 运行时的隐藏操作。3.chassis 设计思路的一些理解
Go-Chassis 是什么?
Go-Chassis 是一个go语言的微服务开发框架,采用插件化设计,原生提供了可插拔的注册发现,加密解密,调用链追踪等组件。协议也是插件化的,支持http和grpc,也支持开发者定制私有协议, 开发者只需要专注于实现云原生应用即可。
云原生应用,基于云服务开发或者针对云服务开发部署的应用。
上图是go-chassis 的架构图,可以看出配置管理(Archaius)、服务注册(Registry)、Metrics、日志(Logger)都是独立的组件,分布式追踪、负载均衡、限流等都是以中间件(Handler Chain)的方式实现的。一个请求进来后会先通过server 转换成chassis invoker,然后经过Handler Chain,最后由Transport 转换成对应协议的response返回。
此篇文章主要关注go-chassis 启动过程时做了什么,以及做这些事情的用途。
一个例子
首先从 hello world 开始, 目录结构如下:
.
├── conf # 配置目录,必须
│ ├── chassis.yaml #
│ ├── microservice.yaml # 微服务相关配置,比如server name,注册中心地址
└── rest
└── main.go
chassis.yaml 内容为:
---
cse:
protocols:
rest:
listenAddress: "127.0.0.1:5001"
transport:
timeout:
rest: 1
handler:
chain:
Provider:
default: tracing-provider
microservice.yaml 内容为:
cse:
service:
registry:
address: http://127.0.0.1:30100
service_description:
name: test-rest-server
main.go
package main
import (
rf "github.com/go-chassis/go-chassis/v2/server/restful"
"log"
"net/http"
"github.com/go-chassis/go-chassis/v2"
)
//RestFulHello is a struct used for implementation of restfull hello program
type RestFulHello struct {
}
//Sayhi is a method used to reply user with hello world text
func (r *RestFulHello) Sayhi(b *rf.Context) {
b.Write([]byte( "hello world"))
return
}
//URLPatterns helps to respond for corresponding API calls
func (r *RestFulHello) URLPatterns() []rf.Route {
return []rf.Route{
{Method: http.MethodGet, Path: "/sayhi", ResourceFunc: r.Sayhi,
Returns: []*rf.Returns{
{Code: 200}}},
}
}
func main() {
chassis.RegisterSchema("rest", &RestFulHello{})
if err := chassis.Init(); err != nil {
log.Fatal("Init failed." + err.Error())
return
}
chassis.Run()
}
先来看一下这段代码具体做了什么。
•11~27 声明了 一个 RestFulHello struct,这个struct 有两个方法 Sayhi 和 URLPatterns,其中URLPatterns 返回一个 Route 列表。这段代码声明了一个http handler 和 对应的路由,那具体为什么这么写等下再做说明。
type Schema struct {
serverName string
schema interface{}
opts []server.RegisterOption
}
•
30行 chassis.RegisterSchema("rest", &RestFulHello{})
将前面声明的 RestFulHello 注册到 "rest" 服务。
这里内部只是简单的使用传入的参数创建一个 chassis.Schema
然后append到 chassis.schemas
中。
•
31行 chassis运行前的初始化工作。
•
35行 运行chassis 服务。
执行 go run rest/main.go
运行代码,会发现启动失败,日志输出内容为:
INFO: Install client plugin, protocol: rest
INFO: Install Provider Plugin, name: default
INFO: Installed Server Plugin, protocol:rest
ERROR: add file source error [[/var/folders/rr/rzqnl9h10y577rch1nsx_jww0000gp/T/go-build725280265/b001/exe/conf/chassis.yaml] file not exist].
file:go-chassis@v1.8.3/chassis_init.go:106,msg:failed to initialize conf: [/var/folders/rr/rzqnl9h10y577rch1nsx_jww0000gp/T/go-build725280265/b001/exe/conf/chassis.yaml] file not exist
init chassis fail: [/var/folders/rr/rzqnl9h10y577rch1nsx_jww0000gp/T/go-build725280265/b001/exe/conf/chassis.yaml] file not exist
Init failed.[/var/folders/rr/rzqnl9h10y577rch1nsx_jww