Java日知录

一个坚持原创,有态度的博客!

0%

Spring Boot开发过程中,我们经常会看到使用 @Enable***激活我们某一个功能性的模块,通过类注解激活后我们就能使用所激活的配置给我们带来的功能。
今天我们就来探究一下这个 @Enable***给我们做了哪些工作,或者我们应该怎么通过自定义的方式开发我们自己的功能模块。

演示环境

  • IntelliJ IDEA 2020.2.1 (Community Edition)
  • Maven 3.5.4
  • Spring Boot 2.1.1.RELEASE
阅读全文 »

介绍

在SpringBoot的Web项目中,默认采用的是内置Tomcat,当然也可以配置支持内置的jetty,内置有什么好处呢?

  1. 方便微服务部署。
  2. 方便项目启动,不需要下载Tomcat或者Jetty

针对SpringBoot的容器优化,目前来说并没有太多地方,主要需要考虑如下几个点

  • 线程数
  • 超时时间
  • jvm优化
阅读全文 »

本文结合实际开发经验总结出一份符合生产规范的开发实践,希望对你们有所帮助!

Maven规范

  1. 所有项目必须要有一个统一的parent模块所有微服务工程都依赖这个parent,parent用于管理依赖版本,maven仓库,jar版本的统一升级维护在parent下层可以有 core,starter,rate-limit 等自定义模块
阅读全文 »

生产环境网关模块偶发的 OutOfDirectMemoryError 错误排查起来困难且曲折,2021-02-05 号也出现过此问题,起初以为是 JVM 堆内存过小 (当时是 2g) 导致,后调整到 8g (2 月 5 号调整)。但是经过上次调整后 5 月 7 号又出现此问题,于是猜测可能是由于网关模块存在内存泄露导致。

症状

报错详情

网关模块偶现 OutOfDirectMemoryError 错误,两次问题出现相隔大概 3 个月。两次发生的时机都是正在大批量接收数据 (大约 500w),TPS 60 左右,网关服务波动不大,完全能抗住,按理不应该出现此错误。

详细报错信息如下:

阅读全文 »

在实际工作中,经常会遇到一些同学提出这样的问题:MySQL 并没有按照自己的预想来选择索引,比如创建了索引但是选择了全表扫描,这肯定是 MySQL 数据库的 Bug,或者是索引出错了。

当然不是! 这主要因为索引中的数据犯了错。

为什么这么说呢?

要理解该问题,要理解 MySQL 数据库中的优化器是怎么执行的,然后才能明白为什么最终优化器没有选择你预想的索引。

接下来,我们就来理解 MySQL 数据库是怎么选择索引的。

阅读全文 »

一份好的设计文档需要提供清晰的问题描述、整体的概要设计、涵盖各个细节的详细设计等。

这篇有趣的英文小短文通过一个简单的小例子介绍了Google工程师是怎么写设计文档的。本文为中文翻译。原文链接如下:https://luanjunyi.medium.com/how-do-i-write-engineering-design-docs-in-google-an-example-f19febe0297c

写文档是我在谷歌学到的最重要的技能之一。在谷歌,文档被用来讨论问题、作为真实的信息源、组织知识。在我工作过的其他公司中,没有一家对如何使用文档进行协作有这样深刻的理解。

这篇文章就是关于我在谷歌如何写设计文档的一个例子,这是一个真实的项目,用于在新冠疫情期间控制健身房现场人数。即使在新冠疫情结束后不需要预约健身房了,也可以访问GitHub上的源代码[1]。为了让这篇文章更有趣,现在每个人都可以在谷歌文档[2]上进行评论,而且谷歌文档的格式也比Medium支持的要好。

阅读全文 »

概述

在单体服务中我们需要查看日志只需直接在日志文件中 grep、awk 就可以获得自己想要的信息。

但是在微服务架构中,不同的服务模块一般会部署多个节点,日志散落在多个节点的日志文件中。一旦出现问题,我们就需要登录不同的服务节点分别查看日志,非常之繁琐。所以在微服务架构中,我们是需要建立集中式日志收集系统,将所有节点上的日志统一收集,管理,访问。

现在目前主流的分布式日志解决方案还是基于ELK(ElasticSearch、Logstash、Kibana),今天我们就动手搭建一个单机版的ELK日志收集系统并将我们的日志文件集成进去。

阅读全文 »

在这个系列文章中曾经介绍过在SpringCloud体系下如何防止前端请求绕过网关直接到达后端微服务,今天我们要反其道而行之,介绍在SpringCloud体系中如何防止内部隐私接口被网关调用。

看到这里可能有的同学会有点晕,怎么还有这种业务场景呢,别急,咱们先回顾一下我们的业务场景。

阅读全文 »

在SpringCloud架构体系中,微服务间的通信是基于Feign调用。而在实际使用Feign的过程中我们大概率会面临下面几个问题:

  • Feign客户端放在消费端还是独立一个api层?
  • Feign调用的接口如何要不要进行包装?
  • Feign如何抓取业务生产端的业务异常?

这篇文章我们就来一起探讨一下这几个问题,希望看完能对你有所帮助。

阅读全文 »