飞污熊博客

静下心来做一件事

在JDK1.8 Hotspot移除了永久代用元空间(Metaspace)取而代之, 这时候字符串常量池还在堆, 运行时常量池还在方法区, 只不过方法区的实现从永久代变成了元空间(Metaspace) ,元空间使用的是直接内存,跟JVM内存无关。

字符串常量池中同时存在字符串常量和字符串引用。直接赋值和new String("xxx")构造函数都可能导致常量池中生成字符串常量; 而intern()方法会尝试将堆中对象的引用放入常量池。

字符串的创建和使用几种典型常见。

阅读全文 »

REST API都是要对外提供服务的,那么文档是必须的。Swagger是一个简单但功能强大的API表达工具。 它具有地球上最大的API工具生态系统,数以千计的开发人员,使用几乎所有的现代编程语言, 都在支持和使用Swagger。使用Swagger生成API,我们可以得到交互式文档,自动生成代码的SDK以及API的发现特性等。

2.X版本已经发布,Swagger变得更加强大。值得感激的是,Swagger的源码100%开源在github

使用Swagger不纯粹是为了生成一个漂亮的API文档,也不纯粹是为了自动生成多种语言的代码框架, 重要的是,通过遵循它的标准, 可以使REST API分组清晰、定义标准。

通过Swagger生成API 文档有两种方式:

  1. 通过代码注解来生成。好处:随时保持接口和文档的同步。坏处:代码入侵
  2. 使用Swagger Editor 编写API文档的Yaml/Json定义。

虽然第一种方式最方便,不用编写swagger配置文件,但是对代码污染太严重了。所以在项目里面我选择第二种方式, 另外我也不实用Swagger UI来展示API文档,页面太花哨了。 这里我选择swagger2markup将其转换为AsciiDoc或MarkDown格式。

阅读全文 »

smart-doc是一款同时支持JAVA REST API和Apache Dubbo RPC接口文档生成的工具,smart-doc在业内率先提出基于JAVA泛型定义推导的理念, 完全基于接口源码来分析生成接口文档,不采用任何注解侵入到业务代码中。你只需要按照java-doc标准编写注释,smart-doc就能帮你生成一个简易明了的Markdown、HTML5、Postman Collection2.0+、OpenAPI 3.0+的文档。

官方地址:https://gitee.com/smart-doc-team/smart-doc

阅读全文 »

Micrometer 为 Java 平台上的性能数据收集提供了一个通用的 API, 它提供了多种度量指标类型(Timers、Guauges、Counters等),同时支持接入不同的监控系统, 例如 Influxdb、Graphite、Prometheus 等。我们可以通过 Micrometer 收集 Java 性能数据, 配合 Prometheus 监控系统实时获取数据,并最终在 Grafana 上展示出来,从而很容易实现应用的监控。

简单地说,actuator 是真正去采集数据的模块,而 Micrometer 更像是一个适配器, 将 actuator 采集到的数据适合给各种监控工具。

Micrometer 中有两个最核心的概念,分别是计量器(Meter)和计量器注册表(MeterRegistry)。

计量器Meter用来收集不同类型的性能指标信息,Micrometer 提供了如下几种不同类型的计量器:

阅读全文 »

Prometheus 其实就是一个数据监控解决方案,它能帮你简单快速地搭建起一套可视化的监控系统。但这么说还是有点抽象, 下面我举几个简单的例子,帮助大家理解 Prometheus 究竟能做什么?

对于运维人员来说,他们需要监控机器的 CPU、内存、硬盘的使用情况,以此来保证运行在机器上的应用的稳定性。

对于研发人员来说,他们关注某个异常指标的变化情况,从而来保证业务的稳定运行。

对于产品或运营来说,他们更关心产品层面的事情,例如:某个活动参加人数的增长情况,活动积分的发放情况。 img.png

对于上面说到的这些功能,Prometheus 都能够实现。Prometheus 能根据这些收集的数据实现告警功能。

例如:运维希望在 CPU 达到 80% 的时候给值班的运维人员发送邮件,产品希望活动积分发放数量超过 10 万的时候发送告警邮件。 这些都可以通过 Prometheus 实现。

除了数据收集、告警功能之外,Prometheus 还有很多强大的功能,例如:强大的 ProQL 查询、许多客户端库等。

阅读全文 »

Grafana 是一个监控仪表系统,它是由 Grafana Labs 公司开源的的一个系统监测 (System Monitoring) 工具。 它可以大大帮助你简化监控的复杂度,你只需要提供你需要监控的数据,它就可以帮你生成各种可视化仪表。 同时它还有报警功能,可以在系统出现问题时通知你。

这个是它的主界面: img.png

Grafana 不对数据源作假设,它支持以下各种数据,也就是说如果你的数据源是以下任意一种,它都可以帮助生成仪表。 同时在市面上,如果 Grafana 称第二,那么应该没有敢称第一的仪表可视化工具了。因此,如果你搞定了 Grafana, 它几乎是一个会陪伴你到各个公司的一件称心应手的兵器。

Grafana 支持的数据源:Prometheus、Graphite、OpenTSDB、InfluxDB、MySQL/PostgreSQL、 Microsoft SQL Server、等等。

阅读全文 »

Expect 是一个可以通过脚本和其它交互程序通信的程序,也可以直接被用于C或C++。

可以实现什么?

  • 让计算机自动回应,比如你可以登录,无需手动输入
  • 开始一个游戏,如果最佳配置没有出现,一直重启直到他出现,然后把控制权交给你。
  • 基于预先确定的标准,运行回话,回答问题“是”、“否”,然后把控制权交给你
  • 传递环境变量,当前路径或者任何类型的信息通过rlogin, telnet, tip, su, chgrp等

安装:yum install expect

本篇通过一个自动远程登录脚本来演示expect的使用。

阅读全文 »

作为一名开发者,是否经常抱怨环境问题,某个bug只出现在你的环境下面,找了很久才找到原来是一个很小的环境差异导致。 Vagrant可以非常容易的配置一个统一的可复制、可移植的分布式开发环境, 在VirtualBox、VMware、AWS或其他provider平台上, 借助provisioning工具, 比如shell脚本、Ansible、Chef等自动在各个机器上面安装和配置好软件。

只需要一个Vagrantfile,别人就能基于它创建统一的环境,不管你的工作机器是Linux、Mac OS 还是Windows系统, 最后创建的虚拟机环境都是一样的。官网:https://www.vagrantup.com/

阅读全文 »

微服务一级目录是按照 DDD 分层架构的分层职责来定义的。在代码模型里分别为用户接口层、应用层、领域层和基础层, 建立了 interfacesapplicationdomaininfrastructure 四个一级代码目录。

这些目录的职能和代码形态是这样的。

  1. interfaces(用户接口层):它主要存放用户接口层与前端交互、展现数据相关的代码。前端应用通过这一层的接口, 向应用服务获取展现所需的数据。这一层主要用来处理用户发送的 Restful 请求,解析用户输入的配置文件, 并将数据传递给 Application 层。数据的组装、数据传输格式以及 Facade 接口等代码都会放在这一层目录里。
  2. application(应用层):它主要存放应用层服务组合和编排相关的代码。 应用服务向下基于微服务内的领域服务或外部微服务的应用服务完成服务的编排和组合, 向上为用户接口层提供各种应用数据展现支持服务。应用服务和事件等代码会放在这一层目录里。
  3. domain(领域层):它主要存放领域层核心业务逻辑相关的代码。领域层可以包含多个聚合代码包, 它们共同实现领域模型的核心业务逻辑。聚合以及聚合内的实体、方法、领域服务和事件等代码会放在这一层目录里。
  4. infrastructure(基础层):它主要存放基础资源服务相关的代码,为其它各层提供的通用技术能力、三方软件包、 数据库服务、配置和基础资源服务的代码都会放在这一层目录里。

下面分别讲解各层的包结构。

阅读全文 »