跳至主要內容
Jia 微服务 DevOps 云服务管理框架

概要

你是否也曾为微服务架构的复杂性而头疼?是否在寻找一个开箱即用的企业级解决方案?今天要介绍的 Jia 框架,或许就是你一直在寻找的那个答案!

Jia 是一个基于 Spring Cloud 的微服务 DevOps 云服务管理框架,它不仅仅是一个简单的脚手架,更是一套完整的企业级解决方案——从后台管理到服务接口,再到门户首页,一站式搞定!

技术栈一览

核心技术

Jia 采用的是业界主流且成熟的技术栈,让你用得放心、学得舒心:


Mr.Chen大约 4 分钟文章JavaSpring Cloud微服务DevOps
记一个 Windows 下 'posix:permissions' not supported as initial attribute 异常

背景

最近在做项目架构升级,并顺便升级了下基础组件。升级完之后,跑 UT 报一下异常:

Caused by: java.lang.UnsupportedOperationException: 'posix:permissions' not supported as initial attribute
  at java.base/sun.nio.fs.WindowsSecurityDescriptor.fromAttribute(WindowsSecurityDescriptor.java:358)
  at java.base/sun.nio.fs.WindowsFileSystemProvider.createDirectory(WindowsFileSystemProvider.java:509)
  at java.base/java.nio.file.Files.createDirectory(Files.java:700)
  at java.base/java.nio.file.TempFileHelper.create(TempFileHelper.java:134)
  at java.base/java.nio.file.TempFileHelper.createTempDirectory(TempFileHelper.java:171)
  at java.base/java.nio.file.Files.createTempDirectory(Files.java:976)
  at com.google.common.io.TempFileCreator$JavaNioCreator.createTempDir(TempFileCreator.java:102)
  at com.google.common.io.Files.createTempDir(Files.java:439)
  at redis.embedded.util.JarUtil.extractExecutableFromJar(JarUtil.java:13)
  at redis.embedded.RedisExecProvider.get(RedisExecProvider.java:56)
  at redis.embedded.RedisServerBuilder.resolveConfAndExec(RedisServerBuilder.java:105)
  ... 141 more

Mr.Chen大约 2 分钟文章JavaGuavaWindows
解决 Gradle 父项目的 subprojects 中无法获取子项目属性的问题

概要

最近在折腾 Gradle 的依赖版本统一管理,真的是一步一个坑。一开始求助于 ChatGPT ,提供了两个插件,一个是 java-platform ,另一个是 io.spring.dependency-management 。我选择了使用 java-platform ,但是各种尝试都是报错,大家有兴趣可以看看官网例子。
https://docs.gradle.org/current/userguide/java_platform_plugin.html


Mr.Chen大约 3 分钟文章JavaGradle
记一个 SpringBoot 优雅停机失败问题

概要

最近,生产环境 EKS(Elastic Kubernetes Service)偶尔出现 POD 被强杀问题。

项目是 SpringBoot 框架,启动了优雅停机,并且配置了停机时长为 120 秒。既然是被强杀,那肯定是因为在 120 秒内没有正常停掉应用。

经过日志分析,是由于开了弹性伸缩,项目还没启动完就收到了 kill 信号,这时候启动线程和停机线程并行跑,导致被停掉的线程又被启动起来,最终导致优雅停机失败,过了 120 秒后,容器被 kill -9 了。

过程分析

为什么说“启动线程和停机线程并行跑,导致被停掉的线程又被启动起来”,难道 SpringBoot 就这么 LOW ,就不知道让启动线程跑完再执行停机线程?


Mr.Chen大约 3 分钟文章JavaSpringBoot
Web 性能测试指标

性能指标

Web性能测试的部分概况一般来说,一个Web请求的处理包括以下步骤:

(1)客户发送请求
(2)web server接受到请求,进行处理;
(3)web server向DB获取数据;
(4)webserver生成用户的object(页面),返回给用户。给客户发送请求开始到最后一个字节的时间称为响应时间(第三步不包括在每次请求处理中)。

1.事务(Transaction)

在web性能测试中,一个事务表示一个“从用户发送请求->web server接受到请求,进行处理-> web server向DB获取数据->生成用户的object(页面),返回给用户”的过程,一般的响应时间都是针对事务而言的。


Mr.Chen大约 12 分钟文章Java性能
Java 语言编码规范

1. 范围

本规范规定了使用Java语言编程时排版、注释、命名、编码和JTEST的规则和建议。
本规范适用于使用Java语言编程的产品和项目。

2. 规范性引用文件

下列文件中的条款通过本规范的引用而成为本规范的条款。凡是注日期的引用文件,其随后所有的修改单(不包括勘误的内容)或修订版均不适用于本规范,然而,鼓励根据本规范达成协议的各方研究是否可使用这些文件的最新版本。凡是不注日期的引用文件,其最新版本适用于本规范。

3. 术语和定义

规则:编程时强制必须遵守的原则。
建议:编程时必须加以考虑的原则。
格式:对此规范格式的说明。
说明:对此规范或建议进行必要的解释。
示例:对此规范或建议从正、反两个方面给出例子。


Mr.Chen大约 30 分钟文章Java
Disruptor 详细介绍

一、背景

1.来源

Disruptor是英国外汇交易公司LMAX开发的一个高性能队列,研发的初衷是解决内部的内存队列的延迟问题,而不是分布式队列。基于Disruptor开发的系统单线程能支撑每秒600万订单,2010年在QCon演讲后,获得了业界关注。

2.应用背景和介绍

据目前资料显示:应用Disruptor的知名项目有如下的一些:Storm, Camel, Log4j2,还有目前的美团点评技术团队也有很多不少的应用,或者说有一些借鉴了它的设计机制。
Disruptor是一个高性能的线程间异步通信的框架,即在同一个JVM进程中的多线程间消息传递。


Mr.Chen大约 18 分钟文章JavaDisruptor
记录几个 Java 开发面试题

建立索引的依据

1、表的主键和外键必须有索引。

2、数据量超过300的表应该有索引。

3、经常和其他表进行连接的表,连接字段应该有索引。

4、经常出现在where语句中的字段,特别是大表的字段,应该建立索引。

5、经常需要进行范围搜索的字段建索引,因为索引已经排序,指定范围是连续的。

6、经常需要排序的字段建立索引,因为索引已经排序。

7、经常出现在order by、group by、distinct后面的字段,建立索引。

8、索引应该建在小字段上,对于大的文本字段和超长字段,不要建索引。


Mr.Chen大约 5 分钟文章Java
Java程序注册为Windows的服务

运行环境

电脑上应该有java运行环境。

需要软件

Java ServiceWrapper

下载地址:http://sourceforge.net/projects/wrapper/

配置过程

  1. 首先将java程序打成jar包。

  2. Java Service Wrapper包解压。

  3. 比如要注册成服务的程序项目目录为workapp,那么在这个目录下面新建三个文件夹:bin、conf、lib。

  4. 把Java Service Wrapper包中bin目录下的Wrapper.exe、src/bin目录下的App.bat.in、InstallApp-NT.bat.in、UninstallApp-NT.bat.in文件拷贝到workapp的bin目录中,并分别改名为App.bat、InstallApp-NT.bat、UninstallApp-NT.bat。

  5. 把Java Service Wrapper包中lib目录下的Wrapper.DLL、wrapper.jar拷贝到workapp的lib目录中。并且将项目的jar和所用到的jar都拷贝到该目录。

  6. 把Java Service Wrapper包中srcconf目录下的wrapper.conf.in拷贝到workapp的conf目录中,并命名为wrapper.conf。

  7. 修改wrapper.conf配置文件,方法如下:

    主要修改以下几项即可:

    • JVM位置:

      wrapper.java.command=C:\jdk1.5.0_07\bin\java
      
    • 运行参数:如:

      wrapper.java.additional.1=-Dprogram.name=run.bat
      
    • 你的Java程序所需的jar包必须全部在此标明,注意路径准确:

      wrapper.java.classpath.1=../lib/wrapper.jar
      wrapper.java.classpath.2=../lib/test_fat.jar
      ……
      
    • 你的Wrapper.DLL或wrapper.jar所在的目录

      wrapper.java.library.path.1=../lib
      
    • MAIN CLASS 此处决定了使用Java Service Wrapper的方式

      wrapper.java.mainclass=org.tanukisoftware.wrapper.WrapperSimpleApp
      
    • 你的Java应用程序的运行类

      wrapper.app.parameter.1= com.tes.Testjar
      
    • 注册为服务的名称和显示名,你可以随意进行设置

      wrapper.ntservice.name=testService
      wrapper.ntservice.displayname= testService
      
    • 服务描述信息

      wrapper.ntservice.description= testService
      
  8. 修改好了以后,运行MyApp.bat即可运行你的java程序,这里可以测试配置的是否正确,如果可以运行,证明配置ok。

  9. 运行InstallApp-NT.bat可以进行服务的注册,UninstallApp-NT.bat为注销服务。

  10. 运行完注册服务InstallApp-NT.bat可以在控制面板-管理程序-服务中看到你注册的服务名称。(如:testService)


Mr.Chen大约 2 分钟文章JavaWindows