大型网站系统与Java中间件实践 02 Java中间件

本文涉及的产品
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
性能测试 PTS,5000VUM额度
Serverless 应用引擎免费试用套餐包,4320000 CU,有效期3个月
简介: 01 认识分布式02 Java中间件03 分布式框架3 构建Java中间件3.1 什么事中间件?中间件不是最上层的应用也不是最底层的支撑系统,中间件在项目中起到桥梁作用,特定中间件是解决特定的场景问题的组件。

01 认识分布式
02 Java中间件
03 分布式框架

3 构建Java中间件

3.1 什么事中间件?

中间件不是最上层的应用也不是最底层的支撑系统,中间件在项目中起到桥梁作用,特定中间件是解决特定的场景问题的组件。让开发聚焦于自己的业务。

常用中间件的分类:

  1. 远程过程调用和对象访问中间件:主要解决分布式环境下应用的互相访问问题,
  2. 消息中间件:解决应用之间的消息传递,解耦,异步的问题。
  3. 数据访问中间件:主要解决应用访问数据库的共性问题的组件。

3.2 Java中间件的基础知识

3.2.1 JVM

Java源码通过编译器变成Java字节码

JVM加载Java字节码

3.2.2 垃圾回收与内存堆布局

Java通过虚拟机进行垃圾回收。

img_76d5b00c1a9539b5a672b4c4706a182e.png
Oracle Hotspot JVM堆

一般新的对象被分配在young的Eden区,也有可能直接分配在Tenured。

在进行垃圾回收的时候,Eden区中存活的对象会被复制到空的Survivor区,而下次新生代垃圾回收的时候,Eden区存活的对象和这个Survivor区中存活的对象会被复制到另外那个Survivor区域,并且清空当前的Survivor区域。经过多次新生代垃圾回收,还存活的对象被移动到年老代,而年老代的空间也会根据一定的条件进行垃圾回收。

新生代:

串行GC -- Serial Copying

并行GC -- ParNew

并行回收GC -- Parallel Scavenge

年老代:

串行GC -- Serial GC

并行MS -- Parallel MSC

并行Compacting GC -- Parallel Compacting GC

并发GC -- CMS

3.2.3 Java并发编程

  1. 线程池

  2. synchronized

任何两个线程之间调用互斥。 同步静态代码块。

同一对象之间的两个方法互斥。 同步代码块。

  1. ReentrantLock

tryLock:调用的时候,如果锁被其他线程占有返回false。

可以构造公平锁,公平锁的好处就是等待锁的线程不会饿死,但是整体效率低。

  1. volatile

可见性是指在一个线程中修改变量以后,在其他线程可以看得到这个数值。

volatile关键字保证了同一个变量在多线程中的可见性,所以它更是用于修饰作为开关状态的变量。

int  key1;
public int getKey1(){
    return key1;
}
对于调用getKey1获取当前线程中的副本,这个值不一定是最新的。
对于setKey1来说,操作的是当前线程中的副本,所以其他线程看不到最新的值。

volatile int key2;
public int getKey2(){
    return key2;
}
对于调用getKey2来说,volatile修饰保证这个变量没有线程副本,只会放在主存,所以得到的值是最新的值。
对于setKey2来说,直接操作主存,其他线程肯定会看到新值。

int key3;
public synchronized int getKey2(){
    return key3;
}

同步关键字保证线程主存与本地副本的同步,所以得到的值是最新的值。

  1. Atomics

提供了原子操作,计数器操作。

  1. wait,notify和nitifyAll

notify唤醒一个线程,noitfyAll唤醒所有线程。

对wait,notify和notifyAll调用都必须是在对象的synchronized快中。

  1. CountDownLatch

线程都到达了预期状态活完成预期工作时触发事件。

统计数据:分布计算 latch.countDown(),然后合并数据latch.await();

  1. CyclicBarrier

循环屏障,协同多个线程,让多个线程在这个屏障前等待,直到所有线程都到达了这个屏障的时候,在一起执行后面的计算。

可以循环使用。

  1. Semaphore

信号量:

  1. Exchanger

用于两个线程交互数据

线程会阻塞在exchange方法上,直到另一个线程也到了同一个Exchanger的exchange方法。

  1. Future和FutureTask
// 远程调用回阻塞
1:HashMap<String,Object> map = rpc.getDataFromRemote();

doOther();

// 远程调用提交给线程池执行
2: Future<HahsMap<String,Object>> fuctur = rpc.getDataRemote();

doOther();

// 获取数据的时候阻塞
future.get();
  1. 并发容器

  2. 动态代理

控制在执行方法之前,方法之后能进行处理相关操作。

  1. 反射

常用操作库

Javassist

cglib

asm

bcel

  1. 网络通信实现

框架Mina,Netty

3.3 分布式系统与Java中间件

img_8648fea1cdb6a376427a56ff029c0a72.png
系统中的中间件

WebApp和Service中间引入服务框架,解决了集群之间的通信问题。

在应用和数据库之间,引入分布式数据层可以方便我们操作已被分库分表的数据库节点。

目录
相关文章
|
26天前
|
存储 缓存 安全
Java内存模型深度解析:从理论到实践####
【10月更文挑战第21天】 本文深入探讨了Java内存模型(JMM)的核心概念与底层机制,通过剖析其设计原理、内存可见性问题及其解决方案,结合具体代码示例,帮助读者构建对JMM的全面理解。不同于传统的摘要概述,我们将直接以故事化手法引入,让读者在轻松的情境中领略JMM的精髓。 ####
33 6
|
1月前
|
设计模式 Java 开发者
Java中的异常处理:理解与实践
【10月更文挑战第42天】在Java的世界中,异常处理是每个开发者必须面对的挑战。它就像是一场不可预知的风暴,可能会在任何时候突然降临,打乱我们的计划。但是,如果我们能够掌握正确的处理方法,这场风暴也可以变成推动我们前进的力量。本文将带你深入理解Java中的异常处理机制,通过代码示例,我们将一起学习如何捕获、处理和预防异常,让你的程序在面对任何挑战时都能保持稳健和优雅。
|
1月前
|
监控 Java API
如何使用Java语言快速开发一套智慧工地系统
使用Java开发智慧工地系统,采用Spring Cloud微服务架构和前后端分离设计,结合MySQL、MongoDB数据库及RESTful API,集成人脸识别、视频监控、设备与环境监测等功能模块,运用Spark/Flink处理大数据,ECharts/AntV G2实现数据可视化,确保系统安全与性能,采用敏捷开发模式,提供详尽文档与用户培训,支持云部署与容器化管理,快速构建高效、灵活的智慧工地解决方案。
|
1月前
|
Arthas 监控 Java
拥抱 OpenTelemetry:阿里云 Java Agent 演进实践
本文介绍了阿里云 Java Agent 4.x 版本在基于 OTel Java Agent 二次开发过程中的实践与思考,并重点从功能、性能、稳定性、兼容性四个方面介绍了所做的工作。同时也介绍了阿里云可观测团队积极参与开源建设取得的丰厚成果。
193 5
拥抱 OpenTelemetry:阿里云 Java Agent 演进实践
|
20天前
|
存储 监控 小程序
Java中的线程池优化实践####
本文深入探讨了Java中线程池的工作原理,分析了常见的线程池类型及其适用场景,并通过实际案例展示了如何根据应用需求进行线程池的优化配置。文章首先介绍了线程池的基本概念和核心参数,随后详细阐述了几种常见的线程池实现(如FixedThreadPool、CachedThreadPool、ScheduledThreadPool等)的特点及使用场景。接着,通过一个电商系统订单处理的实际案例,分析了线程池参数设置不当导致的性能问题,并提出了相应的优化策略。最终,总结了线程池优化的最佳实践,旨在帮助开发者更好地利用Java线程池提升应用性能和稳定性。 ####
|
19天前
|
安全 Java 数据库连接
Java中的异常处理:理解与实践
在Java的世界里,异常处理是维护代码健壮性的守门人。本文将带你深入理解Java的异常机制,通过直观的例子展示如何优雅地处理错误和异常。我们将从基本的try-catch结构出发,探索更复杂的finally块、自定义异常类以及throw关键字的使用。文章旨在通过深入浅出的方式,帮助你构建一个更加稳定和可靠的应用程序。
30 5
|
22天前
|
设计模式 消息中间件 搜索推荐
Java 设计模式——观察者模式:从优衣库不使用新疆棉事件看系统的动态响应
【11月更文挑战第17天】观察者模式是一种行为设计模式,定义了一对多的依赖关系,使多个观察者对象能直接监听并响应某一主题对象的状态变化。本文介绍了观察者模式的基本概念、商业系统中的应用实例,如优衣库事件中各相关方的动态响应,以及模式的优势和实际系统设计中的应用建议,包括事件驱动架构和消息队列的使用。
|
22天前
|
缓存 Java 开发者
Java多线程并发编程:同步机制与实践应用
本文深入探讨Java多线程中的同步机制,分析了多线程并发带来的数据不一致等问题,详细介绍了`synchronized`关键字、`ReentrantLock`显式锁及`ReentrantReadWriteLock`读写锁的应用,结合代码示例展示了如何有效解决竞态条件,提升程序性能与稳定性。
83 6
|
19天前
|
安全 Java 程序员
Java内存模型的深入理解与实践
本文旨在深入探讨Java内存模型(JMM)的核心概念,包括原子性、可见性和有序性,并通过实例代码分析这些特性在实际编程中的应用。我们将从理论到实践,逐步揭示JMM在多线程编程中的重要性和复杂性,帮助读者构建更加健壮的并发程序。
|
22天前
|
安全 Java 开发者
Java中的多线程编程:从基础到实践
本文深入探讨了Java多线程编程的核心概念和实践技巧,旨在帮助读者理解多线程的工作原理,掌握线程的创建、管理和同步机制。通过具体示例和最佳实践,本文展示了如何在Java应用中有效地利用多线程技术,提高程序性能和响应速度。
54 1
下一篇
DataWorks