Java 反射(Reflection)概念反射是 Java 提供的一种机制,允许我们在运行时获取有关类、字段、方法等信息,并动态地操作它们。通过反射,Java 程序能够在运行时访问和修改类的结构(如字段、方法、构造方法),而不是在编译时就固定下来。
反射的基本作用
动态加载类:在程序运行时,根据类名动态加载类。
获取类信息:可以获取类的构造方法、字段、方法等详细信息。
动态创建对象:可以通过反射机制,动态创建类的对象,甚至是无法提前知道的类。
访问/修改字段和方法:可以访问类的私有字段和方法,并对其进行修改。
动态代理:反射与动态代理结合可以实现面向切面编程(AOP)等技术。
Java 反射的核心类和包
Class 类:
Class 类是反射的核心类,它表示一个类或接口的对象。
通过 Class 对象可以获取类的各种信息(如字段、方法、构造方法等)。
获取 Class 对象的常见方法:
Class.forName("com.example.MyClass"):通过类名获取 Class 对象。
MyClass.class:通过类字面量获取 Class 对 ...
1. 引入 Sentinel在 Maven 项目中引入 Sentinel 的依赖:
12345<dependency> <groupId>com.alibaba.csp</groupId> <artifactId>sentinel-core</artifactId> <version>1.8.6</version> <!-- 请根据需求选择具体版本 --></dependency>
如果使用 Spring Boot 或 Spring Cloud,可以添加以下依赖(Spring Cloud Alibaba 提供的支持):
12345<dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId> <version>2 ...
用户分库分表为什么要分库分表?
数据量庞大。
查询性能缓慢,之前可能是 20ms,后续随着数据量的增长,查询时间呈指数增长。
数据库连接不够。
什么是分库分表?分库和分表有两种模式,垂直和水平。
分库两种模式:
垂直分库:电商数据库拆分为用户、订单、商品、交易等数据库。
水平分库:用户数据库,拆分为多个,比如User_DB_0 - x。
分表两种模式:
垂直分表:将数据库表按照业务维度进行拆分,将不常用的信息放到一个扩展表。
水平分表:将用户表水平拆分,展现形式就是 User_Table_0 - x。
什么场景下分表?
数据量过大或者数据库表对应的磁盘文件过大。
Q:多少数据量进行分表?
A:单表 1000w 是否要分表?回答不够标准。假设一个表里 15 个字段,没有特别大的值(不包含 text 或其它超长度的列)数据量超过 5000 万了,依然很丝滑,因为走索引。真正需要考虑的是:业务的增长量以及历史数量。
Q:物理文件过大,会有什么问题?
A:会影响公司对数据库表的一个备份。数据库表文件过大,也间接证明表数据过大,增加或删除字段导致锁表的时间过长。
什么情况下分库? ...
检查用户名是否存在直接查询数据库请求用户名是否存在。存在什么问题?
海量用户如果查询的用户名存在或不存在,全部请求数据库,会将数据库直接打满。
检查用户名是否存在引起的问题用户名加载缓存第一版解决方案,将数据库已有的用户名全部放到缓存里。该方案问题:
是否要设置数据的有效期?只能设置为无效期,也就是永久数据。
如果是永久不过期数据,占用 Redis 内存太高。
布隆过滤器第二版解决方案,使用布隆过滤器。什么是布隆过滤器布隆过滤器是一种数据结构,用于快速判断一个元素是否存在于一个集合中。具体来说,布隆过滤器包含一个位数组和一组哈希函数。位数组的初始值全部置为 0。在插入一个元素时,将该元素经过多个哈希函数映射到位数组上的多个位置,并将这些位置的值置为 1。
1字节(Byte)=8位(Bit)
在查询一个元素是否存在时,会将该元素经过多个哈希函数映射到位数组上的多个位置,如果所有位置的值都为 1,则认为元素存在;如果存在任一位置的值为 0,则认为元素不存在。
优缺点优点:
高效地判断一个元素是否属于一个大规模集合。
节省内存。
缺点:
可能存在一定的误判。
布隆过滤器 ...
什么是责任链模式在责任链模式中,多个处理器依次处理同一个请求。一个请求先经过 A 处理器处理,然后再把请求传递给 B 处理器,B 处理器处理完后再传递给 C 处理器,以此类推,形成一个链条,链条上的每个处理器各自承担各自的处理职责。
责任链模式优点责任链模式的优点在于,它可以动态地添加、删除和调整处理者对象,从而灵活地构建处理链。同时,它也避免了请求发送者和接收者之间的紧耦合,增强了系统的灵活性和可扩展性。
责任链模式实现以购票为例,在实际购票业务场景中,用户发起一次购票请求后,购票接口在真正完成创建订单和扣减余票行为前,需要验证当前请求中的参数是否正常请求,或者说是否满足购票情况。
购票请求用户传递的参数是否为空,比如:车次 ID、乘车人、出发站点、到达站点等。
购票请求用户传递的参数是否正确,比如:车次 ID 是否存在、出发和到达站点是否存在等。
需要购票的车次是否满足乘车人的数量,也就是列车对应座位的余量是否充足。
乘客是否已购买当前车次,或者乘客是否已购买当天时间冲突的车次。解决前置校验需求需要实现一堆逻辑,常常需要写上几百上千行代码。并且,上面的代码不具备开闭原则,以及代码 ...
1.Nacos配置管理Nacos除了可以做注册中心,同样可以做配置管理来使用。
1.1.统一配置管理当微服务部署的实例越来越多,达到数十、数百时,逐个修改微服务配置就会让人抓狂,而且很容易出错。我们需要一种统一配置管理方案,可以集中管理所有实例的配置。
Nacos一方面可以将配置集中管理,另一方可以在配置变更时,及时通知微服务,实现配置的热更新。
1.1.1.在nacos中添加配置文件如何在nacos中管理配置呢?
然后在弹出的表单中,填写配置信息:
注意:项目的核心配置,需要热更新的配置才有放到nacos管理的必要。基本不会变更的一些配置还是保存在微服务本地比较好。
1.1.2.从微服务拉取配置微服务要拉取nacos中管理的配置,并且与本地的application.yml配置合并,才能完成项目启动。
但如果尚未读取application.yml,又如何得知nacos地址呢?
因此spring引入了一种新的配置文件:bootstrap.yaml文件,会在application.yml之前被读取,流程如下:
1)引入nacos-config依赖
首先,在user-servic ...
1.认识微服务随着互联网行业的发展,对服务的要求也越来越高,服务架构也从单体架构逐渐演变为现在流行的微服务架构。这些架构之间有怎样的差别呢?
1.0.学习目标了解微服务架构的优缺点
1.1.单体架构单体架构:将业务的所有功能集中在一个项目中开发,打成一个包部署。
单体架构的优缺点如下:
优点:
架构简单
部署成本低
缺点:
耦合度高(维护困难、升级困难)
1.2.分布式架构分布式架构:根据业务功能对系统做拆分,每个业务功能模块作为独立项目开发,称为一个服务。
分布式架构的优缺点:
优点:
降低服务耦合
有利于服务升级和拓展
缺点:
服务调用关系错综复杂
分布式架构虽然降低了服务耦合,但是服务拆分时也有很多问题需要思考:
服务拆分的粒度如何界定?
服务之间如何调用?
服务的调用关系如何管理?
人们需要制定一套行之有效的标准来约束分布式架构。
1.3.微服务微服务的架构特征:
单一职责:微服务拆分粒度更小,每一个服务都对应唯一的业务能力,做到单一职责
自治:团队独立、技术独立、数据独立,独立部署和交付
面向服务:服务提供统一标准的接口,与语言和技术无关
隔离性强: ...
1 Spring Cache1.1 概览Spring Cache 是一个框架,实现了基于注解的缓存功能,只需要简单地加一个注解,就能实现缓存功能。
Spring Cache 提供了一层抽象,底层可以切换不同的缓存实现,例如:
EHCache
Caffeine
Redis(常用)
起步依赖:
1234<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-cache</artifactId> <version>2.7.3</version> </dependency>
1.2 常用注解在SpringCache中提供了很多缓存操作的注解,常见的是以下的几个:
注解
说明
@EnableCaching
开启缓存注解功能,通常加在启动类上
@Cacheable
在方法执行前先查询缓存中是否有数据,如果有 ...
1. Redis1.1 Redis简介Redis是一个基于内存的key-value结构数据库。Redis 是互联网技术领域使用最为广泛的存储中间件。
**官网:**https://redis.io**中文网:**https://www.redis.net.cn/
key-value结构存储:
主要特点:
基于内存存储,读写性能高
适合存储热点数据(热点商品、资讯、新闻)
企业应用广泛
Redis是用C语言开发的一个开源的高性能键值对(key-value)数据库,官方提供的数据是可以达到100000+的QPS(每秒内查询次数)。它存储的value类型比较丰富,也被称为结构化的NoSql数据库。
NoSql(Not Only SQL),不仅仅是SQL,泛指非关系型数据库。NoSql数据库并不是要取代关系型数据库,而是关系型数据库的补充。
关系型数据库(RDBMS):
Mysql
Oracle
DB2
SQLServer
非关系型数据库(NoSql):
Redis
Mongo db
MemCached
1.2 Redis下载与安装1.2.1 Redis下载Redis安装包 ...
1. 多行输入,每行两个整数123456789101112import java.util.Scanner;public class Main { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); while (scanner.hasNext()) { int a = scanner.nextInt(); int b = scanner.nextInt(); System.out.println(a + b); } }}
2. 多组数据,每组第一行为n,之后输入n行两个整数123456789101112131415import java.util.Scanner;public class Main { public static void main(String[] args) ...