跳到主要内容

microkernel 设计6

1. 目标

  • 支持服务依赖关系管理

2. 代码改动

2.1 Kernel(核心)

定义服务依赖关系。依赖的是服务名称

// kernel/service.go

// Service 定义微内核的服务接口
// 使用接口定义代替固定的struct,低耦合设计。
type Service interface {
Start() error
Stop() error
Name() string
Handle(Event) Reply
// Dependencies 返回依赖服务名称
Dependencies() []string // 新增接口
}

// serviceMeta 定义微内核服务元数据
type serviceMeta struct {
svc Service
state ServiceState
// 存储依赖,也可以不使用,直接使用svc.Dependencies
deps []string
}

注册Register增加deps

// kernel/kernel.go

// Register 注册服务
// 重命名 RegisterService 为 Register
func (k *MicroKernel) Register(svc Service) error {
k.mu.Lock()
defer k.mu.Unlock()

name := svc.Name()
if _, ok := k.services[name]; ok {
return errors.New("service already registered")
}
k.services[name] = &serviceMeta{
svc: svc,
state: Created,
deps: svc.Dependencies(),
}
fmt.Println("Registered:", svc.Name())
return nil
}

启动服务和停止服务增加拓扑排序

// kernel/kernel.go
func (k *MicroKernel) topoSort() ([]string, error) {
k.mu.RLock()
defer k.mu.RUnlock()

visited := make(map[string]bool)
temp := make(map[string]bool)
result := []string{}
var visit func(string) error

visit = func(name string) error {
if temp[name] {
return fmt.Errorf("circular dependency at %s", name)
}
if visited[name] {
return nil
}
temp[name] = true
meta, ok := k.services[name]
if !ok {
return fmt.Errorf("service %s not registered", name)
}
for _, dep := range meta.deps {
if err := visit(dep); err != nil {
return err
}
}
visited[name] = true
temp[name] = false
result = append(result, name)
return nil
}

for name := range k.services {
if !visited[name] {
if err := visit(name); err != nil {
return nil, err
}
}
}

return result, nil
}

func (k *MicroKernel) StartAll() error {
sorted, err := k.topoSort()
// ...
for _, name := range sorted {
if err := k.StartService(name); err != nil {
// ...
}
}
return nil
}

2.2 服务

服务增加依赖方法实现

func (l *LogService) Dependencies() []string {
return []string{"echo"}
}

2.3 运行结果

Registered: logger
Registered: echo
Starting all services...
Services: [echo logger]
[echo] starting...
Started: echo
[logger] starting...
Started: logger
[logger] LOG: Hello, Microkernel!
[MicroKernel] Event from logger: - Hello, Microkernel!
[logger] got reply from kernel: Handled by kernel
[logger] LOG: Hello, Echo!
[MicroKernel] Event from logger: - Hello, Echo!
[logger] got reply from kernel: echo service handled
[MicroKernel] Send Event to unknown: Hello, Log!
{404 Not found service }
Stopping all services...
[logger] stopping...
Stopped: logger
[echo] stopping...
Stopped: echo

查看完整代码