暂时未有相关云产品技术能力~
公众号:做梦都在改BUG,欢迎关注,一起学习,一起进步!
一、今天我们要搞明白的实验 同一个宿主机上的不同容器之间的网络如何互通的??? 二、前置网络知识
为何称MySQL为黑盒? 对于大部分的开发人员而言,编写增删查改的sql语句通过数据库连接去操作数据库,但并不关心数据库是如何监听请求和从连接中把请求数据中提取出来,往往在意表结构,sql执行效率慢就给他们建立索引,完全把MySQL当作黑盒子去使用。
我们在前文已经阐述了Redis 5种基础数据类型详解,分别是字符串(string)、列表(list)、哈希(hash)、集合(set)、有序集合(zset),以及5.0版本中Redis Stream结构详解;那么这些基础类型的底层是如何实现的呢?Redis的每种对象其实都由对象结构(redisObject) 与 对应编码的数据结构组合而成, 本文主要介绍对象结构(redisObject) 部分。
前面讲解了 Kafka 的生产者,而与生产对应的就是消费者,程序中可以通过 KafkaConsumer 来订阅主题,并从订阅的主题中拉取消息。而 Kafka 中消费者比生产者多了个组的概念,也称消费者组,从而提升单机的消费速度。本文将介绍下消费者与消费者组的概念,然后再对客户端开发进行详细讲解。
简介 数据库存储引擎:是数据库底层软件组织,数据库管理系统(DBMS)使用数据引擎进行创建、查询、更新和删除数据。不同的存储引擎提供不同的存储机制、索引技巧、锁定水平等功能,使用不同的存储引擎,还可以获得特定的功能。现在许多不同的数据库管理系统都支持多种不同的数据引擎。MySQL 的核心就是插件式存储引擎。
Disruptor 是一款高性能的有界内存队列,目前应用非常广泛,Log4j2、SpringMessaging、HBase、Storm 都用到了 Disruptor,那 Disruptor 的性能为什么这么高呢?
线程独占 每个线程都会有它独立的空间,随线程生命周期而创建和销毁 线程共享 所有线程能访问这块内存数据,随虚拟机或者GC而创建和销毁
外部服务对于调用者来说一般都是不可靠的,尤其是在网络环境比较差的情况下,网络抖动很容易导致请求超时等异常情况,这时候就需要使用失败重试策略重新调用 API 接口来获取。重试策略在服务治理方面也有很广泛的使用,通过定时检测,来查看服务是否存活。
本文是通过 AnnotationConfigApplicationContext读取配置类来一步一步去了解Spring的启动过程。 在看源码之前,我们要知道某些类的作用,这样更方便后续的了解。
什么是ThreadLocal? ThreadLocal 是一个本地线程副本变量工具类。主要用于将私有线程和该线程存放的副本对象做一个映射,各个线程之间的变量互不干扰。 ThreadLocal怎么使用? ThreadLocl使用比较简单,主要有三个方法:get()、set()、remove()
今天要说的是Nginx服务器高性能优化的配置,如何使Nginx轻松实现10万并发访问量。 通常来说,一个正常的 Nginx Linux 服务器可以达到 500,000 – 600,000 次/秒 的请求处理性能,如果Nginx服务器经过优化的话,则可以稳定地达到 904,000 次/秒 的处理性能,大大提高Nginx的并发访问量。
Spring Boot嵌入式Web容器原理 Spring Boot的目标是构建“非常容易创建、独立、产品级别的基于Spring的应用”。这些应用是“立即可运行的”。在这个过程中,完全没有代码生成,不需要配置任何特殊的XML配置,为了这个目标,Spring Boot在Spring 4.0框架之上提供了很多特性,帮助应用以“约定优于配置”“开箱即用”的方式来启动应用并运行上下文。
Spring Boot Web容器 Web应用开发是企业开发的重要领域,Spring Boot 1.X的Web容器管理方式基于Servlet容器技术栈。Servlet容器主要基于同步阻塞I/O架构,HTTP请求和线程是一对一的关系,主要是TPR模型,即一个请求对应一个线程。主要的业务逻辑也是基于命令式的编程模式。以Spring MVC框架为主,Web容器方面以Tomcat为主,也可以通过自动配置功能改为Jetty/UnderTow容器。
Spring Boot能够迅速地在微服务开发领域流行起来,并影响众多Spring和Java开发社区开发人员,可以说主要原因有两个。
Spring Boot启动 Spring Boot是Spring旗下的一个子项目,其设计目的是简化Spring应用的初始搭建及开发过程,Spring Boot可以快速启动和运行你的Spring应用服务。 Spring Boot概述 Spring Boot本质上是基于Spring内核的一个快速开发框架,是“约定优先于配置”理念下的最佳实践,通过解析Spring Boot的启动过程,可以帮助我们逐渐了解它的工作机制和其背后整合Spring快速开发的实现原理。
限流原理与实战 在通信领域中,限流技术(Time Limiting)被用来控制网络接口收发通信数据的速率,实现通信时的优化性能、较少延迟和提高带宽等。 互联网领域中借鉴了通信领域的限流概念,用来控制在高并发、大流量的场景中对服务接口请求的速率,比如双十一秒杀、抢购、抢票、抢单等场景。 举一个具体的例子,假设某个接口能够扛住的QPS为10 000,这时有20 000个请求进来,经过限流模块,会先放10 000个请求,其余的请求会阻塞一段时间。不简单粗暴地返回404,让客户端重试,同时又能起到流量削峰的作用。
JVM 对 Java 有多重要,对程序员面试有多重要,这些不用多说。 如果你还没意识到学 JVM 的必要性,或者不知道怎么学 JVM,那么看完这篇文章,你就能知道答案了。 曾经的我很不屑于学 JVM,但是后来发现不学不行。这就像和媳妇吵架之后我不想道歉一样,不道歉那是不可能的,道歉是早晚的事儿,逃不掉。 后来我明白了: 认怂越晚,结局越惨。
对于Nacos大家应该都不太陌生,出身阿里名声在外,能做动态服务发现、配置管理,非常好用的一个工具。然而这样的技术用的人越多面试被问的概率也就越大,如果只停留在使用层面,那面试可能要吃大亏。
作为一个程序员,经常需要读一些开源项目的源码。同时呢,读源码对我们也有很多好处: 1.提升自己 2.修复 Bug 3.增加新功能
一、Spring IoC的容器体系 IoC容器是Spring的核心模块,是抽象了对象管理、依赖关系管理的框架解决方案。Spring 提供了很多的容器,其中 BeanFactory 是顶层容器(根容器),不能被实例化,它定义了所有 IoC 容器 必须遵从的一套原则,具体的容器实现可以增加额外的功能,比如我们常用到的ApplicationContext,其下更具体的实现如 ClassPathXmlApplicationContext 包含了解析 xml 等一系列的内容, AnnotationConfigApplicationContext 则是包含了注解解析等一系列的内容。
很多人都认为性能是在通过编写代码(程序代码或者是数据库代码)的过程中优化出来的,其实这是一个非常大的误区。真正影响性能最大的部分是在设计中就已经产生了的,后期的优化很多时候所能够带来的改善都只是在解决前妻设计所遗留下来的一些问题而已,而且能够解决的问题通常也比较有限。 博主将就如何在 MySQL 数据库 Schema 设计的时候保证尽可能的高效,尽可能减少后期的烦恼会分3篇文章来进行详细介绍!
微服务迁移不是一个小更改。你必须搞清楚它是否真的能解决你的问题,否则你可能会创建一个会杀死你的、乱糟糟的实体。 单体有不同类型,其中一些可能是有效的,足以满足业务需求。单体不是一个应该被杀死的敌人。 微服务关乎独立部署。有一些分解和增量更改模式可以帮助你评估并迁移到微服务架构。 当你开始使用微服务时,你会意识到随之而来的是一系列非常复杂的挑战。所以不应该将微服务作为默认选择。你得仔细考虑它们是否适合你。
1.序 这个是数据库相对来说底层的东西,所以面试官一般很喜欢问,我记得字节,阿里等大厂的面试官都会问这个,所以今天我们来彻底的学会它。 2.简略版本 我记得面试官在问到数据库时:“用过数据库吧,奥,用过就行,那用过select语句吗?就比如 select * from student where studentId = 1;这个语句在数据库底层是怎么执行的,可以讲讲吗?” 这个时候不要慌,来到我们秀的时间了。如上图,我建议大家脑子里都有一个这样的图,当我们有这样一个图的时候我们就可以很简单直接的把答案说出来。
众所周知的并发编程三大特性;原子性、可见性、有序性;但是这些特性的起源你知道吗? 可见性:正是由于CPU存在缓存,导致了变量修改的不可见性; 原子性:线程切换是基于CPU指令而不是高级语言中的一行代码,线程切换可以发生在任意一条CPU指令执行之前,完成之后,因此只能保证CPU指令的原子性; 有序性:最诡异的特性,一行代码被拆分成多个CPU指令,但是为了保持高性能,编译器对其做了排序,可能导致顺序改变。 好了,以上的三大特性已经了解了,但是如何解决这些问题呢?
场景 大家如果是做后端开发的,想必都实现过列表查询的接口,当然有的查询条件很简单,一条 SQL 就搞定了,但有的查询条件极其复杂,再加上库表中设计的各种不合理,导致查询接口特别难写,然后加班什么的就不用说了(不知各位有没有这种感受呢~)。 下面以一个例子开始,这是某购物网站的搜索条件,如果让你实现这样的一个搜索接口,你会如何实现?(当然你说借助搜索引擎,像 Elasticsearch 之类的,你完全可以实现。但我这里想说的是,如果要你自己实现呢?)
数据库连接池的配置是开发者们常常搞出坑的地方,在配置数据库连接池时,有几个可以说是和直觉背道而驰的原则需要明确。 1万并发用户访问 想象你有一个网站,压力虽然还没到Facebook那个级别,但也有个1万上下的并发访问——也就是说差不多2万左右的TPS。那么这个网站的数据库连接池应该设置成多大呢?结果可能会让你惊讶,因为这个问题的正确问法是: “这个网站的数据库连接池应该设置成多小呢?” 下面这个视频是Oracle Real World Performance Group发布的,请先看完:http://www.dailymotion.com/video/x2s8uec
因为家人得关系,正好,最近也有时间,再梳理自己的知识点,打算明年找个技术试一下,遂整理再日常得开发工作中,常用得一些开发小技巧,开发环境就是我们的常用得Java8以及junit,个人觉得平时在联系得时候,junit还是非常好用得 希望看到这份文章得朋友,能够自己动手实践一下,实践出真知,好啦,话不多说,我们开始正题吧 函数式编程 匿名函数 λ演算 流式编程 基本原理 在Java中流式编程的基本原理有两点。 构建流 数据流转(流水线) 规约
在《Java虚拟机规范》的规定里,除了程序计数器外,虚拟机内存的其他几个运行时区域都有发生 OutOfMemoryError 异常的可能。 本篇主要包括如下 OOM 的介绍和示例: java.lang.StackOverflowError java.lang.OutOfMemoryError: Java heap space java.lang.OutOfMemoryError: GC overhead limit exceeded java.lang.OutOfMemoryError-->Metaspace
单线程的Redis一向以简洁高效著称,但也有其阿喀琉斯之踵:阻塞!单个线程在最容易产生瓶颈的网络读写(Redis的key)请求完成之前,其他所有请求都将会被阻塞,严重影响其效率,因此Redis的多线程呼声就越来越高。由于是基于内存的操作延迟非常低,所以即便是单线程模式下CPU资源也不会是的瓶颈。最容易出现瓶颈的还是网络IO操作。在Redis 6.0开始支持多线程之后,所谓的多线程也只是socket层面的多线程,核心的内存读写还是单线程模式。
在日常工作中,发现 MySQL 的状态不太对劲的时候,一般都会看看监控指标,很多时候会看到 熟悉的一幕: CPU 使用率又爆了。 本 文将给大家介绍 MySQL 和 CPU 之间的关系,对此有一定的了解之后可以更准确的判断出问题的原因,也能够提前发现一些引发 CPU 问题的隐患。
前面我们介绍了通过turbine直接聚合多个服务的监控信息,实现了服务的监控,但是这种方式有个不太好的地方就是turbine和服务的耦合性太强了,针对这个问题,我们可以将服务的监控消息发送到RabbitMQ中,然后turbine中RabbitMQ中获取获取监控消息,这样就实现类服务和turbine的解耦。 我们通过案例来演示下如何实现该效果 一、启动RabbitMQ服务 显然我们需要安装启动一个RabbitMQ服务 二、创建consumer服务 创建一个consumer服务,同时要将dashboard的监控信息发送到RabbitMQ服务中。 1.创建项目
为什么使用消息队列?消息队列****的****优点和缺点?kafka、activemq、rabbitmq、rocketmq都有什么优缺点? 面试官角度分析: (1)你知不知道你们系统里为什么要用消息队列这个东西? (2)既然用了消息队列这个东西,你知不知道用了有什么好处? (3)既然你用了MQ,那么当时为什么选用这一款MQ? 为什么使用消息队列? 面试官问这个问题的期望之一的回答是,你们公司有什么业务场景,这个业务场景有什么技术挑战,如果不用MQ可能会很麻烦,但是再用了之后带来了很多好处。 消息队列的常见使用场景有很多但是核心的有三个:解耦、异步、削峰
基于 Redis 的分布式锁对大家来说并不陌生,可是你的分布式锁有失败的时候吗?在失败的时候可曾怀疑过你在用的分布式锁真的靠谱吗?以下是结合自己的踩坑经验总结的一些经验之谈。 你真的需要分布式锁吗? 用到分布式锁说明遇到了多个进程共同访问同一个资源的问题。一般是在两个场景下会防止对同一个资源的重复访问: 提高效率。比如多个节点计算同一批任务,如果某个任务已经有节点在计算了,那其他节点就不用重复计算了,以免浪费计算资源。不过重复计算也没事,不会造成其他更大的损失。也就是允许偶尔的失败。 保证正确性。这种情况对锁的要求就很高了,如果重复计算,会对正确性造成影响。这种不允许失败。
随着我们网站用户的增多,我们会逐渐意识到HTTPS加密的重要性。在不修改现有代码的情况下,要从HTTP升级到HTTPS,让Nginx支持HTTPS是个很好的选择。今天我们来讲下如何从Nginx入手,从HTTP升级到HTTPS,同时支持静态网站和SpringBoot应用,希望对大家有所帮助! 生成SSL自签名证书 虽然自签名证书浏览器认为并不是安全的,但是学习下SSL证书的生成还是很有必要的! 首先创建SSL证书私钥,期间需要输入两次用户名和密码,生成文件为blog.key;
通用的CP系统有etcd和consul, 通用的对立面就是专用系统. 所以在某些场合是有这种需求的. 然而etcd embed的可用性极差, Windows上面跑会出现各种问题, 而且不能定制协议, 你必须得用etcd定义好的协议和客户端来和etcd集群通讯. 所以这时候的选择: 忍着 自己实现一个raft算法库, 在这上面做应用 有一定的可能性, 起码MIT 6.824可以做出来, 但是和工业应用还是有很大的差距 找一个工业级raft库, 然后在这上面做应用
所谓的副本机制(Replication),也可以称之为备份机制,通常是指分布式系统在多台网络互联的机器上保存有相同的数据拷贝。副本机制有什么好处呢? 1. 提供数据冗余。即使系统部分组件失效,系统依然能够继续运转,因而增加了整体可用性以及数据持久性。 2. 提供高伸缩性。支持横向扩展,能够通过增加机器的方式来提升读性能,进而提高读操作吞吐量。 3. 改善数据局部性。允许将数据放入与用户地理位置相近的地方,从而降低系统延时。
反射是 Java 语言中一个相当重要的特性,它允许正在运行的 Java 程序观测,甚至是修改程序的动态行为。 举例来说,我们可以通过 Class 对象枚举该类中的所有方法,我们还可以通过Method.setAccessible(位于 java.lang.reflect 包,该方法继承自 AccessibleObject)绕过 Java 语言的访问权限,在私有方法所在类之外的地方调用该方法。 反射在 Java 中的应用十分广泛。开发人员日常接触到的 Java 集成开发环境(IDE)便运用了这一功能:每当我们敲入点号时,IDE 便会根据点号前的内容,动态展示可以访问的字段或者方法。
前言 在最近的业务中,接到了一个需要处理约十万条数据的需求。这些数据都以字符串的形式给到,并且处理它们的步骤是异步且耗时的(平均处理一条数据需要 25s 的时间)。如果以串行的方式实现,其耗时是相当长的: 总耗时时间 = 数据量 × 单条数据处理时间 T = N * t (N = 100,000; t = 25s) 总耗时时间 = 2,500,000 秒 ≈ 695 小时 ≈ 29 天 显然,我们不能简单地把数据一条一条地处理。那么有没有办法能够减少处理的时间呢?经过调研后发现,使用异步任务队列是个不错的办法。
千里之堤,溃于蚁穴。一个在完美的架构,因为一个慢Sql,会导致系统直接崩溃。总结了一些解决慢sql的方法,供参考。 一、慢sql优化 订阅每日慢日志,优先解决调用次数多的慢sql,因慢sql优化的知识点非常多,只列举几个容易忽视的地方。 注意: 1、数据量不同,查询条件不同,sql使用的索引可能是不一样的,要构造多种查询条件去测试。 2、避免所有字段都返回,尽量使用覆盖索引,解决慢sql问题,终归是与库的磁盘IO、CPU做抗争。 3、避免隐式转换造成的索引无法使用问题。
本文将从上层介绍Linux上的TCP/IP栈是如何工作的,特别是socket系统调用和内核数据结构的交互、内核和实际网络的交互。写这篇文章的部分原因是解释监听队列溢出(listen queue overflow)是如何工作的,因为它与我工作中一直在研究的一个问题相关。 建好的连接怎么工作 先从建好的连接开始介绍,稍后将解释新建连接是如何工作的。
前言 ClassLoader 可以说是 Java 最为神秘的功能之一了,好像大家都知道怎么回事儿 (双亲委派模型好像都都能说得出来...),又都说不清楚具体是怎么一回事 (为什么需要需要有什么实际用途就很模糊了...)。 今天,我们就来深度扒一扒,揭开它神秘的面纱!
今天简单讲下 Git 的实现原理,知其所以然才能知其然;并且梳理了日常最常用的 12 个命令,分为三大类分享给你。 如果觉得不错的话,一定要点个关注哦 本文的结构如下: 作者和开发原由 Git 的数据模型 常用命令 资源推荐 作者和开发原由 Talk is cheap. Show me the code. 这句话就出自 Linux 和 Git 的作者Linus Torvalds。 原本 Linux 内核的版本控制系统是用的 BitKeeper,然而 2005 年,BitMover 公司不再让 Linux 开发团队免费使用了。。 Linus 一听,不给用了?老子自己写!
最近在看一个同学代码的时候,发现代码中大量使用了 Google 开源的 Guava 核心库中的内容,让代码简单清晰了不少,故学习分享出 Guava 中我认为最实用的功能。 Guava项目是 Google 公司开源的 Java 核心库,它主要是包含一些在 Java 开发中经常使用到的功能,如 数据校验 、 不可变集合 、计数集合,集合增强操作、I/O、缓存、字符串操作等。并且 Guava 广泛用于 Google 内部的 Java 项目中,也被其他公司广泛使用,甚至在新版 JDK 中直接引入了 Guava 中的优秀类库,所以质量毋庸置疑。 使用方式直接 mavan 依赖引入。
首先说下问题现象:内网sandbox环境API持续1周出现应用卡死,所有api无响应。刚开始当测试抱怨环境响应慢的时候 ,我们重启一下应用,应用恢复正常,于是没做处理。但是后来问题出现频率越来越频繁,越来越多的同事开始抱怨,于是感觉代码可能有问题,开始排查。首先发现开发的本地ide没有发现问题,应用卡死时候数据库,redis都正常,并且无特殊错误日志。开始怀疑是sandbox环境机器问题,测试环境本身就很脆!_!于是ssh上了服务器 执行以下命令top
Hello!在北京做Java如何做到月薪上万,很简单,只要会秒杀,即可轻松做到月薪上万。 高性能: 秒杀设计大量的并发读和并发写,因此支持高并发访问这点相当的重要。 一致性:秒杀商品减库存的实现方式同样很关键,有限数量的商品在同一时刻被很多倍的请求同时来减少库存,在大并发更新的时候都要保证数据的准确性。 高可用:秒杀系统在一瞬间都会涌入大量的流量,为了避免系统宕机,需要高可用,需要做好流量限制。
随着技术的更新迭代,Java5.0开始支持注解。而作为java中的领军框架spring,自从更新了2.5版本之后也开始慢慢舍弃xml配置,更多使用注解来控制spring框架。 而spring的的注解那么多,可能做java很多年,都用不上。这里按照类型总结了这7种最常用的注解。 一. 核心注解 @Require 此注解用于bean的setter方法上。表示此属性是必须的,必须在配置阶段注入,否则会抛出BeanInitializationExcepion。 @Autowired 此注解用于bean的field、setter方法以及构造方法上,显式地声明依赖。根据type来autowiring。
下面介绍一下线程池执行任务的流程,理解各个属性的意义。当一个线程池初始化,向线程池提交任务,线程池新建线程执行任务,随着线程创建,线程数逐渐增多,当达到 corePoolSize 线程池将不再新建线程,而是将任务放入任务等待队列 workQueue 。再持续向线程池提交任务,当等待队列满了,这时会继续新建线程,直到到达最大线程数 maximumPoolSize,如果还继续有任务到来,线程池无法处理,这时就启动拒绝策略。
1.什么是kafka Kafka是分布式发布-订阅消息系统,它最初是由LinkedIn公司开发的,之后成为Apache项目的一部分,Kafka是一个分布式,可划分的,冗余备份的持久性的日志服务,它主要用于处理流式数据。 2.为什么要使用 kafka,为什么要使用消息队列 缓冲和削峰: 上游数据时有突发流量,下游可能扛不住,或者下游没有足够多的机器来保证冗余,kafka在中间可以起到一个缓冲的作用,把消息暂存在kafka中,下游服务就可以按照自己的节奏进行慢慢处理。 解耦和扩展性: 项目开始的时候,并不能确定具体需求。消息队列可以作为一个接口层,解耦重要的业务流程。只需要遵守约定,针对数据
在一个Java程序员工作3、5年之后,已经可以承担起大部分的核心开发工作,成长为团队中的高级开发人员。大部分工作中遇到的问题都已经可以自行解决。这个阶段很多同学会面临着新的成长困惑,到底接下来自己还需要在哪些方面继续提升?如何能够成长为团队里面的架构师呢? 市面上有很多分析和拆解架构师能力的书籍,例如《聊聊架构》《亿级流量网站架构核心技术》《大型网站技术架构:核心原理与案例分析》等,书中有一些相关的实战和理论知识分享。这些书籍如果有时间推荐大家去读一读。
前言 在多线程、多处理器、分布式环境的编程时代,并发是一个不可回避的问题。既然并发问题摆在面前一个到无法回避的坎,倒不如拥抱它,把它搞清楚,花一定的时间从操作系统底层原理到Java的基础编程再到分布式环境等几个方面深入探索并发问题。先就从原理开始吧。 计算机系统层次结构 早期计算机系统的层次 最早的计算机用机器语言编程,机器语言称为第一代程序设计语言 现代(传统)计算机系统的层次 现代计算机用高级语言编程 第三代程序设计语言(3GL)为过程式 语言,编码时需要描述实现过程,即“ 如何做”。 第四代程序设计语言(4GL) 为非过程 化语言,编码时只需说明“做什么”, 不需要描述具体