1.cookie,session
cookie采用的是客户端保持状态的方案,而session采用的是在服务端保持状态的方案。
cookie
cookie的执行原理:就是当客户端访问服务器的时候(服务器运用了cookie),服务器会生成一份cookie传输给客户端,客户端会自动把cookie保存起来,以后客户端每次访问服务器,都会自动的携带着这份cookie。
简单来说,就是当客户端访问服务器时,服务器会生成一个票据给客户端,当客户端收到票据的之后就保存起来,以后再访问服务器就会自动带着票据。
- HTTP是无状态协议,服务器不能记录浏览器的访问状态,也就是说服务器不能区分两次请求是否由同一个客户端发出
- Cookie就是解决HTTP协议无状态的方案之一,中文是小甜饼的意思
- Cookie实际上就是服务器保存在浏览器上的一段信息。浏览器有了Cookie之后,每次向服务器发送请求时都会同时将该信息发送给服务器,服务器收到请求后,就可以根据该信息处理请求
- Cookie由服务器创建,并发送给浏览器,最终由浏览器保存
缺点:
- 不安全,明文;可以分析并修改存在本地的cookie,并进行cookie欺骗;
- 增加带宽消耗,单个cookie保存的数据不能超过4k;
- 可以被禁用
- cookie有上限;很多浏览器限制一个站点最多存储20个cookie;
session
- 服务端会生成对应的session id标识一个session存储客户端信息
- session id会被返回给客户端,客户端可以使用cookie存储sessionid并在下次访问时传给服务端;
- session在一段时间内会被保存在服务端,当请求量较大时,session会耗费服务端性能;
一般重要信息存放使用session,无关紧要的信息可以存放在cookie;
rpc调用和服务监控
-
RPC相关内容
- 数据传输:JSON Protobuf thrift
- 负载:随机算法 轮询 一致性hash 加权
- 异常容错:健康检测 熔断 限流
-
服务监控
- 日志收集
- 打点采样
go类型判断
func justifyType(x interface{}) {
switch v := x.(type) {
case string:
fmt.Printf("x is a string,value is %v\n", v)
case int:
fmt.Printf("x is a int is %v\n", v)
case bool:
fmt.Printf("x is a bool is %v\n", v)
default:
fmt.Println("unsupport type!")
}
}
复制代码
协程
- 协程:独立的栈空间,共享堆空间,调度由用户自己控制,本质上有点类似于用户级线程,这些用户级线程的调度也是自己实现的。
- 线程:一个线程上可以跑多个协程,协程是轻量级的线程。
goroutine 只是由官方实现的超级"线程池"。
每个实力`4~5KB`的栈内存占用和由于实现机制而大幅减少的创建和销毁开销是go高并发的根本原因。
复制代码
goroutine与线程
可增长的栈
OS线程(操作系统线程)一般都有固定的栈内存(通常为2MB),一个goroutine的栈在其生命周期开始时只有很小的栈(典型情况下2KB),goroutine的栈不是固定的,他可以按需增大和缩小,goroutine的栈大小限制可以达到1GB,虽然极少会用到这个大。所以在Go语言中一次创建十万左右的goroutine也是可以的。 (www.topgoer.com/%E5%B9%B6%E…)