go开发随手记

·  阅读 56

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…)

分类:
后端
标签:
收藏成功!
已添加到「」, 点击更改