Java中间件(1)--分布式系统&中间件从入门到精通(五)

简介: Java中间件(1)--分布式系统&中间件从入门到精通(五)

上篇文章说了,当业务数据量大的时候,可以考虑业务和数据分离,当还解决不了的时候,可以考虑把数据库读写分离,缓存,还可以考虑把表垂直拆分,水平拆分。

大型网站架构(2)--分布式系统&中间件从入门到精通(四)


中间件为软件应用提供了操作系统所提供的服务之外的服务,中间件不是操作系统的一部分,也不是数据库的一部分,而是让软件开发者方便的处理通信输入和输出。

我的理解中间件主要分为三大类,当然这三大类肯定没有涵盖业内所有的中间件。

  1. 远程访问时候的中间件,只要解决分布式环境互相访问问题。
  2. 消息中间间:只要解决异步,解耦,削峰。
  3. 数据库访问的中间件,主要提升数据库读写性能。


构建java中间件


认识java中间件,我们要先谈下jvm—跨平台的java运行环境。Java诞生时候口号就是“write once,run anywhere”,能达到这个目标的关键点就是java虚拟机,不同的平台有不同的java虚拟机,但不同java虚拟机识别的是统一格式的中间代码,也就是我们常说的java字节码(java byte code)。


使用jvm就不得不说垃圾回收,java虚拟机是通过垃圾回收的方式进行内存回收的,而不是和c++那样通过代码进行释放,而在java虚拟机中,设置不同的垃圾回收方式和参数会影响垃圾回收的效果。


平时我们接触比较多的oracle hotspot jvm,这里主要分为Young/Tenured/Pren三块区域,也就是常说的新生代、老年代、持久代。一般新的对象会被分配在young的eden区,eden区中存活的对象会被copy到survivor区,survivor又分为form和to,当下次新生代垃圾回收的时候,会吧from里面的清空,copy到另一个survivor的to区域,经过多次回收,还存活的对象会到老年代Tenured,而老年代也会根据一定的条件进行垃圾回收。


Java并发编程


在多核时代下,多线程编程尤为重要,多线程首先要提到线程池,下面举个例子来看看使用线程池和不使用线程池的差别。

long startTime = System.currentTimeMillis();
        final List<Integer> list = new LinkedList<>();
        ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(1, 1, 60, TimeUnit.SECONDS,
            new LinkedBlockingQueue<>(count));
        Random random = new Random();
        for (int i = 0; i < count; i++) {
            threadPoolExecutor.execute(new Runnable() {
                @Override
                public void run() {
                    list.add(random.nextInt());
                }
            });
        }
        threadPoolExecutor.shutdown();
        try{
            threadPoolExecutor.awaitTermination(1,TimeUnit.DAYS);
        }catch (Exception e){
        }
        System.out.println("耗费时间:" + (System.currentTimeMillis() - startTime));
        System.out.println("长度:" + list.size());
        System.out.println("=================================");
        long startTime1 = System.currentTimeMillis();
        final List<Integer> list1 = new LinkedList<>();
        Random random1 = new Random();
        for (int i = 0; i < count; i++) {
            Thread thread = new Thread(){
                @Override
                public void run(){
                    list1.add(random1.nextInt());
                }
            };
            thread.start();
            try{
                thread.join();
            }catch (Exception e){
            }
        }
        System.out.println("耗费时间:" + (System.currentTimeMillis() - startTime1));
        System.out.println("长度:" + list1.size());

线程池可以复用线程,而不需要冗余的创建线程,而线程池避免了频繁的创建和销毁线程,来统一处理。另外刚刚使用的是ThreadPoolExecutor,此外还有定时线程池ScheduledTheadPoolExecutor。


Synchronized可以用于声明方法,static,也可以声明代码块。当修饰static锁的是对象,所以虽然在同一个对象锁的是不同的方法,但是运行的时候,两个不同的方法是互斥的,但如果static没有修饰方法,只修饰了普通的方法,则不会出现锁对象的情况,只锁了方法。而最后一个锁代码块可以是this,也可以是任意对象,对比较前面的两个更加灵活。


reentrantLock与synchronized作用类似,但是需要自己手动释放锁,所以这时候需要注意,如果发生异常会释放锁失败,所以必须写在finally,另外提供了trylocal方法,当一个线程获取锁,另一个线程在一段时间内没有获取到锁则会返回false。reentrantlock构造器里有一个true和false的参数,默认是非公平的锁,公平锁则需要手动设置。

另外reentrantLock也有一个reentrantReadWriteLock,从名字可以看出是读写锁,主要业务场景使用在读多写少的和读不排斥的场景,这时候用readLock和writeLock来设置锁,效率比前面的全部上锁更高。

相关文章
|
4月前
|
存储 Oracle Java
java零基础学习者入门课程
本课程为Java零基础入门教程,涵盖环境搭建、变量、运算符、条件循环、数组及面向对象基础,每讲配示例代码与实践建议,助你循序渐进掌握核心知识,轻松迈入Java编程世界。
396 0
|
5月前
|
Java
java入门代码示例
本文介绍Java入门基础,包含Hello World、变量类型、条件判断、循环及方法定义等核心语法示例,帮助初学者快速掌握Java编程基本结构与逻辑。
485 0
|
6月前
|
安全 Java 数据库连接
2025 年最新 Java 学习路线图含实操指南助你高效入门 Java 编程掌握核心技能
2025年最新Java学习路线图,涵盖基础环境搭建、核心特性(如密封类、虚拟线程)、模块化开发、响应式编程、主流框架(Spring Boot 3、Spring Security 6)、数据库操作(JPA + Hibernate 6)及微服务实战,助你掌握企业级开发技能。
869 3
|
5月前
|
存储 算法 安全
“卧槽,系统又崩了!”——别慌,这也许是你看过最通俗易懂的分布式入门
本文深入解析分布式系统核心机制:数据分片与冗余副本实现扩展与高可用,租约、多数派及Gossip协议保障一致性与容错。探讨节点故障、网络延迟等挑战,揭示CFT/BFT容错原理,剖析规模与性能关系,为构建可靠分布式系统提供理论支撑。
289 2
|
5月前
|
消息中间件 缓存 监控
中间件架构设计与实践:构建高性能分布式系统的核心基石
摘要 本文系统探讨了中间件技术及其在分布式系统中的核心价值。作者首先定义了中间件作为连接系统组件的&quot;神经网络&quot;,强调其在数据传输、系统稳定性和扩展性中的关键作用。随后详细分类了中间件体系,包括通信中间件(如RabbitMQ/Kafka)、数据中间件(如Redis/MyCAT)等类型。文章重点剖析了消息中间件的实现机制,通过Spring Boot代码示例展示了消息生产者的完整实现,涵盖消息ID生成、持久化、批量发送及重试机制等关键技术点。最后,作者指出中间件架构设计对系统性能的决定性影响,
|
5月前
|
前端开发 Java 数据库连接
帮助新手快速上手的 JAVA 学习路线最详细版涵盖从入门到进阶的 JAVA 学习路线
本Java学习路线涵盖从基础语法、面向对象、异常处理到高级框架、微服务、JVM调优等内容,适合新手入门到进阶,助力掌握企业级开发技能,快速成为合格Java开发者。
726 3
|
6月前
|
NoSQL Java 关系型数据库
Java 从入门到进阶完整学习路线图规划与实战开发最佳实践指南
本文为Java开发者提供从入门到进阶的完整学习路线图,涵盖基础语法、面向对象、数据结构与算法、并发编程、JVM调优、主流框架(如Spring Boot)、数据库操作(MySQL、Redis)、微服务架构及云原生开发等内容,并结合实战案例与最佳实践,助力高效掌握Java核心技术。
628 1
|
6月前
|
Java 测试技术 API
Java IO流(二):文件操作与NIO入门
本文详解Java NIO与传统IO的区别与优势,涵盖Path、Files类、Channel、Buffer、Selector等核心概念,深入讲解文件操作、目录遍历、NIO实战及性能优化技巧,适合处理大文件与高并发场景,助力高效IO编程与面试准备。
|
6月前
|
Java 编译器 API
Java Lambda表达式与函数式编程入门
Lambda表达式是Java 8引入的重要特性,简化了函数式编程的实现方式。它通过简洁的语法替代传统的匿名内部类,使代码更清晰、易读。本文深入讲解Lambda表达式的基本语法、函数式接口、方法引用等核心概念,并结合集合操作、线程处理、事件回调等实战案例,帮助开发者掌握现代Java编程技巧。同时,还解析了面试中高频出现的相关问题,助你深入理解其原理与应用场景。
|
5月前
|
Java API 数据库
2025 年最新 Java 实操学习路线,从入门到高级应用详细指南
2025年Java最新实操学习路线,涵盖从环境搭建到微服务、容器化部署的全流程实战内容,助你掌握Java 21核心特性、Spring Boot 3.2开发、云原生与微服务架构,提升企业级项目开发能力,适合从入门到高级应用的学习需求。
1706 0