【架构】
文章平均质量分 89
青山师
编码、架构、程序人生;此博客输出内容永久免费,长期分享JAVA开发技术
展开
-
微服务服务间调用组件Feign使用介绍、原理、优化技巧
Feign是一个声明式的Web Service客户端。它让微服务之间的调用变得更简单。Feign具有可插拔式的注解支持,包括Feign 注解和JAX-RS注解。Feign还支持可插拔的编码器和解码器。Spring Cloud增加了对Spring MVC注解的支持,并且也支持Spring WebFlux。Feign可以与Eureka和Ribbon组合使用以支持负载均衡。Feign的基本概念、原理与使用。Feign采用声明式的接口,自动拼接URL、添加参数等工作,简化HTTP客户端的开发。原创 2023-05-20 15:51:28 · 1226 阅读 · 0 评论 -
微服务负载均衡器Ribbon介绍、使用以及原理和源码理解
Ribbon是Netflix开源的客户端负载均衡器,它可以很好的控制HTTP和TCP客户端的行为。Ribbon支持配置客户端添加重试和超时等功能,旨在使客户端更加强健。负载均衡故障检测暂时性错误重试客户端配置化等轮询(RoundRobinRule):轮流选择服务器随机(RandomRule):随机选择服务器重试(RetryRule):在一个配置时间内当选择服务器不成功,则一直尝试该服务器,超过配置时间才尝试其他服务器。原创 2023-05-17 23:23:16 · 1514 阅读 · 0 评论 -
微服务注册中心Eureka原理到源码
Eureka是Netflix开源的一款用于提供服务注册和发现的产品,它提供了完整的服务注册和发现功能,具有容错性,可伸缩性等特性。Eureka包含两个组件:Eureka Server和Eureka Client。Eureka Server提供服务注册服务。各个微服务启动时,会通过Eureka Client向Eureka Server注册自己的信息(例如服务名称、IP地址、端口等)。原创 2023-05-15 18:31:03 · 955 阅读 · 0 评论 -
JVM问题排查和垃圾回收机制
JVM的主要内存区有方法区、堆、栈、程序计数器等,堆和方法区是所有线程共享的,其中堆主要用于存储对象实例,是一个显著的可回收内存来源。垃圾回收器的主要工作就是规律的遍历堆区,释放那些不再被使用的对象所占用的内存,使其成为可用内存。其中,[标记-清除]算法会产生内存碎片较严重,而[标记-复制]算法需要双倍的内存空间,所以目前主流的商业虚拟机一般采用[标记-整理]算法。Java垃圾回收主要是利用垃圾回收器对堆内存进行回收,回收那些不再被使用的对象所占用的内存,以实现内存的再利用。原创 2023-05-12 19:44:15 · 918 阅读 · 0 评论 -
线程池的介绍、原理、监控运维、框架使用场景案例
JDK 提供的线程池功能较基础,开源框架 Executors 在此基础上做了许多封装,更加易用。主要有:- newCachedThreadPool:创建一个可缓存的线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。- newFixedThreadPool: 创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。- newScheduledThreadPool: 创建一个定长线程池,支持定时及周期性任务执行。- newSingleThreadExecuto原创 2023-05-03 20:19:47 · 1161 阅读 · 0 评论 -
synchronized的偏向、轻量、重量级锁
Synchronized实现同步的方式有三种:偏向锁、轻量级锁、重量级锁。本文会从理论和代码实践两方面阐述三种锁的实现细节和原理。原创 2023-05-02 22:47:16 · 986 阅读 · 1 评论 -
JAVA并发万字长文从ReentrantLock到juc框架
ReentrantLock 是通过一个volatile 的变量和一个 FIFO 的队列来实现的。该 volatile 变量表示当前获得锁的线程,FIFO 队列用来存储等待锁的线程。具体实现方式是:当一个线程获取锁时,将当前线程设置为 volatile 变量的值。如果其他线程试图获取该锁,则会加入 FIFO 队列的尾部,并标记为等待状态。当持有锁的线程释放锁时,它会唤醒 FIFO 队列头部的线程,这个线程继续执行并获取锁。ReentrantLock 是可重入锁,意味着同一个线程可以多次获取这把锁。这是原创 2023-05-02 20:53:28 · 1010 阅读 · 0 评论 -
volatile关键字原理的使用介绍和底层原理解析和使用实例
volatile 关键字的主要作用是保证可见性和有序性,禁止编译器优化。保证可见性:当一个变量被声明为 volatile 之后,每次读取这个变量的值都会从主内存中读取,而不是从缓存中读取,这就保证了不同线程对这个变量操作的可见性。有序性:volatile 关键字保证了不同线程对一个 volatile 变量的读写操作的有序性。禁止编译器优化:编译器会对代码进行各种优化来提高性能,但是这些优化也可能让同步代码失效。volatile 关键字告诉编译器不要对这段代码做优化,从而避免一些不正确的优化。原创 2023-05-02 17:11:46 · 1459 阅读 · 0 评论 -
ThreadLocal的使用介绍和底层原理解析和开源框架的使用实例
ThreadLocal是一个线程内部的数据存储类,它可以为每个线程提供独立的变量副本,不同线程间的变量无法相互访问和修改。这避免了每个线程都要维护一套独立变量的麻烦,并且也减少了线程之间不必要的数据争用。ThreadLocal适用于这样的场景:每个线程需要有自己单独的实例,而不是共享实例。例如,在 web 应用中,每个请求被一个新的线程处理,每个线程需要有自己的变量实例。原创 2023-05-02 15:07:43 · 1891 阅读 · 0 评论 -
ConcurrentHashMap的使用介绍和底层原理解析和开源框架的使用实例
ConcurrentHashMap是JDK1.5提供的线程安全的HashMap,它允许多个线程并发访问哈希表,并发修改map中的数据而不会产生死锁。ConcurrentHashMap适用于高并发的环境下,可以替代synchronized实现的同步HashMap。ConcurrentHashMap的并发度很高,吞吐量也很高。ConcurrentHashMap通过锁分段技术,实现高度的并发访问,大大提高了HashMap的吞吐量,是高并发环境下一个很好的选择。原创 2023-05-01 23:01:50 · 1385 阅读 · 0 评论 -
消息队列如何保证消息可靠性传输
在本文中,我们主要介绍了持久化存储、消息确认机制、重试机制和幂等性处理等机制,以及使用 JAVA 语言和 Apache Kafka、RabbitMQ 进行代码实践的示例。通过上述机制的支持和实践,可以保证消息队列系统的可靠性和稳定性,为各大互联网公司提供高效、稳定的消息传输服务。原创 2023-04-30 11:07:56 · 3071 阅读 · 0 评论 -
RocketMQ 底层实现原理
在 RocketMQ 中,消息的发送过程可以分为三个步骤:1. 生产者发送消息到 Broker;2. Broker 将消息存储到磁盘,并将消息持久化到 CommitLog 和 IndexFile 中;3. 消费者从 Broker 拉取消息并进行消费。原创 2023-04-30 10:59:16 · 2531 阅读 · 0 评论 -
kafka的push、pull分别有什么优缺点
在 Kafka 中,生产者使用 push 模式将消息推送给 Kafka 集群,而消费者则使用 pull 模式从 Kafka 集群中拉取消息。本文对 Kafka 的 push 和 pull 两种模式进行比较,分析其优缺点。Pull 模式是 Kafka 新增的方式,使用该模式时,消费者可以自主选择从哪个分区开始拉取消息,并可以自主控制拉取消息的速度。Kafka 中为消费者维护着一个 offset,表示消费者已经消费的消息序号,当消费者拉取消息时,Kafka 会返回该消费者还没有消费的消息。原创 2023-04-29 15:58:33 · 3249 阅读 · 1 评论 -
InnoDB如何实现事务、undo log、redo log、binlog
当一个事务开始后,会在内存中为其分配一块undo log,并在该事务执行修改数据表之前将相关数据先拷贝到undo log中。同时,InnoDB还利用了多版本并发控制(MVCC)来实现数据的隔离性。主从复制时,从库会读取主库的binlog事件来重放数据的更改,实现数据一致性。redo log是指数据库系统执行修改操作时所记录的日志,它的主要作用是确保当数据库崩溃时不会丢失数据更新操作。InnoDB是MySQL的默认存储引擎,它使用多版本并发控制(MVCC)和锁机制来实现事务。原创 2023-04-26 15:31:43 · 815 阅读 · 0 评论 -
B树、B+树的区别及MySQL为何选择B+树
B树和B+树都是一种多路搜索树,常用于数据库和文件系统中进行索引操作。在介绍B树和B+树的区别之前,先来了解一下它们的定义。原创 2023-04-26 14:44:37 · 1087 阅读 · 0 评论 -
MySQL索引B+树、执行计划explain、索引覆盖最左匹配、慢查询问题
B+树以(m, M)-B+树的形式出现,其中m和M的含义与B树相同,但内部节点包含的关键字数目比B树更多,通常是M/2到M。B树是一种平衡多路查找树,相比于二叉查找树,它允许一个节点存在多个子节点,因此可以减少I/O操作的次数,提高数据的访问效率。B树中的每个节点都可能存储关键字,因此,除了叶子节点,B树的每个节点都可以作为查询结果返回。B树的非叶子节点存储关键字以及指向子节点的指针,而B+树中的非叶子节点只存储关键字和对应子节点的指针,即只存储索引信息,这样可以存储更多的索引信息。原创 2023-04-20 20:35:06 · 674 阅读 · 0 评论 -
MySQL执行计划详解
执行计划是MySQL查询优化器生成的一组指令,用于执行SQL语句。在执行SQL语句时,MySQL会对SQL进行解析、优化、执行三个步骤。在优化阶段,MySQL查询优化器会生成一个执行计划,该计划被称为查询计划或执行计划。执行计划告诉MySQL执行SQL语句的具体步骤,包括表的连接方式、扫描方式、过滤条件等。执行计划是指MySQL根据用户请求所生成的一份查询计划,它决定了MySQL在执行SQL语句时所采取的操作方式,包括表的连接方式、索引的选择、访问方法等,进而影响着查询语句的执行效率。原创 2023-04-19 23:25:05 · 3234 阅读 · 0 评论 -
Redis缓存MySQL数据库存储二者如何保证数据一致性
Redis缓存MySQL数据库存储二者如何保证数据一致性,既可以同步更新缓存,也可以异步更新缓存。同步更新缓存能够保证数据一致性,但会对写操作的性能产生影响;异步更新缓存则能够避免这个问题,但需要引入消息队列,并且也需要考虑缓存更新失败的情况。根据实际情况选择不同的方案即可。原创 2023-04-19 10:10:01 · 807 阅读 · 0 评论 -
Java缓存穿透、击穿、雪崩解决方案
针对缓存穿透、击穿和雪崩问题,我们可以采用布隆过滤器、分布式锁和多级缓存策略等技术手段来进行优化。在实际项目中,需要根据具体情况选择合适的解决方案,并进行适当的调整和配置,以达到最佳的性能和稳定性。原创 2023-04-18 21:03:11 · 956 阅读 · 0 评论 -
Redis主从复制、哨兵、集群原理部署介绍
Redis主从复制是保证Redis数据库高可用性和容错性的重要解决方案之一。Redis哨兵模式是保证Redis数据库高可用性和容错性的重要解决方案之一。Redis 是一款内存数据库,常用于缓存、消息队列等。随着业务的发展和数据的增长,单机 Redis 可能无法满足我们的需求,此时我们需要使用 Redis 集群模式。Redis 集群模式可以将多个 Redis 实例组成一个集群,提供更高的性能和可用性。我们将介绍 Redis 集群模式的核心原理,并通过代码实践演示如何搭建 Redis 集群。原创 2023-04-18 20:20:37 · 971 阅读 · 0 评论 -
Redis分布式锁的实现方式及底层原理
在加锁方法中,我们首先生成了一个随机字符串nonce作为锁的值,并在每个Redis实例上进行原子性的set操作,返回成功加锁的实例数。如果获取到锁的实例数大于等于quorum(即多数节点),并且加锁操作完成的时间小于锁的过期时间expireTime,则表示加锁成功,否则认为加锁失败,触发重试机制。Redlock算法采用多个节点之间互斥的方式获取分布式锁,可以保证在大部分节点正常情况下分布式锁的可靠性,并允许在某些更繁忙或网络质量较差的节点上失败,从而确保分布式锁的稳定性。原创 2023-04-13 20:37:54 · 1225 阅读 · 0 评论 -
SpringCloud微服务技术栈的配置中心SpringCloud Config
随着微服务架构的快速发展,现代化的应用架构越来越依赖于云原生架构、容器化和Kubernetes。在这种背景下,Spring Cloud已经成为了Java开发人员选择构建微服务的首选框架之一。本文将介绍如何使用Spring Cloud Config作为SpringBoot微服务体系结构的配置中心,让您轻松管理配置信息并独立部署。原创 2023-04-13 20:07:45 · 848 阅读 · 0 评论 -
从BIO到NIO、AIO和零拷贝
在BIO模型中,所有的I/O操作都是阻塞的,也就是说,当一个线程调用read()或write()时,该线程会被阻塞,直到有数据可读或写入成功。AIO(Asynchronous I/O)异步I/O模型是在NIO模型的基础上又做了一些改进,它将I/O操作的具体实现委托给内核,直接由内核进行读写操作,当数据读写完成后再回调到应用层,这样就不需要像BIO、NIO模型那样由用户线程进行数据读取和写入,从而减少了系统调用的次数,充分利用了系统的资源。零拷贝技术指避免CPU从应用缓冲区向内核缓冲区拷贝数据的一种技术。原创 2023-04-11 23:33:09 · 661 阅读 · 0 评论 -
分布式事务处理常用手段及生产实践
在分布式系统架构设计中,如何保证数据的一致性是一个非常重要的问题。实际生产需要根据具体业务场景来选择适合的分布式事务处理方法,以保证系统的可靠性和一致性。原创 2023-04-10 10:07:04 · 565 阅读 · 0 评论 -
从零开始,手把手教你实现基于 Websocket 的微服务
Websocket 协议是为了解决 HTTP 协议缺陷而产生的一种通信协议,它能够在客户端和服务器之间建立持久性的连接,并且允许双向通信。HTTP 协议的请求与响应模式,其实并不适合实时通信的场景。比如聊天室、在线游戏等应用,都需要实时地推送消息到客户端,而 HTTP 协议则需要进行频繁的请求和响应操作,这就会导致网络延迟和更多的带宽消耗。而 Websocket 则是允许服务器主动向客户端发送消息,而不需要客户端发起请求,从而提高了通信效率和实时性。原创 2023-04-09 19:36:58 · 1954 阅读 · 0 评论 -
SpringBoot常见的的面试点
SpringBoot是Spring框架的一个子项目,它可以让开发者更快速、更容易地创建基于Spring的应用程序。SpringBoot通过提供默认的配置和自动化配置来简化Spring应用程序的开发过程,并提供了一系列插件和工具来简化构建、测试和部署Spring应用程序的流程。相对于传统的Spring框架,SpringBoot更加轻量级,启动更快,编写更少的代码就能实现同样的功能。原创 2023-04-09 19:01:08 · 456 阅读 · 0 评论 -
SpringCloud微服务技术栈之网关服务Gateway
在微服务架构中,微服务数量的增加会使得系统中出现大量的服务实例,同时每个服务往往又有多个版本,这些版本需要进行升级、降级等操作。因此,对于这些微服务的调用和路由管理就变成了一个巨大的挑战。Spring Cloud网关服务Gateway可以作为微服务架构中的一个基础设施,通过将API网关方式暴露给服务客户端,从而控制所有的请求流量,并支持许多传输协议,例如HTTP、WebSocket等。原创 2023-04-09 17:16:37 · 1108 阅读 · 0 评论 -
服务雪崩、服务限流、服务熔断和服务降级
在分布式系统中,由于网络延迟、节点宕机等各种原因,会出现一些异常情况,如某个服务的响应时间变慢或者宕机。这时候如果不采取措施,可能导致整个系统的性能下降或者不可用。本文主要介绍如何使用服务雪崩、服务限流、服务熔断和服务降级等技术手段来解决这些异常情况。原创 2023-04-07 23:53:09 · 288 阅读 · 0 评论 -
SpringCloud微服务技术栈的注册中心Eureka
在微服务架构中,服务的数量庞大,而且每个服务可能会有多个实例。此时,需要一个中心化的地方来管理和维护各个服务的相关信息,这就是微服务治理中很重要的一环:服务注册与发现。其中,服务注册是指将提供服务的应用实例注册到注册中心,而服务发现则是指从注册中心中获取服务实例列表并调用服务。本文将介绍SpringCloud微服务技术栈中的注册中心Eureka。本文介绍了SpringCloud微服务技术栈的注册中心Eureka,并以实际操作的方式进行了详细的说明。原创 2023-04-07 19:30:22 · 730 阅读 · 1 评论 -
Dubbo服务暴露步骤详解
Dubbo 是一款高性能的分布式服务框架,能够帮助我们快速实现微服务架构。在 Dubbo 中,服务提供者需要将自己的服务暴露出去,并注册到注册中心,让消费者能够通过注册中心找到并调用该服务。本篇博客将会介绍 Dubbo 如何完成服务暴露,其中包括了理论知识的讲解以及操作步骤的具体实现。我们将使用 JAVA 语言来进行开发,并结合当前各大互联网公司主流解决方案,帮助大家更好地掌握 Dubbo 的应用。服务暴露是指将某个服务发布出去,让其他系统或应用程序可以访问和使用该服务的过程。实现服务接口,定义服务方法。原创 2023-04-07 17:32:55 · 1028 阅读 · 0 评论 -
Dubbo负载均衡策略
在Dubbo中,负载均衡是实现高可用和高性能的重要手段之一。Dubbo支持多种负载均衡策略,可以根据业务场景进行选择。本文将详细介绍Dubbo支持的负载均衡策略,并结合代码实践给出操作步骤。原创 2023-04-07 16:52:42 · 2688 阅读 · 0 评论 -
ZK节点间数据同步以及API实践
本文介绍了ZK集群中节点间数据同步的原理,并通过实践演示了如何使用Java编写程序,在ZK集群上进行节点的创建、更新和删除操作。在实际应用中,我们可以借助ZK提供的API,快速实现分布式系统的各种功能。同时,由于ZK使用的是副本机制,故障节点的自动恢复也可以确保数据的可靠性和一致性。原创 2023-04-07 16:37:07 · 1064 阅读 · 0 评论 -
ZooKeeper领导者选举流程
ZK作为一个分布式系统协调服务,在分布式应用中扮演着重要的角色。其Leader选举算法使用ZAB协议,保证了领导者节点的选举和数据同步的正确性和效率。在实际应用中,我们可以使用ZK的API来实现Leader选举和其他的分布式协调功能。原创 2023-04-07 13:49:11 · 778 阅读 · 0 评论 -
分布式理论CAP、BASE和RPC
CAP原则、BASE理论和RPC技术都是分布式系统设计架构师必须熟悉的知识点。在实际应用中,需要根据需求和现实情况选择适合的模型和技术来保证系统的稳定性和可靠性。原创 2023-04-07 10:29:20 · 566 阅读 · 0 评论 -
分布式锁介绍及解决方案
在分布式系统中,多个节点可能同时操作同一资源,此时需要使用分布式锁来保护共享资源的访问。分布式锁要求在多个节点上都能起到保护作用,并且能够保证在高并发情况下的正确性和效率。原创 2023-04-06 23:24:08 · 818 阅读 · 0 评论 -
分布式ID介绍及实际解决方案
在分布式系统中,生成全局唯一的ID是一个常见的需求。但是,在分布式系统中,单机生成的ID难以保证全局唯一性,因此需要一种分布式ID生成方案。本文介绍了三种常见的分布式ID生成方案:UUID、自增ID和Snowflake算法,并且详细介绍了Snowflake算法的实现方式。在实际使用中,可以根据具体场景选择合适的方案。对于要求ID有序递增、长度较短的场景,建议使用Snowflake算法。原创 2023-04-06 20:53:32 · 669 阅读 · 0 评论 -
生产环境常见的限流算法
在高并发场景下,为了保护系统的稳定性和可用性,需要对请求进行限流。本文介绍几种生产环境中常见的限流算法,并结合Java代码实现。原创 2023-04-06 20:34:52 · 537 阅读 · 0 评论 -
延迟队列的设计与最佳实践
在现代分布式系统中,延迟任务是一种非常重要的概念。它们可以用来处理需要特殊关注或执行的任务,如发邮件、推送消息或生成报告等。为了实现这些任务,我们需要一种强大而可靠的工具,即延迟队列。在本博客中,我们将介绍延迟队列的设计和最佳实践。我们将使用RabbitMQ和Redis两种技术来展示各自的实践方法,并提供操作步骤。原创 2023-04-06 19:13:34 · 1071 阅读 · 0 评论 -
RPC框架性能基本比较测试
gRPC是Google最近公布的开源软件,基于最新的HTTP2.0协议,并支持常见的众多编程语言。 我们知道HTTP2.0是基于二进制的HTTP协议升级版本,目前各大浏览器都在快马加鞭的加以支持。 我们可以设想一下,未来浏览器支持HTTP2.0,并通过现有开源序列化库比如protobuf等,可以直接和各种语言的服务进行高效交互,这将是多么“美好”的场景!gPRC的Java实现底层网络库是Netty,转载 2016-12-15 20:16:04 · 1388 阅读 · 1 评论 -
分布式RPC框架性能大比拼 dubbo、motan、rpcx、gRPC、thrift的性能比较
分布式RPC框架性能大比拼 dubbo、motan、rpcx、gRPC、thrift的性能比较 Dubbo 是阿里巴巴公司开源的一个Java高性能优秀的服务框架,使得应用可通过高性能的 RPC 实现服务的输出和输入功能,可以和 Spring框架无缝集成。不过,略有遗憾的是,据说在淘宝内部,dubbo由于跟淘宝另一个类似的框架HSF(非开源)有竞争关系,导致dubbo团队已经解散(参见http://转载 2016-12-15 20:27:11 · 34159 阅读 · 2 评论