分类
Java 笔记

初识Sharding-JDBC 4.0

昨天(1月14日)ShardingSphere 4.0.0 发布。发布说明:ShardingSphere 4.0.0 发布,ShardingSphere 四周年贺礼

基于4.0版简单写了个Demo,主要是测试数据分片,读写分离,数据脱敏。

数据分片

数据分片应该是Sharding-JDBC最核心的功能。主要是根据自定义规则解析SQL,把数据放到不同库表中,从不同库表中查询,组装数据并返回最终结果。这种水平分片的方
式相对于垂直分片,它不再将数据根据业务逻辑分类,而是通过某个字段(或某几个字段),根据某种规则将数据分散至多个库或表中,每个分片仅包含数据的一部分。数
据分片的核心概念。

分类
Java 笔记

JVM 性能调优监控工具

现实企业级Java应用开发、维护中,有时候我们会碰到下面这些问题:

  • OutOfMemoryError,内存不足
  • 内存泄露
  • 线程死锁
  • 锁争用(Lock Contention)
  • Java进程消耗CPU过高
  • ……

这些问题在日常开发、维护中可能被很多人忽视(比如有的人遇到上面的问题只是重启服务器或者调大内存,而不会深究问题根源),但能够理解并解决这些问题是Java程序员进阶的必备要求。本文将对一些常用的JVM性能调优监控工具进行介绍,希望能起抛砖引玉之用。

分类
编程

SHA-1已被攻破:使用选择前缀冲突可以成功突破PGP信任网络

最近密码学家盖坦.勒伦(GaëtanLeurent)和托马.佩林(Thomas Peyrin)宣布已经对SHA-1成功计算出第一个选择前缀冲突并对利用相关成功撰写了论文。这表明了SHA-1哈希已经被完整而实在的攻破,如果还在使用该哈希函数,将带来具有严重的风险:所有适用于MD5的攻击现在也适用于SHA-1。下面我们一起来看看他们的研究和结论。

SHA-1已被攻破:使用选择前缀冲突可以成功突破PGP信任网络

SHA-1选择前缀冲突研究

我们都知道针对SHA-1的碰撞攻击,之前早有谷歌团队于2017宣布可操作的生成冲突的技术,并证明攻击的方法,但是该攻击依赖了谷歌大规模计算群并不具备通用性,而且时间和成本较大。

SHA-1已被攻破:使用选择前缀冲突可以成功突破PGP信任网络

这次由盖坦.勒伦(GaëtanLeurent)和托马.佩林(Thomas Peyrin)主导的研究则利用SHA-1选择前缀冲突,极大提高了SHA-1攻击效率,将加速因子提高了大约10倍。研究使用GTX 970 GPU计算条件下碰撞攻击的成本从2^64.7降低到26^1.2,选择前缀碰撞攻击的成本从2^67.1降低到2^63.4 。

SHA-1已被攻破:使用选择前缀冲突可以成功突破PGP信任网络
SHA-1已被攻破:使用选择前缀冲突可以成功突破PGP信任网络

通过改进,实施了整个选定的前缀冲突攻击。这种攻击是非常具有技术性的,包含许多细节,各个步骤,并且需要大量的工程工作。为了节省成本、以较少的学术预算进行计算,他们从GPU serversrental租用了下便宜的游戏或采矿GPU,没有使用大型云提供商的数据中心级硬件。在19年夏天,已经使用900个GPU(Nvidia GTX 1060)计算了两个月。计算结果表明现在以64位安全级别破解密码(即计算264个对称密码的操作)的成本不到10万美元。

分类
Android Linux

在 Linux 上安装安卓 8.1 Oreo 来运行应用程序和游戏

android x86 是一个自由而开源的项目,将谷歌制作的安卓系统从 ARM 架构移植到了 x86 架构,可以让用户在他们的桌面电脑上运行安卓系统来享受所有的安卓功能和应用程序及游戏。

在前一段时间,android x86 项目完成了安卓 8.1 Oreo 系统的 x86 架构移植。在这篇文章中,我们将解释如何在你的 Linux 系统上安装它,以便你能够随时使用你的安卓 用程序和游戏。

在 Linux 上安装安卓 x86 8.1 Oreo

准备环境

首先,让我们下载 android x86 8.1 Oreo 系统镜像。你可以从这个页面下载它,只需单击 “android-x86_64-8.1-r1.iso” 文件下的 “View” 按钮。

我们将在我们的 Linux 系统上使用 QEMU 来运行 android x86。QEMU 是一个非常好的模拟器软件,它也是自由而开源的,并且在所有主要的 Linux 发行版存储库中都是可用的。

在 Ubuntu/Linux Mint/Debian 上安装 QEMU:

sudo apt-get install qemu qemu-kvm libvirt-bin

在 Fedora 上安装 QEMU:

sudo dnf install qemu qemu-kvm

对于其它发行版,只需要搜索 “qemu” 和 “qemu-kvm” 软件包,并安装它们。

分类
Java

使用 Java 持久化 API

对应用开发者来说,Java 持久化 APIJava Persistence API(JPA)是一项重要的 java 功能,需要透彻理解。它为 Java 开发人员定义了如何将对象的方法调用转换为访问、持久化及管理存储在 NoSQL 和关系型数据库中的数据的方案。

本文通过构建自行车借贷服务的教程示例来详细研究 JPA。此示例会使用 Spring Boot 框架、MongoDB 数据库(已经不开源)和 Maven 包管理来构建一个大型应用程序,并且构建一个创建、读取、更新和删除(CRUD)层。这儿我选择 NetBeans 11 作为我的 IDE。

此教程仅从开源的角度来介绍 Java 持久化 API 的工作原理,不涉及其作为工具的使用说明。这全是关于编写应用程序模式的学习,但对于理解具体的软件实现也很益处。可以从我的 GitHub 仓库来获取相关代码。

Java: 不仅仅是“豆子”

Java 是一门面向对象的编程语言,自 1996 年发布第一版 Java 开发工具(JDK)起,已经变化了很多很多。要了解其各种发展及其虚拟机本身就是一堂历史课。简而言之,和 Linux 内核很相似,自发布以来,该语言已经向多个方向分支发展。有对社区免费的标准版本、有针对企业的企业版本及由多家供应商提供的开源替代品。主要版本每六个月发布一次,其功能往往差异很大,所以确认选用版本前得先做些研究。

总而言之,Java 的历史很悠久。本教程重点介绍 Java 11 的开源实现 JDK 11。因其是仍然有效的长期支持版本之一。

  • Spring Boot 是由 Pivotal 公司开发的大型 Spring 框架的一个模块。Spring 是 Java 开发中一个非常流行的框架。它支持各种框架和配置,也为 WEB 应用程序及安全提供了保障。Spring Boot 为快速构建各种类型的 Java 项目提供了基本的配置。本教程使用 Spring Boot 来快速编写控制台应用程序并针对数据库编写测试用例。
  • Maven 是由 Apache 开发的项目/包管理工具。Maven 通过 POM.xml 文件来管理包及其依赖项。如果你使用过 NPM 的话,可能会非常熟悉包管理器的功能。此外 Maven 也用来进行项目构建及生成功能报告。
  • Lombok 是一个库,它通过在对象文件里面添加注解来自动创建 getters/setters 方法。像 C# 这些语言已经实现了此功能,Lombok 只是把此功能引入 Java 语言而已。
  • NetBeans 是一款很流行的开源 IDE,专门用于 Java 开发。它的许多工具都随着 Java SE 和 EE 的版本更新而更新。

我们会用这组工具为一个虚构自行车商店创建一个简单的应用程序。会实现对 Customer 和 Bike 对象集合的的插入操作。

分类
Java

Spring Cloud 2020 年路线图

Spring Cloud 开发团队昨日公布了 Spring Cloud 2020 年的路线图,并对 Spring Cloud Greenwich 和 Hoxton 的生命周期进行了一些讲解。

Spring Cloud Ilford

开发团队称 Spring Cloud Ilford 将是下一个主要版本,这也将是自 Spring Cloud Finchley 发布以来的第一个主要版本。此版本将提供对 Spring Boot 2.x 和 Spring Framework 5.x 的支持。通过使 Ilford 成为主要版本,开发团队将能够删除进入维护模式(maintenance mode)的模块,并兑现今年早些时候宣布的简化新版本的承诺。此外,团队成员还会对一些 API 进行重构,这可能会引入重大变更。

Spring Cloud Ilford 将在 2020 年第四季度的某个时候随 Spring Framework 5.3 和 Spring Boot 2.4 一起发布。

分类
Android

Android无需ROOT的跨平台投屏工具

前言

之前有提到Vysor,但是这个插件免费版的码率比较低,如果要高清的就要付费。

现在推荐一个Genymotion推出的投屏工具,跨平台,自定义码率,最重要的是开源,简直良心。

Github:https://github.com/Genymobile/scrcpy
下载地址:https://github.com/Genymobile/scrcpy/releases

效果图

gif录制较模糊,实际使用很清晰

分类
Java

利用 Kafka 设置可靠的高性能分布式消息传递基础架构

世界已经迈进”移动”时代,现在应用程序必须能够实时提供数据,这不仅包括数据库表中存储的重要最终结果,还包括用户使用应用程序时执行的所有操作。任何可用信息,例如,用户点击量、日志数据或传感器数据都可用于改善用户体验、生成报告、向机器学习系统提供数据,等等。现如今,开发者必须关注基于实时事件流的系统。

下图展示了基于事件流处理的架构示例。

Apache Kafka 已成为构建基于事件的高度可扩展系统的首选解决方案。Kafka 可为事件流平台提供快速升级换代的功能,以供开发者在现代化业务解决方案中使用。然而,开发者通常需要将现有 Java EE 业务解决方案(基于 IBM MQ 或 IBM WebSphere Application Platform 之类的技术而构建的)集成到这些新的事件流架构中。

考虑以下示例: 某个网上商店拥有一个移动应用程序,该应用程序使用 Kafka 向企业 Java 中实施的分布式支付系统发送支付请求数据。该解决方案必须绝对保证一次性完成支付请求的处理(避免多次向买家收费)。但是,在分布式系统中,故障是不可避免的,因此该解决方案需要采用稳妥的方式来处理故障。

分类
Java 编程

JAVA程序通过代理访问网络

指定 Java 程序的代理服务器地址和端口有两种指定方式:

1.通过 命令行参数 指定

如果只需要考虑代理 HTTP 协议请求,只需添加如下命令行参数:

-Dhttp.proxyHost=127.0.0.1 -Dhttp.proxyPort=1080

想要 HTTP 和 HTTPS 协议的请求都通过代理访问网络,可以追加上:

-Dhttps.proxyHost=127.0.0.1 -Dhttps.proxyPort=1080

最终填写的值为:

-Dhttp.proxyHost=127.0.0.1 -Dhttp.proxyPort=1080 -Dhttps.proxyHost=127.0.0.1 -Dhttps.proxyPort=1080

2.在程序中使用System.setProperty(String, String)

同样很简单,这里直接上代码:

String proxyHost = "127.0.0.1";
String proxyPort = "1080";

System.setProperty("http.proxyHost", proxyHost);
System.setProperty("http.proxyPort", proxyPort);

// 对https也开启代理
System.setProperty("https.proxyHost", proxyHost);
System.setProperty("https.proxyPort", proxyPort);

推荐使用第一种方案,通过VM Option 的方式,对代码没有任何侵入,绿色环保。

分类
Java 笔记 编程

Feign设置header无效

把原生Http Connection改为使用Feign请求调用外部接口,在方法上添加注解:

@PostMapping("{接口url}")
@Headers({"Content-Type: application/json"})

返回:

看来用@Headers设置的Content-Type没有生效。@Headers是Feign自带的注册,而@PostMapping是Spring MVC的注解。在@PostMapping中也有header属性,于是改为:

@PostMapping(value = "{接口url}", headers = {"Content-Type: application/json"})

问题依旧。