零声Golang云原生
golang/云原生/Docker/DevOps/K8S/持续集成/分布式/etcd/ipfs
Go 云原生应用实战:
启动注册中心
docker run -d -p 30100:30100 servicecomb/service-center(已报名零声go 底部评)
初始化Go工程
go mod init github.com/go-chassis/go-chassis-examples/hello
go get github.com/go-chassis/go-chassis/v2
工程目录规划
可以创建一个server(名称任意)文件夹,这个就是一个微服务的目录
mkdir server
目录结构
servicecomb:
registry:
address: http://127.0.0.1:30100
protocols:
rest:
listenAddress: 127.0.0.1:9000
最小化配置
在chassis.yaml中涵盖了几乎所有的配置,不过想要启动只需要2个简单的配置
servicecomb:
registry:
address: http://127.0.0.1:30100
protocols:
rest:
listenAddress: 127.0.0.1:9000
复制
也就是服务监听地址和注册中心地址
在microservice.yaml里定义微服务信息,只需要一个简单的微服务名即可,它还有大量的其他高级特性,我们将后续在高级特性中介绍
servicecomb:
service:
name: HelloServer
复制
编写业务逻辑
是时候编写自己的API了
//通常持有一批API,并定义API Patternstype HelloResource struct {}//业务APIfunc (r *HelloResource) SayHi(b *rf.Context) {
b.Write([]byte("hello, go chassis"))
return}//定义所有的API Patterns,用于API路由func (r *HelloResource) URLPatterns() []rf.Route {
return []rf.Route{
{Method: http.MethodGet, Path: "/hello", ResourceFunc: r.SayHi},
}}
复制
之后仅需要注册即可
chassis.RegisterSchema("rest", &HelloResource{})
复制
启动服务
启动很简单,只需要编写如下内容
if err := chassis.Init(); err != nil {
openlog.Fatal("Init failed." + err.Error())
return}chassis.Run()
复制
编译执行
go build main.go./main
复制
验证:访问UIhttp://127.0.0.1:30103


额外可以看到自动生成的open API文档


直接访问服务
curl http://127.0.0.1:9000/hello
复制
调用服务
接着我们需要调用这个服务
创建一个新的微服务
mkdir client
复制
定义微服务
在chassis.yaml中定义另一个监听地址
servicecomb:
registry:
address: http://127.0.0.1:30100
protocols:
rest:
listenAddress: 127.0.0.1:8000
复制
在microservice.yaml中定义微服务名
servicecomb:
service:
name: HelloClient
复制
#编写客户端
为了简单这里只需要简单的转发即可,这里给出完整逻辑
type SimpleResource struct {}//在这个方法中,调用上面编写的服务func (r *SimpleResource) SayHi(b *rf.Context) {
req, _ := rest.NewRequest(http.MethodGet, "http://HelloServer/hello", nil)//这里要填写需要调用哪个服务,填写服务名即可,然后就是他的api路径
restInvoker := core.NewRestInvoker()//并发安全,可全局使用
resp, err := restInvoker.ContextDo(context.TODO(), req)//执行调用,这时go chassis介入,执行一些列用户不可见的计算和操作
if err != nil {
log.Println(err)
return
}
b.Write(httputil.ReadBody(resp))//读出服务端body体并直接透传返回
return}func (r *SimpleResource) URLPatterns() []rf.Route {
return []rf.Route{
{Method: http.MethodGet, Path: "/hi", ResourceFunc: r.SayHi},
}}func main() {
chassis.RegisterSchema("rest", &SimpleResource{})
if err := chassis.Init(); err != nil {
openlog.Fatal("Init failed." + err.Error())
return
}
chassis.Run()}
复制
验证:
go build main.go./main
## 打开另一个终端,执行
curl http://127.0.0.1:8000/hi
复制
将返回HelloServer的返回结果
此时2个微服务实例应该同时在线