自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(60)
  • 资源 (3)
  • 收藏
  • 关注

原创 Kubernetes学习(八)Helm应用包管理器

Helm是一个Kubernetes的包管理工具,就像Linux下的包管理器,如yum/apt等,可以很方便的将之前打包好的yaml文件部署到kubernetes上。helm:一个命令行客户端工具,主要用于Kubernetes应用chart的创建、打包、发布和管理。Chart:应用描述,一系列用于描述 k8s 资源相关文件的集合。Release:基于Chart的部署实体,一个 chart 被 Helm 运行后将会生成对应的一个 release;将在k8s中创建出真实运行的资源对象。

2023-03-21 13:45:43 622 1

原创 Kubernetes学习(七)补充:基于自定义指标进行扩缩容

metadata:spec:metrics:pods:metric:target:此时适配器还不知道要什么指标(http_requests_per_second),HPA也就获取不到Pod提供指标。

2023-03-20 16:14:44 831 1

原创 Kubernetes学习(七)弹性伸缩

此时如果大规格机器有较低的利用率被判断缩容,那么很有可能会造成节点缩容后,容器重新调度后的争抢。在一个Kubernetes集群中,通常不只包含一种规格的机器,假设集群中存在4C8G与16C32G两种规格的机器,对于10%的资源预留,这两种规格代表的意义是完全不同的。在弹性伸缩中,冷却周期是不能逃避的一个话题, 由于评估的度量标准是动态特性,副本的数量可能会不断波动。在大部分生产环境中,资源利用率都不会保持一个高的水位,但从调度来讲,调度应该保持一个比较高的水位,这样才能保障集群稳定性,又不过多浪费资源。

2023-03-17 10:34:06 1195

原创 Kubernetes学习(六)配置管理ConfigMap

ConfigMap是一种API对象,用来将非机密性数据保存到键值对中。使用时可以用作环境变量、命令行参数或者存储卷中的配置文件。ConfigMap将配置信息和容器镜像解耦,便于应用修改配置,当需要存储机密数据时可以使用Secret对象。注意:ConfigMap并不提供保密或加密功能。如果想存储加密数据,请使用Secret,或者使用其他第三方工具来保证数据的私密性。ConfigMap配置Pod中的容器:1、容器entrypoint的命令行参数2、容器的环境变量。

2023-03-09 16:22:03 936

原创 Kubernetes学习(五)持久化存储

容器中的文件在磁盘上是临时存放的,这给容器中运行的特殊应用带来了一些问题。首先,当容器崩溃时,kubectl将重新启动容器,容器中的文件将会丢失--应为容器会以干净的状态重建。其次,当在一个Pod中运行多个容器是,常常需要在这些容器之间共享文件。Kubernetes抽象出Volume对象来解决这2个问题。Docker也有Volume的概念,但对它是有少量且松散的管理。在Docker中,Volume是磁盘上或者另外一个容器内的一个目录。

2023-03-08 17:12:36 839 1

原创 Kubernetes学习(四)控制器

ReplicaSet的目的是维护一组在任何时候都处于运行状态的Pod副本的稳定集合。因此,它通常用来保证给定数量的、完全相同的Pod的可用性。ReplicaSet的工作原理ReplicaSet是通过一组字段来定义的,包括一个用来识别可获得的pod的集合的选择符,一个用来标明应该维护的副本个数的数值,一个用来执行应该创建新Pod以满足副本个数条件时要使用的Pod模板等等。每个ReplicaSet都通过根据需要创建和删除Pod以使得副本个数达到期望值,进而实现其存在价值。

2023-03-08 10:07:27 419

原创 Kubernetes学习(三)Service

将运行在一组Pods上的应用程序公开为网络服务的抽象方法使用Kubernetes服务无需修改应用程序即可使用通用的服务发现机制。Kubernetes为Pods提供自己的IP地址,并为一组Pod提供相同的DNS,并且可以在他们之间进行负载均衡。Service在Kubernetes中是一个REST对象,和Pod类似。像所有的REST对象一样,Service定义可以基于POST方式,请求API server创建新的实例。例如,有一组Pod,它们对外暴露9376端口,同时还被打上app=myapp标签。

2023-03-07 10:06:47 604

原创 Kubernetes学习(二)Pod

Pod 是可以在 Kubernetes 中创建和管理的、最小的可部署的计算单元。Pod的共享上下文包括一组Linux命名空间、控制组(cgroup)和可能的一些其他隔离,即用来隔离docker容器的技术。在Pod上下文中,每个独立的应用可能会进一步实施隔离。就Docker概念的术语而言,Pod类似于共享命名空间和文件系统卷的一组Docker容器。

2023-03-03 09:26:39 661

原创 Kubernetes学习(一)入门及集群搭建

一、简介一、简介1.简介Kubernetes 最初源于谷歌内部的Borg,Kubernetes 是一个全新的基于容器技术的分布式架构解决方案。包含几个基本功能:1.将应用水平扩容到多个集群2.为扩容的实例提供负载均衡策略3.提供基本的健康检查和自愈能力4.实现任务的统一调度2.发展历史- 2014年6月 谷歌云计算专家Eric Brewer在旧金山的发布会为这款新的开源工具揭牌。- 2015年7月22日K8S迭代到 v 1.0并在OSCON大会上正式对外公布。

2022-11-22 09:21:58 553

原创 IDEA 护眼色设置

代码区Settings --> Editor --> Color Scheme--> General --> Test --> Default text设置背景色:项目结构Settings --> Appearance --> File Colors点击 “+” 创建 All下 Custom颜色控制台Settings --> Editor --> Color Scheme --> Con...

2022-04-14 09:18:39 821

原创 ETCD 十六 服务注册与发现

微服务架构中的服务注册与发现在微服务架构中,多个微服务间的通信需要依赖服务注册与发现组件获取指定服务实例的地址信息,才能正确地发起 RPC 调用,保证分布式系统的高可用、高并发。服务注册与发现主要包含两部分:服务注册的功能与服务发现的功能。服务注册是指服务实例启动时将自身信息注册到服务注册与发现中心,并在运行时通过心跳等方式向其汇报自身服务状态;服务发现是指服务实例向服务注册与发现中心获取其他服务实例信息,用于远程调用。下面我们来看服务注册与发现中心的职责和服务实例进行服务注册的基本流程,...

2022-03-03 15:54:28 3209

原创 ETCD 十五 分布式锁

为什么需要分布式锁?在分布式环境下,数据一致性问题一直是个难点。相比于单进程,分布式环境的情况更加复杂。分布式与单机环境最大的不同在于它不是多线程而是多进程。由于多线程可以共享堆内存,因此可以简单地采取内存作为标记存储位置。而多进程可能都不在同一台物理机上,就需要将标记存储在一个所有进程都能看到的地方。例如秒杀场景就是一个常见的多进程场景。订单服务部署了多个服务实例,如秒杀商品有 4 个,第一个用户购买 3 个,第二个用户购买 2 个,理想状态下第一个用户能购买成功,第二个用户提示购买失败,反...

2022-03-03 15:22:45 1566 1

原创 ETCD 十四 服务端处理客户端请求过程

请求过程概述客户端层如 clientv3 库和 etcdctl 等工具,用户通过 RESTful 方式进行调用,降低了 etcd 的使用复杂度;API 接口层提供了客户端访问服务端的通信协议和接口定义,以及服务端节点之间相互通信的协议。etcd v3 使用 gRPC 作为消息传输协议;etcd Raft 层负责 Leader 选举和日志复制等功能,除了与本节点的 etcd server 通信之外,还与集群中的其他 etcd 节点进行交互,实现分布式一致性数据同步的关键工作;etcd 的业务逻辑层,包..

2022-03-03 14:36:29 1080

原创 ETCD 十三 启动ETCD Server过程

etcd Server 启动总览etcd 服务端的启动包括两大块: etcdServer 主进程,直接或者间接包含了 raftNode、WAL、Snapshotter 等多个核心组件,可以理解为一个容器; 另一块则是 raftNode,对内部 Raft 协议实现的封装,暴露简单的接口,用来保证写事务的集群一致性。 etcd 可分为 Client 客户端层、API 网络接口层、etcd Raft 算法层、逻辑层和 etcd 存储层。如下图所示:etcd 服务端对 Etc..

2022-03-03 09:17:32 4950

原创 ETCD 十二 Lease租约

ETCD的Lease 租约,它类似 TTL(Time To Live),用于 etcd 客户端与服务端之间进行活性检测。在到达 TTL 时间之前,etcd 服务端不会删除相关租约上绑定的键值对;超过 TTL 时间,则会删除。因此我们需要在到达 TTL 时间之前续租,以实现客户端与服务端之间的保活。Lease 也是 etcd v2 与 v3 版本之间的重要变化之一。etcd v2 版本并没有 Lease 概念,TTL 直接绑定在 key 上面。每个 TTL、key 创建一个 HTTP/1.x 连...

2022-03-02 09:26:52 3190

原创 ETCD 十一 watch机制

etcd v2 和 v3 版本之间发生的其中一个重要变化就是 watch 机制的优化。etcd v2 watch 机制采用的是基于 HTTP/1.x 协议的客户端轮询机制,历史版本则通过滑动窗口存储。在大量的客户端连接场景或集群规模较大的场景下,etcd 服务端的扩展性和稳定性都无法保证。etcd v3 在此基础上进行优化,满足了 Kubernetes Pods 部署和状态管理等业务场景诉求。watch 可以用来监听一个或一组 key,key 的任何变化都会发出事件消息。某种意义上讲,etcd 也是..

2022-03-01 15:27:14 4852

原创 ETCD 十 分布式事务

etcd 实现了在一个事务中,原子地执行冲突检查、更新多个 keys 的值。除此之外,etcd 将底层 MVCC 机制的版本信息暴露出来,根据版本信息封装出了一套基于乐观锁的事务框架 STM,并实现了不同的隔离级别。etcd 使用了不到四百行的代码实现了迷你事务,其对应的语法为If-Then-Else。etcd 允许用户在一次修改中批量执行多个操作,即这一组操作被绑定成一个原子操作,并共享同一个修订号。其写法类似 CAS,如下所示:Txn().If(cond1, cond2, ...).The..

2022-03-01 14:58:44 1611

原创 ETCD 九 MVCC

etcd v2 版本存在丢弃历史版本数据的问题,仅保留最新版本的数据。但是这样做引起了一系列问题,比如 watch 机制依赖历史版本数据实现相应功能,因此 etcd v2 又采取了在内存中建立滑动窗口来维护部分历史变更数据的做法,然而在大型的业务场景下还是不足以支撑大量历史变更数据的维护。到了 etcd v3 版本,该功能得到了更新,etcd v3 支持 MVCC,可以保存一个键值对的多个历史版本。MVCC 模块是 etcd 的核心模块。MVCC 作为底层模块,为上层提供统一的调用方法。这一讲我们将..

2022-02-28 14:02:05 1016

原创 ETCD 八 分布式一致性raft模块

etcd 集群中的多个节点不可避免地会出现相互之间数据不一致的情况。但不管是同步复制、异步复制还是半同步复制,都会存在可用性或者一致性的问题。我们一般会使用共识算法来解决多个节点数据一致性的问题,常见的共识算法有 Paxos和Raft。ZooKeeper 使用的是 ZAB 协议,etcd 使用的共识算法就是Raft。etcd raft模块 对外提供的接口raft模块中的主要对象是节点。可以使用 raft.StartNode 创建新的Node节点 ,也可以使用 raft.RestartNode..

2022-02-28 10:08:52 1576

原创 ETCD 七 gRPC 通信接口以及客户端

client/v3 client定义// Client provides and manages an etcd v3 client session.type Client struct { Cluster // 向集群里增加 etcd 服务端节点之类,属于管理员操作。 KV //我们主要使用的功能,即操作 K-V。 Lease //租约相关操作,比如申请一个 TTL=10 秒的租约。 Watcher //观察订阅,从而监听最新的数..

2022-02-26 11:10:55 973

原创 ETCD 六 etcd总体架构

etcd 源码结构etcd 项目代码的目录结构:包名 用途 api

2022-02-26 10:05:45 999

原创 ETCD 五 动态配置etcd集群和调优

etcd 集群部署之后,动态调整集群是经常发生的情况,比如增加 etcd 节点、移除某个 etcd 节点,或者是更新 etcd 节点的信息,这些情况都需要我们动态调整 etcd 集群。集群运行时重配置集群运行时重配置的前提条件是只有在大多数集群成员都在正常运行时,etcd 集群才能处理重配置请求。从两个成员的集群中删除一个成员是不安全的,因为两个成员的集群中的大多数也是两个,如果在删除过程中出现故障,集群就可能无法运行,需要从多数故障中重新启动。因此 etcd 官方建议:生产环境的集群大..

2022-02-23 14:14:42 2186

原创 ETCD 四 etcd 网关与 gRPC-Gateway

etcd 网关什么是etcd 网关etcd 网关是一个简单的TCP 代理,可将网络数据转发到 etcd 集群。网关是无状态且透明的,它既不会检查客户端请求,也不会干扰集群响应,支持多个 etcd 服务器实例,并采用简单的循环策略。etcd 网关将请求路由到可用端点,并向客户端隐藏故障,使得客户端感知不到服务端的故障。后期可能会支持其他访问策略,例如加权轮询。我们使用客户端连接到 etcd 服务器时,每个访问 etcd 的应用程序必须知道所要访问的 etcd 集群实例的地址,即用来提供客户端服..

2022-02-22 10:46:42 2547 1

原创 ETCD 三 etcdctl

etcdctl常用命令:etcdctl 支持的命令大体上分为数据库操作和非数据库操作两类,其中数据库的操作命令是最常用的命令 。数据库操作数据库操作基本围绕着对键值和目录的 CRUD 操作(即增删改查),及其对应的生命周期管理。我们上手这些操作其实很方便,因为这些操作是符合 REST 风格的一套 API 操作。键操作键操作包括最常用的增删改查操作,包括 PUT、GET、DELETE 等命令。PUT 设置或者更新某个键的值GET 命令还提供了根据指定的键(key)...

2022-02-21 16:04:09 990

原创 ETCD 二 部署ETCD

一、单机安装部署etcd version:v3.5.21.二进制包脚本安装ETCD_VER=v3.5.2GITHUB_URL=https://github.com/etcd-io/etcd/releases/downloadDOWNLOAD_URL=${GITHUB_URL}rm -f /tmp/etcd-${ETCD_VER}-linux-amd64.tar.gzrm -rf /tmp/etcd-downloadmkdir -p /tmp/etcd-downloadcu...

2022-02-21 15:35:10 1246

原创 ETCD 一 什么是ETCD

etcd简介云原生架构中重要的基础组件,因为etcd 项目是 Kubernetes 内部的一大关键组件,目前有很多项目都依赖 etcd 进行可靠的分布式数据存储。云原生中的微服务应用属于分布式系统的一种落地实践。在分布式环境中,由于网络的复杂性、不确定性以及节点故障等情况,会产生一系列的问题。最常见的、最大的难点就是数据存储不一致的问题,即多个服务实例自身的数据或者获取到的数据各不相同。因此我们需要基于一致性的存储组件构建可靠的分布式系统。那什么是etcd呢?etcd是一个分布式、可靠...

2022-02-21 10:41:04 4319

原创 MyBatis源代码学习

版本mybatis:3.5.3源码分析使用(不集成Spring)public class App { public static void main(String[] args) { String resource = "mybatis-config.xml"; Reader reader; try { //将XML配置文件构建为Configuration配置类 reader = Re

2021-10-28 15:19:43 539 1

原创 Spring源码学习之 编译运行Spring源码

工具版本spring-framework:5.1.xgradle:6.8.3idea:2020.3环境准备1.下载源码码云:https://gitee.com/mirrors/Spring-Framework/tree/5.1.x/github:https://github.com/spring-projects/spring-framework2.下载配置gradle下载地址:https://services.gradle.org/distributions/版本:

2021-09-07 16:08:30 494

原创 golang net/http 源码

golang net/http 源码学习分析golang中函数是一等公民Server端建立http服务import "net/http"func main() { http.HandleFunc("/", IndexHandler) http.ListenAndServe(":8088",nil)}func IndexHandler(writer http.ResponseWriter, request *http.Request) { writer.Write([

2021-09-04 11:12:31 424 1

原创 JDK1.8新特性 Stream 和 Collectors

java.util.Stream 表示能应用在一组元素上一次执行的操作序列。Stream 操作分为中间操作或者最终操作两种,最终操作返回一特定类型的计算结果,而中间操作返回Stream本身,这样就可以将多个操作依次串起来。Stream 的创建需要指定一个数据源,比如 java.util.Collection的子类,List或者Set, Map不支持。Stream的操作可以串行stream()执行或者并行parallelStream()执行。...

2021-07-15 09:57:49 271

原创 JVM系列 四 synchronized 锁膨胀

synchronized 同步锁有四种状态:无锁、偏向锁、轻量级锁、重量级锁,他们会随着竞争情况逐渐升级,此过程不可逆,称之为锁膨胀。所以 synchronized 锁膨胀其实就是无锁 → 偏向锁 → 轻量级锁 → 重量级锁的一个过程。偏向锁(Biased Locking)偏向锁是为了在无多线程竞争的情况下尽量减少不必要的轻量级锁执行路径,因为轻量级锁的获取及释放依赖多次CAS原子指令,而偏向锁只需要在置换ThreadID的时候依赖一次CAS原子指令。其实在大多数情况下,锁不仅不存在多线程竞争,而.

2021-07-14 10:45:12 376

原创 Nacos服务发现与注册

Nacos一致性协议实现一、持久化实例:基于简化的 Raft 的 CP 一致性二、临时实例:基于自研协议 Distro 的 AP 一致性Nacos核心功能点服务注册:Nacos Client会通过发送REST请求的方式向Nacos Server注册自己的服务,提供自身的元数据,比如ip地址、端口等信息。Nacos Server接收到注册请求后,就会把这些元数据信息存储在一个双层的内存Map中。服务心跳:在服务注册后,Nacos Client会维护一个定时心跳来持续通知Nacos

2021-07-02 14:38:22 105

原创 SpringBoot整合各组件原理

SpringBoot整合MyBatis:利用Spring的扩展接口BeanFactoryPostProcessor接口SpringBoot整合Nacos:ApplicationListener接口 -->WebServerInitializedEventSpringBoot整合Eureka:SmartLifeCycle接口SpringBoot整合Ribbon:SmartInitializingSingletion接口SpringBoot整合Sentinel:BeanPostProces

2021-07-01 14:30:03 156

原创 Redis系列 二 数据结构

RedisDB(redis数据库)默认16个 0-15typedef struct redisDb { dict *dict; dict *expires; dict *blocking_keys; dict *ready_keys; dict *watched_keys; int id; ..

2021-06-30 14:17:48 65

原创 springboot 集成 mybatis原理

自动装配POM文件添加mybatis支持 <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>2.1.4</version> </dependency>该starter会导入myba

2021-06-29 16:50:10 236

原创 Netty 线程模型

Netty 线程模型Netty的线程模型是基于Reactor模型的。Netty的线程模型如下图所示:模型解释:1) Netty 抽象出两组线程池BossGroup和WorkerGroup,BossGroup专门负责接收客户端的连接, WorkerGroup专门负责网络的读写2) BossGroup和WorkerGroup类型都是NioEventLoopGroup3) NioEventLoopGroup 相当于一个事件循环线程组, 这个组中含有多个事件循环线程 , 每一个事件循环线

2021-06-16 20:16:36 59

原创 BIO NIO AIO

BIO(Blocking IO)同步阻塞模型,一个客户端连接对应一个处理线程这里假设一个烧开水的场景,有一排水壶在烧开水,BIO的工作模式就是, 小菠萝一直看着着这个水壶,直到这个水壶烧开,才去处理下一个水壶。线程在等待水壶烧开的时间段什么都没有做。缺点:1、IO代码里read操作是阻塞操作,如果连接不做数据读写操作会导致线程阻塞,浪费资源2、如果线程很多,会导致服务器线程太多,压力太大。NIO(Non Blocking IO)同步非阻塞,服务器实现模式为一个线程可以处理多个

2021-06-02 20:34:26 95

原创 Redis系列 一 持久化、集群架构

Redis持久化RDB快照在默认情况下, Redis 将内存数据库快照保存在名字为dump.rdb的二进制文件中。你可以对 Redis 进行设置, 让它在“N秒内数据集至少有M个改动”这一条件被满足时, 自动保存一次数据集。比如说, 以下设置会让 Redis 在满足“60秒内有至少有1000个键被改动”这一条件时, 自动保存一次数据集:# save 60 1000 //关闭RDB只需要将所有的save保存策略注释掉即可还可以手动执行命令生成RDB快照,进入redi...

2021-06-01 20:44:30 76

原创 JVM系列 三 垃圾收集器

垃圾收集算法分代收集理论当前虚拟机的垃圾收集都采用分代收集算法,这种算法没有什么新的思想,只是根据对象存活周期的不同将内存分为几块。一般将java堆分为新生代和老年代,这样我们就可以根据各个年代的特点选择合适的垃圾收集算法。比如在新生代中,每次收集都会有大量对象(近99%)死去,所以可以选择复制算法,只需要付出少量对象的复制成本就可以完成每次垃圾收集。而老年代的对象存活几率是比较高的,而且没有额外的空间对它进行分配担保,所以我们必须选择“标记-清除”或“标记-整理”算法进行垃圾收集。注意,“标

2021-05-31 21:05:56 53

原创 JVM系列 二 对象创建与内存分配

2021-05-31 18:51:58 70

并发编程面试题(2020最新版)

并发编程面试题(2020最新版)-重点.pdf

2021-05-26

JSR133中文版,java并发进阶必读

JSR133中文版,java并发进阶必读。

2021-05-26

axure谷歌浏览器插件_V0.6.3.rar

axure谷歌浏览器插件

2021-05-26

空空如也

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

TA关注的人

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