欢迎光临散文网 会员登陆 & 注册

零声Golang云原生

2022-09-06 14:57 作者:先填写用户名字  | 我要投稿

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个微服务实例应该同时在线


零声Golang云原生的评论 (共 条)

分享到微博请遵守国家法律