- 博客(42)
- 收藏
- 关注
原创 解决远程调用三方接口:javax.net.ssl.SSLHandshakeException:sun.security.validator.ValidatorException报错
最近在对接腾讯会议API接口,在鉴权完成后开始调用对方的接口,在此过程中出现调用报错:javax.net.ssl.SSLHandshakeException。
2024-08-22 17:51:34 1598
原创 ElasticSearch基本介绍和Windows环境安装
ElasticSearch(简称ES)Elasticsearch是用Java开发并且是当前最流行的开源的企业级搜索引擎。能够达到实时搜索,稳定,可靠,快速,安装使用方便。客户端支持Java、.NET(C#)、PHP、Python、Ruby等多种语言。1.2 ElasticSearch与Lucene的关系Lucene可以被认为是迄今为止最先进、性能最好的、功能最全的搜索引擎库(框架)但是想要使用Lucene,必须使用Java来作为开发语言并将其直接集成到你的应用中,并且Lucene的配置及使用非常
2022-04-23 16:18:20 608
原创 Docker网络原理
Docker网络原理当我们用ip addr命令查看服务器内部网络地址时,可以发现三个地址:[root@ecs-98457 ~]# docker run -d -P --name tomcat01 tomcatUnable to find image 'tomcat:latest' locallylatest: Pulling from library/tomcatdbba69284b27: Pull complete 9baf437a1bad: Pull complete 6ade5c59e
2022-04-17 11:33:04 1467
原创 Docker部署Redis集群
部署Redis集群redis集群高可用部署 我们定义6个redis节点 利用三主三从实现redis高可用# 自定义一个网络[root@ecs-98457 ~]# docker network create redis --subnet 172.38.0.0/1608c633236a59151a68272d44be289c01f23e0d74adff1ff018ed936b25818066# 通过脚本创建6个redis配置[root@ecs-98457 ~]# for port in $(seq
2022-04-11 20:34:30 667
原创 Dokcer构建镜像以及发布镜像
常见指令FROM # 基础镜像,从此开始构建MAINTAINER # 镜像作者,通常为姓名+邮箱RUN # 镜像构建时需要执行的命令ADD # 在镜像中需要添加的文件(比如基础镜像centos中要添加tomcat)WORKDIR # 镜像的工作目录VOLUME # 容器数据卷,挂载主机的目录EXPOSE # 对外的暴露端口CMD # 指定容器启动时要运行的命令(只有最后一个生效,可被替代)ENTRYPOINT # 指定容器启动时要运行的命令(可以追加命
2022-04-09 22:04:15 1484
原创 Docker容器挂载
docker的理念:将应用和环境打包成一个镜像!通过镜像启动容器运行问题:在容器中存储的程序数据是需要持久化的,不能容器删了数据也随之删除。比如,安装一个MySQL容器,在其中存储了大量数据,结果把容器删了数据也没了,就相当于删库跑路,这是不可能发生的数据卷技术的引入:我们希望Docker容器产生的数据可以自动同步到本地,这样容器删了数据并不会丢失;同时数据也可在容器之间共享。这就是卷技术,也就是目录的挂载,将容器内的目录挂载到linux上总结:容器的持久化和同步操作!容器间也可以实现数据共享!使
2022-04-07 16:16:29 11571 2
原创 docker commit镜像
当我们通过镜像启动一个容器时,分为了两层:容器层和镜像层;镜像层是可读的,容器层可写,我们的所有操作都是基于容器层,当我们对容器层修改完后,就可以再将修改后的容器层和不变的镜像曾一起打包成一个新的镜像,也就是本节要讲的Commit镜像提交容器成为一个新的副本docker commitdocker commit -m=“提交的描述信息” -a=“作者” 容器id 目标镜像名:[TAG]#进入tomcat容器修改webapps[root@ecs-98457 ~]# docker exec -it 6
2022-04-06 20:29:32 429
原创 Docker部署应用案例
一、部署nginx# 1. 搜索镜像docker search nginx# 2. 下载镜像docker pull nginx# 3. 查看镜像是否下载成功docker images# 4. 启动容器(-d:后台运行 --name:容器名 -p:暴露端口 宿主机端口3344:容器端口80)docker run -d --name nginx01 -p 3344:80 nginx# 5. 查看容器是否启动docker ps# 6. 本机测试curl localhost:334
2022-04-06 12:17:02 5078
原创 Docker基本命令
1. Docker常用命令1.1 基础命令docker version #查看docker的版本信息docker info #查看docker的系统信息,包括镜像和容器的数量docker 命令 --help #帮助命令(可查看可选的参数)docker COMMAND --help命令的帮助文档地址:https://docs.docker.com/engine/reference/commandline/docker/1.2 镜像命令1.d...
2022-04-02 22:08:25 285
原创 Docker基本介绍和安装
1. Docker概述(1)基本介绍Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从 Apache2.0 协议开源。Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低。Docker 从 17.03 版本之后分为 CE(Community Edition: 社区版) 和 EE(En
2022-04-02 21:59:10 1448
原创 Docker 启动报错 See “systemctl status docker.service“ and “journalctl -xe“ for details.
systemctl start docker 启动报错Job for docker.service failed because start of the service was attempted too often. See “systemctl status docker.service” and “journalctl -xe” for details.[root@ecs-98457 docker]# systemctl status docker.service● docker.servic
2022-04-02 21:13:56 4489 1
原创 mongoDB基本介绍
Mongo 是 humongous 的中间部分,在英文里是“巨大无比”的意思。所以 MongoDB 可以翻译成“巨大无比的数据库”,更优雅的叫法是“海量数据库”。Mongodb是一款非关系型数据库,说到非关系型数据库,区别于关系型数据库最显著的特征就是没有SQL语句,数据没有固定的数据类型,关系数据库的所使用的SQL语句自从 IBM 发明出来以后,已经有 40 多年的历史了,但是时至今日,开发程序员一般不太喜欢这个东西,因为它的基本理念和程序员编程的想法不一致。后来所谓的NoSQL 风,指的就是那些不用 S
2022-03-31 17:05:46 1527
原创 Mysql分库分表工具ShardingSphere
ShardingSphere是一款起源于当当网内部的应用框架。2015年在当当网内部诞生,最初就叫ShardingJDBC。2016年的时候,由其中一个主要的开发人员张亮,带入到京东数科,组件团队继续开发。在国内历经了当当网、电信翼支付、京东数科等多家大型互联网企业的考验,在2017年开始开源。并逐渐由原本只关注于关系型数据库增强工具的ShardingJDBC升级成为一整套以数据分片为基础的数据生态圈,更名为ShardingSphere。到2020年4月,已经成为了Apache软件基金会的顶级项目。Sha
2022-03-30 15:43:59 5720 1
原创 Mysql分库分表
1、分库分表有什么用分库分表就是为了解决由于数据量过大而导致数据库性能降低的问题,将原来独立的数据库拆分成若干数据库组成,将数据大表拆分成若干数据表组成,使得单一数据库、单一数据表的数据量变小,从而达到提升数据库性能的目的。例如:微服务架构中,每个服务都分配一个独立的数据库,这就是分库。而对一些业务日志表,按月拆分成不同的表,这就是分表。单表数据量大于500W或数据量大于2G就需要考虑分库分表了。2、分库分表的方式分库分表包含分库和分表 两个部分,而这两个部分可以统称为数据分片,其目的都是将数
2022-03-28 17:55:17 5402
原创 Mysql高可用
一、基础理论主从架构有什么用?通过搭建MySQL主从集群,可以缓解MySQL的数据存储以及访问的压力。1、数据安全给主服务增加一个数据备份。基于这个目的,可以搭建主从架构,或者也可以基于主从架构搭建互主的架构。2、读写分离对于大部分的JAVA业务系统来说,都是读多写少的,读请求远远高于写请求。这时,当主服务的访问压力过大时,可以将数据读请求转为由从服务来分担,主服务只负责数据写入的请求,这样大大缓解数据库的访问压力。要理解,MySQL的主从架构只是实现读写分离的一个基础。实现读写分离还是需要
2022-03-28 17:16:39 923
原创 Kafka核心原理
Kafka核心总控制器Controller在Kafka集群中会有一个或者多个broker,其中有一个broker会被选举为控制器(Kafka Controller),它负责管理整个集群中所有分区和副本的状态。当某个分区的leader副本出现故障时,由控制器负责为该分区选举新的leader副本。当检测到某个分区的ISR集合发生变化时,由控制器负责通知所有broker更新其元数据信息。当使用kafka-topics.sh脚本为某个topic增加分区数量时,同样还是由控制器负责让新分区被其他节点感
2022-03-23 19:24:00 279
原创 Kafka基本介绍
Kafka是最初由Linkedin公司开发,是一个分布式、支持分区的(partition)、多副本的(replica),基于zookeeper协调的分布式消息系统,它的最大的特性就是可以实时的处理大量数据以满足各种需求场景:比如基于hadoop的批处理系统、低延迟的实时系统、Storm/Spark流式处理引擎,web/nginx日志、访问日志,消息服务等等,用scala语言编写,Linkedin于2010年贡献给了Apache基金会并成为顶级开源 项目Kafka的使用场景日志收集:一个公司可以用Kafk
2022-03-06 13:51:05 1142
原创 RocketMQ常见生产问题
一、如何保证消息不丢失1,2,4三个场景都是跨网络(生产者和MQ服务之间 、主从同步之间、消费者和MQ之间)然后关于3(数据存储到硬盘)这个环节,通常MQ存盘时都会先写入操作系统的缓存page cache中,然后再由操作系统异步的将消息写入硬盘。这个中间有个时间差,就可能会造成消息丢失。如果服务挂了,缓存中还没有来得及写入硬盘的消息就会丢失。针对场景1 ——生产者与MQ之前使用MQ事务以订单系统为例:1、为什么要发送个half消息?有什么用?这个half消息是在订单系统进行
2022-03-03 21:22:34 694
原创 RocketMQ消息存储
1、何时存储消息分布式队列因为有高可靠性的要求,所以数据要进行持久化存储。1. MQ收到一条消息后,需要向生产者返回一个ACK响应,并将消息存储起来。2. MQ Push一条消息给消费者后,等待消费者的ACK响应,需要将消息标记为已消费。如果没有标记为消费,MQ会不断的尝试往消费者推送这条消息。3. MQ需要定期删除一些过期的消息,这样才能保证服务一直可用2、消息存储介质RocketMQ采用的是类似于Kafka的文件存储机制,即直接用磁盘文件来保存消息,而不需要借助MySQL这一类索引工具。
2022-03-02 08:51:49 2706
原创 RocketMQ消息类型
RocketMQ集群架构一个完整的RocketMQ集群中,有如下几个角色Producer:消息的发送者;举例:发信者Consumer:消息接收者;举例:收信者Broker:暂存和传输消息;举例:邮局NameServer:管理Broker;举例:各个邮局的管理机构Topic:区分消息的种类;一个发送者可以发送消息给一个或者多个Topic;一个消息的接收者可以订阅一个或者多个Topic消息RocketMQ的消息样例1、基本样例:W基本样例部分我们使用消息生产者分别通过三
2022-03-01 20:57:37 1767
原创 RocketMQ基本介绍
MQ:MessageQueue,消息队列。 队列,是一种FIFO 先进先出的数据结构。消息由生产者发送到MQ进行排队,然后按原来的顺序交由消息的消费者进行处理。QQ和微信就是典型的MQ。MQ的作用主要有以下三个方面:异步例子:快递员发快递,直接到客户家效率会很低。引入菜鸟驿站后,快递员只需要把快递放到菜鸟驿站,就可以继续发其他快递去了。客户再按自己的时间安排去菜鸟驿站取快递。作用:异步能提高系统的响应速度、吞吐量。解耦例子:《Thinking in JAVA》很经典,但是都是英文,我们看不懂
2022-03-01 20:56:05 2565
原创 RabbitMQ 高级特性
1.1 消息的可靠投递在使用 RabbitMQ 的时候,作为消息发送方希望杜绝任何消息丢失或者投递失败场景。RabbitMQ 为我们提供了两种方式用来控制消息的投递可靠性模式。 confirm 确认模式 return 退回模式 rabbitmq 整个消息投递的路径为:producer--->rabbitmq broker--->exchange--->queue--->consumer 消息从 producer 到 exchange 则会返回一个 c.
2022-02-20 15:54:08 892
原创 rabbitMQ基本介绍
MQ全称 Message Queue(消息队列),是在消息的传输过程中保存消息的容器。多用于分布式系统之间进行通信。AMQP,即 Advanced Message Queuing Protocol(高级消息队列协议),是一个网络协议,是应用层协议的一个开放标准,为面向消息的中间件设计。基于此协议的客户端与消息中间件可传递消息,并不受客户端/中间件不同产品,不同的开发语言等条件的限制。2006年,AMQP 规范发布。类比HTTP。2007年,Rabbit 技术公司基于 AMQP 标准开发的 RabbitM
2022-02-15 13:40:32 189
原创 分布式事务
本地事务在计算机中,更多的是通过关系型数据库来控制事务,这是利用数据库本身的事务特性来实现的,因此叫数据库事务,由于应用主要靠数据库来控制事务,而数据库统称和应用在同一个服务器,所以基于关系型数据库的事务又被称为本地事务。分布式事务分布式系统会把一个应用系统拆分为可独立部署的多个服务,因此需要服务与服务之间远程协作才能完成事务操作,这种分布式系统环境下由于不同的服务之间网络远程协作完成事务称之为分布式事务,例如用户注册送积分事务,创建顶戴减库存事务。分布式事务产生场景分布式事务基础理论
2022-01-18 20:05:56 169
原创 线程池原理
在web开发中,服务器需要接受并处理请求,所以会为一个请求来分配一个线程来进行处理。如果每次请求都新创建一个线程的话实现起来非常简便,但是存在一个问题:如果并发的请求数量非常多,但每个线程执行的时间很短,这样就会频繁的创建和销毁线程,如此一来会大大降低系统的效率。可能出现服务器在为每个请求创建新线程和销毁线程上花费的时间和消耗的系统资源要比处理实际的用户请求的时间和资源更多。线程池:顾名思义就是一个线程缓存,当线程执行完一个任务,并不被销毁,而是可以继续执行其他的任务。线程池为线程生命周期的开销和资源不
2021-12-27 10:13:21 109
原创 多线程限流及线程等待执行( Semaphore, CountDownLatch)
Semaphore 使用及应用场. Semaphore 是什么?Semaphore 字面意思是信号量的意思,它的作用是控制访问特定资源的线程数目,底层依赖AQS的状态State,是在生产当中比较常用的一个工具类。2. 怎么使用 Semaphore?2.1 构造方法1 public Semaphore(int permits) 2 public Semaphore(int permits, boolean fair)permits 表示许可线程的数量fair 表示公平性,如果这个设为 true
2021-12-26 12:33:51 655
原创 ReentrantLock核心原理
ReentrantLock是一种基于AQS框架的应用实现,是JDK中的一种线程并发访问的同步手段,它的功能类似于synchronized是一种互斥锁,可以保证线程安全。而且它具有比synchronized更多的特性,比如它支持手动加锁与解锁,支持加锁的公平性。1 使用ReentrantLock进行同步2 ReentrantLock lock = new ReentrantLock(false);//false为非公平锁,true为公平锁3 lock.lock() //加锁4 lock.unlock
2021-12-25 13:03:52 138
原创 synchronized原理详解
synchronized内置锁是一种对象锁(锁的是对象而非引用),作用粒度是对象,可以用来实现对临界资源的同步互斥访问,是可重入的。加锁的方式:1、同步实例方法,锁是当前实例对象2、同步类方法,锁是当前类对象3、同步代码块,锁是括号里面的对象synchronized底层原理synchronized是基于JVM内置锁实现,通过内部对象Monitor(监视器锁)实现,基于进入与退出Monitor对象实现方法与代码块同步,监视器锁的实现依赖底层操作系统的Mutex lock(互斥锁)实现,它是一个重量
2021-12-24 16:54:32 503
原创 volatile如何保证可见性:MESI缓存一致性
CPU为何要有高速缓存CPU在摩尔定律的指导下以每18个月翻一番的速度在发展,然而内存和硬盘的发展速度远远不及CPU。这就造成了高性能能的内存和硬盘价格及其昂贵。然而CPU的高度运算需要高速的数据。为了解决这个问题,CPU厂商在CPU中内置了少量的高速缓存以解决I\O速度和CPU运算速度之间的不匹配问题。在CPU访问存储设备时,无论是存取数据抑或存取指令,都趋于聚集在一片连续的区域中,这就被称为局部性原理。时间局部性(TemporalLocality):如果一个信息项正在被访问,那么在近期它很可能还会.
2021-12-23 17:04:40 224
原创 git撤销commit和push操作
commit之后撤销commit:执行完commit后,想撤回commit,怎么办?git reset --soft HEAD^这样就成功的撤销了你的commit注意,仅仅是撤回commit操作,您写的代码仍然保留。HEAD^的意思是上一个版本,也可以写成HEAD~1如果你进行了2次commit,想都撤回,可以使用HEAD~2撤销已经push到远程仓库的代码提交:1.撤销提交信息首先,通过git log查看提交信息,以便获取需要回退至的版本号比如需要撤销 “modified for e
2021-12-23 15:16:10 1890
原创 Redis主从复制、哨兵、集群
Redis主从工作原理如果你为master配置了一个slave,不管这个slave是否是第一次连接上Master,它都会发送一个PSYNC命令给master请求复制数据。master收到PSYNC命令后,会在后台进行数据持久化通过bgsave生成最新的rdb快照文件,持久化期间,master会继续接收客户端的请求,它会把这些可能修改数据集的请求缓存在内存中。当持久化进行完毕以后,master会把这份rdb文件数据集发送给slave,slave会把接收到的数据进行持久化生成rdb,然后再加载到内存中。
2021-12-22 23:31:50 394
原创 redis持久化与淘汰策略
RDB快照(snapshot):在默认情况下, Redis 将内存数据库快照保存在名字为 dump.rdb 的二进制文件中。你可以对 Redis 进行设置, 让它在“ N 秒内数据集至少有 M 个改动”这一条件被满足时, 自动保存一次数据集。比如说, 以下设置会让 Redis 在满足“ 60 秒内有至少有 1000 个键被改动”这一条件时, 自动保存一次数据集:save 60 1000 //关闭RDB只需要将所有的save保存策略注释掉即可AOF(append-only file):从 1
2021-12-22 15:57:01 726
原创 Redis分布式锁
redis分布式锁应用场景:秒杀、大促之类的活动,在并发情况下对同一资源的访问redis实现分布式锁: @Autowired @Qualifier("redisTemplate") private RedisTemplate<String, Object> redisTemplate; public Boolean redisLock() throws Exception { //生成分布式锁redis key Strin
2021-12-22 14:11:39 401
原创 Redis高性能与数据结构
Redis的单线程和高性能redis是单线程的?Redis 的单线程主要是指 Redis 的网络 IO 和键值对读写是由一个线程来完成的 即当客户端发起命令 这些命令在并发发起的时候 在redis中是对命令排队去执行 执行命令的操作是单个线程执行的。但Redis的其他功能,比如持久化、异步删除、集群数据同步等,其实是由额外的线程执行的。redis的高性能所有的数据都在内存中,所有的运算都是内存级别的运算,而且单线程避免了多线程的切换性能损耗问题。注意:正因为 Redis 是单线程,..
2021-12-21 19:29:10 943
原创 Redis Lua脚本
Redis Lua脚本Redis在2.6推出了脚本功能,允许开发者使用Lua语言编写脚本传到Redis中执行。1、减少网络开销:本来5次网络请求的操作,可以用一个请求完成,原先10次请求的逻辑放在redis服务器上完成。使用脚本,减少了网络往返时延。2、原子操作:Redis会将整个脚本作为一个整体执行,中间不会被其他命令插入。3、替代redis的事务功能:redis自带的事务功能很鸡肋,而redis的lua脚本几乎实现了常规的事务功能,官方推荐如果要使用redis的事务功能可以用redis lua替
2021-12-17 13:43:30 1209
原创 并发编程的可见性,原子性与有序性
可见性,原子性与有序性原子性原子性指的是一个操作是不可中断的,即使是在多线程环境下,一个操作一旦开始就不会被其他线程影响X=10;//原子性(简单的读取、将数字赋值给变量)Y=x;//变量之间的相互赋值,不是原子操作X++;//对变量进行计算操作不是原子操作X=x+1;可见性可见性指的是当一个线程修改了某个共享变量的值,其他线程是否能够马上得知这个修改的值。对于串行程序来说,可见性是不存在的,因为我们在任何一个操作中修改了某个变量的值,后续的操作中都能读取这个变量值,...
2021-12-07 23:41:06 389 1
原创 JMM Java内存模型
Java内存模型(JavaMemoryModel简称JMM)是一种抽象的概念,并不真实存在,它描述的是一组规则或规范通过这组规则控制程序中各个变量在共享数据区域和私有数据区域的访问方式,JMM是围绕原子性,有序性、可见性展开Java内存模型中规定所有变量都存储在主内存,主内存是共享内存区域,所有线程都可以访问,但线程对变量的操作(读取赋值等)必须在工作内存中进行,首先要将变量从主内存拷贝的自己的工作内存空间,然后对变量进行操作,操作完成后再将变量写回主内存,不能直接操作主内存中的变量,工作内..
2021-12-06 17:52:32 416
原创 MySQL事务隔离级别与锁机制
我们的数据库一般都会并发执行多个事务,多个事务可能会并发的对相同的一批数据进行增删改查操作,可能就会导致我们说的脏写、脏读、不可重复读、幻读这些问题。这些问题的本质都是数据库的多事务并发问题,为了解决多事务并发问题,数据库设计了事务隔离机制、锁机制、MVCC多版本并发控制隔离机制,用一整套机制来解决多事务并发问题事务的基本要素(ACID)原子性(Atomicity):事务是一个原子操作单元,其对数据的修改,要么全都执行,要么全都不执行。一致性(Consistent):在事务开始和完成时..
2021-12-05 12:00:52 757 3
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人