JUC
未读1.线程池优点
前面我们说过,创建线程的一种方法就是使用线程池,那么使用线程池创建线程的好处是什么呢?
降低系统资源消耗,通过重用已存在的线程,降低线程的创建和销毁造成的消耗
提高系统的相应速度,当有任务到达时候,无需等待新线程的创建便可以立即执行
方便线程并发数的管控,线程不能无限制的创建,会消耗大量的系统资源,甚至会阻塞系统。线程池可以有效管控线程,统一分配,提高系统资源利用率
线程池提高了定时,定期以及可控线程数等功能,使用更加方便
2.四种线程池
Java 里面线程池的顶级接口是 Executor,但是严格意义上讲 Executor 并不是一个线程池,而只是一个执行线程的工具。真正的线程池接口是 ExecutorService。
自定义一个创建线程的通用线程工厂:
123456789101112131415161718public static class testThreadPoolFactory implements ThreadFactory { private AtomicInteger threadIdx = new AtomicInteger(0 ...
一、进程与线程
1.1 进程
进程(Process) 是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。 在当代面向线程设计的计算机结构中,进程是线程的容器。程序是指令、数据及其组织形式的 描述,进程是程序的实体。
1.2 线程
线程(thread) 是操作系统能够进行运算调度的最小单位。它被包含在进程之 中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流, 一个进程中可以并发多个线程,每条线程并行执行不同的任务。
1、线程是独立调度和分派的基本单位。2、同一进程中的多条线程将共享该进程中的全部系统资源。3、一个进程可以有很多线程,每条线程并行执行不同的任务。可并发执行。
1.3 创建线程的几种方式
继承Thread类:创建一个类继承Thread类,并重写run()方法,在run()方法中定义线程要执行的任务。
1234567891011public class MyThread extends Thread { public void run() { System.o ...
1.单独配置(不推荐)
1.1 使用SpringBoot提供的注解
springboot默认提供,在需要的字段上使用
1@JsonFormat(locale = "zh", timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
这个方式每个字段都需要加有点过于麻烦。
1.2 使用Spring自带注解
1@DateTimeFormat(pattern = "yyyy-MM-dd")
这个方式每个字段都需要加有点过于麻烦。
2.全局配置
2.1 在配置文件上配置
12spring.jackson.date-format=yyyy-MM-dd HH:mm:ssspring.jackson.time-zone=GMT+8
123456spring: jackson: ## 格式为yyyy-MM-dd HH:mm:ss date-format: yyyy-MM-dd HH:mm:ss ## 定时区,解决8小时的时间差问题 tim ...
全局异常捕获
SpringBoot中,@ControllerAdvice 即可开启全局异常处理,使用该注解表示开启了全局异常的捕获,我们只需在自定义一个方法使用@ExceptionHandler注解然后定义捕获异常的类型即可对这些捕获的异常进行统一的处理。
1.自定义异常
1234567891011/** * @Author wzy * @Date 2023/12/27 14:52 * @description: 自定义异常 */public class CustomException extends RuntimeException{ public CustomException(String message) { super(message); }}
2.通用报错信息枚举类
1234567891011121314151617181920212223242526package com.wzy.base.exception;/** * @Author wzy * @Date 2023/12/27 15:02 * @des ...
SpringCloud
未读1.网关路由
1.1 认识网关
网关就是网络的关口。数据在网络间传输,从一个网络传输到另一网络时就需要经过网关来做数据的路由和转发以及数据安全的校验。
在微服务架构里,服务的粒度被进一步细分,各个业务服务可以被独立的设计、开发、测试、部署和管理。这时,各个独立部署单元可以用不同的开发测试团队维护,可以使用不同的编程语言和技术平台进行设计,这就要求必须使用一种语言和平 台无关的服务协议作为各个单元间的通讯方式。
网关的角色是作为一个 API 架构,用来保护、增强和控制对于 API 服务的访问。API 网关是一个处于应用程序或服务(提供 REST API 接口服务)之前的系统,用来管理授权、访问控制和流量限制等,这样 REST API 接口服务就被 API 网关保护起来,对所有的调用者透明。因此,隐藏在 API 网关后面的业务系统就可以专注于创建和管理服务,而不用去处理这些策略性的基础设施。
1.2 网关组成
网关 = 路由转发 + 过滤器(编写额外功能)
1. 路由转发
接收外界请求,通过网关的路由转发,转发到后端的服务上。
如果只有这个一个功能看起来和之前学习的Nginx反向代理 ...
SpringCloud
未读在上一篇文章,利用nacos实现了服务的注册和发现,利用RestTemplate实现了服务的远程调用。但是远程调用的代码太复杂了。
而且这种调用方式,与原本的本地方法调用差异太大,编程时的体验也不统一,一会儿远程调用,一会儿本地调用。
因此,我们必须想办法改变远程调用的开发模式,让远程调用像本地方法调用一样简单。而这就要用到OpenFeign组件了。
其实远程调用的关键点就在于四个:
请求方式
请求路径
请求参数
返回值类型
所以,OpenFeign就利用SpringMVC的相关注解来声明上述4个参数,然后基于动态代理帮我们生成远程调用的代码,而无需我们手动再编写,非常方便。
1.快速入门
1.1 导入依赖
12345678910<!--openFeign--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</arti ...
SpringCloud
未读1.服务注册与发现
1.1 注册中心原理
在微服务远程调用的过程中,包括俩个角色:
服务提供者:提供接口供其他微服务访问
服务消费者:调用其他微服务接口
在大型微服务项目中,服务提供者的数量会非常多,为了管理这些服务就引入注册中心的概念。
1.2 数据库准备 用作持久化
我们基于Docker来部署Nacos的注册中心,首先我们要准备MySQL数据库表,用来存储Nacos的数据。由于是Docker部署,所以大家需要将资料中的SQL文件(github上可以找到这个sql文件)导入到你Docker中的MySQL容器中:
然后修改nacos文件中的custom.env文件
123456789PREFER_HOST_MODE=hostnameMODE=standaloneSPRING_DATASOURCE_PLATFORM=mysqlMYSQL_SERVICE_HOST=192.168.163.128//宿主机ip地址修改为自己的MYSQL_SERVICE_DB_NAME=nacosMYSQL_SERVICE_PORT=3306MYSQL_SERVICE_USER=rootMYSQL_S ...
关于springboot的自动配置原理,是非常非常非常重要的知识点,应该牢记和熟悉其原理!!!!!!!!!!
如果学过SpringMVC,一定有被XML 配置统治的恐惧。这也就是为什么SpringMVC被称为配置地狱。但是,Spring Boot 项目,我们只需要添加相关依赖,无需配置,通过启动下面的 main 方法即可。
1234567@SpringBootApplicationpublic class DemoApplication { public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); }}
自动装配可以说是springboot的核心。springboot自动配置原理就是当spring容器启动时候,一些配置类、、bean对象就自动存入IOC容器中,不需要我们手动申明,从而简化了开发,省去了繁琐的配置操作。
SpringBoot是如何实现自动装配的?
每一个启动类上都有springbo ...
一、操作系统概述
1.1 操作系统的定义与目标
定义:操作系统是控制管理计算机系统的硬软件,分配调度资源的系统软件。
目标:方便性,有效性(提高系统资源的利用率、提高系统的吞吐量),可扩充性,开放性。
1.2 操作系统的基本功能
1.统一管理计算机资源:处理器资源,IO设备资源,存储器资源,文件资源
2.实现了对计算机资源的抽象:IO设备管理软件提供读写接口,文件管理软件提供操作文件接口
3.提供了用户与计算机之间的接口:GUI图形用户界面,命令形式,系统调用形式
1.3 操作系统的特征(重点)
最基本的特征,互为存在条件:并发,共享;
1.并发
(1)并行:俩个或多个时间可以在同一个时刻发生,多核cpu可以实现并行
(2)并发:同一个时间间隔发生,每个程序交替执行
2.共享性:操作系统中的资源可以供多个并发的程序共同使用,称为资源共享。
互斥共享:当资源被资源占用时,其他想使用的程序只能等待。
同时访问:某种资源并发的被多个程序访问
虚拟和异步性的前提是具有并发性
3.虚拟性:表现为把一个物理实体转变为若干个逻辑实体
时分复用技术:资源在时间上进行复用,不同程序并发使用,多到程 ...
为什么调优
防止出现OOM,进行JVM规划和预调优
解决程序运行中各种OOM
减少Full GC出现的频率,解决运行慢,卡顿问题
调优的大方向
合理的编写代码
充分并合理的使用硬件资源
合理的进行JVM调优
总结:要从业务场景开始,没有业务场景的调优都是耍流氓;无监控,不调优。
调优监控的依据
运行日志、异常堆栈、GC日志、线程快照、堆转储快照
调优的基本步骤
第一步,熟悉业务场景
第二步,进行性能监控来发现问题:GC频繁、cpu load过高、OOM、内存泄露、死锁、程序相应时间过长
第三步,进行性能分析来排查问题:
打印GC日志,通过GCviewer或者http://gceasy.io来分析日志信息
灵活运用命令行工具,jstack,jmap,jinfo等
dump出堆文件,使用内存分析工具分析文件
使用阿里Arthas,或jconsole,JVisualVM来实时查看JVM状态
jstack查看堆栈信息
第四步,进行性能调优解决问题:
适当增加内存,根据业务背景选择垃圾回收器
优化代码,控制内存使用
增加机器,分散节点压力
合理设置线程池数量
使用中间件提高程序 ...