自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(50)
  • 收藏
  • 关注

原创 区块链共识算法研究

工作量证明(proof-of-work)是一种确认你完成了某件事的证明方式。生活中常见的就是毕业证,因为毕业证可以证明你完成了阶段性的学习,通过了考试,但过程对验证方来说不重要,验证方只看到你的毕业证就行了有这么两种情况:a.每个旷工都是自私自利的;b.不是每个交易都是有效的,即便是有效交易,由于旷工的自私自利,他可能不同意这笔交易,则这笔交易无效例如,A给B转钱,交易成功了,但是B可以操作区块链,那么B不同意这笔交易落块,而他又获得了这笔钱,这就导致了作恶。

2024-05-14 16:37:01 965

原创 golang并发(2)--同步原语

除了通道机制,go依然会提供一些传统的锁机制等同步原语来处理并发问题。

2024-05-14 16:29:23 323

原创 golang并发(1)

golang在启动并发的方式上直接添加了语言级的关键字就可以实现,和其他编程语言相比更加轻量。

2024-05-14 16:28:08 893

原创 k8s--(15)开发应用的最佳实践

转个图:1、以pod作为应用的最小运行单元,其中包括container和volume2、pod需要权限、拉镜像的密钥等3、卷可以是configmap、emptydir、gitrepo、PVC持久卷等类型4、方便其他应用或集群外访问pod,需要建立service5、label方便管理6、deployment方便高可用、多副本运行、滚动升级7、可能需要用到job等资源。

2024-05-14 16:21:59 565

原创 k8s--(14)自动横向伸缩pod与集群节点

横向伸缩:调大replicas副本数纵向伸缩:扩充pod的资源请求和限制,仅在创建时。

2024-05-14 16:09:52 820

原创 k8s--(13)计算资源管理

创建一个pod时,可以指定容器对CPU和内存的资源请求量(即requests),以及资源限制量(即limits)。它们并不在pod里定义,而是针对每个容器单独指定。pod对资源的请求量和限制量是它所包含的所有容器的请求量和限制量之和。

2024-05-14 16:08:12 826

原创 k8s--(12)保障集群内节点和网络安全

本章讲述的是如何通过一些安全配置,保障集群中宿主节点和pod的安全,不被其他pod攻击。

2024-05-14 16:05:43 861

原创 k8s--(11)k8s API服务器安全防护

通过用户认证和权限控制守护API服务器的安全。

2024-05-13 15:55:14 332

原创 k8s--(10)k8s机理

之前说RC的操作类似一个无限循环,比对pod期望数量和实际数量,但控制器实际上是监听pod数量的变更事件,并做出相应动作:增加pod副本时,RC不会直接创建pod,而是创建pod清单,发送到API服务器,让调度器和kubelet完成调度工作并运行pod。多实例API服务器:API服务器是无状态的,随便运行多少个都可以,通常一个etcd配一个API服务器,这样API服务器只需要和本地etcd实例通信即可,负载均衡也由API服务器做,不用etcd做。

2024-05-13 15:53:55 728

原创 k8s--(9)StatefulSet:部署有状态的pod

1、什么是pod的状态举例:无状态:假设草原上有很多头牛,不健康的牛可以被替换掉,用户无感知有状态:每一只牛我都知道它的名字、生什么病、眼睛啥颜色,无法找到一个一模一样的牛来替换它对应用来说,新的pod要和旧的pod拥有完全一致的状态和标识,体现在网络标识、存储卷等特性上,RC和RS管理的pod,重新调度后与之前的pod完全不一致,是一个全新的pod,而StatefulSet管理的pod,重新调度后依然拥有旧pod的状态2、pod稳定标识状态。

2024-05-13 15:51:04 1092

原创 k8s--(8)Deployment:应用升级

容器有个属性imagePullPolicy,默认是IfNotPresent,也就是说,当本节点有这个tag的镜像时,不会拉新的镜像,所以只改镜像内容并推送到镜像仓库是没用的,当然,将imagePullPolicy改为Always即可。(2)所有的请求都是由kubectl客户端发送给API服务器的,也就是说伸缩请求是由kubectl客户端执行的,不是k8s master,这带来的问题就是升级中间出现问题,升级进程就会中断,pod和RC的状态处于中间状态。

2024-05-13 15:49:18 737

原创 k8s--(7)从应用访问pod元数据以及其他资源

ambassador容器的启动命令就是kubectl proxy,在main容器中直接curl 8001就可以访问API服务器,因为ambassador可以转发请求。kubectl proxy启动了一个代理服务,接收本机的http请求并转发至API服务器,同时处理身份认证。(1)发现API服务器地址,其实pod的环境变量里默认添加了这些,甚至还有DNS入口。构造一个pod,运行两个容器,一个主容器main,一个ambassador容器。注意一个细节:卷定义中引用容器级的元数据,需要指定容器名称。

2024-05-13 15:47:14 537 2

原创 k8s--(6)ConfigMap和Secret:配置应用程序

本章主要讲如何向容器传递环境变量或配置信息等。

2024-05-13 15:45:43 863

原创 k8s--(5)卷:将磁盘挂载到容器

一、介绍1、为什么需要存储卷(1)容器启动时,除了来自于镜像的文件系统外,没有其他文件,如果想加入一些文件,例如配置文件,就需要存储卷加进去(2)容器重启后,非原镜像中的文件会丢失,例如区块链的账本数据文件,如果希望容器重启后数据依然在,需要存储卷保证数据的不丢失(3)pod内有多个容器,如果希望多个容器间共享一些数据,就需要存储卷来存一份数据,给多个容器用,相当于磁盘2、生命周期存储卷被定义为pod的一部分,并和pod共享相同的生命周期。

2024-05-13 15:43:14 1141

原创 k8s--(4)服务

1、定义k8s服务是一种为一组功能相同的pod提供单一不变的接入点的资源。看一个前后端例子:2、创建服务和RC、RS一样,服务也是用标签来管理pod的,创建服务有两种方式:(1)将RC或RS暴露为一个服务kubectl expose replicationcontroller rc名 --type=LoadBalancer --name 服务名(2)yamlmetadata:spec:ports:- port: 80 //服务对外的端口。

2024-05-13 15:39:31 573

原创 k8s--(3)副本机制和其他控制器:部署托管的pod

如果一个容器内的主进程挂了,也就是容器从内部挂了,kubelet自然能检测到容器的失败并重启容器,但试想一个java程序崩溃了,但JVM的程序还在运行,这个容器看起来依然在运行,但实际已经没有提供任何可用的服务了,这时候kubelet是不会重启容器的,所以要有一种从外部检测容器失败的机制,来保持pod的健康运行,即存活探针。(1)一定要检查应用程序的内部。如果将上述pod的app=kubia的标签删了,rc则认为少了一个pod,会启动一个新的打这个标签的pod,原来的pod不归任何rc管理,可以随意删除。

2024-05-13 15:33:54 685

原创 k8s--(2)pod

虽然一个pod可以管理多个容器,但是我们还是倾向于一个pod里只运行一个容器,原因有两点:1.两个不需要共享资源的容器在同一个pod中运行时,k8s不会对容器调度,而是对pod调度,这个pod永远都只会在某一个工作节点上运行,降低了基础设施的使用率;如果我们仅使用容器来运行这些进程,那么这些进程都需要在一个容器中运行,也就是单个容器多个进程,这其实是不合理的,我们倾向于一个容器一个进程,因为多个进程在一个容器里运行会给维护、管理带来巨大的工作量。应用:一个pod的多个副本,一个应用的多个版本同时运行。

2024-05-13 15:31:18 690

原创 k8s--(1)k8s介绍和使用

k8s是一个集群系统,允许开发人员在其上很容易的部署和管理容器化的应用。

2024-05-13 15:26:29 511

原创 java设计模式--结构型模式

适用于排列组合的场景:一杯咖啡,选中杯、大杯、超大杯,以及加不加糖,不能写六个类去实现ICoffee接口,独立实现makeCoffee接口,因为后来可能又来“加不加奶”的需求,应该用桥接模式去实现,这里有两个变化维度,咖啡的容量和口味,而且都需要独立变化,可以将容量理解为抽象部分,而口味理解为实现部分,这两个部分需要桥接。目的:将现有的旧接口转换成新的客户端接口,尽可能多的重用原来的已经通过测试的代码,并且可以对新接口自由修改(将一个接口转换为客户端所期待的接口,从而使两个接口不兼容的类可以在一起工作)。

2024-05-13 15:21:54 667

原创 java设计模式--行为型模式

行为型模式关注对象交互、通信和控制流。

2024-05-13 15:15:10 725

原创 java设计模式--创建型模式

创建型模式主要用于处理对象的创建问题,分为:单例、工厂、对象池、原型、建造者模式。

2024-05-13 15:07:12 587

原创 mysql日志

MySQL 日志 主要包括错误日志、查询日志、慢查询日志、事务日志、二进制日志几大类。其中,比较重要的还要属二进制日志 binlog(归档日志)和事务日志 redo log(重做日志)和 undo log(回滚日志)一、redo log。

2024-05-13 14:57:15 1270

原创 redis--一些问题

使用的是AOF 重写缓冲区,当bgrewriteaof创建后,意味着要重写AOF了,那此时来的数据,除了写入AOF缓冲区外,还要写入AOF 重写缓冲区,完成AOF重写后,会把缓冲区的内容也追加进新的AOF文件的。AOF 日志记录的是操作命令,不是实际的数据,所以用 AOF 方法做故障恢复时,需要全量把日志都执行一遍,一旦 AOF 日志非常多,势必会造成 Redis 的恢复操作缓慢,所以增加了RDB快照,可以记录某一个瞬间的内存数据,方便恢复数据。频率太低,丢失的数据就会比较多,频率太高,就会影响性能。

2024-05-06 21:35:37 441

原创 mysql--一些问题

B+树的叶子结点的data域存放的是数据的地址。1、undo log:事务在执行中,但还未提交,mysql发生了崩溃,就需要undo log来回退事务,需要的是记录执行事务之前的状态。在事务中,所有修改其实都是先写到缓存+日志的,最后提交的时候再写到磁盘(由后台线程完成),所以一旦提交失败,还可以重新提交,重新提交就是根据日志来redo。5、PG的主备复制属于物理复制,相对于MySQL基于binlog的逻辑复制,数据的一致性更加可靠,复制性能更高,对主机性能的影响也更小。所有的事务依次逐个执行,效率低。

2024-05-06 21:35:26 654

原创 kafka--一些问题

一个partition可以有多个副本,且每个副本可以分布在不同的broker上,多副本中必须有一个leader,其他的都叫follower,消息会发送到leader,其他follower会同步leader的数据,生产者和消费者只会连接leader,follower只是为了提高存储安全性。设置 unclean.leader.election.enable = false,保证leader挂了,重新选leader的时候,不会从那些同步程度达不到要求的follower的副本中选举。

2024-05-06 21:35:12 1006

原创 kafka--spring event和kafka消息的区别

而kafka是一个分布式流处理平台,它提供了持久性、容错性、伸缩性和高吞吐量的消息传递系统,通过分布式发布-订阅机制,允许多个应用程序或服务之间以实时的方式交换数据。但kafka消息可以是多对多的,多个发布者向多个topic里写消息,也可以有多个订阅者订阅这些消息。3、spring事件是观察者模式,使用的是监听机制,而kafka消息是发布-订阅模式。2、spring event 基本上就是一对一,一个服务发送,一个服务接收。1、概念层面不同,事件是系统内发生的特定事情或状态变化的表示,

2024-05-06 21:35:05 179

原创 kafka--消息存储与读取

kafka的存储方式与区块链一样,都是文件存储,通过响应的.log和.index文件来存储,每一个partition为一簇.log和.index文件,一组.log和.index构成了一个segement,partition便是由多个segement组成。每有一条新消息,都会追加到partition的末尾,也会追加存储到该partition的存储文件中,当这个文件大于1G时,会创建一个新的.log文件。index文件的序号就是对应.log文件中第一条消息在所有消息中的相对偏移量(第n条消息)

2024-05-06 21:34:56 150

原创 kafka--机制

服务端:以集群方式运行,部分服务作为代理,其他的服务运行kafka connect来持续将我们自己系统中的数据导入导出并集成成事件流;Topics是分区的,每个分区叫做partition,这样一个Topic可以分布式存储在多个的kafka代理上,这样应用同时向不同的代理读写数据。生产者和消费者是完全解耦的,甚至不感知对方的存在性,生产者只需要将事件发送到kafka,消费者也只需读取并处理事件,与对方的状态无关。客户端:各种语言的kafka流库,使得我们可以使用kafka读、写、处理自己的事件。

2024-05-06 21:34:46 306

原创 kafka--从消息队列说起

一种可以处理、存储多个消息的数据结构。

2024-05-06 21:34:38 251

原创 java并发--ThreadLocal

4、entry的key是弱引用类型,如果没有其他引用,在GC时会被清理,就会产生一个key为null,value不为null的entry,可以通过remove()清理这些entry;2、ThreadLocalMap维护着一个数组,数组的元素是Entry对象,Entry中有key、value,key为ThreadLocal对象,value是要线程隔离的值。使用ThreadLocal.get()方法后,key变成了强引用,就不会被GC为null了。用于线程隔离一个变量。

2024-05-06 21:34:29 182

原创 java线程池TreadPoolExecutor的使用

线程集合workSet和阻塞队列workQueue,新添加的线程放入阻塞队列,workerSet中的一个个线程worker会从阻塞队列中拿线程来执行,如果阻塞队列中没有线程,worker会阻塞。从任务的优先级,任务的执行时间长短,任务的性质(CPU密集/ IO密集),任务的依赖关系这四个角度来分析。可以看到,没有核心线程数,一旦线程空闲超过60秒,就会停止,下次再建新的线程,会导致一定的系统开销。通过参数看到,上面三个常用的线程池,都会造成OOM问题,要么阻塞队列无限长,要么线程数无限多。

2024-05-06 21:34:21 478

原创 java线程池--FutureTask

FutureTask 常用来封装 Callable 和 Runnable,也可以作为一个任务提交到线程池中执行。除了作为一个独立的类之外,此类也提供了一些功能性函数供我们创建自定义 task 类使用。由于get()方法是获取线程执行结果的,所以FutureTask对象需要一个Callable的对象,或者runnable+返回值。run() cancel() isCancelled() isDone() get() 延迟get()获取线程执行结果,调用这个方法的线程会阻塞等待这个结果。

2024-05-06 21:34:11 137

原创 java JUC 工具类---Semaphore、Phaser

又称“阶段器”,用来解决控制多个线程分阶段共同完成任务的情景问题,类似于CountDownLatch和CyclicBarrier,但只有Phaser可以动态注册需要协调的线程。释放一个或多个令牌release()、release(int),如果一个线程释放的令牌数大于获取的令牌数,那总令牌数就会增加对应的个数。通常叫它信号量, 可以用来控制同时访问特定资源的线程数量,通过协调各个线程,以保证合理的使用资源。获取一个或多个令牌acquire()、acquire(int),令牌不够了,线程会阻塞。

2024-05-06 21:34:02 222 1

原创 java JUC工具类--CountDownLatch和CyclicBarrier

3、CountDownLatch和CyclicBarrier都有让多个线程等待同步然后再开始下一步动作的意思,但是CountDownLatch的下一步的动作实施者是主线程,具有不可重复性;每个线程都需要调用await()来阻塞本线程的继续运行,当所有线程都到达await()点后,会由最后一个达到await()点的线程执行barrierAction,然后所有线程继续往下运行,parties又设置为初始值,迎接下一个屏障点。破坏屏障可以用breakBarrier(),会唤醒所有在屏障中的线程。

2024-05-06 21:33:50 257

原创 java锁--同步器的实现类

ReentrantLock本身没有继承AQS,而是实现了Lock接口,所以使用时用reentrantLock.lock()方法来获取锁。在ReentrantLock的构造方法中,可以选择使用公平锁还是非公平锁,默认是非公平锁。内部类Sync继承了AQS,ReentrantLock使用了Sync。五个内部类,由ReentrantReadWriteLock组合。ReadWriteLock并没有继承自Lock。2、使用计数器来记录读锁的个数。构造函数也是默认非公平锁。

2024-05-05 21:38:54 223 2

原创 java锁--LockSurpport和AQS

synchronized最底层是使用monitor来实现给对象加锁的,没有获得monitor的线程需要阻塞并竞争获得monitor,那在jdk层面,也就需要一种类似的机制实现线程互斥,关键点在于:1、有一个共享资源只能被一个线程占有2、没获得共享资源的线程需要阻塞3、线程被唤醒后需要竞争获得该共享资源。

2024-05-05 21:37:07 909

原创 java锁基础

问题:如果一个变量 V 初次读取的时候是 A 值,并且在准备赋值的时候检查到它仍然是 A 值,那我们就能说明它的值没有被其他线程修改过了吗?乐观锁认为本线程在修改数据时,不会有其他线程也修改数据,即不存在竞争,所以不加锁,而是通过CAS来修改,失败了有不同处理方式。破坏不剥夺条件:占用部分资源的线程进一步申请其他资源时,如果申请不到,可以主动释放它占有的资源。线程 A 持有资源 2,线程 B 持有资源 1,他们同时都想申请对方的资源。请求与保持条件:一个线程因请求资源而阻塞时,对已获得的资源保持不放。

2024-05-05 21:35:25 288

原创 java并发关键字

协议(MESI),每个处理器通过嗅探在总线上传播的数据来检查自己缓存的值是不是过期了,当处理器发现自己缓存行对应的内存地址被修改,就会将当前处理器的缓存行设置成无效状态,当处理器对这个数据进行修改操作的时候,会重新从系统内存中把数据读到处理器缓存里。事实上,只要存在多线程,必然会有锁竞争成功与失败,那就必然升级到轻量级锁,所以偏向锁意义不大,可以通过JVM参数:-XX:-UseBiasedLocking选择是否开启,甚至在java18后直接被废弃了。为了保证各个处理器的缓存是一致的,实现了。

2024-05-05 21:34:36 612

原创 java并发理论基础

,守护线程直接被kill掉,不再执行任何语句;调用 wait() 使得线程等待某个条件满足,线程在等待时会被挂起,当其他线程的运行使得这个条件满足时,其它线程会调用 notify() 或者 notifyAll() 来唤醒挂起的线程。与之对应的是用户线程,即工作线程,即完成某个业务的线程,当用户线程全部结束后,意味着没有线程需要守护,那么守护线程就会退出,JVM跟着退出。守护线程是一种特殊的线程,是系统的守护者,在后台默默地守护一些系统服务,比如垃圾回收线程,JIT线程就可以理解守护线程。

2024-05-05 21:33:34 561

原创 类加载过程

(2)其次是考虑到安全因素,java核心api中定义类型不会被随意替换,假设自定义了一个名为java.lang.Integer的类,通过双亲委托模式传递到启动类加载器,而启动类加载器在核心Java API发现这个名字的类,发现该类已被加载,并不会重新自定义的java.lang.Integer,而直接返回已加载过的Integer.class,这样便可以防止核心API库被随意篡改。Java类加载器由JVM提供,是所有程序运行的基础,JVM提供的这些类加载器通常被称为系统类加载器。

2024-05-05 21:29:40 770

空空如也

空空如也

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

TA关注的人

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