JVM类加载机制 在类加载过程的加载阶段,通过类的完全限定名,获取描述类的二进制流的实现类,被称为“类加载器”隔离加载类。在某些框架内进行中间件与应用的模块之间进行隔离,把类加载到不同的环境。修改类加载方式。扩展加载源。比如:从数据库、网络、电视机顶盒进行类加载。防止源码泄漏。比如:编译时字节码进行加密,需要通过自定义类加载器对字节码进行解密还原。
JVM基本了解 如果是热机状态,正常情况下,集群中的一半的机器可以勉强支撑负载流量,但由于刚启动的 J 均是解释执行,还没有进行热点代码统计和JT动态编译,导致机器启动之后,当前 1/2 发布成功的服务器马上全部宕机。剩余部分中的每个字节均代表一个字节码指令,由于每个指令的长度按照 1 个字节存储,所以每个指令被称为字节码(Bytecode),Java 所有的字节码指令有 200 多个。字节码必须通过类加载器,通过加载、验证、解析等校验步骤,将字节码文件中的类,加载至 JVM 的中运行时数据区,才可以执行字节码。
线程池的状态 线程池已经完全终止,所有的任务均已完成,所有资源已被释放。线程池的状态分为:RUNNING, SHUTDOWN, STOP, TERMINATED。■当工作队列为空时,并且线程池中执行的任务也为空时,线程池进入TDNG状态;该状态的线程池会接收新任务,并处理工作队列中的任务。:线程池被一旦被创建,就处于RUNNING状态,并且线程池中的。:该状态的线程池不会接收新任务,但会处理工作队列中的任务;:该状态表明所有的任务已经运行终止,记录的任务数量为O;■线程池中执行的任务为空,进入TIDYING状态;
线程池的执行流程 如果需要更细粒度的控制,可以使用类自定义线程池。核心线程数 (: 线程池中的基本线程数量,核心线程创建后不会被回收,大于核心线程数的线程,在空闲时间超过keepAliveTime后会被回收。在创建了线程池后,默认情况下,线程池中并没有任何线程,当调用 execute()方法添加一个任务时,如果正在运行的线程数量小于 corePoolsize ,则马上创建新线程并运行这个任务。
线程池的类型 在指定的延迟后执行一次任务。: 在指定的初始延迟后,按照固定的周期执行任务。: 在任务完成后,等待指定的延迟再执行下一个任务。延迟3秒钟后执行,任务只执行1次executorservice.schedule(new Task("线程A"),3,TimeUnit.SECONDS);延迟2秒钟后,每隔3秒钟执行任务1次/ /方式1executorService.scheduleAtFixedRate(new Task("线程A"),2,3,TimeUnit.SECONDS);// 方式2。
Java反射机制 Java 反射是一种强大的特性,允许程序在运行时检查和操作类、方法、字段等。通过反射,Java 程序可以动态地加载类、创建对象、调用方法和访问字段,而无需在编译时知道这些类的具体信息。每个。
Swagger Swagger 是一个规范和完整的框架,用于生成、描述、调用和可视化 RESTful 风格的 Web 服务。使用 Swagger,就是把相关的信息存储在它定义的描述文件里面(yml或json格式),再通过维护这个描述 文件可以去更新接口文档,以及生成各端代码。而Springfox-swagger,则可以通过扫描代码去生成这个 描述文件,连描述文件都不需要再去维护了。所有的信息,都在代码里面了。代码即接口文档,接口文 档即代码。总体目标是使客户端和文件系统作为服务器以同样的速度来更新。
微服务保护 什么是雪崩问题?微服务之间相互调⽤,因为调⽤链中的⼀个服务故障,引起整个链路都⽆法访问的情况。可以认为:限流是对服务的保护,避免因瞬间⾼并发流量⽽导致服务故障,进⽽避免雪崩是⼀种预防措施。超时处理、线程隔离、降级熔断是在部分服务故障时,将故障控制在⼀定范围,避免雪崩。是⼀种补救 措施。Sentinel是阿⾥巴巴开源的⼀款微服务流量控制组件。
微服务⽹关 ⽹关搭建步骤:1. 创建项⽬,引⼊nacos服务发现和gateway依赖2. 配置application.yml,包括服务基本信息、nacos地址、路由路由配置包括:1. 路由id:路由的唯⼀标示2. 路由⽬标(uri):路由的⽬标地址,http代表固定地址,lb代表根据服务名负载均衡3. 路由断⾔(predicates):判断路由的规则,4. 路由过滤器(filters):对请求或响应做处理。
微服务通信 Feign可以⽀持很多的⾃定义配置,如下表所示:⼀般情况下,默认值就能满⾜我们使⽤,如果要⾃定义时,只需要创建⾃定义的@Bean覆盖默认Bean 即可。配置⽂件⽅式feign:client:config:default: # 这里用default就是全局配置,如果是写服务名称,则是针对某个微服务的配置loggerLevel: FULL # 日志级别feign:client:config:default: # 这⾥⽤default就是全局配置,如果是写服务名称,则是针对某个微服务的配置。
微服务注册中⼼ Nacos 致⼒于帮助您发现、配置和管理微服务。Nacos 提供了⼀组简单易⽤的特性集,帮助您快 速实现动态服务发现、服务配置、服务元数据及流量管理。nacos的作⽤就是⼀个注册中⼼,⽤ 来管理注册上来的各个微服务是 Netflixfa 发布的⼀个负载均衡器,有助于控制 HTTP 和 TCP客户端⾏为。在 SpringCloud 中, Nacos⼀般配合Ribbon进⾏使⽤,Ribbon提供了客户端负载均衡的功能,Ribbon利⽤从Nacos中读取到 的服务信息,在调⽤服务节点提供的服务时,会合理的进⾏负载。
微服务基础知识 SOA 全称为 Service-Oriented Architecture,即⾯向服务的架构。它可以根据需求通过⽹络对松散耦合 的粗粒度应⽤组件(服务)进⾏分布式部署、组合和使⽤。⼀个服务通常以独⽴的形式存在于操作系统进程 中。站在功能的⻆度,把业务逻辑抽象成可复⽤、可组装的服务,通过服务的编排实现业务的快速再⽣,⽬ 的:把原先固有的业务功能转变为通⽤的业务服务,实现业务逻辑的快速复⽤。通过上⾯的描述可以发现 SOA 有如下⼏个特点:分布式、可重⽤、扩展灵活、松耦合。
Spring中Bean的生命周期 BeanDefinition存储到一个名为beanDefinitionMap对象存储在一个名为singletonObjects的MapSpring Bean的生命周期是从 Bean 实例化之后,即通过反射创建出对象之后,到Bean成为一个完整对象,最终存储到单例池中,这个过程被称为Spring Bean的生命周期。Bean的实例化阶段。
SpringBoot 自动配置 自定义启动器(Custom Starter)是Spring Boot的一种常见功能,主要用于打包一些自动配置功能和相关的依赖,以便其他Spring Boot项目能够方便地使用。创建一个独立的 Maven 或 Gradle 项目创建一个新的项目,用于实现自定义启动器。2.添加必要的依赖3创建自动配置类:并添加注解//@EnableConfigurationProperties开启对特定配置属性类的支持。它允许将一个或多个配置属性类注册到 Spring 的上下文中。
Redis面试题 -旦有请求到达,就会交给Redis线程处理,这就实现了- -个Redis线程处理多个1O流的效果。之所以Redis为「关闭文件、AOF 刷盘、释放内存」这些任务创建单独的线程来处理,是因为这些任务的操作都是很耗时的,如果把这些任务都放在主线程来处理,那么Redis主线程就很容易发生阻塞,这样就无法处理后续的请求了。单台设备的Redis的QPS (Query Per Second,每秒钟处理完请求的次数)是MySQL的10倍,Redis单机的QPS能轻松破10w,而MySQL单机的QPS很难破1w。
Spring-data-redis 说明: 在 SpringBoot2.x 之后,原来使用的jedis 被替换为了 lettuce: 采用的直连,多个线程操作的话,是不安全的,如果想要避免不安全的,使用 jedis pool 连接池: 采用netty,实例可以再多个线程中进行共享,不存在线程不安全的情况!可以减少线程数据 了。
SpringBoot 自动配置(Condition) ConditionalOnProperty:判断配置文件中是否有对应属性和值才初始化Bean ConditionalOnClass:判断环境中是否有对应字节码文件才初始化Bean ConditionalOnMissingBean:判断环境中没有对应Bean才初始化Bean。:自定义类实现Condition接口,重写 matches 方法,在 matches 方法中进行逻辑判 断,返回 boolean值。:上下文对象,可以获取属性值,获取类加载器,获取BeanFactory等。将类的判断定义为动态的。
SpringBoot事务-调度-缓存 通过和@Async注解,Spring 允许你轻松地将方法异步执行,从而提高应用的吞吐量和响应速度。同时,自定义配置线程池也可以使你更好地控制异步任务的执行。使用异步任务时要注意,异步方法不能被同一类中的其他方法直接调用,因为那样不会触发代理,方法会在同一线程中执行。通过和@Scheduled注解,Spring 提供了一种简单而强大的方式来实现定时任务。你可以根据需要自定义 cron 表达式,以满足不同的调度需求。