自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

张氏小毛驴的博客

初学者,互相学习~

  • 博客(71)
  • 收藏
  • 关注

原创 LRU淘汰算法

LRU,全称为Least Recently Used,意思为最近最少使用,是一种内存淘汰算法,常用在缓存中作为一种淘汰策略。计算机内存是有有限的,因此不可能无限的增加数据,缓存也是内存的一种,存在于内存中,缓存容量是有限制的,当缓存满了,就需要删除一些数据,给新的数据腾空间。但这里有个问题是,应该删除哪些缓存呢?对于我们来说,肯定希望将没用的缓存删掉,留下有用的,但是怎么判定缓存是没用的?

2023-07-29 11:07:24 199

原创 一致性哈希

在实现分布式缓存时,我们一般都会部署机台缓存服务器,用来缓存数据,我们这里使用三台缓存服务器,并且给他们编号为0,1,2。我们使用这些缓存服务器缓存图片资源,假设有三万张图片需要缓存,那我们肯定是希望它能均匀的存放在三台服务器上,这样每台服务器的压力也不会很大,也满足了我们分布式存储的需求。那我们该怎么来分配这些图片,是每台服务器都均匀放一万张图片?

2023-07-26 14:11:43 125

原创 接口型函数

在学习极客兔兔大佬的GeeCache时,里面提到了一个,之前在使用Go官方的http库时候也遇到过,但是并不知道他原来叫接口型函数,于是赶紧详细学习下这个接口型函数。

2023-07-24 16:40:14 138

原创 Go互斥锁和读写锁

sync.Mutex(互斥锁),(读写锁)

2023-07-24 10:43:27 106

原创 SpringSecurityOAuth2-微信授权登录

这一篇主要是介绍了对于微信的第三方登录自定义,讲的可能比较乱,还是得结合源码理解理解,我只想把思路和为什么尽量都分享清楚,当然这只是测试,真正的支持微信第三方还得需要在微信登记公众号等操作,那些是需要认证啥的,我们当前学习的话目前的已经足够了。最后为把代码都上传到Github了,如果觉得有用,帮帮忙点个Start。我的Github。

2023-07-03 17:19:40 2778 8

原创 SpringSecurityOAuth2登录流程分析

整个流程跟着源码走下来,结合log分析,还是能大体上理解的,不奢求所有细节都掌握,其中实际上跟我们关系比较大的就是几处自定义的地方,毕竟我们如果要自定义一些东西,还是得仰仗他们,比如微信的授权登录,就会用到,他有很多不同之处,也有一些坑,这个就留到下一篇再学习好了。

2023-06-30 15:48:36 852

原创 SpringSecurityOAuth2多个第三方登录配置

通过这一篇文章,我了解到了原来配置其他的第三方登录,是需要自己提供Provider的,还有如何获取到已经授权登录的用户信息。下一篇就来学习下源码,走下源码流程,看看具体是个怎么回事。

2023-06-29 16:16:28 990 2

原创 SpringSecurityOAuth2第三方登录初体验

首先第一个,得先了解什么是OAuth2?关于OAuth2基础的学习,可以学习下阮一峰大佬的这几篇文章,相信聪明的你看完肯定能理解。OAuth 2.0 的一个简单解释OAuth 2.0 的四种方式GitHub OAuth 第三方登录示例教程这一篇文章主要是快速体验一遍使用第三方授权登录的感觉,可能会感觉到有很多疑惑,比如是不是配置所有的第三方平台授权都是同样的流程?咱们后续继续逐步深入学习,瞄瞄源码,以及接入其他第三方,比如微信等。

2023-06-29 00:01:28 650

原创 Springboot全局统一响应格式与全局异常处理

code:响应的状态码,由后端统一定义的message:响应的错误消息data:响应返回的数据比如:"message": "操作错误",/*** 统一前后端接口/*** 业务响应码/*** 响应信息/*** 响应数据/*** 返回成功,不带数据* @return} /*** 返回成功,带数据* @return} /*** 返回失败* @param code 错误码* @param message 错误信息* @return。

2023-04-18 13:41:15 1175

原创 iam-authz-server源码学习

之前大概看了iam-apiserver的启动流程和API请求处理流程,今天记录下iam-authz-server的学习。iam-authz-server目前的功能只有一个,就是完成资源授权,但因为这个应用承载了数据流的请求,需要确保API接口具有较高的性能,因此作者使用了大量的缓存技术,值得学习。iam-authz-server的服务框架设计与iam-apiserver的保持一致,也是有3种配置:Options配置,组件配置和HTTP服务配置,启动流程也是类似。入口为:cmd/iam-authz-ser

2023-04-03 17:30:41 159

原创 iam-authz-server源码学习

之前大概看了iam-apiserver的启动流程和API请求处理流程,今天记录下iam-authz-server的学习。iam-authz-server目前的功能只有一个,就是完成资源授权,但因为这个应用承载了数据流的请求,需要确保API接口具有较高的性能,因此作者使用了大量的缓存技术,值得学习。iam-authz-server的服务框架设计与iam-apiserver的保持一致,也是有3种配置:Options配置,组件配置和HTTP服务配置,启动流程也是类似。入口为:cmd/iam-authz-ser

2023-03-15 09:32:31 135

原创 iam源码学习2

模型层(Models)这里的模型,就是具体的struct结构,这里作者是作为了一个独立的包引用,比如Secret的定义:仓库层(Repository)仓库层是用来和数据库/第三方服务进行CRUD交互的,这里不封装任何业务逻辑。iam-apiserver使用了MariaDB,仓库层源码在:internal/apiserver/store/mysql目录业务层(Service)业务层主要用来完成业务逻辑处理,处理来自控制层的请求,并根据需要请求仓库层完成数据的CRUD操作。

2023-03-01 15:32:39 263

原创 iam源码学习1

iam-apiserver有三种配置:Options配置,应用配置,HTTP/GRPC服务配置三种配置的关系如下:Options配置接管命令行选项,应用配置接管整个应用的配置,HTTP/GRPC服务配置接管跟HTTP/GRPC服务相关的配置。这3种配置独立开来,可以解耦命令行选项、应用和应用内的服务,使得这3个部分可以独立扩展,又不相互影响。2. iam-apiserver的启动流程设计。

2023-03-01 10:33:56 178

原创 Go应用构建工具(3)--cobra

NoArgs: 如果存在任何的参数,将会报错:接受任意参数:接受至少N个参数,否则报错:接受至多N个参数,否则报错:只接收N个参数,如果个数不对,报错:参数个数在min和max之间,否则报错:如果没有一个参数是符合command的ValidArgs字段指定的参数的话,就报错;这个要配合ValidArgs使用MatchAll:这个方法可以组合上面几种验证函数,比如可以要求参数个数必须为2个,而且需要满足指定的参数},比如:err!

2023-01-30 15:04:01 730

原创 Go应用构建工具(2)--viper

基本上所有的后端应用,都是需要用到配置项,可能小的项目配置项不多会选择命令行来传递,但是对于大项目来说,配置项可能会很多,全都用命令行传递那就麻烦死了,而且不好维护。所以基本上都是会选择将配置项保存在配置文件中,在程序启动时加载和解析。而Viper是Go生态中目前最受欢迎的配置相关的包,Viper能满足我们对配置的各种需求,能处理不同格式的配置文件。由上面可知,viper支持从不同的位置读取配置,但不同的位置是具有不同的优先级的,优先级高的配置会覆盖掉优先级低的相同配置,以下是优先级的排序(

2023-01-13 17:50:00 537

原创 Go应用构建工具(1)--pflag

也是今天学习的对象。pflag是一个用来替代Go标准库flag包的,兼容flag库,几乎不用更改就可以替换,pflag在大型项目中应用的比较广泛,比较知名的有:K8S,Docker,ETCD等。作者spf13大牛,还有其他好几个强大的开源库,包括配置神器Viper,命令行框架cobra等(这两个接下来都会学习一波)

2023-01-10 13:51:54 475

原创 Go优雅的进行错误处理

我们开发处理的是可恢复故障,也即是error。错误的抛出对消费方分为两种同一服务内的,可使用错误类型不同服务之间的,可使用错误标识错误信息的暴露,分为bug,内部依赖服务的错误,业务错误,远程RPC调用错误对于bug错误,直接返回错误信息对于服务内部依赖的其他服务的错误,使用Wrap包装,给自己留下堆栈信息,给消费方提供错误信息对于业务错误,看情况给予错误类型或错误标识的错误抛出。

2023-01-01 20:43:21 525

原创 Go错误处理实践

Go标准库中error类型是一个接口类型,在}只要实现了Error()方法的类型都可以作为error返回,它将错误消息以字符串的形式返回。

2023-01-01 20:42:42 1097

原创 RabbitMQ学习笔记

本笔记是学习该教程记录的:https://www.bilibili.com/video/BV1cb4y1o7zz什么是MQMQ(Message Queue),从字面意义上看,本质是个队列,FIFO先入先出,只不过队列中存放的内容是message而已,还是一种跨进程的通信机制,用于上下游传递消息。在互联网架构中,MQ是一种非常常见的上下游"逻辑解耦+物理解耦"的消息通信服务。使用了MQ之后,消息的发送上游只需要依赖MQ,不用依赖其他服务为什么要用MQ流量消峰举个例子,如果订单系统最多能处理一万次订单,这个处理

2022-09-14 14:01:58 362

原创 Java集合---Iterator接口和工具类Collections

以上的实现方式,对于存储Person对象的集合排序就只能用升序的方式排列了,如果想要使用其他规则去排序,显然改变Person中compareTo方法并不是一个好的方式,这是就可以使用Collections.sort方法实现Comparator接口,自己定义排序规则。Comparator是比较器接口,可以将Comparator传递给sort方法,从而控制排序,也可以为那些没有实现排序的对象提供排序。两个对象比较的结果有三种:大于,等于,小于,对于compare函数,是根据返回值来比较的。

2022-08-24 15:55:39 159

原创 Java集合---Map

LinkedHashMap是HashMap的子类,存储数据采用的是哈希表+链表的结构,能够保证元素有序,同样需要保证键的唯一,需要。Map接口有多个子类,这里主要介绍常用的HashMap集合和LinkedHashMap集合。HashMap采用哈希表结构存储数据,元素无序,同HashSet一样,要保证键的唯一,需要。​ Map集合是Java提供的用来存放键值对的,是双列集合,用以处理一一对应关系的数据。使用键找值的方式:通过元素的键,获取键所对应的值。:获取到Map集合中所有的键值对对象的集合。

2022-08-24 15:55:28 127

原创 Java集合---List和Set

HashSet存储基本元素。

2022-08-24 15:55:12 460

原创 Java Collection集合

集合,就类似一个容器,可以存储多个数据。数组的长度是固定的,集合的长度是可变的数组存储的是同一类型的元素,主要是基本类型,而集合存储的都是对象,而且对象的类型可以不一致单列集合Collection和双列集合Map,两类集合都在java.util包中。java.utilList:一种元素有序,元素可重复的集合Set:一种没有重复元素,元素无序的集合Map:一种存储键值对的集合实现了接口和实现类的分离,比如有序表的接口是List,具体实现类有ArrayList,LinkedList等。

2022-08-24 15:54:43 140

原创 Java泛型

​ 泛型是java 1.5的新特性,本质是参数化类型,就是将要操作的数据类型指定为一个参数。泛型可以使用在类,接口,方法中,分别叫做泛型类,泛型接口以及泛型方法。​ 比如就是一个泛型类。​ 为什么要使用泛型?} }​ 存入数据的时候是可以任意类型,取出来时需要做一个类型转换,这样子操作就存在一个问题,过了许久后可能会忘记了集合的第几个数据是什么类型,一旦搞错,就会产生一个异常} }

2022-08-24 15:54:29 152

原创 Java 注解

​ 注解,可以理解为标签,是一种特殊的“注释”,用来标识或解释Java代码,是给机器看的(而注释是给程序员看的)。​ **注解的定义:**注解也叫元数据,跟类、接口、枚举是同一个层次的,也是java的一种类型,在Java SE 5.0开始引入,放在Java源码的类、方法、字段、参数前面,用来进行注释或说明。

2022-08-23 09:15:53 148

原创 Java 反射机制

​ 反射机制主要在于这个反字.​ 一般情况下,我们使用类的时候都是知道它是个什么类,比如定义了一个Person类,在使用的时候我们已经知道这个Person类是用来做什么的,于是我们就可以直接new一个Person类的实例对象,然后对这个实例对象进行操作,这是常规的操作。} }​ 而反射,就是与常规情况不同,在一开始我们并不知道要初始化的类对象是什么,导致我们没法使用new去实例化,但可以使用JDK提供的反射API进行调用,比如如下代码:(相关API下面会提及)

2022-08-23 09:15:41 68

原创 Java8新特性--Stream流操作

​ Stream流操作是Java8 新增的重要特性,与之前学习的java.io包里的字节流和字符流是完全不同的概念,不是同一个东西。​这里的Stream流操作是java8针对集合操作的增强,专注于对集合的各自高效、便利、优雅的聚合操作。​ Stream不是集合元素,也不是数据结构,并不保存数据,它是有关算法和计算的,使用起来更像一个高级的迭代器,我们只需要给出需要对其流中的元素执行什么操作,Stream就会隐式的在内部进行遍历,作出相应的数据操作。

2022-08-23 09:15:28 363

原创 Java8新特性--方法引用

​谈到方法引用,就必须提到Lambda,因为方法引用是用在Lambda表达式的,方法引用是一种更简洁易懂的Lambda表达式,和Lambda表达式一样,也是一种语法糖。​当我们需要使用Lambda表达式来实现一个函数式接口的抽象方法时,已经有存在的类实现了我们需要的功能方法,这时我们完全没必要再造一个实现方法,可以直接用Lambda表达式调用这个方法来实现,虽然这样子实现可以,但是很冗余,此时使用方法引用就很简洁清晰,可读性更高。​ 方法引用的运算符为。

2022-08-23 09:15:14 597

原创 Java8新特性--函数式接口

(重写时候不需要加default关键字)。注意:函数式接口中有且只能有一个抽象方法,但可以有多个static方法或default方法。

2022-08-23 09:15:04 250

原创 Java TCP简易多人聊天室

​ 本例是一个简易的Java TCP多人聊天室,先启动服务器端,再启动客户端,客户端敲入用户名,然后可以开始聊天,敲入信息,每一个在线的用户都会收到相应信息。

2022-08-23 09:14:44 285

原创 Java Socket网络编程

​ Java网络编程主要涉及的内容是Socket编程。​ Socket(套接字),是网络上两个程序之间实现数据交换的一端,它既可以发送请求,也可以接受请求,一个Socket由一个IP地址和一个端口号唯一确定,利用Socket能比较方便的实现两端(服务端和客户端)的网络通信。​ 在Java中,有专门的Socket类来处理用户请求和响应,学习使用Socket类方法,就可以实现两台机器之间通信。​Socket通信是有两种方式的:TCP和UDP。​ TCP通信:客户端提供了类,服务器端提供了类。

2022-08-23 09:14:32 1352 1

原创 Java IO---序列化和反序列化

什么是序列化和反序列化?​ 序列化就是将对象转换为字节序列的过程。​ 反序列化就是将字节序列恢复为对象的过程。序列化的用途在哪?将对象的字节序列永久的保存到硬盘上,一般存在一个文件中。在网络中传送对象的字节序列。序列化的意义?序列化机制使得对象可以脱离程序的运行而独立存在,能够离开内存空间,以便能长期保存。比如:一个记录用户信息设置的类,当程序退出后下次再运行要保留上次的信息设置,此时就可以把这个类作为配置文件存在磁盘上,每次运行时再读取。

2022-08-23 09:14:20 92

原创 Java IO---缓冲流和转换流

​ 讲到转换流之前,涉及到一个编码与解码的问题,一般来说,使用规则A编码,则需要使用A规则解码才可以正常显示文本符号,而在Java中不同的编码方式,中文所占的字节数不同,所以当使用不同编码时,需要对应的编码方式的解码才能正常显示中文,否则将会导致乱码的现象。​ 缓冲流是处理流的一种,也叫高效流,是对4个基本输入输出流的增强,它让输入输出流具有1个缓冲区,能显著减小与外部的IO次数,从而提高读写的效率,并且提供了一些额外的读写方法。磁盘文件是以字节的方式存储的,内存中的程序时以字符存储的。

2022-08-23 09:14:05 714

原创 Java IO---字节流和字符流

流流是一个抽象概念,Java程序和外部设备(可以是硬盘上的文件,也可以是网络设备)之间的输入输出操作是基于流的。流就好比水管中的水流,具有流入和流出,类比数据的输入和输出。Java中流屏蔽了实际IO设备中处理数据的细节,主要用来处理设备之间的数据传输。IO流的分类输入流和输出流字节流和字符流Java中将所有流类型都放在了java.io包中,用于实现输入和输出功能,相关类关系如下图。

2022-08-23 09:13:55 329

原创 Java IO---File类

类是文件和目录路径名的抽象表示形式,主要用于文件和目录的创建,查找,删除,判断等操作。

2022-08-18 16:56:31 1228

原创 Java多线程基础

这时候线程3抢到了CPU开始运行,ticket仍是1,线程3也运行到Thread.sleep处睡眠,这时候线程1醒了,重新获得CPU运行,把票卖了,这时ticket=0,这时候线程3获得了CPU,继续运行,再卖一张票,这时ticket已经是0了,所以又卖了一张,ticket就变成了-1,这种现象就出现了。比如:线程A是生产者,用来生产包子,线程B是消费者,用来吃包子,包子就是他们共享的同一资源,但线程A和线程B的动作是不一样的,一个负责生产,一个负责消费,这就存在双方通信问题了。......

2022-08-18 16:56:19 889

原创 Java8新特性——Lambda表达式

LambdaLambda是java 8引入的一个新特性,一个Lambda表达式是一个匿名函数,它提供了更为简单的语法和协作方式,能够让我们通过表达式来代替函数式接口。Lambda表达式完全可以用在简化创建匿名内部类上。函数式接口所谓的函数式接口,就是指只有一个抽象方法的接口。......

2022-08-18 16:56:08 284

原创 Java异常处理

除了使用java内置的异常类外,还可以自定义异常,用户自定义异常,只需要继承Exception类即可创建自定义异常类在方法中通过throw抛出异常对象如果在当前抛出异常的方法中处理异常,可以使用try-catch捕获并处理;否则在方法的声明使用throws声明要抛出的异常在异常出现的方法中捕获并处理异常比如:模拟注册操作,用户名存在,则抛出异常并提示// 自定义异常 public class RegisterException extends Exception {......

2022-08-18 16:55:58 111

原创 Linux中tar分卷压缩与解压缩

Linux中tar分卷压缩与解压缩。

2022-08-18 16:55:44 2542

原创 Linux常见的错误

Linux常见的错误。

2022-08-18 16:54:29 130

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除