跳至主要內容
Spring Gateway堆外内存溢出问题定位

公司使用Spring Gateway作为业务网关,一直存在一个堆外内存泄露的疑难杂症。从同事手上接手过来后最终解决了这个问题。


DHB大约 3 分钟JavaSpringSpring Gateway
Spring事务分析

Propagation

  • REQUIRED:支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择。
  • SUPPORTS:支持当前事务,如果当前没有事务,就以非事务方式执行。
  • MANDATORY:支持当前事务,如果当前没有事务,就抛出异常。
  • REQUIRES_NEW:新建事务,如果当前存在事务,把当前事务挂起。
  • NOT_SUPPORTED:以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
  • NEVER:以非事务方式执行,如果当前存在事务,则抛出异常。
  • NESTED:支持当前事务,如果当前事务存在,则执行一个嵌套事务,如果当前没有事务,就新建一个事务。

DHB大约 1 分钟JavaSpring
scheduleAtFixedRate与scheduleWithFixedDealy

scheduleAtFixedRate

如果上一个任务的执行时间大于等待时间,任务结束后,下一个任务马上执行

scheduleWithFixedDealy

如果上个任务的执行时间大于等待时间,任务结束后也会等待相应的时间才执行下一个任务

总结

也就是说,不管是scheduleAtFixedRate还是scheduleWithFixedDealy都会等待上一个任务运行结束再进行下一个任务。如果需要并行执行,可以考虑任务中使用异步处理,比如Spring Boot中的@Async


DHB小于 1 分钟JavaSpring
Spring Boot源码编译

Spring Boot源码编译

fork spring boot[可选]

我fork一个Spring boot到自己的github上,主要是为了把阅读源码时添加的一些注释push上去,所以这一步是可选的。

clone spring boot

1、把Spring boot源码克隆下来

git clone https://github.com/DHBin/spring-boot.git

DHB大约 1 分钟JavaSpring源码
Spring 获取真实Ip

获取客户端的IP地址的方法是:request.getRemoteAddr(),这种方法在大部分情况下都是有效的。

但是在通过了Apache,Squid等反向代理软件就不能获取到客户端的真实IP地址了,如果通过了多级反向代理的话,X-Forwarded-For的值并不止一个,而是一串IP值, 究竟哪个才是真正的用户端的真实IP呢?

答案是取X-Forwarded-For中第一个非unknown的有效IP字符串。 例如:X-Forwarded-For:192.168.1.110, 192.168.1.120, 192.168.1.130, 192.168.1.100 用户真实IP为: 192.168.1.110


DHB小于 1 分钟JavaSpring
Spring boot中怎么发送各种格式的邮件

纯文本邮件

@Autowired
JavaMailSender mailSender;

public void sendSimpleMail() {
    SimpleMailMessage message = new SimpleMailMessage();
    message.setFrom("xx158@qq.com");    // 发件人
    message.setTo("1020641638@qq.com"); // 收件人
    message.setSubject("标题");
    message.setText("内容");
    mailSender.send(message);
}

DHB大约 1 分钟JavaSpring