如何在 Go-kit 和 Service Mesh 中进行服务注册与发现?

本文探讨了如何使用Go-kit进行服务注册与发现,并详细介绍了Service Mesh中的Istio服务注册与发现机制。Go-kit提供了一套微服务工具集,简化了与服务发现中心如Consul的交互。而Istio,作为一个流行的Service Mesh实现,依赖Kubernetes进行服务发现,通过Envoy代理控制流量。文章强调了在Istio实践中,与Kubernetes结合使用能实现最佳效果。
摘要由CSDN通过智能技术生成

Service Mesh 作为下一代的微服务架构,它将服务间的通信从基础设施中抽离出来,达到交付更可靠的应用请求、监控和控制流量的目的。Service Mesh一般与应用程序一同部署,作为“数据平面”代理网络以及“控制平面”代替应用与其他代理交互。Service Mesh 的出现让业务开发人员从基础架构的底层细节中解放出来,从而把更多的精力放在业务开发上,提高需求迭代的效率。

本文我们将使用 Go-kit 提供的服务注册与发现工具包完成服务注册与发现,并介绍 Service Mesh 中 Istio 是如何进行服务注册与发现的。

使用 Go-kit 服务注册与发现工具包

自主开发服务注册与发现客户端固然能够加深我们对「微服务」「服务注册与发现中心」交互流程的理解,但同样会增加开发人员的理解成本,比如要了解服务注册与发现中心对外提供的接口、提交数据的具体细节,以及在服务注册与发现中心版本升级迭代或者 API 发生更新时,还需要持续维护客户端代码以避免不可用情况的发生,等等。

「Go-kit 作为一套微服务工具集」,意在帮助开发人员解决微服务开发中遇到的绝大多数问题,让他们更专注于业务开发。

Go-kit 提供了诸多服务注册与发现组件的客户端实现,支持包括 Consul、Etcd、ZooKeeper和 Eureka 在内的多种服务注册与发现中心。下面我们以 Consul 为例,实践如何使用 Go-kit 的 sd 包「简化」微服务服务注册与发现的实现。

sd 包中提供如下注册和注销接口,代码如下所示:

type Registrar interface {
Register() // 服务注册
Deregister() // 服务注销
}

在 Go-kit 中,我们根据选定的服务注册和发现组件,实例化Registrar接口对应的结构体实现,即可使用同样的接口进行服务注册和服务注销。接下来我们实例化 sd/consul 包下的 Registrar 用于完成与 Consul 的交互,实例化代码如下:

func NewDiscoveryClient(host string, port int, registration *api.AgentServiceRegistration) (*DiscoveryClient, error) {
config := api.DefaultConfig()
config.Address = host + ":" + strconv.Itoa(port)
// 生成 hashicorp client
client, err := api.NewClient(config)
if err != nil{
return nil, err
}
// 使用 hashicorp client 生成 sd consul client
sdClient := consul.NewClient(client)
return &DiscoveryClient{
client: sdClient,
config: config,
registration: registration,
register: consul.NewRegistrar(sdClient, registration, log.NewLogfmtLogger(os.Stderr)),
}, nil
}

DiscoveryClient.register 即最终实例化的 Consul 注册器。从实例化的过程可以发现 ConsulRegistrar的实现依赖于 sd.consul.Client,而 sd.consul.Client 实现依赖于 hashicorp client,即 Consul 的官方实现客户端。深入 hashicorp client 客户端中的服务注册与发现的实现,会发现它也是通过请求 Consul Agent 提供的 HTTP API 完成的,实现的方式与我们在上一课时中的实践大同小异。api.AgentServiceRegistration 结构体即需要提交到 Consul中的服务实例信息,包含服务名、服务实例ID、服务地址和服务端口等基本信息。

然后我们的服务注册和服务注销实现就可以委托给 Register 执行,如下所示:

func (consulClient *DiscoveryClient) Register(ctx context.Context) {
consulClient.register.Register()
}
func (consulClient *DiscoveryClient) Dereg
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值