spring cloud 四种服务下线方式
这里指已经在 Eureka 注册中心注册的服务,如果需要停用,有四种方式进行停用。
1.直接关闭最粗暴。写这个是因为,直接关闭,如果 Eureka 开了保护模式,会导至服务已关闭,但是未下线,还是会重试调用。如果不需强稳定性的话可以这么干。
2.客户端主动通知注册中心下线安全。Eureka注册中心在收到某个客户端下线后不会马上通知所有的注册的客户端,而是等到客户端进行心跳的时候(心跳(续约)频率,默认30秒 )再将下的数据返回。通过这种方式下线的话,可以在某个服务下线后防止其他服务调用此服务失败。
白话就是,服务状态下线了,但是不通知其他服务。等到续约时间到了,再通知所有注册服务。
猜测,服务下线后,在没有心跳前,其他服务还是可以进行调用。等到心跳后,通知所有服务已下线,其他服务认为已下线,就不会再调该下线服务。
12345678 @Autowired private DiscoveryClient client; @ResponseBody @GetMapping("/eurekaUnRegister") public String shut ...
JVM 日志输出参数 [-XX:+PrintGCDetails] 解释
PrintGCDetails 参数
-XX:+PrintGCDetails 是在启动 java 时,添加的 VM 参数,用来在控制台中输出 GC 的详情。用这个参数可以详细的查看 GC 的回收操作,一般会将 GC 的输出,单独单到一个 log 文件当中进行查看。
添加启动参数
java -XX:+PrintGCDetails -jar Demo.jar
GC日志示例120.098: [GC (Allocation Failure) [PSYoungGen: 1022K->490K(1536K)] 1022K->522K(30208K), 0.0007804 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]1.959: [Full GC (Ergonomics) [PSYoungGen: 384K->0K(1536K)] [ParOldGen: 28064K->11941K(28672K)] 28448K->11941K(30208K), [Metaspace: 3382K->3382K(10567 ...
产生线程死锁的原因和处理方式
产生背景
简单的说:线程1 想要去拿一个由 线程2 持有的锁,由于synchronized 的锁是互斥锁,某一时刻只能被一个线程所持有,所以线程1 就拿不到锁。
死锁原因是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。原因如下:
因为系统资源不足。
进程运行推进的顺序不合适,这种产生的最多。
资源分配不当。
多个线程同时被阻塞,它们中的一个或者全部都在等待某个资源被释放,而该资源又被其他线程锁定,从而导致每一个线程都得等其它线程释放其锁定的资源,造成了所有线程都无法正常结束。
因为多线程访问共享资源,由于访问的顺序不当所造成的,通常是一个线程锁定了一个资源A,而又想去锁定资源B;在另一个线程中,锁定了资源B,而又想去锁定资源A以完成自身的操作,两个线程都想得到对方的资源,而不愿释放自己的资源,造成两个线程都在等待,而无法执行的情况。
产生背景: 在多线程环境下,争抢同是争抢对方资源(锁)就会产生该问题,即产生死锁。
java 死锁产生的四个必要条件
互斥使用,即当资源被一个线程使用(占有)时,别的线程不能使用
不 ...
你为什么学不会lambda
这个一篇对学习 Lambda 表达式进行解惑的文章,主要是总结了自己在学习 Lambda 表达式时候的一些理解不了的坑进行总结。长篇大论和详细语法,自行谷歌,这里只说一些理解起来不顺的概念。
重要事情说三遍123首先 Lambda 表达式 ()->{ } 是一种方法实现,并且在直接调用的时候才会执行。首先 Lambda 表达式 ()->{ } 是一种方法实现,并且在直接调用的时候才会执行。首先 Lambda 表达式 ()->{ } 是一种方法实现,并且在直接调用的时候才会执行。
1. 什么是 ()->{ }理论造航母,程序就一行。不提什么是函数式编程,用大白话,其实就是写了一个匿名实现,并且在需要使用这行匿名实现的时候调用了一下,才会直正去执行这个匿名实现方法。Lambda 表达式,本质上是一种延迟加载执行。将预先写好的实现方法进行加载。到实际使用时,再执行。
演示执行过程:1.声明一个 Lambda 表达式接口2.加载一下匿名实现方法3.执行一下
新建一个类,声明一个 Lambda 表达式接口12 ...
JDK11介绍
JDK 11 特性做为java开发JDK的更新内容是必须要关注的,这里我把JDK11的相关的JEP(JDK Enhancement Proposals),汇总并偿试了一下。分享一下相关的改进点。历史所有JEP:http://openjdk.java.net/jeps/0
JDK11发版 JEP 汇总JDK11 于2018年9月25日发布正式版,其中官方给出的改进JEP如下:
JEP-181 嵌套类可见性控制JEP-309 动态类文件常量JEP-315 改进 Aarch64 IntrinsicsJEP-318 Epsilon–一个无操作的垃圾收集器JEP-320 删除 Java EE 和 CORBA 模块JEP-321 HttpClientJEP-323 用于 Lambda 参数的局部变量语法JEP-324 Curve25519 和 Curve448 算法的密钥协议JEP-327 Unicode 10JEP-328 Flight Recorder(飞行记录器)JEP-329 haCha20 和 Poly1305 加密算法支持JEP-330 Launch Single-File Sourc ...
docker run 和 start 的区别
1.docker rundocker run 只在第一次运行时使用,将镜像放到容器中,以后再次启动这个容器时,只需要使用命令docker start 即可。docker run相当于执行了两步操作:将镜像放入容器中(docker create),然后将容器启动,使之变成运行时容器(docker start)。
2.docker startdocker start的作用是,重新启动已存在的镜像。也就是说,如果使用这个命令,我们必须事先知道这个容器的ID,或者这个容器的名字,我们可以使用docker ps找到这个容器的信息。
3.查看所有容器而要显示出所有容器,包括没有启动的,可以使用命令docker ps -a
4.重命名1docker rename old_name new_name
5.启停1docker [stop]|[start] name
docker 守护容器
docker 守护式容器守护式容器,是可以长时间运行的容器:
1.能够长期运行,没有交互式会话2.适合运行应用程序和服务
命令:
1docker run -d 镜像名[COMMAND][arg...]
重点是 -d -d -d
1.启动守护式容器1234567docker run --name dc1 -d ubuntu /bin/sh -c "while true ;do echo hello world ; sleep 1 ; done"#非守护式,打印 hello world后就退出docker run ubuntu:15.10 /bin/echo "Hello world"#查看运行中的容器docker psdocker stats
2.再次进入守护式容器 attach1234docker attach [id | name] //查看刚才用 ctrl + P/Q 退出的命令docker attach a54w1a26 //容器还在运行exit / ...
mac下 iterm2实现 clone session
问题最近在使用iterm2的时候,需要clone多个session,然后发现每次登陆都需要重新输入一个动态验证码,非常麻烦,又不想使用 SecureCRT,所以就研究了一下iterm2是怎么实现clone不需要重复输入的动态验证码的。公司使用跳板机登陆,很从小伙伴应该也都是使用跳板机登陆,SecureCRT就可以每次Clone Session 不需要输入。
配置创建文件1touch ~/.ssh/config
在文件中添加配置
12345Host *ServerAliveInterval 30ControlMaster autoControlPath ~/.ssh/master-%r@%h:%pControlPersist yes
下次打开后,就可以复用session,不需要重复的输入动态验证码。
docker 基本操作
最近在研究使用 docker 进行微服务改造,总结了一下常用的命令,docker 这东西,单个用简单,整体配合 k8s 和 spring cloud 坑还是不少,一个一个解决掉以后,他的易用性和高可用的特性确实很棒。
如果是业务日志需要输出到宿主机上,可以使用 -v 挂载。
1.查看 docker 信息 infodorker info
2.运行 docker 容器 rundocker run IMAGE //启动容器docker run ubuntu echo "en heng"这种命令运行完就退出了。
3.启动交互式容器docker run -it IMAGE //交互式,即进入容器docker run -i -t ubuntu /bin/bash //进入容器ps -efexit //退出
4.查看容器 psdocker ps [-a] [-l]docker psdocker ps -a //-a 全部容器
CONTAINER ID //docker为容器分配的id,即守护进程IDNAME // ...
docker-安装docker
CentOS 安装docker这个命令在 CentOS 环境下使用,在ARM架构下也不需要特殊处理。
添加源
curl https://download.docker.com/linux/centos/docker-ce.repo -o /etc/yum.repos.d/docker-ce.repo
安装 docker
yum install -y docker-ce docker-ce-cli containerd.io
开启docker服务
systemctl enable dockersystemctl start docker
验证
docker ps
MacOS 安装dockerbrew 安装那肯定是离不开 brew 的。
brew install --cask --appdir=/Applications docker
官网下载安装如果习惯手动安装的话,到官方网站上下载https://docs.docker.com/desktop/mac/install/