什么是线程安全这篇博客内容很好,直接偷过来:
什么是线程安全?如何保证线程安全?-CSDN博客
如何保证线程安全第一种:加锁。
在 Java 中通过添加synchronized关键字实现,对方法或者代码块进行互斥。
第二种:CAS非阻塞同步。
通过不断自旋进行重试,避免线程进入阻塞状态,挂起和唤醒都需要性能开销。
前面两种方式可以参考上面的博客和我写的锁的内容:Java多线程:(三)多线程锁、JUC锁的实现
第三种:ThreadLocal无同步方案。
线程本地存储:将共享数据的可见范围限制在一个线程中。这样无需同步也能保证线程之间不出现数据争用问题。
这种方式我结合后端开发一起介绍。
SpringBoot + ThreadLocal通常,我们会使用 synchronzed 关键字 或者 lock锁 来控制线程对临界区资源的同步顺序,但这种加锁的方式会让未获取到锁的线程进行阻塞,很显然,这种方式的时间效率不会特别高。
线程安全问题的核心在于多个线程会对同一个临界区的共享资源进行访问,那如果每个线程都拥有自己的“共享资源”,各用各的,互不影响,这样就不会出现线程安全的问题了,对吧?
顾名 ...
MySQL中的锁,按照锁的粒度分,分为:
全局锁:锁定数据库中所有表
表级锁:每次操作锁整张表
行级锁:每次操作锁住对应行数据
一、全局锁
mysqldump相信大家都听说过,这是用来进行数据库备份的工具,除此以外也可以采用数据库主从复制机制进行数据库备份,这同时也是异地容灾、备份等内容。
数据库备份操作:
# 加锁操作flush tables with read lock;# 数据备份mysqldump -uroot -p databases > database.sql# 加端口的数据备份mysqldump -h..xx.xx -uroot -p databases > database.sql# 解锁操作unlock tables;
这里附上一篇flush操作的博客,用的是博客中的第条:MySQL flush命令详解-CSDN博客
FLUSH TABLES: 关闭所有表并清空表缓存(如查询缓存),或者指定特定表进行刷新。这对于解决锁问题、确保数据一致性或在没有重启MySQL服务的情况下应用表结构更改很有用 ...
Docker 是什么Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从 Apache. 协议开源。
Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。
容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低。
docker 三个重要概念. Dockerfile这是一个文本文件,包含了一系列的指令,用于描述如何构建一个镜像。可以使用 docker build 命令根据 Dockerfile 中的指令逐步构建镜像。
. Image;镜像一、概念
Docker 镜像可以看作是一个包含了运行特定软件所需的所有文件和配置的静态文件包。它就像是一个软件的安装包,但更加轻量级和灵活。
一个镜像通常由以下几个部分组成:
基础操作系统层:可以基于常见的 Linux 发行版,如 Ubuntu、CentOS 等。
应用程序及其依赖:包括应用程序的二进制文件、库文件、配置文件等。
元数据:描述镜像的信息,如作者、版本号、标签等。
...
Sentinel 规则持久化一、修改order-service服务修改OrderService,让其监听Nacos中的sentinel规则配置。
具体步骤如下:
.引入依赖在order-service中引入sentinel监听nacos的依赖:
<dependency> <groupId>com.alibaba.csp</groupId> <artifactId>sentinel-datasource-nacos</artifactId></dependency>
.配置nacos地址在order-service中的application.yml文件配置nacos地址及监听的配置信息:加的是datasource往下的内容。
spring: cloud: sentinel: datasource: flow: nacos: server-addr: localhost: ...
后端开发未读
微服务保护:sentinel微服务保护
.初识Sentinel..雪崩问题及解决方案...雪崩问题微服务中,服务间调用关系错综复杂,一个微服务往往依赖于多个其它微服务。
如图,如果服务提供者I发生了故障,当前的应用的部分业务因为依赖于服务I,因此也会被阻塞。此时,其它不依赖于服务I的业务似乎不受影响。
但是,依赖服务I的业务请求被阻塞,用户不会得到响应,则tomcat的这个线程不会释放,于是越来越多的用户请求到来,越来越多的线程会阻塞:
服务器支持的线程和并发数有限,请求一直阻塞,会导致服务器资源耗尽,从而导致所有其它服务都不可用,那么当前服务也就不可用了。
那么,依赖于当前服务的其它服务随着时间的推移,最终也都会变的不可用,形成级联失败,雪崩就发生了:
...超时处理解决雪崩问题的常见方式有四种:
•超时处理:设定超时时间,请求超过一定时间没有响应就返回错误信息,不会无休止等待
...仓壁模式(线程隔离)方案:仓壁模式
仓壁模式来源于船舱的设计:
船舱都会被隔板分离为多个独立空间,当船体破损时,只会导致部分空间进入,将故障控制在一定范围内,避免整个船体都被淹没。
于此 ...
resiliencej在 Spring Cloud 中使用 ResilienceJ 断路器进行配置非常直观。下面我会提供一个简单的示例,展示如何在 Spring Boot 应用程序中配置 ResilienceJ 断路器。
一、circuitbreaker(断路器). 添加依赖首先,确保你的项目中包含了必要的依赖。对于非响应式应用程序,你需要添加以下依赖:
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-circuitbreaker-resiliencej</artifactId> <version>$spring-cloud.version</version></dependency>
对于响应式应用程序,则需要使用:
<dependency> <groupId& ...
后端开发未读
分布式事务:Seata微服务下的事务场景在以下场景中,用户支付成功后,订单服务创建业务,同时使用 restTemplate 或者 feign 对其他服务发起远程调用,完成整个业务流程。
照理来说所有业务要么都成功,要么都失败,在没有加上事务管理时,是否能保证事务一致性?
实际上不会。假设在第三个库存服务中,商品库存不够了,那么后端确实会给前端报错信息(报状态码),但是在前面两个服务不会同时失败。也就是说,订单确实创建了,钱也确实少了,但是给不了货儿,明白了吧?此时事务就不是一致的。
在分布式系统中,一个业务跨越了多个服务或数据源,每个事务都是一个分支事务,而整个事务称为全局事务。保证所有分支事务的最终一致性,这样的事务就是分布式事务。
那么,如何保证分布式事务?先从基本的理论开始~
理论基础CAP定理四张图介绍CAP定理。
Base理论在CAP中,P是一定会发生的。想想看,网络故障,或者仅仅是普通的网络波动等其他原因,都有可能会导致集群中的节点不可用。因此满足P的前提下,能产生的模式也就只有两个了,那就是CP模式和AP模式。
无论是AP模式还是CP模式,他俩都在一开始我们提出分布式事务中遇 ...
Java开发未读
Java高级:动态代理、反射动态代理什么是动态代理为了避免代码侵入式的修改,在程序运行时,目标对象不变,对目标对象生成代理对象,代理对象中的方法是目标对象方法的增强方法,最终达到目标对象增强的效果。
Java中动态代理的实现第一种:基于接口实现动态代理
基于接口的动态代理,用到的类是Proxy的newProxyInstance静态方法创建,要求被代理对象至少实现一个接口,如果没有,则不能创建代理对象。
import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; interface MyInterface void doSomething(); public class DynamicProxyDemo ...
如何在SpringCloud中使用Nacos面试官提问,怎么在你的服务中使用Nacos?
下载安装&使用
使用window直接在Nacos官网下载就可以了,或者使用docker拉取nacos的镜像,我使用的是windows安装。
安装Nacos后在bin目录下使用cmd,执行命令startup.cmd -m standalone,以单机的模式启动nacos。打开浏览器中默认的账号和密码都是nacos。
springcloud引入依赖
<!-- springCloud --><dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>$spring-cloud.version</version> <t ...