自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Flume-WAL日志机制源码分析

WAL 的全称是 Write-Ahead Logging,中文称预写式日志,是一种数据安全写入机制,记录变更操作。就是先写日志,然后在写入磁盘,这样保证数据的安全性。WAL在关系型数据库中非常常见,Mysql中的Redo Log就是采用WAL机制。

2024-03-21 11:01:51 432

原创 Flume-transaction机制源码分析

FileChannel主要是由WAL预写日志和内存队列FlumeEventQueue组成。

2024-03-21 11:01:32 567

原创 kubernetes之operator开发controller-runtime源码分析

Controller会先向Informer注册资源的eventHandler;然后Cache会启动Informer,Informer向APIServer发出请求,建立连接;当Informer检测到有资源变动后,使用Controller注册进来的eventHandler判断是否推入工作队列中;当工作队列中有元素被推入时,Controller会将元素取出,并执行用户侧的Reconciler。

2024-02-22 14:14:18 739

原创 kubernetes之operator开发及informer机制源码分析

在Kubernetes中我们经常使用 Deployment、DaemonSet、Service、ConfigMap 等资源,这些资源都是Kubernetes的内置资源,而对这些资源的创建、更新、删除的动作都会被称为事件(Event),Kubernetes 的 Controller Manager 负责事件监听,并触发相应的动作来满足期望(Spec),这种声明式的方式简化了用户的操作,用户在使用时只需关心应用程序的最终状态即可。随着 Kubernetes 的发展, 在一些场景更为复杂的分布式应用系统,原生 K

2024-02-22 14:12:37 1188

原创 linux内核视角看零拷贝

因此,

2024-02-19 17:16:17 817

原创 Istio金丝雀部署和流量镜像

总的来说,Istio 的金丝雀发布功能更加灵活和强大,可以提供更细粒度的流量控制和管理,但需要依赖 Istio 的服务网格架构。而 Kubernetes 的金丝雀发布功能相对简单直接,适合基本的金丝雀发布需求。1、namespace加上label,pod自动注入sidecar2、VirtualService制定流量转发规则,将10%流量转到新版本或者匹配HTTP Header,将匹配成功的流量转到新版本,否则转到老版本。

2024-02-19 17:15:21 1085

原创 linux内核视角看epoll

在传统的阻塞I/O模型中,一个Socket(套接字)通常只能处理一个TCP连接,即一对一的关系。每个TCP连接都需要分配一个独立的Socket来处理。然而,使用多路复用技术,可以在单个线程中同时监视多个Socket的状态,以确定哪些Socket有可读或可写事件。通过在单个线程内等待和处理多个连接的事件,高效地处理大量的并发连接,减少资源消耗。

2024-02-03 17:48:18 691

原创 深入理解Istio服务网格(一)数据平面Envoy

在传统的微服务架构中,服务间的调用,业务代码需要考虑认证、熔断、服务发现等非业务能力,在某种程度上,表现出了一定的耦合性服务网格追求高级别的服务流量治理能力,认证、熔断、服务发现这些能力更多的是平台测的能力。将业务测和平台测能力解耦,开发人员只关心业务测的能力。每个服务实例都有一个代理,服务的入站流量、出站流量都先经过代理,代理不进行业务处理,只做流量转发,因此,传统微服务架构,服务到服务间的调用,转成了proxy到proxy的调用。Proxy通常是一种反向代理软件,有强大的流量转发能力。

2024-02-03 17:47:32 1284

原创 linux内核视角看阻塞式IO

网络包从网卡送到协议栈后,内核还有一项重要的工作,就是要能通知用户进程,让用户进程能够收到并处理这些数据。用户进程和内核的交互一般有两种典型的方案,一种是同步阻塞,另一种是多路IO复用。

2024-01-19 16:24:11 526

原创 java-log4j日志冲突解决

java日志框架较多,其中主流的slf4j和commons-logging是日志接口,log4j、log4j2和logback是真正的日志实现库。

2024-01-19 16:23:14 1103

原创 kubernetes-监控系统Prometheus

在微服务分布式系统中,监控是极其重要的。监控能够对系统的运行状态了如指掌,有问题及时发现。

2024-01-10 16:27:58 1091

原创 java-远程代码debug

在某些场景下,本地环境代码可能不具备调试条件,那么远程代码调试是需要的。

2024-01-10 16:27:19 464 1

原创 kubernetes-L7负载均衡ingress

前面我们说到kube-proxy是基于iptables/ipvs的分布式L4负载均衡技术,但是有很多的需求场景是这种网络层的dnat不能提供的能力。基于L4的服务。

2023-12-20 09:13:11 556

原创 kubernetes-日志系统Loki

以前的企业级日志系统ELK(Elasticsearch、Logstash、Kibana)比较重,而Loki是一个轻量级的日志系统,且Loki与Prometheus、Grafana是同一个生态的产品,在云原生领域有着很好的兼容性。

2023-12-20 09:12:34 408

原创 kubernetes--kube-proxy实现L4负载均衡

要了解kube-proxy如何实现负载均衡,要先了解Linux网络收包机制,kube-proxy利用Linux的内核实现的负载均衡。在TCP/IP网络分层模型里,整个协议栈被分成了物理层、链路层、网络层,传输层和应用层。物理层对应的是网卡和网线,应用层对应的是我们常见的Nginx,FTP等等各种应用。Linux实现的是链路层、网络层和传输层这三层。。我们用Linux的视角来看到的TCP/IP网络分层模型是下面这个样子的。

2023-11-28 15:34:24 1164

原创 GC算法和常见垃圾回收器

GC Algorithms(常见的垃圾回收算法),找到这个垃圾之后怎么进行清除的算法。GC常用的算法有三种如下:1:Copying(拷贝)2:Mark-Sweep(标记清除)3:Mark-Compact(标记压缩)第一个是Copying(拷贝)。非常简单,就是把内存一分为二,分开之后呢,把有用的拷贝到下面绿色区域,拷贝完后上面全部清掉,回收完之后就变成下面的样子了,清楚简单。第二个是叫Mark-Sweep,标记、清除。就是你把它标出来,然后清掉就这么简单。首先找到那些有用。

2023-11-28 15:33:43 105

原创 kubernetes-容器网络接口CNI

Kubernetes的集群里,IP地址是以Pod为单位进行分配的,每个Pod都拥有一个独立的IP地址。一个Pod内部的所有容器共享一个网络栈,即宿主机上的一个网络命名空间,包括它们的IP地址、网络设备、配置等都是共享的。也就是说,Pod里面的所有容器能通过localhost:port 来连接对方。在Kubernetes中,提供了一个轻量的通用容器网络接口CNI(Container Network Interface),专门用于设置和删除容器的网络连通。

2023-11-18 21:51:01 250

原创 kubernetes-pod高可用

PreStop完成后,Kubelet会发kill-SIGTERM给容器进程,这时就要看应用是否支持处理SIGTERM信号量了,由/bin/bash起的进程是会忽略SIGTERM的,需要注意。当Node出现问题的时候,kubenetes会给Node打上taints,比如Node ping不通的时候打上unreachable,Node上的组件有问题的时候打上not-ready。当一个pod创建出来的时候,kubenetes会自动为pod增加Toleration。

2023-11-18 21:50:07 327

原创 kubernetes-kubelet组件

每个节点都运行一个kubelet进程,默认监听10250端口,kubelet作用非常重要,是节点的守护神。

2023-11-12 20:33:42 450

原创 kubernetes-容器运行时接口CRI

容器运行时(Container Runtime),运行于Kubernetes(K8s) 集群的每个节点中,负责容器的整个生命周期。其中Docker是目前应用最广的。随着容器云的发展,越来越多的容器运行时涌现。为了解决这些容器运行时和Kubernetes的集成问题,在Kubernetes 1.5版本中,社区推出了CRI(Container Runtime Interface,容器运行时接口)以支持更多的容器运行时。CRI是 Kubernetes 定义的一组gRPC服务。

2023-11-12 20:32:56 263

原创 容器网络-Underlay和Overlay

前面讲了容器内部网络,但是容器最终是要部署在主机上,跨主机间的网络访问又是怎么样的,跨主机网络主要有两种方案。

2023-11-11 15:55:10 501

原创 Docker容器网络

Docker网络有下面4种配置类型,用的比较多的是Bridge:HostContainer。

2023-11-11 15:54:46 95

原创 容器核心技术-Cgroups

这两个参数进行除法 cpu.cfs_quota_us/cpu.cfs_period_us ,比如 10ms /100ms = 0.1 ,表示这个控制组被允许使用的CPU最大配额是 0.1个cpu。cpu.cfs_period_us ,是CFS 调度的周期,默认是 100000,单位是 microseconds 也就是 100ms。cpu.cfs_quota_us 在一个调度周期里,这个控制组被允许的运行时间,比如 30000 ,就是 30ms。4.进程的cpu限制到了10%

2023-11-06 16:54:25 201

原创 容器核心技术-Namespace

基于Linux 内核的 Cgroup, Namespace,以及Union FS等技术,对进程进行封装隔离,属于操作系统层面的虚拟化技术,由于隔离的进程独立于宿主和其它的隔离的进程,因此也称其为容器。

2023-11-05 22:27:59 182

原创 kubenetes认证、授权、准入控制

kube-apiserver是 Kubernetes 最重要的核心组件之一,主要提供以下的功能:提供集群管理的REST API接口,包括认证授权、数据校验以及集群状态变更等;提供其他模块之间的数据交互和通信的枢纽(其他模块通过API Server 查询或修改数据,只有API Server才直接操作etcd)。Kubernetes API的每个请求都会经过多阶段的访问控制之后才会被接受,这包括认证、授权以及准入控制(Admission Control)等。

2023-11-05 14:10:59 195

原创 Raft协议

Raft协议是一种分布式一致性算法。它通过确保多个节点之间的日志复制达成一致,从而保证系统的可靠性和持久性。Raft协议的设计目标是易于理解和实现,并且能够在网络发生分区或节点故障时继续正常工作。相比于其他一致性算法(如Paxos),Raft提供了更强的可读性和模块化性。

2023-08-25 18:27:14 265

原创 spring-RMI及底层实现原理

Java远程方法调用,即Java RMI(Java Remote Method Invocation),是java里一种实现远程过程调用的应用程序编程接口。java RMI极大地依赖于接口。在需要创建一个远程对象时,程序员通过传递一个接口来隐藏底层的实现细节。客户端得到的远程对象句柄正好与本地的桩代码连接,由后者负责透过网络通信。这样一来,程序员只需关心如何通过自己的接口句柄发送消息。在spring中,同样提供了对RMI的支持,使得在spring下的RMI开发变得更方便。/** * 服务接口 */

2021-04-20 19:54:09 584 2

原创 分布式事务框架底层原理(2PC)

事务中的全部操作,要求要么都成功,要么都不成功。通常在同一个jvm中是比较容易做到的。例如数据库JDBC操作的

2021-02-16 13:57:33 235

原创 redis缓存常见问题及解决方案

1、缓存穿透缓存穿透是指查询一个一定不存在的数据(数据库中也没有这个数据),由于缓存不命中,从存储层也查不到数据则不写入缓存,这将导致这个不存在的数据每次请求都要到存储层去查询,失去了缓存的意义。解决方案:布隆过滤器它实际上是由一个很长的二进制数组(或者也叫bitmap)和一系列哈希函数组成,布隆过滤器可以用于检索一个元素是否在一个集合中。如果想判断一个元素是不是在一个集合里,一般想到的是将所有元素保存起来,然后通过比较确定。链表,树等等数据结构都是这种思路. 但是随着集合中元素的增加,我们需要的存储

2021-01-10 20:28:43 546

原创 try-catch-finally处理机制(字节码)

java字节码对于异常的处理:1、统一采用异常表的方式来对异常进行处理。2、当异常处理存在finally语句块时,jvm的处理方式是将finally语句块的字节码拼接到每一个catch块里面。换句话说,程序中存在多少个catch块,就会在每一个catch块后面重复多少个finally语句块的字节码。private String test(){ try { FileInputStream is = new FileInputStream("test.txt");

2020-11-09 09:45:06 197

原创 java字节码整体结构

java字节码整体结构常量池:紧跟着主版本号之后的就是常量池入口。一个java类中定义的很多信息都是由常量池来维护和描述的,可以将常量池看作是class文件的资源仓库,比如说java类中定义的方法与变量信息,都是存储在常量池中的,不仅仅是存储常量。常量池中主要存储两类常量:字面量与符号引用。字面量如文本字符串,java中声明为final的常量值等;而符号引用如类和接口的全限定名,字段的名称和描述符,方法的名称和描述符等。看个例子,看下常量池会维护什么信息...

2020-10-17 16:16:17 89

原创 线程池7大构造参数及关闭

ThreadPoolExecutor类的七大构造参数corePoolSize在创建了线程池后,默认情况下,线程池中并没有任何线程,而是等待有任务到来才创建线程去执行任务。默认情况下,在创建了线程池后,线程池中的线程数为0,当有任务来之后,就会创建一个线程去执行任务,当线程池中的线程数目达到corePoolSize后,就会把到达的任务放到缓存队列当中。maxPoolSize当线程数大于或等于核心线程,且任务队列已满时,线程池会创建新的线程,直到线程数量达到maxPoolSize。如果线程数已等

2020-10-05 18:51:49 170

原创 Spring循环依赖源码分析

关于Spring的依赖注入以及Bean的实例化过程,在Spring自动注入源码分析和Spring-IOC之实例化Bean源码及生命周期分析这俩篇文章已经讲的很清楚了。这里就不重复介绍了,主要来分析下Spring循环依赖问题。@Configuration@ComponentScan("com.su.spring.populate")public class PopulateConfig {}@Servicepublic class UserService { @Autowired

2020-07-30 10:05:00 195

原创 客户端负载均衡与服务端负载均衡的区别

服务端的负载均衡是一个url先经过一个代理服务器(这里是nginx),然后通过这个代理服务器通过算法(轮询,随机,权重等等)反向代理你的服务,来完成负载均衡。而客户端的负载均衡则是一个请求在客户端的时候已经通过eureka获取了要调用服务的集群信息,然后通过具体的负载均衡算法来完成调用具体某个服务。简而言之,服务端负载均衡需要先经过nginx代理服务器才能知道调用服务的集群信息。而客户端负载均衡请求在客户端的时候就已经知道了调用服务的集群信息。...

2020-07-27 19:22:42 3233 1

原创 Spring自动注入源码分析

autowireByName@Configuration@ComponentScan("com.su.spring.common")public class CommonConfig {}@Servicepublic class UserService { UserDao userDao; public void query(){ System.out.println("UserService query() -----------");

2020-07-27 10:34:08 381

原创 Spring-IOC之实例化Bean源码及生命周期分析(Annotation)

spring的后置处理器贯穿了整个spring生命周期,包括bean的实例化和初始化过程,在这个过程中,spring会执行9次后置处理器的调用,我们来逐一分析每个后置处理器的作用吧。在此之前,spring已经完成了前期的一些工作,比如说,已经将BeanDefinition放到了BeanDefinition Map中。所以我们直接从AbstractAutowireCapableBeanFactory#createBean()方法进行分析:...

2020-07-21 15:10:55 198

原创 Spring-Aop流程源码分析

spring aop的整体流程思路是这样的:首先先注册一个专门处理aop的BeanPostProcess,在bean的实例化过程中,从BeanPostProcess的list列表中拿出这个处理aop的BeanPostProcess,判断该bean是否满足advise要求,如果符合,会针对该bean创建一个代理对象,最终在ioc容器中,该beanName对应的实例就是这个代理对象。如果不符合,返回的就还是原生对象。@Configuration@ComponentScan("com.su.spring.ao

2020-07-13 19:33:16 132

原创 mybatis-spring:mapper实例化源码分析

@Mapperpublic interface UserDao { @Select("select * from student where sid=1") String query();}@Configuration@MapperScan("com.su.mybatis.dao")public class MybatisConfig { @Bean public DataSource dataSource(){ DruidDataSource d

2020-07-04 15:56:38 274 1

原创 观察者模式

观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态上发生变化时,会通知所有观察者对象,让他们能够自动更新自己。

2020-06-27 10:24:09 98

原创 Future浅析-实现一个自己的Future

Future表示一个可能还没有完成的异步任务的结果,也可以理解为获取未来执行结果的票据,通过这个票据可以获取异步任务的结果。但是有可能异步任务还没执行结束,这时候你就要等着,这就是为说明调用future.get()的时候,调用线程会陷入阻塞的原因。下面我们自己来模拟实现一个future吧public interface Future<T> { T get() throws InterruptedException;}public class AsynFuture<T&gt

2020-06-18 18:56:26 382

空空如也

空空如也

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

TA关注的人

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