Polaris系列-05.启动分析四

接上,先贴出方法代码:
在这里插入图片描述
进入cacheMgn.OpenResourceCache(...)方法, 注意入参:传递是gray, 正是上篇缓存管理的配置项的最后一个,着重强调是因为下面这个方法是通用的,通过传递不同的入参来区别模块:即开启不同的资源缓存

// OpenResourceCache 开启资源缓存
func (nc *CacheManager) OpenResourceCache(entries ...types.ConfigEntry) error {
	for _, obj := range nc.caches {
		var entryItem *types.ConfigEntry
		for _, entry := range entries {
			// 每个配置项有不同的Name()实现
			if obj.Name() == entry.Name {
				entryItem = &entry
				break
			}
		}
		if entryItem == nil {
			continue
		}
		if err := obj.Initialize(entryItem.Option); err != nil {
			return err
		}
		// 保存加载成功的配置项
		nc.needLoad.Add(entryItem.Name)
	}
	return nil
}

再次回顾下:
// CacheManager 名字服务缓存
type CacheManager struct {
	storage  store.Store
	caches   []types.Cache
	// 一个线程安全set集合
	needLoad *utils.SyncSet[string]
}

上个方法做的事是:
从缓存管理器管理的(16个)配置项中遍历查找出名称为 指定入参的配置项,
如果找到了,那么就去初始化这个配置项模块,对于当前调用,正是找到 gray配置项(灰度发布),然后去初始化它:
等等??? 上一篇不是已经初始化缓存配置项了嘛?怎么又要初始化?
我们进去看看:
在这里插入图片描述
对缓存的灰度发布来说,这次的初始化只是初始化了2个属性…
在这里插入图片描述
那么上一篇中 灰度发布初始化是做了什么呢?上篇中似乎只是一笔带过…
回顾下:

// NewGrayCache create gray cache obj
func NewGrayCache(storage store.Store, cacheMgr types.CacheManager) types.GrayCache {
	return &grayCache{
		BaseCache: types.NewBaseCache(storage, cacheMgr),
		storage:   storage,
	}
}
type grayCache struct {
	*types.BaseCache
	storage       store.Store
	grayResources *utils.SyncMap[string, []*apimodel.ClientLabel]
	updater       *singleflight.Group
}

grayCache结构体就上述4个属性,上一篇初始化了前两个,本篇又初始化了后两个。至此cacheMgn.OpenResourceCache 开启灰度规则缓存 方法介绍完毕,往下:
在这里插入图片描述
把错误判断处理省略掉了:

// Initialize 初始化
func Initialize(ctx context.Context, authOpt *Config, storage store.Store, cacheMgn *cache.CacheManager) error {

	once.Do(func() {
		userMgn, strategyMgn, err = initialize(ctx, authOpt, storage, cacheMgn)
	})
	return nil
}

进入initialize(...):
在这里插入图片描述
先看看我们的配置文件关于auth的部分:
在这里插入图片描述
如果我们没有配置auth,SetDefault()会给我们设置默认值:
在这里插入图片描述
再次证明了配置项名称不能乱写,是init()早就定好的:
在这里插入图片描述
接下来是 用户数据管理 + 策略管理 的初始化:
先看前者:
在这里插入图片描述
依据配置初始化了userServer + AuthConfig并校验了密码长度,
开启了用户的资源缓存

type Server struct {
	authOpt  *AuthConfig
	storage  store.Store
	history  plugin.History
	cacheMgr cachetypes.CacheManager
	helper   auth.UserHelper
}

密码长度有要求限制:
在这里插入图片描述
缓存用户资源初始化如下:
在这里插入图片描述
至此,userCache的属性几乎全部初始化完毕。

再看插件配置:
在这里插入图片描述
GetHistory()
在这里插入图片描述
进去:
在这里插入图片描述
在这里插入图片描述
History插件执行完毕后,保存值到 userServer的history字段中,至此用户初始化完毕。
在这里插入图片描述

在这里插入图片描述
再看第174行的 policyMgr.Initialize(authOpt, storage, cacheMgr, userMgr)

// Initialize 执行初始化动作
func (svr *Server) Initialize(options *auth.Config, storage store.Store, cacheMgr cachetypes.CacheManager, userSvr auth.UserServer) error {
	svr.userSvr = userSvr
	return svr.nextSvr.Initialize(options, storage, cacheMgr, userSvr)
}

在这里插入图片描述
进入上图中的第96行:初始化几个字段:

// Initialize 执行初始化动作
func (d *DefaultAuthChecker) Initialize(conf *AuthConfig, s store.Store,
	cacheMgr cachetypes.CacheManager, userSvr auth.UserServer) error {
	d.conf = conf
	d.cacheMgr = cacheMgr
	d.userSvr = userSvr
	return nil
}

在这里插入图片描述
初始化命名空间模块和上面2个逻辑一样:不再赘述。
在这里插入图片描述
再看第194行StartDiscoverComponents(ctx, cfg, s, cacheMgn);
在这里插入图片描述
里面看起来一大片代码,分步说明:
1.取配置文件内容,保存到数据模型,
在这里插入图片描述

// Controller 批量控制器
type Controller struct {
	register         *InstanceCtrl
	deregister       *InstanceCtrl
	heartbeat        *InstanceCtrl
	clientRegister   *ClientCtrl
	clientDeregister *ClientCtrl
}

在这里插入图片描述

贴出部分配置,心跳部分:
在这里插入图片描述
组织好批量控制器(bc)后,我们去看看如何启动:
在这里插入图片描述
在这里插入图片描述
bc的前3个属性类型为InstanceCtrl,后两个为ClientCtrl,但是它们的Start(ctx)实现风格是一致的,我们只拿第一个分析:

// Start 开始启动批量操作实例的相关协程
func (ctrl *InstanceCtrl) Start(ctx context.Context) {
	log.Infof("[Batch] Start batch instance, config: %+v", ctrl.config)

	// 初始化并且启动多个store协程,并发对数据库写
	for i := 0; i < ctrl.config.Concurrency; i++ {
		ctrl.storeThreadCh = append(ctrl.storeThreadCh, make(chan []*InstanceFuture))
	}
	for i := 0; i < ctrl.config.Concurrency; i++ {
		go ctrl.storeWorker(ctx, i)
	}

	// 进入主循环
	ctrl.mainLoop(ctx)
}

协程果然是轻量级的,128个,你要是起128个线程试试 )_(~
在这里插入图片描述
我们进入上图第140行代码:ctrl.storeWorker(ctx, i)
在这里插入图片描述
先跳过上图的第245行 处理逻辑,看看下面代码实现:
在这里插入图片描述在这里插入图片描述
所以storeWorker写协程事先待命,等着ctrl.mainLoop(ctx)往里面塞数据:生产消费模型,作者方法说明旁白说:mainLoop 注册主协程 从注册队列中获取注册请求,即对应上图的第218行。至于什么时候,谁 往此queue(chan *InstanceFuture )中写数据,后面有机会再分析,先了解全貌。

再回过头来看看storeWorker写协程如何写库:
在这里插入图片描述
在这里插入图片描述
我们回到初始化的地方看看这个函数是哪个:
在这里插入图片描述
里面代码汇总如下:
1.
1.遍历InstanceFuture列表,收集成一个map:
2.统一判断实例是否存在,存在则需要更新部分数据
3.构造model列表数据
4.调用batch接口,创建实例
5.响应

至此,bc.Start() 介绍完毕,继续往下:
在这里插入图片描述
接下来是健康检查初始化:把它留到下篇吧…

本篇总结:

  1. 开启灰度规则缓存
  2. 初始化鉴权层
  3. 初始化命名空间模块
  4. 一部分 初始化服务发现模块相关功能…

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值