记录一些常用的 Linux 操作,持续更新 …

查看系统版本

常用的查看系统版本有以下命令

  • cat /etc/os-release
  • uname -a
  • cat /proc/version
  • cat /etc/issue

下面演示一下 cat /etc/os-release,其他不详细说明。

1
cat /etc/os-release

输出如下

1
2
3
4
5
6
7
8
PRETTY_NAME="Debian GNU/Linux 9 (stretch)"
NAME="Debian GNU/Linux"
VERSION_ID="9"
VERSION="9 (stretch)"
ID=debian
HOME_URL="https://www.debian.org/"
SUPPORT_URL="https://www.debian.org/support"
BUG_REPORT_URL="https://bugs.debian.org/"

替换源

由于网络的原因,国内部分 Linux 在安装软件时非常缓慢,将源替换为国内的镜像可以方便很多。

阅读全文 »

Rpc Introduction 中简单写了一个 RPC Framework。在本节中,对 Edith 新增采用线程池支持多线程的特性。

背景

实际开发中,我们的应用程序是不能盲目的开辟线程的,这样会造成资源的极大浪费。若采用线程池,可以减少创建和销毁线程的次数,让每个线程可以多次使用,并且可以根据系统的承受能力,调整线程池中工作线程的数量,防止消耗过多的内存。

如有需要可以阅读 Dubbo 中关于线程池的设计(位于 org.apache.dubbo.common.threadpool 包)。


开发

依赖

1
2
3
4
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
</dependency>

Code

本文代码可以从这里获取。

阅读全文 »

What is RPC

Remote Procedure Call (RPC) is a protocol that one program can use to request a service from a program located in another computer on a network without having to understand the network’s details. A procedure call is also sometimes known as a function call or a subroutine call. A procedure call is also sometimes known as a function call or a subroutine call.

RPC 是一种远程过程调用协议,一个程序可以使用该协议从位于网络上另一台计算机中的程序请求服务,而无需了解网络的详细信息。RPC 有时也称为函数调用或子程序调用。RPC 是进程间通信的一种方式。


Why is RPC

网上很多关于 RPC 的优点,笔者都不太赞同。不能将那些成熟的 RPC 框架解决的问题全部归结为 RPC 的优点。比如 RPC 的概念中并没有提到服务治理等问题,但是常见的 RPC 框架(如 DUBBO)均解决了服务治理的相关问题,这显然不能作为 RPC 的优点。要解释“Why is RPC?”的问题,还是要回归到 RPC 的概念上来。

  • RPC 可以使远程过程调用变得像本地调用一样简单。
  • 方便计算能力的横向扩展。

有兴趣可以阅读 dubbo 诞生的背景 以及dubbo 解决了哪些需求

RPC vs HTTP

其实这两者不是同一个维度的概念。从 RPC 的概念上来讲,HTTP 其实就是 RPC 的一种实现。

阅读全文 »

使用 Docker 构建 Spring Boot Application 中简单介绍了如何使用 Docker 构建 Spring Boot Application。本文探讨如何更简单的构建 Docker 镜像。

jib 简介

Make America Great Again. – Donald Trump

大概是受 Donald Trump 的启发 🙄,Google 发布的 jib 让原本已经很简单的 Docker 镜像构建过程变得更加简单。

一图顶千言,先看 Docker 构建镜像流程

再看 Jib 构建容器镜像流程


使用

阅读全文 »

Docker & Spring Boot

Docker 是一种 Linux 容器的实现,具有进程的轻量级资源隔离的特点,每一个容器对应操作系统中的一个进程,但是它又会有自己的网络空间、文件系统、PID 等。Docker 除了实现 Linux 容器,还使得容器具有“社会化”的属性,用户可以将容器镜像发布在 Docker Hub 与其他开发者共享、协作,类似于 Maven

Spring Boot 简化了 Spring 应用程序的开发过程,遵循约定优先配置的原则提供了各类 开箱即用(out-of-the-box) 的框架配置。另一方面,Spring Boot 还具备将代码直接构建为可执行 jar 包的能力,这个 jar 包是一个可以独立运行的部署单元。基于以上特性,现在普遍认为 Spring Boot 提供了一种快速构造微服务(Micro-Service)的能力。

Spring Boot 的运行环境非常简单,将 Spring Boot Application 打包为 Docker 镜像,对于自动化部署、运维都非常方便。


Dockerizing Spring Boot Application

使用 Docker 发布 Spring Boot Application,需要经历简单的几步,即可实现。

如有需要,可参考本文所涉及 Demo

常规操作

编写 Spring Boot Application

阅读全文 »

我们使用 Maven 时,基本上只会用到 mvn 这一个命令。有些开发者可能听说过 mvnw,这个是啥?

mvnw 是 Maven Wrapper 的缩写,我们安装 Maven 时,默认情况下,系统所有项目都会使用全局安装的这个 Maven 版本。但是,对于某些项目来说,它可能必须使用某个特定的 Maven 版本,这个时候,就可以使用 Maven Wrapper,它可以负责给这个特定的项目安装指定版本的 Maven,而其他项目不受影响。

简单地说,Maven Wrapper 就是给一个项目提供一个独立的,指定版本的 Maven 给它使用。

安装 Maven Wrapper

安装 Maven Wrapper 最简单的方式是在项目的根目录(即 pom.xml 所在的目录)下运行安装命令:

1
mvn -N io.takari:maven:0.7.7:wrapper

它会使用默认版本的 Maven。注意 0.7.7 是 Maven Wrapper 的版本。最新的 Maven Wrapper 版本可以去官方网站查看。

如果要指定使用的 Maven 版本,使用下面的安装命令指定版本,例如 3.6.0:

1
mvn -N io.takari:maven:0.7.7:wrapper -Dmaven=3.6.0

安装后,查看项目结构:

阅读全文 »

什么是 Maven

Apache Maven is a software project management and comprehension tool. Based on the concept of a project object model (POM), Maven can manage a project’s build, reporting and documentation from a central piece of information.

Apache Maven 本质是一个软件项目管理和理解工具,它提供了一种项目管理的方法,涵盖了了项目管理中常见的阶段:

  • Builds
  • Documentation
  • Reporting
  • Dependencies
  • SCMs
  • Releases
  • Distribution

安装

官网下载安装包。

基础环境

Maven 依赖 Java 环境,所以要先确保已经正确安装 JDK

通过 java -version 命令来查看是否正确安装了 JDK

阅读全文 »

A sequence of elements supporting sequential and parallel aggregate operations.

Stream 的定义可以看出

  • Stream 是一组元素的集合
  • Stream 支持顺序和并行地对元素进行操作

How it work

先看示例:

1
2
3
4
5
6
7
8
public void method1() {
List<String> list = Stream.of("a", "b", "c", 1, 2, 3)
.peek(System.out::print)
.map(String::valueOf)
.sorted()
.collect(Collectors.toList());
System.out.println("\n" + JSON.toJSONString(list));
}

上述程序输出结果:

1
2
abc123
["1","2","3","a","b","c"]

通过上述例子:

  1. Stream.of() 产生一个流;
  2. peek 将所有元素进行打印;
  3. map 将所有元素转化为 String;
  4. sorted 将所有元素进行排序;
  5. collect 将所有元素聚合为一个 List。
阅读全文 »