0%

微服务架构系列(一)-服务注册与发现(3)

从上一篇留下的两个问题出发,介绍从服务发现获取的服务注册列表中获取一个服务注册信息并将其实例成可使用的client对象的过程;

分析

从服务发现获取的服务注册列表中获取一个服务注册信息并将其实例成可使用的client对象需要经过以下步骤:

1
2
3
1、服务发现获取服务列表;对其进行监听,如果服务列表发生变化进行更新;
1、服务列表连接和权重等信息构成节点列表;节点列表中节点再附加命中等信息构成加权节点列表供后续使用;
2、从加权节点列表经过过滤后通过负载均衡算法选择其中一个节点;

从以上步骤抽象出角色和接口:

1
2
3
Reslover(解析器): 通过服务名(服务注册时的服务命名)解析成服务对象列表的过程;通过服务发现获取列表,服务监听更新列表;
Selector(选择器): 将服务列表构建成具有权重和命中等信息的家权节点列表,通过均衡器从加权节点列表中选择一个节点的过程;
Balancer(均衡器): 从节点列表中选择这个节点有不同的负载均衡算法;例如:wrr等

接口定义伪代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
type Selector interface {
Apply([]Node)
Select() Node
}

type Balancer interface {
Pick() Node
}

type ResloverBuilder interface {
Build(Discovery, Selector, Target) Reslover
}

type Reslover interface {
Update([]Service)
}

实现

1
2
github.com/go-kratos/kratos/selector
github.com/go-kratos/kratos/transport

其中grpc提供了解析器的reslover.Builder接口和reslover.Reslover接口以及均衡器的balancer.Picker接口和balancer.PickResult接口,实现这些接口并进行注册;

最后

这里只是简单介绍从服务发现获取的服务注册列表中获取一个服务注册信息并将其实例成可使用的client对象的过程,将角色和方法进行分解;具体实现还需要自己去看代码,最好再自己也实现一遍。