- 博客(116)
- 资源 (4)
- 收藏
- 关注
原创 欢迎访问我的个人博客:www.zou8944.com
博客主要发布站点为:www.zou8944.com。CSDN只是备份,如有需要,欢迎访问我的个人站点,蟹蟹。
2021-11-30 16:20:17 9219
原创 可能是最全的Kotlin协程讲解
使用协程已经有较长的时间了,但一直停留在launch、async启动协程,suspend方法挂起的阶段。这段时间系统梳理Kotlin知识时才发现,对协程(仅对Kotlin)还有很多概念不甚了解。例如CoroutineScope对协程生命周期的重要性、协程父子结构的作用、结构化并发、一些Kotlin协程中约定俗称的规定等。概述解释协程解释协程这一概念,是个作死的行为,这里斗胆一试。我们尝试从几个比较流行的说法来解释协程到底是个什么东西,而不是再增加一种让人猜不透的说法协程是轻量级线程(官方表述)
2020-05-30 21:51:48 33569 13
原创 Kubernetes网络侃闲天
以下内容作为这段时间研究Kubernetes网络的总结,一口气写完,代表了当前对Kubernetes网络的认知,可能有误,权当摆龙门阵。more。
2022-08-15 10:00:44 846 2
原创 如何安全地使用token
通常在带有登录功能的业务中,我们会向用户(客户端)发放访问凭证,往后一段时间,用户持该凭证即可在应用内畅行。不同应用可能有不同的名字:access_token、token、xxxid,也可能有不同的形式:不透明字符串、JWT等。本文讨论访问凭证的安全性。more考虑到一般发放JWT的系统都将其当做无状态token使用,不适用本文讨论范文,故忽略。...
2022-08-10 12:27:00 1966
原创 iptables详解
iptables经常被与netfilter一同提起。netfilter是一个工作在Linux内核层面的网络数据包处理框架,提供了包过滤、地址或端口转换、包修改等功能;具体来说,就是在数据包处理路径上的特定位置触发对应的hook,这就是我们常说的5个chain、4个table。iptables是一个工作在用户态的命令行工具,用于在上述chain和table上配置规则集,以自定义包过滤规则、地址转换规则等。常见的用途如实现防火墙。chain即五个hook位置,为什么叫做chain?PREROUTING。...
2022-07-19 12:30:13 6156
原创 几种常用登录的调试方式
三方登录常需要客户端和服务端共同完成,对OAuth2,客户端获取授权码,服务端用授权码换取访问凭证;对OIDC,客户端获取ID Token,服务端验证其正确性用以登录之类的场景。但两端又常非同一个开发人员,服务端逻辑写好后需要客户端配合获取授权码或ID Token作为输入进行调试验证。这样效率太过低下,协调上会有困难。最好是服务端能够自己获取输入参数,这里介绍常见的四种登录方式的简单调试方法:微信登录、Apple ID登录、Google登录、Facebook登录。微信登录遵循标准的OAuth 2.0协议,完
2022-07-12 18:31:32 1069
原创 换个角度看X.509证书
初识X.509证书,多半是HTTPS协议,SSL或TLS握手阶段,需要用证书传输公钥,建立加密的传输信道。于是在印象中X.509就和HTTPS绑定在了一起。这种绑定有些许先入为主。实际上X.509证书的用途不止如此。网上已经很多写得好的文章,推荐一篇:X.509数字证书的基本原理及应用。从中我们可以总结出几个要点除此之外,没有更多的理论信息。博客的输出往往只是作者知识学习过程的输出,常很片面,仅能作为知识交流和了解的方式,不能作为严肃学习的主要来源(包括我这篇)。优秀如此文,看完也还是虚空之感,因为我们不知
2022-06-12 15:57:39 2048
原创 K8S如何灰度发布
灰度发布、蓝绿发布、金丝雀发布等,本质上没有区别,都是版本渐进式发布+流量管理,所以也不要去纠结自己的发布方式到底算哪一种。硬要说,灰度发布是渐进式发布的统称,蓝绿发布和金丝雀发布是渐进式发布的具体方式,详细区别,在于蓝绿发布强调蓝绿环境(即新版和旧版服务)的平等性,流量拆分粒度较粗;金丝雀发布拥有更细粒度的流量拆分。灰度发布两个核心点:流量管理、发布流程管理。先来分析流量管理,不算Istio等组件新引入的流量管理策略,仅以Kubernetes本身的组件来看。一个常见的后端服务具有如下网络拓扑结构:ingr
2022-06-02 11:53:28 5089
原创 Kotlin写Spring注意事项
Kotlin与Java百分百互操作,顺理成章,Spring开发也可以用Kotlin。可以享受到Kotlin的简洁语法。二者结合的大部分特点,在尝试之后都能体会。本文列举一些实际开发中最容易遇到的问题。DTO、VO、BO、MyBatis的Entity、Spring配置文件对应的PropertiesBean,各种Bean的组装与传输。直觉告诉我们,最好定义成data class,属性最好是val,最好是不可空,但不可一概而论,需按情况分析。与前端交互的Bean:由于需要在前后端进行传输,需要设置为var的可空类
2022-06-01 18:33:14 1301
原创 简单想 - 我们应该如何做测试
我们到底应该如何测试?TDD的想法是非常美好的;单元测试、集成测试、系统测试、验收测试等构成的测试金字塔是非常美好的;通过测试,尽早地将问题暴露出来的想法也是非常美好的。但测试带来的收益和成本应该如何衡量呢?大团队应该如何测试?两三个人的小团队又应该如何测试?如果你所在的团队已经有明确的测试规范,那不用操心这些问题;但如果是专注业务的小团队,各方面尚未有明确规范,测试应该做到什么程度,会是一个值得思考的问题。伊始,对测试算是一知半解,主要认知还来自主观认识,知道单元测试、集成测试基本概念,大致了解JUnit
2022-06-01 18:32:11 293
原创 (记) Deployment设置环境变量不生效
记一个卡了两天的问题问题Dockerfile中,指定不同的启动方式,会有不同的读取环境变量的效果。有的能够读到,有的读不到。具体来说,如下能够读取到的方式直接启动 CMD ["java", " -jar", "xxxx.har"]tini+直接启动 CMD ["/tini", "--", "java", " -jar", "xxxx.har"]tini+sh启动 CMD ["/tini", "--", "sh", "-c", "java -jar xxxx.jar"]不能读取的方.
2022-05-19 17:52:34 1747
原创 IAP StoreKit2后端开发完全指南
原文地址:https://zou8944.com/2022/05/13/IAP-StoreKit2%E5%90%8E%E7%AB%AF%E5%BC%80%E5%8F%91%E6%8C%87%E5%8D%97/TL;DR;2021年10月,苹果发布了StoreKit2。新API和流程看起来更加简化,但是苹果官方文档并没有让开发者接入变得简单,调试起来也是各种问题,这方便和StoreKit1一样做的不好。梳理是必要的。文档研读文档目录官方文档虽然有组织结构,但并不清晰,按照如下结构去看,能够.
2022-05-16 15:39:12 7378 3
原创 Kubernetes节点磁盘管理
Kubernetes集群运行一段时间后,通常会出现磁盘占用过高的问题。这里聊聊排查这类问题的方法和思路。问题点如果是正常的Linux服务器出现这种情况,解决方案无非是ssh到该主机查看大文件然后进行删除。Kubernetes上也是如此,但问题在于,其中的节点由Kubernetes自己管理,登录秘钥管理人员很可能不知道。所以通常的问题点是:无法进入Kubernetes节点。就磁盘问题来说,是无法进入节点的文件系统。进入节点有两个进入节点的方式使用Lens管理软件,它是一个非常厉害的Kubern
2022-02-17 15:05:04 1516
原创 单元测试 - 理论
很多人是不写单元测试的,无非因为性价比太低。但我始终以为,真实原因是打开方式不正确,如果花功夫系统研究一下,或许会不一样。这不就来了,现希望相对系统第了解单元测试的理论、常用工具、实施方法。伴随会产生系列文章。初预备三部分:理论:介绍单元测试需要关注的内容,从设计上如何考虑工具:介绍Spring Test、JUnit、Assert、Mock技术,相关库的使用实践:基于以上两个部分的学习,重构当前的一个项目,记录过程中考虑的点。并最终给出结论。此篇为首!与单元测试相关的书籍,大约有这么三.
2022-01-22 12:35:40 444
原创 Linux用户和权限管理
这是Linux系列第二篇文章,本来觉得Shell写完就OK了。但仔细一梳理发现对很多Linux要么是一知半解,要么是忘了。既然如此,还是遇到什么就回顾什么吧。本文试图解决以下问题Linux如何做用户管理用户和权限的关系一个用户安装软件后,其它用户能否使用,这是如何决定的?与此相关的命令的使用方式概览Linux的权限管理,与两个重要的特性关联甚密:一切皆文件;多用户操作系统。多用户操作系统,意味着用户之间的资源需要隔离,就有了权限存在的必要性;一切皆文件,意味着权限管理的目标只有文件。Li
2022-01-13 23:15:50 738
原创 Shell编程知识点速查
shell常用,却从未引起重视,用到啥就查啥,甚至语法都不记得。在这样一次次的”现查“中,浪费了大量的时间。索性画上一个周末的时间,相对系统第学学它,毕竟它也不复杂。本文没有太多内容,正文是一张图。我到B站随便找了个视频,就它,看了下,收获颇丰。算是系统梳理吧,整个思维导图,助记。说起来,shell也不复杂,掌握的大知识点不会超过10个。图片如下,思维导图本导在这。gocha …...
2022-01-09 20:56:01 251
原创 可能是最详细的LDAP讲解
本文试图清晰明白的讲述LDAP是什么、应用场景、使用方法。开篇照例一波吐槽。LDAP这个名字大家不会陌生,即所谓轻量级目录访问协议。无论博客还是论坛,网上对它的讲解太多了,但在我看来,都不得要领。它们中的大多数都仅介绍了冰山一角,还不注明资料来源。想来,作者很可能也不知道这些知识从哪里来的,这篇文章看看、那篇文章参考一下,东拼西凑,再看看库的API,写写代码,然后…it works!!!,再然后就没有然后了吧????。本文试图从协议本身出发,尽量做到系统化。就算读者看了这篇文章还是不能掌握,也可以自己
2022-01-03 14:43:18 43751 9
原创 OpenID Connect详解
OpenID Connect 1.0是建立在OAuth 2.0上的一个身份验证机制,它允许客户端通过授权服务对用户进行认证并获取简单的用户信息。前置知识:读者需要了解OAuth2.0的授权码模式和隐藏模式两种工作流程,要了解JWT、JWE、JWS等概念。这在我的前两篇文章都有详细讲解概览名词解释OP:OpenID Provider,即OAuth2.0中的授权服务,用于对用户鉴权RP:Relying Part,依赖方,即OAuth2.0中的客户端,它从OP除获取对用户的鉴权和用户信息
2021-12-26 11:39:34 9814
原创 OAuth2.0详解
本文深入OAuth2.0协议,以及基于其上的OpenID Connect身份认证协议。前者解决授权第三方服务访问资源的问题;后者解决身份认证的问题。主要资料来源是官方协议手册:RFC6749、OpenID Connect Specification。当然还有更多其它说的好的第三方资源,比如阮一峰这个,它的优点是只针对协议讲解,没有举那些无助于理解的复杂例子。考虑到文章的长度,OpenID Connect移到下篇文章再说OAuth2.0解决了授权的问题。在只有客户端和资源服务器的简单架构中,资源服
2021-12-23 20:52:24 3679
原创 JWT详解
本文介绍JWT组成原理及适用范围。概览JWT,全称JSON Web Token,是一种包含信息的Token,相较于普通的Token,唯一多的内容是:包含部分信息。与JWT相关的协议比较简单,但数量较多,本文只是对此加以总结。JWS-rfc7515JWE-rfc7516JWK-rfc7517JWA-rfc7518JWT-rfc7519术语说明这其中会涉及到很多简写,先介绍一下JWS:JSON Web Signature,表示使用基于JSON的数据结构,对内容进行数字签名或MAC。具
2021-12-21 14:28:49 4389 1
原创 Kubernetes搭建血泪史(上)
很可能没有下篇,只有这个上篇我有一个树莓派3B,1G内存版本,以前用来当做linux主机,随便玩一玩,谢谢python,点个灯。但最近我想搭建一个Kubernetes集群,用来学习,不过集群诶,怎么能只有一台机器呢?于是在咸鱼上又购买了两台树莓派4B,一台4GB内存,一台2GB内存。为什么想用树莓派呢?一来因为还算OK的云服务器贵得离谱,对个人来说实在不划算,二来树莓派可玩性比较高。然而搭建过程几经波折,浪费了大量的时间,想来,最主要的问题有两个:cgroup的开启失败和墙的问题。系统选择为尽.
2021-12-18 21:50:50 443
原创 Spring源码剖析 - 配置注解和自动配置原理
截止目前,我们已经写了四篇关于Spring源码解析的文章,但它们只关注了Spring和SpringBoot的启动流程,并没有回答我们日常使用中的核心问题——自动配置的实现原理,本文进行探索在前文“Spring源码剖析 - BeanDefinition”中扫描Bean定义一节中,我们漏掉了一个关键方法调用,其调用路径如下-> org.springframework.context.annotation.AnnotationConfigApplicationContext #Annotati.
2021-12-11 16:08:28 533
原创 Spring源码剖析 - SpringBoot启动流程
在Spring源码剖析的前三篇文章,我们介绍了ApplicationContext、Bean相关内容、BeanPostProcessor的内容;但从普遍反馈和自己事后阅读的体验来看,文章过长,没有重点,条理并不是特别清楚。想必是写作方式出了问题,最突出的莫过于流水账式写法,虽然写作的目的并不一定是写出好的文章,而是主要服务自己,但时间一长,自己也是个普通的读者,同样会看不大懂。因此,写作方法是需要变更了:要突出条理和重点,如需大段源码讲解,可在文章最后增加源码解析一节,读者可选读。也就是说,长度还是那么.
2021-12-07 21:51:50 534
原创 容器速记 - Dockerfile主要指令
本文介绍Dockerfile中主要命令的用途FROM指定基础镜像,推荐的方式是 image:tag,精确指定。注意:可以使用多条FROM,这样就会构建多个镜像。比如我同时想要busybox和nginx,我可以这么写FROM busybox:latestFROM nginx:latest然后构建运行# 构建root@10-9-175-15:/home/ubuntu/docker-learn$ docker build -t busybox-nginx .Sending build con
2021-12-05 18:10:38 551
原创 容器化基石 - namespace和cgroup
本文目的是让读者对namespace和cgroup有具象的认识,并不会深入。当然,由于笔者Linux知识有限,也无法深入。“容器是一个与宿主机系统共享内核但与操作系统中的其它进程资源隔离的执行环境”,这是理解容器技术的核心。这句话可以翻译的更直白一点:容器是一个环境,该环境内运行的进程和操作系统中的其它进程是一样的,享受同样的硬件资源,唯一的差别是,该环境内的进程看不到其它进程的存在,操作也不会相互影响,即所谓的隔离;多个容器的运行,就是在各自的隔离环境中运行各自的进程。容器只是一个抽象的逻辑概念.
2021-12-05 15:42:50 1347
原创 Kubernetes权限管理详解
前面介绍过Kubernetes的结构组成,其中API Server用于与外界的交互,我们常用的命令行工具kubectl、UI工具lens、云服务商提供的WebUI,最终都是通过Restfule API的形式,走HTTP协议,到达API Server。此时就带来权限控制问题。如上图,对来自外部的请求,Api Server会经过三个组件Authentication:认证,验证用户的合法性,并从中提取出用户信息,如用户名、组等Authorization:鉴权,鉴定该用户是否有权限访问指定资源Admis
2021-12-03 17:06:06 1897
原创 Spring源码剖析 - PostProcessor们
BeanPostProcessor是Spring中参与Bean生命周期定制非常重要的一个手段,上文分析过,其执行有两个时机一前:Bean自动注入之后,自定义初始化方法调用前一后:自定义方法调用之后Spring中很多重要的特性利用了BeanPostProcessor达成,毕竟,算来算去,Spring中整个Bean的生命周期已经足够复杂了,如果每加一个功能就要在生命周期上做文章,只会增加复杂度,而BeanPostProcessor则是Spring提供的一种扩展方式。与其相对的,一般用户用的可能较少的B
2021-11-30 16:11:13 498
原创 PostgreSQL权限管理详解
本文介绍PostgreSQL中如何管理用户和权限,这些是正确管理PostgreSQL权限必备的前置知识。角色 - ROLEPG中,围绕角色进行权限的管理。它可以被看做是一个user,或一组user。区分role、user、group。user和group是PG 8.1之前的两个实体,role是那之后唯一存在的实体,现在user和role,等价。初始角色数据库刚创建时,会自动创建一个超级用户的角色:postgres。任何操作都是从该用户开始的。创建角色CRAETE ROLE {角色名} [LOG
2021-11-25 00:03:42 22830 2
原创 《刻意练习》所感
读《刻意练习—如何从新手到大师》有感,读于2021年11月22日晚,写于2021年11月23日晚。《刻意练习—如何从新手到大师》被归类为心理学著作,但我是将它当做方法论书籍来看的。它已经在书架上待了两个月,迟迟不翻,多半还是因为书名。在我看来,书名可以分为两部分:第一部分”刻意练习“,看起来是一本务实的书;第二部分”如何从新手到大师“,颇有”21天学会单片机“的意味,虽没有强调速成,但还是极具诱惑力的标题,成功学意味明显。直觉告诉我它是一本垃圾书籍。最终还是看了,毕竟豆瓣7.8分,借鉴《如何阅读一本.
2021-11-23 22:08:59 304
原创 Spring源码剖析 - 关于Bean的一切
阅读提示:TL;DR。文章包含大量源码,阅读时长较长,认真阅读可能超过20分钟。回想一下,Spring最最核心的功能,终究是一个容器,用于提供所谓的”Bean“,并负责Bean之间的联结。而我们又知道,Bean有不同的Scope,即作用范围,单例的、原型的、Session的,或自定义的。Bean还能够懒加载。因此,创建Bean的时机可能是运行时的任何时候。Spring使用BeanDefinition描述一个Bean的name、类、scope等元数据,并在需要时候创建。创建过程自然也包括了自动注入的过程.
2021-11-20 16:07:25 590
原创 Spring源码剖析 - ApplicationContext
前言实话说,Spring虽火,但我的使用经验却不多。这和我的实际工作经历有一定关系,前几年初入软件这行,项目使用Struts1,第一次使用Spring,还是在同时期的外快项目,非常表面。换公司后直接转向Vertx技术栈,近一年多虽然又转向Spring,但手上的Spring项目并不复杂,也没抽时间好好过一遍Spring。于是,Spring成了心病,你可以说它千万好坏,但首先得掌握它,这一点我做的不好,所以是时候研究一下它。Spring说简单也简单,本质上就一个依赖注入、面向切面的框架;Spring MVC
2021-11-14 13:54:04 626
原创 瞅瞅动态代理
动态代理说大不大,说小不小,可深可浅。往深了说还是对JVM的了解程度要足够深入,时间篇幅有限,本文专注于回答如下问题,不作更深入的探讨。JDK和Cglib动态代理,分别怎么使用JDK动态代理的原理Cglib动态代理的原理为什么JDK动态代理一定要实现接口,而Cglib就不用?JDK和Cglib,本质上有什么区别?JDK动态代理使用一个简单的场景一个Service接口,拥有sayHello()方法一个ServiceImpl实现类,实现Service创建一个ServiceImpl的代
2021-11-03 15:40:54 115
原创 我不会Java反射
我会写Java反射,我知道反射是用来获取、改变程序运行时状态的方式,通过反射API我们能够获取类对象、类的方法、成员变量、注解等。我不会写Java反射,我不知道Type和Class有啥关系,ParameteredType、TypeVariable呢?我会Java反射吗?不,我不会。反射是什么?反射是什么,镜子里看自己。往小了说,就是Java提供的一组能够在运行时查看和修改对象信息的API;往大了说,从计算机专业来看,是编程语言提供的运行时动态更新自身状态的能力,Java的反射只是其中的一种。Go、C
2021-11-01 17:26:29 178
原创 序列化探索之六 - Protobuf
序列化探索之ProtobufProtobuf是谷歌提出的一种高压缩比的序列化格式,二进制,不可读,语言无关,平台无关。拥有自己的语法规则,压缩编码算法,并提供主流语言的API生成器(即Protobuf编译器),其序列化结果很小,能够有效节省带宽。掌握Protobuf,需要比较了解三个方面,其中,如果只是单纯滴使用,前两个方面即可。proto语法规则,即proto文件的语法规则具体语言的API生成及使用规则,即通过proto文件生成对应语言的代码序列化和反序列化算法语法截止目前,proto有
2021-11-01 17:25:38 1828
原创 序列化探索之五 - Gson
Gson是一个相对简单的库,没有那么多功能,从设计上也并不想让别人去扩展它,它只想安安静静地做一个Json序列化库,简单而实用。简单说Gson提供两种方式创建Gson实例new Gson():快速创建,默认配置,快速使用new GsonBuilder().setxxxxx().create():完整方式创建,支持一些自定义化的配置Gson突出一个简单,API如此,功能更是如此,大致列一下其支持的功能基于field的序列化与反序列化:基本特性支持自定义属性名:@SerializedName
2021-11-01 17:25:01 323
原创 序列化探索之四 - Fastjson
开局一吐槽,Fastjson的文档,比Jackson还差。Jackson只是位置不明确,如果安下心来看看,还是能够理清楚的。而Fastjson是位置不明确,如果安下心来看看,还会发现,它的文档零零散散,中英文混杂,找不准主线在哪儿。我记得知乎上有个问题,fastjson这么快老外为啥还是热衷 jackson?,就这文档,让老外用个啥。不过看还是要看的,毕竟它是目前主流序列化框架之一。老样子,我们还是从基本使用方法和原理分析两部分着手。能力Fastjson仅仅针对json,尚不支持其它任何格式,也没有看
2021-11-01 17:24:27 1685
原创 序列化探索之三 - Jackson
写这篇文章时,我一度陷入了纠结与不安,再次体会到了聚焦的重要性。Jackson看似简单,实则功能强大,这两天有些迷失,不知道要看些什么,要写些什么。但路得一步一步走,饭得一口一口吃,纵使它可供探索的点繁如星辰,我也得将焦点拉回,否则就叫失控。至于其它的点,以后再说。因此,本文将聚焦如下几点Jackson的能力基本原理module工作原理基本组成Jackson文档怎么看,是一个问题。如果初次接触Jackson,看主项目的介绍半个小时,多半还是云里雾里,我认为这是Jackson文档做的很不好的一点
2021-11-01 17:23:53 1402
原创 序列化探索之二 - Kotlin
文章不长,但代码演示居多,可选择性阅读Kotlin以扩展包的形式提供了序列化能力,使得能够以“Kotlin方式”进行序列化。Kotlin设计目标,是提供一个序列化抽象,具体格式实现可用Json、CBOR、Protobuf、Properties、Yaml等进行替换。但就目前的进度,仅提供了对Json的稳定支持。其它格式都处于试验阶段。因此,我们看Kotlin的序列化,主要看的就是数据对象与Json之间的序列化和反序列化。能力展示场景假设:需要序列化一个数据类,包含五个字段resourceId:.
2021-11-01 17:22:58 3824
原创 序列化探索之一 - Java
序列化和反序列化,渗透在日常开发的方方面面。所谓的序列化,就是将数据转换为能够在网络上传输、在数据库中存储、在文件中持久化的格式,这类格式很多,可以是字节流(如Java自带的序列化机制)、可以是JSON(系统之间传输用的较多)、可以是Protocol Buffers(压缩率高,GRPC有用)。反序列化,即序列化的反过程。序列化这件事,不同的语言、库,提供了不同的使用方法,哪怕是对同一种序列化格式的支持也有差别。因此,深入了解常用的序列化技术,很有必要。不要再去记使用方法了,我们来看原理吧。序列化探索思
2021-10-26 16:16:11 591
原创 如何面对无意义的生活
读《西西弗神话》有感思考人生意义的必要性意义,亦可作价值、作用。是我们一直在找寻的东西。上学的意义,读书的意义,工作的意义,以及终极问题——活着的意义、人生的意义。人是需要驱动力的,而驱动力的很大一部分,来自于对自身当前境况及前途的希望和预期。当不停地对自己进行灵魂拷问,往往会发现你的生活,你的存在并无多大意义,又或者是生活的意义太过遥远,遥远导致短期的心灵空虚。希望变得若隐若现,驱动力时有时无。轻则彷徨度日,重则丧失生活的信心,走向极端。因此,学习如何和无意义感相处,是一项重要的课题。是每个.
2021-10-26 16:15:30 276 1
微信小程序DEMO
2018-09-17
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人