• 「连载」边缘计算(二十)02-23:边缘部分源码(源码分析篇)


    (接上篇)

    EdgeCoredevicetwin

    前面对EdgeCore组件的edged功能模块进行了分析,本节对EdgeCore组件的另一个功能模块devicetwin进行剖析,包括devicetwin的struct调用剖析、devicetwin的具体逻辑剖析、devicetwin缓存机制剖析。

    1.devicetwin的struct调用剖析

    EdgeCore模块注册函数入手,具体如下所示。

    KubeEdge/edge/cmd/EdgeCore/app/server.go

    // registerModules register all the modules started in EdgeCore

    func registerModules() {

    devicetwin.Register()

    ...

    }

    进入registerModules()函数中的devicetwin.Register()函数定义,具体如下所示。

    KubeEdge/edge/pkg/devicetwin/devicetwin.go

    // Register register devicetwin

    func Register() {

    dtclient.InitDBTable()

    dt := DeviceTwin{}

    core.Register(&dt)

    }

    Register()函数主要做了如下3件事。

    1)初始化devicetwin需要的数据库表(dtclient.InitDBTable());

    2)实例化DeviceTwin struct(dt := DeviceTwin{});

    3)注册将已经实例化的DeviceTwin struct(core.Register(&dt))。

    下面深入剖析初始化devicetwin需要的数据库表具体做了哪些事情以及DeviceTwin struct具体由哪些属性组成。

    (1)devicetwin数据库相关struct剖析

    这部分剖析初始化devicetwin需要的数据库及数据库表相关的struct,具体如下所示。

    KubeEdge/edge/pkg/devicetwin/dtclient/sql.go

    //InitDBTable create table

    func InitDBTable() {

    klog.Info("Begin to register twin model")

    dbm.RegisterModel("twin", new(Device))

    dbm.RegisterModel("twin", new(DeviceAttr))

    dbm.RegisterModel("twin", new(DeviceTwin))

    }

    InitDBTable()函数中,通过封装的beegoorm(https://GitHub.com/astaxie/beego/tree/develop/orm)创建数据库twin,并初始化device、device_attr和device_twin三张表。与上述三张表对应的结构体如下所示。

    KubeEdge/edge/pkg/devicetwin/dtclient/device_db.go

    //Device the struct of device

    type Device struct {

    ID          string `orm:"column(id); size(64); pk"`

    Name        string `orm:"column(name); null; type(text)"`

    Description string `orm:"column(description); null; type(text)"`

    State       string `orm:"column(state); null; type(text)"`

    LastOnline  string `orm:"column(last_online); null; type(text)"`

    }

    KubeEdge/edge/pkg/devicetwin/dtclient/deviceattr_db.go

    //DeviceAttr the struct of device attributes

    type DeviceAttr struct {

    ID          int64  `orm:"column(id);size(64);auto;pk"`

    DeviceID    string `orm:"column(deviceid); null; type(text)"`

    Name        string `orm:"column(name);null;type(text)"`

    Description string `orm:"column(description);null;type(text)"`

    Value       string `orm:"column(value);null;type(text)"`

    Optional    bool   `orm:"column(optional);null;type(integer)"`

    AttrType    string `orm:"column(attr_type);null;type(text)"`

    Meta Data    string `orm:"column(metadata);null;type(text)"`

    }

    KubeEdge/edge/pkg/devicetwin/dtclient/devicetwin_db.go

    //DeviceTwin the struct of device twin

    type DeviceTwin struct {

    ID              int64  `orm:"column(id);size(64);auto;pk"`

    DeviceID        string `orm:"column(deviceid); null; type(text)"`

    Name            string `orm:"column(name);null;type(text)"`

    Description     string `orm:"column(description);null;type(text)"`

    Expected        string `orm:"column(expected);null;type(text)"`

    Actual          string `orm:"column(actual);null;type(text)"`

    ExpectedMeta    string `orm:"column(expected_meta);null;type(text)"`

    ActualMeta      string `orm:"column(actual_meta);null;type(text)"`

    ExpectedVersion string `orm:"column(expected_version);null;type(text)"`

    ActualVersion   string `orm:"column(actual_version);null;type(text)"`

    Optional        bool   `orm:"column(optional);null;type(integer)"`

    AttrType        string `orm:"column(attr_type);null;type(text)"`

    Meta Data        string `orm:"column(metadata);null;type(text)"`

    }

    以上3个文件中除了包含与device、device_attr和device_twin三张表对应的结构体定义外,还有针对这三张表的增、删、改、查方法的定义。

    未完待续…… 

  • 相关阅读:
    kettle连接达梦资源库-达梦资源库初始化SQL
    Netty面试题(二)
    第二章 数据链路层
    8 张图 | 剖析 Eureka 的首次同步注册表
    echarts折线图设置背景颜色
    java计算机毕业设计美容院业务管理系统源码+系统+mysql数据库+lw文档
    基于Apache Hudi在Google云构建数据湖平台
    生成删除数据库所有表的外检脚本
    云原生Kubernetes:Yaml文件编写
    行业追踪,2023-09-11
  • 原文地址:https://blog.csdn.net/2301_81786633/article/details/136249010