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 ...
Lambda Optional代替if-else
前言函数式的编程可以极大的简化逻辑代码的编写,虽然是一种语法糖,但是好用就是好用。Optional 这个功能可以用来防止null值给程序带来的异常,提供的API也可以用来简化逻辑代码的编码,简化if-else的编写。
写法比较常规代码写法一般写一个业务逻辑时,业务代码需要加很多判断,保证程序的健状性。
12345678910111213public void test() { User user = userService.getUser(); if (user != null) { String userName = user.getUserName(); if (userName != null) { return userName.toUpperCase(); } else { return null; } } else { return null; }}
改进后可以看到,改进后的写法,判空这种操作,直接交给Optiona ...
springboot 发送邮件
最近重写一个邮件服务来给告警业服务用,做成一个内置的应用。直接使用 spring 的 javamail 来实现。公司使用腾讯企业邮箱。这个例子正常使用,可以直接套上使用。
邮件配置以下配置方式二选一
代码方式
yml方式
代码方式1234567891011121314151617181920212223242526272829303132333435363738394041424344454647package com.liukai.springmail.send;import org.springframework.beans.factory.annotation.Configurable;import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;import org.springframework.boot.autocon ...
java 解决父构造器中拿到对象
这两天被问到一个有意思的问题,就是如果在构造器中拿到匿名对象。这个问题有意思在,直觉上是可以通过外部放一个成员变量去接,然后后续就可以使用了,但实际不行。
问题复现下面这个是构造器,当通过 supper 去调用父类构造器。由于问题出现在Spring项目当中,所以我复现的例子也基于Spring重新搭了一个项目来复现这个过程,代码放github上。
复现demo:
12345678910111213package com.test;import org.springframework.beans.factory.annotation.Autowired;public class TransactionCache extends RevokingDB { @Autowired public TransactionCache(String dbName) { // 其他代码不能在 supper 之前,但是又要拿到 TxCacheDB,不能再new一次,否则会初始化两次TxCacheDB。 super(new TxCacheDB(dbName)); // ...
Lambda Optional使用
简述Optional 针对空指处理而设计的类型。Java 8借鉴了Scala和Haskell,提供了一个新的Optional模板,可以用它来封装可能为空的引用。这是一个可以为null的容器对象。使用 Optional 的好处是可以以一种专门针对null的处理方式,来避免值可能存在 null 导致出现的程序异常。你可以理解为:处理null,就是你的业务。在实际使用过程中,你会发现 Optional 的灵活性有时候会让你想用在任何可能出现null的地方,不过凡事都有套路可循,只要清楚利弊就知道该如何选择。
从两个方面说一下 Optional
常用API
项目使用套路
只讲 API 不讲使用套路的文章都是耍流氓。
API说明先看一下常用API,后面再讲实际使用场景。
构建API: 构建Optional对象:of()、ofNullable()、empty()
获取API: 获取Optional对象包装的值:get()、orElse()、orElseGet()、orElseThrow()
判断API:对Optional对象里包装的值做一些逻辑判断:isPresent()、ifPresent ...
静态资源配置的问题
spring boot 的项目是将静态资源打包到.jar 的文件包中, 项目中有碰到需要使用外部静态资源的情况,使用外部资源的一直老出问题,查了google 后发现是指定的方式不对。
静态资源配置将 resource/static 进行映射,springboot 默认优先级:
/META-INF/resources//resources//static//public/
spring 属性合配 resources 配置1.本项目包含路径:
12345spring:mvc: static-path-pattern: /lateresources: static-locations: classpath:/templates/dist/
这两天遇到的坑
2.指定项目外的磁盘路径如果要映射本地磁盘路径,可以使用,注意必须得有 file:, 注意必须得有file:,注意必须得有file: 否则 404, 重要事情说三遍。
12345spring:mvc: static-path-pattern: /lateresources: static-locations: fil ...