写点什么

[ CloudWeGo 微服务实践 - 05 ] 服务注册(2)

用户头像
baiyutang
关注
发布于: 10 小时前
[ CloudWeGo 微服务实践 - 05 ] 服务注册(2)

昨天的实践中,我们打算使用 etcd 作为注册中心,安装好并尝试连接到了 etcd,今天就尝试封装成组件,在服务启动时,能把我们的服务信息注册到 etcd 中。

目标

  1. etcd 安装配置好。(上节我们做好了)

  2. 实现 Kitex 的服务注册接口。(今天要做)


环境

  1. MacOS Monterey 12.0.1

  2. etcd version:3.5.0

  3. go version go1.16.5 darwin/amd64

步骤

参看服务注册扩展接口

这里我们直接参考官网介绍>>服务注册扩展

// Registry is extension interface of service registry.type Registry interface {  Register(info *Info) error  Deregister(info *Info) error}
复制代码


项目中创建服务注册文件夹及文件

新建 registry 文件夹

mkdir registry
复制代码


创建 etcd.go 文件

效果如下:


尝试实现接口

在刚刚的 etcd.go 文件中,我们先尝试如下代码:

package registry
import ( "log"
"github.com/cloudwego/kitex/pkg/registry")
var EtcdRegistry registry.Registry = &etcdRegistry{}
type etcdRegistry struct{}
func (e *etcdRegistry) Register(info *registry.Info) error { log.Printf("Register info:%v", info) return nil}
func (e *etcdRegistry) Deregister(info *registry.Info) error { log.Printf("Deregister info:%v", info) return nil}
复制代码


尝试注册服务

我们在 main.go 文件中,修改 api.NewServer 处的代码如下:

	// 记得引入包  // "api/registry"
// 修改代码,在启动脚本注入注册中心 option svr := api.NewServer(NewKblogImpl(db), server.WithRegistry(registry.EtcdRegistry)) err = svr.Run()
复制代码

确定下代码

main.go


register/etcd.go


重启服务

先尝试这个玩法是否可行

启动

能看到我们注册时打印的日志,由以下代码产生的:

log.Printf("Register info:%v", info)
复制代码


停止


能看到我们撤销服务时打印的日志,由以下代码产生的:

log.Printf("Deregister info:%v", info)
复制代码


优化 etcd 注册中心的实现

思路:

  1. 使用 NewFunc 的方式创建实例,并把 etcd client 显式的注入进去。

  2. 注册、撤销服务时对应操作 etcd 数据。

New 出注册中心实例

etcd.go 文件先改造下:

package registry
import ( "log"
"github.com/cloudwego/kitex/pkg/registry" etcdcli "go.etcd.io/etcd/client/v3")
func NewEtcdRegistry(client *etcdcli.Client) registry.Registry { return &etcdRegistry{ etcdClient: client, }}
type etcdRegistry struct { etcdClient *etcdcli.Client}
func (e *etcdRegistry) Register(info *registry.Info) error { log.Printf("Register info:%v", info) return nil}
func (e *etcdRegistry) Deregister(info *registry.Info) error { log.Printf("Deregister info:%v", info) return nil}
复制代码


然后改造下 main.go:

// 	NewEtcdRegistry,并把 etcd client 注入进去svr := api.NewServer(NewKblogImpl(db), server.WithRegistry(registry.NewEtcdRegistry(cli)))	err = svr.Run()
复制代码

操作 etcd 数据

// 引入import (	"context"	"encoding/json")
// key 前缀常量const ( KeyPrefix = "svc:")
// 注册的简单实现func (r *etcdRegistry) Register(info *registry.Info) error { k := KeyPrefix + info.ServiceName infoByte, err := json.Marshal(info) if err != nil { return err } resp, err := r.etcdClient.Put(context.Background(), k, string(infoByte)) if err != nil { return err } log.Printf("Register:%v", resp)
return nil}
// 撤销的简单实现func (r *etcdRegistry) Deregister(info *registry.Info) error { k := KeyPrefix + info.ServiceName resp, err := r.etcdClient.Delete(context.Background(), k) if err != nil { return err } log.Printf("Deregister:%v", resp) return nil}
复制代码


改造 main.go,定义一些服务信息

// 新增引入import (	kitexRegistry "github.com/cloudwego/kitex/pkg/registry")
// 服务元数据 svcInfo := &kitexRegistry.Info{ ServiceName: "kblog", Addr: &net.TCPAddr{IP: net.IPv4(127, 0, 0, 1), Port: 8888}, StartTime: time.Now(), Tags: make(map[string]string), } svcInfo.Tags["env"] = "local"
// 将服务信息注入到服务 options 中 svr := api.NewServer(NewKblogImpl(db), server.WithRegistry(registry.NewEtcdRegistry(cli)), server.WithRegistryInfo(svcInfo)) err = svr.Run()
复制代码


代码确认

main.go


registry/etcd.go


重启服务


没有任何报错,是个好消息


确认注册信息

打开终端执行:

etcdctl get svc:kblog
复制代码


效果如下:


成功!

总结

  1. 代码还有很多优化空间,严谨性合理性等等,后续可继续优化。比如注册一个服务支持多节点,现在我们只是简单的放了一个节点进去。

系列阅读

发布于: 10 小时前阅读数: 13
用户头像

baiyutang

关注

广州 2017.12.13 加入

Microservices | Golang | Cloud Nitive | “Smart work,Not hard”

评论

发布
暂无评论
[ CloudWeGo 微服务实践 - 05 ] 服务注册(2)