获得徽章 7
JWT(JSON Web Token)是一种用于在网络应用间传递信息的开放标准(RFC 7519)。它以JSON格式表示,并被设计用于在信息的接收方和发送方之间安全地传递声明。JWT通常被用来对用户身份进行认证和授权。
一个JWT由三部分组成:头部(Header)、载荷(Payload)和签名(Signature)。
1. 头部(Header):头部通常由两部分组成,令牌的类型(例如"JWT")和使用的签名算法(例如HMAC SHA256或RSA)。
2. 载荷(Payload):载荷包含了一些称为声明的信息。声明可以分为三类:注册声明(注册的声明名称,例如"iss"表示签发者),公共声明(任何可以使用的声明)和私有声明(自定义声明,用于在双方之间传递信息)。
3. 签名(Signature):要创建签名部分,你需要使用编码后的头部、编码后的载荷、一个秘密(对称算法)或公钥(非对称算法)。签名的目的是验证发送者和内容是否未被篡改。
JWT的工作流程如下:
1. 用户提供身份验证信息,服务器进行验证。
2. 服务器生成JWT并将用户信息作为载荷。
3. 服务器使用密钥对JWT进行签名。
4. 服务器将签名后的JWT发送给用户。
5. 用户在后续请求中将JWT放入请求头或其他方式传递给服务器。
6. 服务器使用相同的密钥解析JWT,验证签名,从而确认用户身份。
展开
评论
Kafka的一些常见使用场景:
实时数据流处理:Kafka 可以实时处理和分析数据流,例如用户活动跟踪、日志或监控数据等。
集中式日志管理:通过Kafka,可以集中收集来自不同系统和应用程序的日志数据,进一步用于分析和监控。
数据同步:Kafka 可以用作在不同数据库和应用程序之间同步数据的中间层,确保数据的一致性和完整性。
解耦生产者和消费者:通过使用Kafka,可以有效解耦数据的生产者和消费者,使得系统更灵活、扩展更方便。
数据缓冲:Kafka的高吞吐量使其成为一种有效的数据缓冲解决方案,可以在数据生产和消费之间提供平衡,确保系统的稳定运行。
聚合多个数据源:通过Kafka,可以从多个不同的数据源聚合数据到一个集中位置,方便进一步分析和处理。
重放和备份:Kafka提供了数据重放功能,可以在必要时重播数据流。此外,也可以用于数据备份和灾难恢复。
展开
评论
TCP是一种常用的传输层协议,它提供了可靠的、面向连接的数据传输服务。TCP是互联网协议套件(TCP/IP)中的核心协议之一,用于确保数据在网络上的可靠传输。TCP通过在通信的两端建立连接来实现可靠传输。通信的两端分别是源主机和目标主机。在建立连接之前,源主机和目标主机必须先建立一个TCP连接。这个连接由三次握手过程完成。在握手过程中,源主机首先发送一个带有SYN标志的数据包给目标主机,目标主机接收到后发送一个带有SYN/ACK标志的数据包作为回应,最后源主机再发送一个带有ACK标志的数据包,握手完成,连接建立。一旦连接建立,数据就可以通过TCP连接进行传输。TCP使用序号和确认机制来保证数据的可靠性。每个发送的数据包都会被分配一个序号,接收端收到数据后会发送一个确认消息,确认已经接收到了哪个序号的数据。如果发送端没有收到确认消息,它会重新发送相应的数据。这样可以确保数据的可靠传输。TCP还具有流量控制和拥塞控制的功能。流量控制用于调节数据的发送速率,确保接收端能够处理接收到的数据,防止数据丢失。拥塞控制用于调整数据的发送速率,避免网络拥塞情况的发生。
展开
评论
今天用go写个堆排

func heapSort(arr []int) {
n := len(arr)

// 构建最大堆
for i := n/2 - 1; i >= 0; i-- {
heapify(arr, n, i)
}

// 一个一个从堆中取出元素
for i := n - 1; i > 0; i-- {
// 将当前根节点与末尾元素交换
arr[0], arr[i] = arr[i], arr[0]

// 在减少的堆上执行堆化操作
heapify(arr, i, 0)
}
}

func heapify(arr []int, n, i int) {
largest := i // 当前节点作为最大元素
left := 2*i + 1 // 左子节点索引
right := 2*i + 2 // 右子节点索引

// 如果左子节点大于根节点
if left < n && arr[left] > arr[largest] {
largest = left
}

// 如果右子节点大于当前最大节点
if right < n && arr[right] > arr[largest] {
largest = right
}

// 如果最大值不是根节点
if largest != i {
// 交换根节点和最大值
arr[i], arr[largest] = arr[largest], arr[i]

// 递归地对堆子树进行堆化
heapify(arr, n, largest)
}
}

func main() {
arr := []int{12, 11, 13, 5, 6, 7}
fmt.Println("排序前:", arr)

heapSort(arr)

fmt.Println("排序后:", arr)
}
展开
评论
搓一个go的快排

package main

import (
"fmt"
)

// quicksort 函数用于对数组进行快速排序
func quicksort(arr []int) []int {
// 如果数组的元素数量少于2,那么直接返回该数组,因为它已经是有序的了
if len(arr) < 2 {
return arr
}

// 设置左右指针,和基准值指针
left, right := 0, len(arr)-1
pivot := right // 设置基准值指针
right--

// 循环直到左右指针相遇
for {
if left >= right {
break
}

// 如果左指针指向的元素大于基准值,那么交换左右指针指向的元素,并移动右指针
if arr[left] > arr[pivot] {
arr[right], arr[left] = arr[left], arr[right]
right--
} else { // 如果左指针指向的元素不大于基准值,那么移动左指针
left++
}
}

// 最后将基准值交换到中间位置
arr[left], arr[pivot] = arr[pivot], arr[left]

// 递归地对左右子数组进行快速排序
quicksort(arr[:left])
quicksort(arr[left+1:])

// 返回排序好的数组
return arr
}

func main() {
// 定义一个需要排序的数组
arr := []int{12, 4, 5, 6, 7, 3, 1, 15}
fmt.Println("排序前", arr)
// 对数组进行快速排序
arr = quicksort(arr)
fmt.Println("排序后", arr)
}
展开
评论
Git安装和配置:

在Ubuntu系统中,可以使用apt-get命令安装所需的依赖库和Git。
在Centos/RedHat系统中,可以使用yum命令安装所需的依赖库和Git。
在Windows系统中,可以从Git官方下载地址下载exe安装包并按照向导进行安装。
在Mac系统中,可以从Git官方下载地址下载Mac安装包并按照向导进行安装。
Git的配置文件可以存储在/etc/gitconfig、~/.gitconfig或.git/config中,每个级别的配置会覆盖上一级别的配置。
Git的基本概念:

版本库是Git用来跟踪和管理代码版本的目录,存在于项目目录下的.git子目录中。
Git使用SHA-1哈希机制来计算文件和目录的校验和,以保证数据的完整性。
文件在Git中有三种状态:已修改(modified)、已暂存(staged)和已提交(committed)。
不同状态的文件对应不同的工作区域:工作区、暂存区和本地仓库。
远程仓库是存储在网络上的项目副本,可以与本地仓库同步和交换数据。
Git的常用操作:

初始化仓库:使用git init命令在项目目录中创建一个.git文件夹,用于存储Git仓库的相关信息。
克隆仓库:使用git clone命令将远程仓库克隆到本地。
添加文件:使用git add命令将文件添加到Git仓库的暂存区。
提交更改:使用git commit命令将文件的当前版本保存到本地仓库。
推送到远程仓库:使用git push命令将本地仓库的更改推送到远程仓库。
更新代码:使用git pull命令获取远程仓库的最新代码并合并到当前分支。
展开
评论
今天搓一个RPC通信的demo
//服务端
// 定义一个服务对象
type MathService struct{}

// 定义方法,供远程调用
func (m *MathService) Multiply(args *Args, reply *int) error {
*reply = args.A * args.B
return nil
}

// 定义传递的结构体
type Args struct {
A, B int
}

func main() {
// 创建服务端对象
mathService := new(MathService)

// 注册服务对象
rpc.Register(mathService)

// 监听指定的网络地址和端口
listener, err := net.Listen("tcp", ":1234")
if err != nil {
panic(err)
}

// 接收并处理连接请求
for {
conn, err := listener.Accept()
if err != nil {
continue
}
go rpc.ServeConn(conn)
}
}

//客户端
// 定义传递的结构体
type Args struct {
A, B int
}

func main() {
// 连接服务端
client, err := rpc.Dial("tcp", "localhost:1234")
if err != nil {
panic(err)
}

// 准备参数
args := &Args{A: 10, B: 5}

// 调用远程方法
var reply int
err = client.Call("MathService.Multiply", args, &reply)
if err != nil {
panic(err)
}

// 打印结果
fmt.Println("Result:", reply)
}
展开
评论
Kafka是一种高性能、可扩展的分布式消息队列系统。通过学习Kafka,我了解到它的核心设计思想是基于发布-订阅模式,通过主题进行消息的发布和订阅。Kafka采用分布式存储和多副本机制,确保消息的持久性和容错性。它具有高吞吐量和低延迟的特点,适用于构建实时数据管道和事件驱动的应用程序。重要的概念包括主题、分区和消费者组,它们实现了消息的并行处理和水平扩展。
评论
今天,深入学习了 GORM,搓了个demo。做了一个User结构体,表示用户对象,包含姓名、年龄和电子邮件等属性。使用 GORM 的结构体标记,定义了字段的映射关系和约束条件。
通过 GORM 提供的方法和查询语句,实现了以下 CRUD 操作的示例:
1. 创建用户:
user := User{Name: "John Doe", Age: 25, Email: "john.doe@example.com"}
db.Create(&user)
2. 查询用户:
var user User
db.First(&user, 1) // 查询ID为1的用户
db.Where("age > ?", 20).Find(&users) // 查询年龄大于20的所有用户
3. 更新用户:
db.Model(&user).Update("Age", 30) // 将用户的年龄更新为30
4. 删除用户:
db.Delete(&user) // 删除用户
展开
评论
Git是一个强大的分布式版本控制系统,能够有效地管理项目的代码变更历史。我学会了克隆仓库、创建分支、提交变更、推送到远程仓库以及拉取最新代码的操作。通过Git,团队可以高效协作开发,提高工作效率。我将继续应用这些知识,并与团队成员共享经验,以实现更好的项目管理和版本控制。
克隆仓库:使用git clone <仓库URL>命令克隆一个远程仓库到本地。
创建分支:使用git branch <分支名称>命令创建一个新的分支。
切换分支:使用git checkout <分支名称>命令切换到指定的分支。
提交变更:使用git add <文件名>命令将文件添加到暂存区,然后使用git commit -m "提交信息"命令提交变更。
查看状态:使用git status命令查看当前仓库的状态,包括已修改和未跟踪的文件。
拉取代码:使用git pull命令从远程仓库拉取最新的代码。
推送代码:使用git push命令将本地的提交推送到远程仓库。
查看提交历史:使用git log命令查看提交历史记录,包括提交者、日期和提交信息。
合并分支:使用git merge <分支名称>命令将指定分支的代码合并到当前分支。
展开
评论
学习了GORM的安装和初始化过程,以及模型定义和数据库迁移。了解GORM丰富的查询和操作方法,包括条件查询、排序、限制查询结果数量等。通过实际编写代码,我成功地完成了一些基本的数据库操作,并将查询结果转换为Go语言中的结构体对象。
评论
今天补完go语法进阶,在并发编程部分,介绍了Go语言中的goroutine和CSP的概念。通过使用关键字"go"和匿名函数,可以创建轻量级的协程,实现并发执行。并且可以通过使用通道在goroutine之间进行通信和数据共享。通道可以是无缓冲的或有缓冲的,通过make函数创建。在并发编程中,还涉及到互斥锁的使用来保护共享资源,以避免数据竞态的问题。同时,介绍了sync.WaitGroup的使用,用于等待一组并发操作完成。在依赖管理部分,介绍了Go语言中的官方包管理工具go mod。通过go mod init可以初始化一个新的模块,并且可以使用go get命令下载和管理依赖项。可以使用go mod tidy清理不再使用的依赖项,并验证go.mod文件。还介绍了一些常用的go mod命令,如go build、go run、go list等。在测试部分,介绍了Go语言中的单元测试和基准测试。单元测试通过编写测试函数,并使用testing模块进行测试框架的支持,对函数进行测试和验证。基准测试可以对函数的性能进行评估和优化,使用Benchmark开头的函数进行基准测试,并通过testing.B对象来获取测试结果。
展开
评论
在掌握数据库的基本原理后,我深入研究了MySQL的各个方面,包括数据存储、查询优化以及事务处理等。此外,我还积极探索了Redis事务锁的应用,以提高并发性和数据完整性。这一系列学习和实践使我在数据库管理和性能优化方面取得了更深入的理解,并为开发高效可靠的数据存储解决方案提供了更多的思路和经验。
评论
下一页
个人成就
文章被阅读 1,128
掘力值 85
收藏集
0
关注标签
9
加入于