知识点积累

云原生学习路线导航页(持续更新中)

知识点积累

  • 本文主要记录日常学习中遇到的疑难知识点
  • 随着知识点积累内容变多,本文越来越长,不方便阅读,故将本文拆成多篇文章,目录如下

  • 本文不再更新,更多内容请按照下面的目录进行查看

  • 知识点积累系列(一)golang语言篇【持续更新】

  • 知识点积累系列(二)数据库篇【持续更新】

  • 知识点积累系列(三)golang框架篇【持续更新】

  • 知识点积累系列(四)Kubernetes篇【持续更新】

  • 知识点积累系列(五)版本发布篇【持续更新】

  • 知识点积累系列(六)操作系统(Linux+Windows+MacOS)篇【持续更新】

  • 知识点积累系列(七)文件格式相关篇【持续更新】

  • 知识点积累系列(八)各种IDE编辑器篇【持续更新】

  • 知识点积累系列(九)开发规范篇【持续更新】

1、golang语言相关

1.1.结构体的mapstructure是什么

  • mapstructure:"default"
    • mapstructure是一个Go语言的库,用于将一个map中的值映射到一个结构体对象。
    • 在下面的例子中,如果在映射过程中,map中没有包含"name"或"age"键,那么Person结构体中的NameAge字段会被设置为其类型的零值(例如""0)。而对于"gender"字段,如果map中没有"gender"键或者该键的值为空,那么Gender字段会被赋予"default"标签指定的默认值,即"unknown"。
    type Person struct {
        Name   string `mapstructure:"name"`
        Age    int    `mapstructure:"age"`
        Gender string `mapstructure:"gender" default:"unknown"`
    }
    

1.2.json key的命名规范

  • model结构体,我们一般都会指定它的json key,应该遵循哪些规范呢?
    • 属性名应该是具有定义语义的有意义的名称。
    • 属性名必须是 驼峰式(首字母小写,后面单词首字母大写) 的,ASCII码字符串。
    • 首字符必须是字母,下划线( _ )或美元符号( $ )。
    • 随后的其他字符可以是字母,数字,下划线( _ )或美元符号( $ )。
    • 应该避免使用Javascript中的保留关键字(下文附有Javascript保留字清单)
  • 参考:https://github.com/darcyliu/google-styleguide/blob/master/JSONStyleGuide.md
    • Google Style Guides 项目是Google公司发布的一系列编程规范指南,覆盖了诸如C++、Java、Python、JavaScript等多种编程语言的最佳实践、命名约定、代码格式等方面的建议,旨在帮助开发人员编写一致、易读、易维护的代码,促进团队协作和代码质量的提高。
    • google官方开源的github:https://github.com/google/styleguide ,官方文档:https://google.github.io/styleguide/
    • 国内共建的中文版github(还不全):https://github.com/zh-google-styleguide/zh-google-styleguide

1.3.不同版本的UUID

  • 我们在go中,可以使用 github.com/satori/go.uuid 工具,使用uuid
  • 其中,不同版本的uuid有什么区别?
    • Version 1:
      • 版本 1 UUID 基于时间戳和节点的 MAC 地址。它包括当前时间和节点的 MAC 地址,以确保全球唯一性。
      • 实现原理:使用当前时间作为 UUID 的前 64 位,然后将节点的 MAC 地址的散列(通常是 MD5 散列)作为后 64 位。
    • Version 2:
      • 版本 2 UUID 是为 DCE 安全需求设计的,包括 POSIX UID/GID 和 POSIX 分布式计算环境(DCE)的组标识符。
      • 实现原理:不常用,并且对于一般用途来说并不适用,因此我不建议使用。
    • Version 3:
      • 版本 3 UUID 基于命名空间和名称的散列值。它使用给定的命名空间和名称作为输入,生成相应的 UUID。
      • 实现原理:使用给定的命名空间和名称计算散列值(通常是 MD5 散列),然后根据特定的规则将散列值转换为 UUID。
    • Version 4:
      • 版本 4 UUID 是随机生成的 UUID,使用随机性作为生成标识符的方法。它具有非常低的碰撞概率。
      • 实现原理:通过使用随机数生成器生成128位的随机数,并根据 UUID 标准进行必要的设置,例如将版本字段设置为 4。
    • Version 5:
      • 版本 5 UUID 类似于版本 3 UUID,但使用 SHA-1 散列替代了 MD5。
      • 实现原理:使用给定的命名空间和名称计算 SHA-1 散列值,然后将散列值转换为 UUID。

1.4.go的sql.NullInt64是什么类型

  • sql.NullInt64 是 database/sql 包提供的一种类型,是一个结构体,包含两个字段
    • Int64:表示整数值的字段,类型为 int64
    • Valid:表示整数值是否有效的布尔字段,类型为 bool
  • sql.NullInt64 可以在处理数据库查询结果时,同时获取到整数值以及该值是否为 NULL 的信息
  • 使用示例
    package main
    
    import (
            "database/sql"
            "fmt"
    )
    
    func main() {
            // 模拟从数据库中查询到的结果
            result := sql.NullInt64{
                    Int64:  123, // 整数值
                    Valid: true, // 值有效
            }
    
            // 检查整数值是否有效
            if result.Valid {
                    // 使用 Int64 字段获取整数值
                    fmt.Println("Value:", result.Int64)
            } else {
                    fmt.Println("Value is NULL")
            }
    }
    

1.5.recover中间件是什么

  • 在 Go 语言中,“recovery” 通常指的是在程序发生 panic(宕机)时进行恢复的机制。在处理 panic 的过程中,日志记录是非常重要的,因为它可以帮助我们了解程序在出现问题时的上下文信息,从而更好地排查和解决 bug。

  • 在 Go 中,你可以使用内置的 defer 和 recover 来捕获 panic,并记录相应的日志信息。一般来说,我们会在程序的入口处或者一些关键的处理函数中设置一个 defer 函数,用来捕获 panic,并记录日志。

  • 下面是一个简单的示例代码,演示了如何在发生 panic 时进行日志记录和恢复:

    package main
    
    import (
            "log"
    )
    
    func main() {
            defer func() {
                    if r := recover(); r != nil {
                            log.Printf("Recovered from panic: %v", r)
                            // 在这里可以记录日志或者做一些其他的处理
                    }
            }()
    
            // 模拟发生 panic
            panic("oops, something went wrong!")
    }
    
  • 此外,一些框架和库也提供了自带的 panic 恢复和日志记录机制,比如 go-zero 框架就提供了对 panic 的恢复和日志记录支持

1.6.golang.org/x/…目录是什么,和golang标准库的区别?

  • golang承诺除极少数情况,API是可以向前兼容(forward-compatible)的。这是非常大的承诺了,所以golang标准库的代码,要求非常高,不能随便加入
  • x包下的代码,具有实验性质,对兼容性的要求没有那么高,一般会向前兼容两个版本,也由官方维护,并且一般不会引用第三方依赖(除 golang.org/x/tools/gopls, golang.org/x/vscode-go, and golang.org/x/pkgsite.之外)
  • golang官方也给出了解释
    • https://github.com/golang/go/wiki/X-Repositories

1.7.go的plugin是什么

  • Go语言自1.8版本开始引入了对插件(Plugin)的支持。

    • 如果不在程序中明确指定,插件是不会被加载的。
    • 通过插件,允许程序在运行时动态加载已经编译好的插件模块。因此,如果我们更新了已有的某个插件,想要不停机的情况下直接更新上去,就更换编译后的可执行文件就可以
    • 在Go语言中,使用插件的主要步骤包括:
      • 创建一个插件模块(被编译为 .so文件):编写一个独立的Go程序,使用plugin包提供的API进行构建。这个程序需要实现 导出函数,以便主程序可以调用这些函数。
      • 主程序加载插件:主程序通过plugin包中的 plugin.Open("./plugin_doctor.so") 函数加载插件模块,并使用插件模块中导出的函数进行交互。
  • 学习博客可参考:https://cloud.tencent.com/developer/article/1914954

1.8.go的包导入相关知识点

在这里插入图片描述

https://www.cnblogs.com/wongbingming/p/12950888.html

1.9.go结构体字段后面的 json:",inline" 什么意思

  • json:“,inline” 用于 Go 语言中结构体字段的一个标记,用于表示将该字段的所有子字段展开到当前结构体中
  • 使用场景:有时候希望将嵌套结构体的字段,直接展开到当前结构体中,而不是创建一个嵌套的对象。这时就可以使用 json:“,inline” 标记。
  • 这样,在 JSON 序列化和反序列化时,被标记的字段及其子字段就会被展开到当前结构体中,并与其它字段平级地处理。
  • 举例:
    • Person 结构体嵌套了 Address 结构体,并使用了 json:",inline" 标记
      type Address struct {
          City  string `json:"city"`
          State string `json:"state"`
      }
      
      type Person struct {
          Name    string  `json:"name"`
          Age     int     `json:"age"`
          Address `json:",inline"`
      }
      
    • 那么,在将一个 Person 对象序列化为 JSON 字符串时,结果如下所示。
      {
        "name": "John Doe",
        "age": 30,
        "city": "New York",
        "state": "NY"
      }
      

1.10.go结构体字段后面的 json:",omitempty" 什么意思

  • omitempty 是 Go 语言中 JSON 标记的一个选项,用于指示在将结构体字段序列化为 JSON 字符串时,如果该字段的值为空(例如零值、空字符串、空数组、空切片、空映射等),则忽略该字段,不将其包含在生成的 JSON 中
  • 举例:
    type Person struct {
        Name     string `json:"name"`
        Age      int    `json:"age"`
        // Address 加了 omitempty
        Address  string `json:"address,omitempty"`
        Phone    string `json:"phone,omitempty"`
    }
    
    // 加入当前我创建了一个对象,Address为空
    person := Person{
        Name:    "Alice",
        Age:     25,
        Address: "",
        Phone:   "123-456-7890",
    }
    
    // 则序列化为json后,结果为:
    {
      "name": "Alice",
      "age": 25,
      "phone": "123-456-7890"
    }
    

2、数据库相关(包括gorm框架)

2.1.数据库的DSN是什么

  • https://blog.csdn.net/qq_36777143/article/details/131174267

2.2.Gorm的自动迁移

2.2.1.db.WithContext(ctx).AutoMigrate(a)db.AutoMigrate(a) 有什么区别

  • db.WithContext(ctx).AutoMigrate(a)db.AutoMigrate(a)是在GORM库中用于数据库迁移的两种方式。

    • db.AutoMigrate(a): 这种方式是最基本的数据库迁移方法。它会将模型a对应的表结构与数据库中的表进行比较,如果有差异则会自动执行相应的操作(创建表、添加列等)。这种方式不会传递上下文(context),因此在执行过程中无法控制超时、取消等操作。
    • db.WithContext(ctx).AutoMigrate(a): 这种方式是使用了上下文(context)的数据库迁移方法。通过传递上下文对象ctx,可以实现对迁移操作的更精细控制。例如,可以设置超时时间、取消迁移操作等。这种方式适用于需要对数据库操作进行超时控制或取消的情况。
  • 总之,db.WithContext(ctx).AutoMigrate(a)相较于db.AutoMigrate(a)提供了更多的灵活性和控制性,可以根据具体需求选择使用。

2.3.Navicat数据库执行sql文件,报错:Unknown collation: utf8mb4_0900_ai_ci

  • https://tecadmin.net/resolved-unknown-collation-utf8mb4_0900_ai_ci/
  • 解决方案:
    • 将sql文件中的 utf8mb4_0900_ai_ci 全部替换成 utf8mb4_general_ci
    • 如果还不行,可以看上面的文章

3、gin框架相关

3.1.在gin中间件中直接return,相当于什么

  • 在 Gin 中间件中直接使用 return 语句,相当于提前结束当前中间件的执行,并将控制权返回给请求处理链的下一个中间件或处理函数。这意味着后续的中间件或处理函数将不会被执行。

4、Kubernetes相关

4.1.Kubernetes琐碎知识点

4.1.1.为什么要有annotations

  • annotation中除了能够记录一些额外信息,还可以解决kubernetes的新功能特性的支持和过渡问题
    • 每当要添加新功能,不要直接去改配置的组织格式(就是yaml的编排结构)
    • 先在annotations中添加一下,让这个功能先加上,等到功能完善之后,再从annotations中取出来,设计成yaml中的结构。
  • 优缺点:
    • 实验性的新特性、尚未完善的新特性,都可以加入,升级方便
    • 啥都往annotations中放,不太美观
  • 举例:
    • kubernetes1.3中,initContainer引入,先放入的annotations,后来1.8的时候,才引入到pod的spec中

4.1.2.YAML中多行字符串的配置方法:|+、|、|-、>+、>、>-的区别

  • 参考博客:https://blog.csdn.net/a772304419/article/details/126141668

4.1.3.kubernetes内置的一些标签、注解、污点列表

  • https://kubernetes.io/zh-cn/docs/reference/labels-annotations-taints/#topologykubernetesiozone

4.1.4.kube-apiserver 6443端口、8080端口、443端口的区别

  • https://www.apispace.com/news/post/10771.html

4.1.5.kubectl explain 如何指定版本

  • 添加参数 --api-version,举例:
    kubectl explain hpa.spec.metrics --api-version=autoscaling/v2beta2
    

4.1.6.pod.status中的podIP和podIPs有什么区别

status:
  ...
  hostIP: 192.168.245.102
  phase: Running
  podIP: 10.244.2.74
  podIPs:
  - ip: 10.244.2.74
  • podIP

    • podIP 是一个字符串,表示 Pod 的 IP 地址。每个 Pod 在创建时都会分配一个唯一的 IP 地址,用于在集群内部进行通信。
    • 该 IP 地址是 Pod 内部网络的标识符,其他 Pod 可以使用该地址与该 Pod 进行通信。
    • 通常情况下,Pod 的 IP 地址是动态分配的,但也可以使用静态 IP 地址。
  • podIPs

    • podIPs 是一个 IP 地址列表,表示 Pod 可能具有多个 IP 地址。
    • 这种情况通常发生在 Pod 具有多个网络接口或多个网络插件配置的情况下。
    • 例如,当使用 CNI 插件时,Pod 可能会分配多个 IP 地址,每个 IP 地址对应于一个网络接口。

4.1.7.ingress的3个概念:Ingress / IngressController / IngressClass有什么区别

参考文章:5分钟搞懂Ingress / IngressController / IngressClass的区别

下面是一些个人理解:

  • ingress:其实就是kubernetes提供的一个资源,本身不代表什么,需要ingressController来将它解析成具体的映射规则,它才能生效
  • ingress Controller:其实就是一个角色,一个概念,表示管理ingress的控制器,负责解析ingress的声明,监听对应的service变化,生成最新的 转发规则
  • ingress Class:ingress Controller的具体实现,我们平时说安装一个ingressController,其实就是安装一个 具体的ingress Class。比如 nginx-ingress-controller

综上,我们使用ingress,需要先安装一个 ingressController的具体实现,然后再编写ingress yaml文件

4.1.8.ingress controller的nginx配置文件在哪里

  • k8s的nginx配置文件在哪里

4.1.9.kubernetes的运行时:docker和containerd的关系

  • 参考了博客:https://cloud.tencent.com/developer/article/2154031、https://www.51cto.com/article/765823.html,我 梳理了下过程。
  • 早期,docker一家独大,kubernetes直接支持docker。后来为了防止docker一家独大,docker被拆分出了几个标准化的模块,为的就是更方便地替换某个模块。
    • docker-client
    • dockerd
    • containerd:纯粹、轻量的容器运行时
    • docker-shim
    • runc
  • K8s社区认可了containerd的优势,将其作为K8s生态系统的标配容器运行时,让containerd在宿主机负责以下功能:
    • 管理容器的生命周期(从创建容器到销毁容器)
    • 拉取/推送容器镜像
    • 存储管理(管理镜像及容器数据的存储)
    • 调用 runC 运行容器(与 runC 等容器运行时交互)
    • 管理容器网络接口及网络
  • 就在docker刚拆出来containerd不久,kubernetes 1.5版本 引入了CRI(container runtime interface)的概念,作为kubelet和容器运行时交互的统一接口规范。至此,kubelet与容器运行时交互就使用CRI,底层可以使用任意符合CRI规范的运行时。
  • 不过,docker发展的早,并不支持CRI,为此,kubernetes团队专门为docker开发了一个dockershim(shim:临时的)。通过dockershim适配docker,让docker支持CRI
    在这里插入图片描述
  • dockershim由kubernetes维护,当docker发布新的版本时,kubernetes也需要维护dockershim适配docker新版本,这很耗费精力。
  • docker中真正工作的高级运行时是Containerd,kubernetes使用dockershim对接docker,还不如直接对接containerd,所以后来对containerd做了CRI的支持(CRI-Containerd),让kubelet直接对接符合规范的CRI-containerd,这样更加标准,调用的链路也更短
  • 所以kubernetes1.24时,kubernetes宣布正式删除和弃用dockershim。因此1.24大家都说不再支持docker,本质上是废弃了内置的 dockershim 功能,而是直接去对接containerd。并不是说以后不能使用docker了
  • 发展过程图如下:参考自博客
    知识点积累_第1张图片
  • 上图中,可以看出containerd后来做了插件化处理,为CRI规范开发了一个插件适配,这样以后如果有其他规范,只需要再开发相应的插件即可。

4.1.10.如何修改kube-scheduler的调度策略

  • 官方文档有详细介绍:https://kubernetes.io/zh-cn/docs/reference/scheduling/config/

4.1.11.kubernetes API 完整列表

  • 1.24版本:
    • https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.24/
  • 1.29版本:
    • https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.29/

4.1.12.kubernetes中的内存单位Mi/M、Gi/G的区别

  • 结论:
    • Mi表示(1Mi=1024x1024B)
    • M表示(1M=1000x1000B)
    • 其它单位类推, 如Ki/K Gi/G
  • 详细+测试:https://www.jianshu.com/p/f798b02363e8

4.1.13.kubernetes如何根据Pod找到所属的控制器?

  • pod yaml的元数据里,有一个ownerReferences,写了它属于谁
  • kubectl get pods podName -n ns -oyaml,就可以看到
    知识点积累_第2张图片
    知识点积累_第3张图片

4.1.14.如何在Pod和本地之间复制文件

  • pod中文件 复制到 本地。如果pod有多个容器,就指定 -c
    kubectl cp :  -c 
    // 举例
    kubectl cp nginx-6ddbbc47fb-sfdcv:/etc/fstab /tmp
    kubectl cp nginx-6ddbbc47fb-sfdcv:/etc/fstab /tmp -c nginx1
    
  • 本地文件 复制到 pod中。如果pod有多个容器,就指定 -c
    kubectl cp  : -c 
    kubectl cp /tmp nginx-6ddbbc47fb-sfdcv:/etc/fstab 
    kubectl cp /tmp nginx-6ddbbc47fb-sfdcv:/etc/fstab  -c nginx1
    

4.2.Kubernetes进阶内容【TODO】

这部分。是在学习过程中发现的一些扩展点,可以深入学习,或者作为一个专门的方向深入研究

4.2.1.ReadinessProbe的扩展:Readiness Gate

  • 学习博客:https://cloud.tencent.com/developer/article/1661689?pos=comment
  • 自定义RG controller:https://github.com/du2016/readnessgate-controller
  • TODO:将是很好的扩展方式

4.2.2.开发并使用自定义调度器完成pod调度

  • 学习博客:https://www.qikqiak.com/post/custom-kube-scheduler/

4.2.3.利用Prometheus+hpa自定义监控指标

4.2.4.使用headless service实现自定义负载均衡策略

4.2.5.service的LoadBalancer类型、vpc等

4.2.6.service和kube-proxy的关系

https://www.cnblogs.com/chadiandianwenrou/p/13860520.html

4.2.7.自定义一个IngressController,实现转发规则的自动更新

4.3.待学习的开源项目【TODO】

这里主要是学习过程中发现的一些比较好的开源项目,以后有时间了会深入学习,也会出文章

4.3.1.CoreDNS

  • 地址:https://github.com/coredns/coredns
  • CoreDNS 是一个用于 Kubernetes 集群中 DNS 解析的开源项目,是一个轻量级的 DNS 服务器。
  • 截至目前(2023年),CoreDNS 的代码库中包含了大约 12,000 行左右的代码。
  • CoreDNS 是一个功能强大、可靠且广泛使用的 DNS 解析器,适用于 Kubernetes 集群中的服务发现和网络通信。

4.3.2.etcd

  • etcd(读作 et-see-dee)是一种开源的分布式统一键值存储,用于分布式系统或计算机集群的共享配置、服务发现和的调度协调。
  • 为了更深入的掌握kubernetes,有必要学习一下etcd
  • github地址:https://github.com/etcd-io/etcd
  • 官网地址:https://etcd.io/
  • RedHat 为ETCD 开发了一个Operator,可以作为学习Operator的资料
    • https://www.redhat.com/zh/topics/containers/what-is-etcd

4.3.3.go-delve

  • go-delve 是一个开源项目,为go语言提供debug能力,简单易用,github地址:https://github.com/go-delve/delve
  • go-delve 属于golang语言基础设施的一部分,像vscode的go语言插件、goland调试功能等,底层都是使用了delve。

4.3.4.cobra

  • Cobra 是一款非常流行的命令行生成工具,由 Go 语言实现,比如说著名的博客工具 Hugo , GitHub 命令行等都是用它实现的。kubernetes也大量使用了它。
  • github地址:https://github.com/spf13/cobra

4.3.5.gen-go

  • gengo 是 kubernetes 项目中常用的代码生成工具,kubernetes 项目中大量使用了这个工具用于代码生成。
  • gengo 更多的设计为一个比较通用的代码生成工具,完成代码表达树解析,生成的工作。
  • github地址:https://github.com/kubernetes/gengo
  • 学习博客:https://cloud.tencent.com/developer/article/1635822

5、版本发布相关

5.1.软件各种版本的含义!例如RC,M,GA等等

  • https://developer.aliyun.com/article/269148

6、Linux相关

6.1.shell脚本

6.2.命令相关

6.2.1.vim命令

6.2.2.nslookup命令

6.2.3.curl命令

6.2.4.nano命令

  • nano是一个符终端的文本编辑器,比vi/vim使用更简单些
  • 命令详解:https://wangchujiang.com/linux-command/c/nano.html

6.2.5.ls命令

  • ls怎么查看文件大小
    ls [-lh] [-s]
    -l:以长格式显示文件和目录的列表,以字节为单位显示大小。(请参见下面的示例。)
    -h:文件或目录大小大于 1024 字节时,请以 KB、MB、GB 或 TB 来表示文件大小和目录大小。此选项还可以修改 -o、-n、-@ 和 -g 选项显示的输出,以使用新格式显示文件或目录大小。有关更多信息,请参见 ls(1) 手册页。
    -s:显示文件和目录(以块为单位)的列表。
    

6.2.6.make命令

  • make是最常用的构建工具,诞生于1977年,主要用于C语言的项目。可以用来编译和安装 各种内核和开源项目。
  • makefile:描述项目代码的依赖关系,make命令就是依赖这个文件,对项目进行编译的
  • 学习博客:https://www.ruanyifeng.com/blog/2015/02/make.html

6.2.7.netstat命令

  • netstat命令用于显示网络状态,学习博客:https://www.runoob.com/linux/linux-comm-netstat.html
  • netstat输出结果默认有6列
    Proto   Recv-Q   Send-Q   Local Address  Foreign Address  State
    
    • Proto:协议,TCP/UDP
    • Local Address:网络连接是有2方参与,Local Address表示自己这方的地址 ip:port
    • Foreign Address:网络连接是有2方参与,Foreign Address表示对面那方的地址 ip:port
    • State:表示当前的网络连接中,自己这方处于出于什么阶段。
      • 这就是3次握手、4次挥手的那些状态
      • 比如:客户端关闭连接,我们立马执行netstat,可以看到客户端的tcp连接,处于TIME_WAIT状态,这就是在等待2个MSL后,才能关闭连接
      root@graham-virtual-machine:~# netstat | grep 34819
      tcp        0      0 localhost:51908         localhost:34819         TIME_WAIT
      

6.2.8.ps命令

  • ps命令能够给出当前系统中进程的快照,注意是执行命令那一时刻的快照。动态的话,需要使用top命令
  • 学习博客参考:
    • https://linux.cn/article-4743-1.html
    • https://www.runoob.com/linux/linux-comm-ps.html

6.2.9.ufw命令

  • ufw 是 Uncomplicated Firewall 的简称,是linux用来管理防火墙的命令
  • 常用操作:
    • 查看 当前防火墙 开放端口的情况
      sudo ufw status
      
    • 开放指定端口
      sudo ufw allow 12345
      
  • 具体的学习博客:https://www.zzxworld.com/posts/linux-ufw-firewall-command

6.2.10.telnet命令

  • telnet 通常用于远程登录,或者用于测试一个ip+port是否畅通

  • 常用命令:

    • 远程登录,能登录上就说明是畅通的
      telnet ip port
      
  • windows下没有telnet的问题

    • windows下默认没有开启telnet,需要在控制面板->windows功能->telnet客户端开启
    • 如果还不能远程连接,再按win+R,打开运行窗口,输入services.msc,打开服务窗口,把这个服务开启
      在这里插入图片描述
  • telnet学习博客:

    • https://cloud.tencent.com/developer/article/2113234
    • https://blog.csdn.net/u011561335/article/details/84781236

6.2.11.iptables命令

  • iptables原理:https://zhuanlan.zhihu.com/p/545054578
  • iptables命令学习:https://wangchujiang.com/linux-command/c/iptables.html

6.3.Linux琐碎知识点

6.3.1.GNU 是什么,和 Linux 是什么关系?

  • 以下内容是从 https://www.zhihu.com/question/319783573/answer/656033035 拷贝的一个匿名评论,说的很清楚
    • Unix 系统被发明之后,大家用的很爽。但是后来开始收费和商业闭源了。
    • 一个叫 RMS 的大叔觉得很不爽,于是发起 GNU 计划(GNU’s Not Unix),模仿 Unix 的界面和使用方式,从头做一个开源的版本。
    • 然后他自己做了编辑器 Emacs 和编译器 GCC。因此,GNU 是一个计划或者叫运动。
    • 在这个旗帜下成立了 FSF,起草了 GPL 等。
    • 接下来大家纷纷在 GNU 计划下做了很多的工作和项目,基本实现了当初的计划。包括核心的 gcc 和 glibc。
    • 但是 GNU 系统缺少操作系统内核。原定的内核叫 HURD,一直完不成。同时 BSD(一种 UNIX 发行版)陷入版权纠纷,x86 平台开发暂停。
    • 然后一个叫 Linus 的同学为了在 PC 上运行 Unix,在 Minix 的启发下,开发了 Linux。注意,Linux 只是一个系统内核,系统启动之后使用的仍然是 gcc 和 bash 等软件。
    • Linus 在发布 Linux 的时候选择了 GPL,因此符合 GNU 的宗旨。
    • 最后,大家突然发现,这玩意不正好是 GNU 计划缺的么。于是合在一起打包发布叫 GNU / Linux。然后大家念着念着省掉了前面部分,变成了 Linux 系统。

6.3.2.什么是GPL协议

  • GPL,全称 General Public License,通用公共授权协议,常用的开源协议。最早是由斯托曼撰写,用于GNU计划
  • 科普性学习:
    • https://zhuanlan.zhihu.com/p/36091228
    • https://blog.csdn.net/qq_41458207/article/details/104449098

7.windows命令

7.1.查看端口占用

  • netstat -aon|findstr “8081”
  • https://www.runoob.com/w3cnote/windows-finds-port-usage.html

8.文件格式相关

8.1.toml格式是什么

  • TOML 旨在成为一个语义明显且易于阅读的 最小化配置文件格式
  • TOML 可以无歧义地映射为哈希表
  • 官网:https://toml.io/cn/
  • json、yaml、toml 配置文件格式对比:https://zhuanlan.zhihu.com/p/50412485
  • toml 格式示例:
    # 这是一个 TOML 文档
    
    title = "TOML 示例"
    
    [owner]
    name = "Tom Preston-Werner"
    dob = 1979-05-27T07:32:00-08:00
    
    [database]
    enabled = true
    ports = [ 8000, 8001, 8002 ]
    data = [ ["delta", "phi"], [3.14] ]
    temp_targets = { cpu = 79.5, case = 72.0 }
    
    [servers]
    
    [servers.alpha]
    ip = "10.0.0.1"
    role = "前端"
    
    [servers.beta]
    ip = "10.0.0.2"
    role = "后端"
    

9.各种IDE编辑器相关

9.1.VS Code

9.1.1.launch.json是干嘛的

  • launch.json 文件的主要作用是提供一个结构化的配置方式,以便在VS Code 中启动和管理不同类型的调试会话。
  • 它定义了许多调试相关的参数,如调试器的类型、运行参数、环境变量等,从而在调试过程中能够提供更多的控制和定制。
  • 学习博客:VS Code 的 launch.json 进行高效代码调试:配置和原理解析

9.2.Goland

10.开发规范

10.1.OpenAPI是什么,和swagger有什么区别

  • OpenAPI:其实就是用于描述 应用API信息 的通用规范,让其他人不需要看你的代码,就知道你这个API接口在做什么、怎么使用
  • OpenAPI概念的博客:https://apifox.com/apiskills/what-is-openapi/
  • OpenAPI和Swagger的区别:
    • 简单来说:OpenAPI =规范;Swagger = 实现规范的工具
    • 学习博客:https://www.modb.pro/db/562880

你可能感兴趣的:(云原生学习专栏,go,容器,kubernetes,云原生,devops)