技术阅读周刊第第7️⃣期

image.png

技术阅读周刊,每周更新。

历史更新

What is a JWT? Understanding JSON Web Tokens

URL: https://supertokens.com/blog/what-is-jwt

本文主要讲了一些 JWT 的基本原理,以及优缺点
image.png

  • JWT 的生成规则 <header>.<body>.<signature>
    • 使用证书+签名算法创建签名 Key
    • 将 header 和 body 的空格换行都去掉后进行 base64,然后使用 . 拼接起来。
    • 将刚才拼接的字符串使用 Base64 + HMACSHA256 生成签名。
    • 最终将 <header>.<body>.<signature> 拼接成 JWT
      1
      2
      3
      4
      Base64URLSafe(   HMACSHA256("eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VySWQiOiJhYmNkMTIzIiwiZXhwaXJ5IjoxNjQ2NjM1NjExMzAxfQ", "NTNv7j0TuYARvmNMmWXo6fKvM4o6nv/aUi9ryX38ZH+L1bkrnD1ObOQ8JAUmHCBq7Iy7otZcyAagBLHVKvvYaIpmMuxmARQ97jUVG16Jkpkp1wXOPsrF9zwew6TpczyHkHgX5EuLg2MeBuiT/qJACs1J0apruOOJCg/gOtkjB4c=")
      )
      Results in:
      3Thp81rDFrKXr3WrY1MyMnNK8kKoZBX9lg-JwFznR-M
  • 验证 JWT
    • 先获取 header,校验头里的签名类型和算法
    • 获取 body,然后按照之前的方式 Base64 + HMACSHA256 生成签名
    • 判断两者签名是否相同,不同则验证失败
    • 判断过期时间是否过期
  • JWT 的优点
    • 安全性:使用非对称加密保证数据不被篡改
    • 高效,无状态:不需要单独使用数据库存储数据,只使用算法就能验证
  • 缺点
    • 因为他的独立性和无状态,除非是 token 过期了,不然很难撤销
    • 依赖于第一步里生成的签名 Key,一旦这个 Key 被泄露就会被伪造。

Go 开发中的十大常见陷阱[译]

URL: https://tomotoes.com/blog/the-top-10-most-common-mistakes-ive-seen-in-go-projects/

最近在 Reddit 上看到一个帖子,让推荐一本 Go 相关的书籍,大部分都是推荐的 “100 Go Mistakes and How to Avoid Them”,目前还没有中译版本,不过作者之前写过一个十个错误的博客,也可以预先看看。

  • 未知的枚举值,将枚举的未知值设置为 0
  • 自动优化的基准测试
  • 被转移的指针,日常开发中建议传值,速度会更快。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    loop:  
    for {
    select {
    case <-ch:
    // Do something
    case <-ctx.Done():
    break loop
    }
    }
  • 出乎意料的 break,在 select 语句中想要退出 for 循环,可以使用标签。
  • 正确传递错误上下文,使用 https://github.com/pkg/errors
  • 扩容切片有性能损耗,如果知道长度可以在初始化时指定长度。
  • 正确使用 context
  • 做好函数抽象,可以参考 io.Reader/io.Writer
  • 在 goroutine 中使用循环调用的时候需要额外赋值,这个在 1.22 已经修复了。

Dapr: A Portable, Event-Driven Runtime for Building Distributed Applications | by Seifeddine Rajhi | Nov, 2023 | Medium

URL: https://medium.com/@seifeddinerajhi/dapr-a-portable-event-driven-runtime-for-building-distributed-applications-c2ea8254406c

本文介绍了 Dapr 是什么,以及给了一个入门示例

image.png

  • Dapr 是 Distributed Application Runtime 的简称,翻译过来就是分布式应用运行时。
  • 你可以使用任何语言,任何框架、运行在任何地方构建你的分布式应用程序
  • Dapr 抽象了我们应用开发中所需要的大部分 API,所有与这些 API 交互的 SDK 都是由 Dapr 提供,所以我们不需要关系他的底层是什么。

3 years managing Kubernetes clusters, my 10 lessons. | by Herve Khg | Nov, 2023 | Medium

URL: https://hervekhg.medium.com/3-years-managing-kubernetes-clusters-my-10-lessons-b565a5509f0e

作者描述他三年的 kubernetes 集群管理的十条经验

  • 在云环境使用 kubernetes,这会比自己维护要简单很多,即便是自己维护也不会让自己的业务能力得到成长,或者收益性价比不高
  • 使用代码来部署应用,避免直接在控制台用命令操作,这样难以记录操作。
  • 避免过度使用 helm,同时要对充分理解其中的配置项;这个也很重要。
  • 不要直接迁移应用到 kubernetes,往往需要做相关的适配。
  • 非必要不要使用 Mesh
  • 避免过多的使用管理工具,kubernetes 的管理工具有很多,但大部分操作就靠 kubectl 就够用了。
  • 一定要记得定义资源的限制(内存和 CPU),避免程序 bug 导致 kubernetes 集群出现问题
  • 尽量不要在 Pod 中存储数据,推荐使用 NAS、云存储
  • 配置 HPA,可以根据负载自动扩容 Pod
  • 不要畏惧改变,每年需要对 kubernetes 进行升级,升级前需要充分阅读 ReleaseNote.

Ten Optimization Tricks to Make Your Java Application Run Faster | by lance | Javarevisited | Medium

URL: https://medium.com/javarevisited/ten-optimization-tricks-to-make-your-java-application-run-faster-9742f568ed6f

十个优化让 Java 应用更快

  1. 循环拼接字符串使用 StringBuilder
  2. 线程池代替自定义线程
  3. 容器类预先分配大小
  4. 用枚举代替常量
  5. 用 NIO 代替传统 IO
  6. 用位移操作
  7. 多使用单例模式
  8. 减少锁的范围
  9. 尽量少使用全局变量
  10. 多使用基础数据类型

文章链接:

#Newletters