爱看书的阿东

赐他一块白色石头,石头上写着新名

原文

How to store UTF8 characters in MySQL - Ubiq BI

引言

关于 《如何在MySQL中存储UTF8字符》 的一篇英文博客阅读和个人实战笔记。注意个人实验过程中使用了docker的Mysql 5.7 版本,读者可以根据自身情况调整。

阅读全文 »

原文

https://ubiq.co/database-blog/how-to-increase-max-connections-in-mysql/

引言

有时候连接Mysql时候我们会遇到“Too many connections”这样的报错,当然更多可能是在生产过程中碰到这样的问题,默认情况下Mysql的整体服务器连接数设置过低。

Sometimes MySQL server may give “Too many connections” error message when you try to connect to a MySQL database. Here’s how to increase max connections in MySQL to fix this problem.

阅读全文 »

历史背景

2018年9 月 26 日,Oracle 官方宣布 Java 11 正式发布。这个版本中一共包含 17 个 JEP(JDK Enhancement Proposals,JDK 增强提案)

JDK 11 是一个长期支持版本(LTS, Long-Term-Support),在编写本文的时间节点下和JDK17一样被用于编写项目代码的主流版本。

本文结合了各方资料整理出JDK11的新特性,工作上使用高版本JDK的机会确实不多,但是自己体验的过程中确实切身体会到JDK升级的好处。

升级JDK11的意义

  • 大量的新特性、Bug 修复,例如,容器环境支持,GC 等基础领域的增强。
  • 安全协议更新,比如废弃TLS1.2中不安全的加密算法,部分支持TLS1.3协议。
  • JVM的零成本优化。
  • 划时代的垃圾收集器ZGC,关键目的是实现GC时间不超过10ms。
  • G1垃圾收集器的免费升级
    • 并行的 Full GC(JDK11之前Oracle没有考虑过G1需要并行Full GC)
    • 快速的 CardTable 扫描
    • 自适应的堆占用比例调整(IHOP)
    • 在并发标记阶段的类型卸载
  • JVM自带工具增强
    • JEP 328: Flight Recorder(JFR),商用版工具JFR转为开源。
    • JEP 331: Low-Overhead Heap Profiling 实现底层成本堆分析JVM扩展
  • TLS协议精简
    • 完善Java标准HTTP类库上的扩展能力。
    • JEP 332: Transport Layer Security (TLS) 1.3,完全支持TLS 1.3(协议部分部分支持,加密算法部分基本满足要求)。
  • HTTP/2 Client API
    • 完善了Java语言自身进行Http Client的能力
    • 等同于把HttpClient官方化(难听点就是搬来了)
    • 只要不写作者,谁也不知道自己写的还是抄的谁的
  • 废弃Nashorn JavaScript引擎
    • 实际上是全力推动Graal VM虚拟机的开发。
阅读全文 »

原文

https://www.baeldung.com/swagger-apioperation-vs-apiresponse

引言

本文内容讨论的是 @ApiOperation@ApiResponse 注解的优劣。

介绍Swagger

一个RestFul最重要的是具备“自描述能力”,所谓的自描述能力是能在返回结果的同时,告知客户端调用下
一步的行为,Swagger在一定程度上封装和规范了这些操作。

什么是Swagger?

Swagger represents a set of open-source tools built around OpenAPI Specification. It can help us design, build, document, and consume REST APIs.

Swagger代表了一套围绕OpenAPI规范建立的开源工具。它可以帮助我们设计、构建、记录REST APIs接口。其中最为常用的注解便是 @ApiOperation 和 @ApiResponse。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@RestController
@RequestMapping("/customers")
class CustomerController {

private final CustomerService customerService;

public CustomerController(CustomerService customerService) {
this.customerService = customerService;
}

@GetMapping("/{id}")
public ResponseEntity<CustomerResponse> getCustomer(@PathVariable("id") Long id) {
return ResponseEntity.ok(customerService.getById(id));
}
}

下面分别介绍这两个注解的使用,最后是进行对比。

阅读全文 »

原文

Best coding practices every java developer should follow

目录

引言

把标题翻译成中文在国内也是一个老生常谈的问题:编程习惯和编码规范。

这篇文章大部分观点和国内的规范习惯类似,令我好奇的是外国人是如何理解这些内容的?

注意本文的Tips排序是打乱的,个人把感兴趣放到了前面来了。这篇文章的评论区非常精彩,这里一并整合了评论区的读者观点。

不管是学习还是了解老外的思考方式,或是在评论区当中看读者的讨论和纠正错误,阅读本文都是值得推荐的。

抱着半信半疑的态度学习这些内容,你会得到比单纯的了解和接受建议更多的收获。

阅读全文 »

How to Use the Stdin, Stderr, and Stdout Streams in Bash

目录

原文

How to Use the Stdin, Stderr, and Stdout Streams in Bash – Linux Consultant

引言

当Linux操作系统启动时,将会有三个流被打开。它们是stdinstdoutstderr

stdin 的全称是标准输入,用于接受用户的输入。

stdout 的完整形式是标准输出,用于将命令的输出存储到stdout流中。

stderr 的完整形式是标准错误,用于将任何命令产生的错误信息存储到数据流中。

stdinstdoutstderr 的相应数字标识符值为012

阅读全文 »

#rocketmq

引言

首先注意本次讨论的RokcetMq源码版本为 4.9.4,距离5.0发布 的没有多久。

这一节针对RocketMq的生产者请求发送的部分细节进行阐述,主要包含了下面的内容:DefaultMQProducer 为生产者默认对象,这个对象继承自 ClientConfig,里面包含了请求者的通用配置,所以可以拆分为两个部分进行理解,第一部分为ClientConfig,第二部分为DefaultMQProducer。

ClientConfig 部分

ClientConfig 定义了一些配置的获取方法,定义了命名空间等参数。无论是消息的发送者还是消费者都是通用的。

下面根据本次的版本的源代码介绍相关参数。

名称 描述 参数类型 默认值 有效值 重要性
namesrvAddr NameServer的地址列表 String 从-D系统参数rocketmq.namesrv.addr或环境变量。NAMESRV_ADDR
instanceName 客户端实例名称 String 从-D系统参数rocketmq.client.name获取,否则就是DEFAULT
clientIP 客户端IP String RemotingUtil.getLocalAddress()
namespace 客户端命名空间 String
accessChannel 设置访问通道 AccessChannel LOCAL
clientCallbackExecutorThreads 客户端通信层接收到网络请求的时候,处理器的核数 int Runtime.getRuntime().availableProcessors()
pollNameServerInterval 轮询从NameServer获取路由信息的时间间隔 int 30000,单位毫秒
heartbeatBrokerInterval 定期发送注册心跳到broker的间隔 int 30000,单位毫秒
persistConsumerOffsetInterval 作用于Consumer,持久化消费进度的间隔 int 默认值5000,单位毫秒
pullTimeDelayMillsWhenException 拉取消息出现异常的延迟时间设置 long 1000,单位毫秒
unitName 单位名称 String
unitMode 单位模式 boolean false
vipChannelEnabled 是否启用vip netty通道以发送消息 boolean 从-D com.rocketmq.sendMessageWithVIPChannel参数的值,若无则是true
useTLS 是否使用安全传输。 boolean 从-D系统参数tls.enable获取,否则就是false
mqClientApiTimeout mq客户端api超时设置 int 3000,单位毫秒
language 客户端实现语言 LanguageCode LanguageCode.JAVA
阅读全文 »

引言

在阿里云的官方网站提供了RocketMq的商用版本,但是个人在项目应用上发现和SpirngBoot以及Spring Cloud(Alibaba)等开源的RocketMQ依赖虽然可以正常兼容,但是依然出现了注解失效、启动报错,商用和开源版本的不兼容导致部分代码要重复编写的蛋疼问题。

这样的兼容问题不是简单加个SDK依赖,切换到商用配置就可以直接使用的(因为个人起初真就是这么想),为了避免后面再遇到这种奇葩的开发测试用开源RocketMq,生产环境需要使用商用集群的RocketMq的混合配置的业务场景,个人花了小半天时间熟读阿里云的接入文档,加上各种尝试和测试,总结出一套可以快速使用的兼容模板方案。

如果不了解阿里云商用RocketMq,可以看最后一个大节的【阿里云商用RocketMq介绍】介绍。个人的兼容方案灵感来自于官方提供的这个DEMO项目:springboot/java-springboot-demo

注意本方案是基于SpringBoot2.XSpring cloud Alibaba 的两个项目环境构建项目基础,在SpringBoot上只做了生产者的配置,而在Spring Cloud Alibaba的Nacos上进行了生产者和消费者的完整兼容方案。

最后注意兼容集成的版本为商用RocketMq使用4.x版本,最近新出的5.X 的版本并未进行测试,不保证正常使用。

阅读全文 »

原文

Best coding practices every java developer should follow

目录

引言

把标题翻译成中文在国内也是一个老生常谈的问题:编程习惯和编码规范。

这篇文章大部分观点和国内的规范习惯类似,令我好奇的是外国人是如何理解这些内容的?

注意本文的Tips排序是打乱的,个人把感兴趣放到了前面来了。这篇文章的评论区非常精彩,这里一并整合了评论区的读者观点。

不管是学习还是习老外的思考方式,或是大在评论区当中看读者的讨论和纠正错误,阅读本文都是值得推荐的。

抱着半信半疑的态度学习这些内容,你会得到比单纯的了解和接受建议更多的收获。

阅读全文 »