获得徽章 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)
}展开评论点赞 - 今天,深入学习了 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 <分支名称>命令将指定分支的代码合并到当前分支。展开评论点赞