Blogs

网络接入

域名系统

使用域名系统来代替 hosts 文件

关于域名空间: - 域名空间被组织成树形结构 - 域名空间通过划分zone的方式进行分层授权管理 - 全球公共域名空间仅对应一棵树 - 根域名服务器:查询起点 - 域名组成格式:[a-zA-Z0-9-],以点划分label

顶级域gTLD(general Top-level Domains):gov政府.edu教育.com商业.mil军事.org非盈利组织

DNS服务器

DNS查询过程

比如这里的网络客户端想要访问163.com域名,首先会访问本地的DNS服务器,看看有没有163.com域名的解析记录,第一次访问都不会有解析记录的,如果没有解析记录会依次向根、顶级域进行解析以及保存在本地,以便于下次查询

DNS记录类型

  • A/AAAA:IP指向记录,用于指向IP,前为IPv4记录,后者为IPv6记录
  • CNAME:别名记录,配置值为别名或主名,客户端根据别名继续解析以提取IP地址
  • TXT:文本记录,购买证书时需要
  • MX:邮件交换记录,用于指向邮件交换服务器
  • NS:解析服务器记录,用于指定哪台服务器对于该域名解析
  • SOA 记录:起始授权机构记录,每个zon要权威服务器的记录,有且仅有唯一的一条SOA记录,SOA是描述zone属性以及主

接入HTTPS协议

由于HTTP是明文传输,很容易被截取,因此有了HTTPS

消息队列

消息队列

(听不懂,不是人听的,内容的很奇怪,像初见,又像告别,又像是重逢,能看懂并且记下来都是神人了)

消息队列(MQ),指保存消息的一个容器,本质是个队列。要想称之为消息队列,这个队列要支持 高吞吐高并发 并且 高可用

Kafka

Kafka 的使用

  1. 首先需要创建一个 Kafka 集群;
  2. 在这个集群中创建一个 Topic,并且设置好分片数量;
  3. 编写生产者逻辑,引入对应语言的 SDK,配置好集群和 Topic 等参数,初始化一个生产者,调用 Send 方法发送消息;
  4. 编写消费者逻辑,引入对应语言的 SDK,配置好集群和 Topic 等参数,初始化一个消费者,调用 Poll 方法接收消息。

Kafka的原理

Go 框架三件套

Gorm 的基本使用

相关文档 https://gorm.io/zh_CN/docs/index.html

gorm目前支持 MySQL、SQLServer、PostgreSQL、SQLite

以 MySQL 为例:

import (
  "gorm.io/driver/mysql"
  "gorm.io/gorm"
)

func main() {
  // 参考 https://github.com/go-sql-driver/mysql#dsn-data-source-name 获取详情
  dsn := "user:pass@tcp(127.0.0.1:3306)/dbname?charset=utf8mb4&parseTime=True&loc=Local"
  db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
}

或者可以更详细的配置:

db, err := gorm.Open(mysql.New(mysql.Config{
  DSN: "gorm:gorm@tcp(127.0.0.1:3306)/gorm?charset=utf8&parseTime=True&loc=Local", // DSN data source name
  DefaultStringSize: 256, // string 类型字段的默认长度
  DisableDatetimePrecision: true, // 禁用 datetime 精度,MySQL 5.6 之前的数据库不支持
  DontSupportRenameIndex: true, // 重命名索引时采用删除并新建的方式,MySQL 5.7 之前的数据库和 MariaDB 不支持重命名索引
  DontSupportRenameColumn: true, // 用 `change` 重命名列,MySQL 8 之前的数据库和 MariaDB 不支持重命名列
  SkipInitializeWithVersion: false, // 根据当前 MySQL 版本自动配置
}), &gorm.Config{})

创建数据

对象存储

我在青训营看完这章对象存储TOS感觉对理论性的知识有了一定了解吧,太理论了,让我复述一遍可能都做不到

我在网上查阅资料后得知

  • TTencent,表示这是腾讯云提供的服务。

  • OObject,表示对象存储(Object Storage),是一种存储非结构化数据的技术。

  • SStorage,表示存储服务。

首先开头以抖音短视频为例

架构大概分为 片源 -> 转码 -> 审核 -> 播放

但是短视频系统要承载非常多的用户访问量,根据未来的可能的用户数量,做了简单数学计算,结果发现存储量非常之大:

  • 每天: 432块4tb磁盘

  • 每月:12960块4tb磁盘

  • 每年: 157680块4tb盘

对于这么大的访问量,我们需要一个合适的存储去承载数据,这个储存需要满足以下三个条件:

  • 海量

  • 易用

  • 便宜

然后列举了四个存储系统

  • 单机存储——>不支持海量,适合的数据类型(单击文件)——>不行

  • 单机数据库——> 不支持海量,只支持结构化和半结构化数据——>不行

  • 分布式数据库——>支持海量,但是单条记录存储的容量太少——>不行

  • 分布式存储——> 大数据计算中间结果/视频/图片——>行

分布式文件系统(HDFS)

  • 海量:支持PB——>EB海量存储

  • 易用:伪Posix文件接口,开发略微复杂,非云原生,搭建维护麻烦,视频、图片相关生态接入略微复杂

  • 便宜:使用普通x86服务器,成本低

分布式对象存储TOS

  • 海量:支持>eb海量存储

  • 易用:RestFul HTTP接口,开发极其简单,云原生,按需申请使用

  • 便宜:使用普通x86服务器,具备冷热数据分级存储能力,成本更低

TOS 的接口

Mkdirs创建文件夹
Append:写
GET:下载对象
HEAD:查看对象上传
PUT:上传对象
DELETE:删除对象

TOS 中Bucket/Object语义

Bucket:存储对象的桶,可类比一下
Object:对象,包含以下三个部分
key:对象的名字,可类比于Map的key
Data:对象的内容,例如视频、图片内容
MetaData:对象的一些元信息

SpringBoot学习笔记

体验SpringBoot

创建项目

所有的SpringBoot依赖都是以starter的形式命名的,之后我们需要导入其他模块也是导入 spring boot-starter-xxxx 这种名称格式的依赖。

SpringBoot为我们提供了包含内置Tomcat服务器的Web模块,我们只需要导入依赖就能直接运行服务器 把原来的

<dependency>  
    <groupId>org.springframework.boot</groupId>  
    <artifactId>spring-boot-starter</artifactId>  
</dependency>

换成

<dependency>  
    <groupId>org.springframework.boot</groupId>  
    <artifactId>spring-boot-starter-web</artifactId>  
</dependency>

点击启动后可以看到已经启动了内置的 tomcat

在浏览器上打开 localhost:8080 可以访问 可以看到成功响应了404页面,相比之前的大量配置,可以说方便了很多,我们到目前为止仅仅是导入了一个依赖,就可以做到直接启动我们的Web服务器并正常访问

SpringBoot支持自动包妇描,我们不需要编写任何配置,直接在任意路径(但是不能跑到主类所在包外面去了)下创建的组件(如Controller、Service、Component、Configuration等)都可以生效

比如创建一个Controller

package com.example.demo.controller;  
  
import org.springframework.stereotype.Controller;  
import org.springframework.web.bind.annotation.GetMapping;  
import org.springframework.web.bind.annotation.ResponseBody;  
  
@Controller  
public class TestController {  
  
    @ResponseBody  
    @GetMapping("/")  
    public String index() {  
        return "Hello World!";  
    }  
}

然后我们不需要扫描,直接启动