https://avatars.githubusercontent.com/u/18242685

lihuu's blog

Spring Boot Web Test

创建一个 Controller 类

package com.example.testingweb;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class HomeController {
    @GetMapping("/")
    public String greeting() {
        return "Hello, World";
    }
}

如何测试这个 Controller

直接注入对应的 HomeController

@SpringBootTest
public class HomeControllerTest {
    @Autowired
    private HomeController homeController;

    @Test
    public void should_return_hello_world() {
        String expected = "Hello, World";

        String actual = homeController.greeting();

        assertEquals(expected, actual);
    }

}

启动一个随机端口进行测试

import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.web.client.TestRestTemplate;
import org.springframework.boot.test.web.server.LocalServerPort;

import static org.junit.jupiter.api.Assertions.assertEquals;
@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)
public class HttpRequestTest {

    @LocalServerPort
    private int port;

    @Autowired
    private TestRestTemplate restTemplate;

    @Test
    public void should_return_hello_world() {
        String expected = "Hello, World";

        String actual = restTemplate.getForObject("http://localhost:" + port + "/", String.class);

        assertEquals(expected, actual);
    }

}

使用 WebEnvironment.RANDOM_PORT 在测试时启动一个真实的服务器,但使用随机端口。这种方式有以下优点:

Jpa中自定义枚举映射

Jpa 中默认自带了@Enumerated 注解,它默认提供了两种形式 String 和 ordinal,表示按照枚举的名字和枚举值的顺序 ,但是有时候我们需要自定义枚举映射,比如枚举的值不是枚举的名字,而是枚举的某个属性值。这时候我们可以使用@Convert 注解来实现自定义枚举映射。

使用默认的@Enumerated 注解实现字段映射

@Entity
public class User{
  @Id
  private Integer userId;

  private String name;

  private Integer age;

  @Enumerated(STRING)
  private Status status;
}

public enum Status{
   ACTIVE,DELETED,BANED
}

使用自定义枚举映射

创建一个用于映射的枚举

public enum Status{
  ACTIVE(1),DELETED(0),BANED(-1);

  private final int value;

  public int getValue(){
    return this.value;
  }

  public static Status of(int value){
    for(Status status:Status.values()){
      if(status.getValue() == value){
        return status;
      }
    }
    throw new IllegalArgumentException("Invalid value: "+value);
  }

}

实现一个枚举转换器


//@Converter(autoApply=true)
public class StatusConverter implements AttributeConverter<Status,Integer>{

  @Override
  public Integer convertToDatabaseColumn(Status attribute){
    return attribute.getValue();
  }

  @Override
  public Status convertToEntityAttribute(Integer dbData){
    return Status.of(dbData);
  }
}

使用@Convert 注解 � 用


@Entity
public class User{
  @Id
  private Integer userId;

  private String name;

  private Integer age;

  @Convert(converter = StatusConverter.class, attributeName = "status")
  private Status status;

}

在上面的例子中使用了@Convert 注解,它有两个属性,一个是 converter,用于指定转换器,另一个是 attributeName,用于指定要转换的属性名,如果转换器设置了 autoApply,则可以省略这个注解。 配置完之后,我们就可以在实体类中使用自定义的枚举映射了。

iptables 简易使用手册

iptables 简易使用手册

iptables 是一个强大而灵活的 Linux 防火墙工具,用于管理网络包过滤和网络地址转换 (NAT)。它基于 Netfilter 框架工作,允许你定义详细的规则来管理入站和出站流量。

1. 查看现有规则

  • 查看所有表的规则:

    
    sudo iptables -L
  • 查看特定链(例如INPUT链)的规则:

    
    sudo iptables -L INPUT

2. 允许或拒绝端口

  • 允许某个端口(例如允许 22 端口的 SSH 流量):

UFW 简易使用手册

UFW 简易使用手册

ufw(Uncomplicated Firewall)是 Ubuntu 的默认防火墙管理工具,旨在简化防火墙配置。ufw是一个对iptables的封装,简化了防火墙规则的配置。它适合那些不需要深入配置复杂防火墙策略的用户,易于使用并提供友好的命令行接口。ufw背后实际使用的也是iptables,因此它本质上是简化了iptables的配置过程。

Perttier 使用

Perttier 使用

官网

What is Prettier? · Prettier

安装

# 全局安装
npm install -g prettier
# or
yarn global add pretter

# 项目中安装
npm install --save-dev --save-exact prettier
#or
yarn add prettier --dev --exact

配置

配置的位置

  • package.json 中的 perttier 字段

  • JSON 或者 YAML 格式的 .prettierrc

  • .prettierrc.json, .prettierrc.yml , .prettierrc.yaml, .prettierrc.json5

  • .prettierrc.js , .prettierrc.cjs ,prettierrc.config.js,prettierrc.config.cjs

{
  "tabWidth": 2, // tab缩进大小,默认为2
  "useTabs": true, // 使用tab缩进,默认false
  "semi": false, // 使用分号, 默认true
  "singleQuote": true, // 使用单引号, 默认false(在jsx中配置无效, 默认都是双引号)
  "TrailingCooma": "none", // 行尾逗号,默认none,可选 none|es5|all,es5 包括es5中的数组、对象,all 包括函数对象等所有可选
  "bracketSpacing": true, // 对象中的空格 默认true
  "jsxBracketSameLine": false, // JSX标签闭合位置 默认false
  "arrowParens": "avoid", // 箭头函数参数括号,默认avoid 可选 avoid| always,avoid 能省略括号的时候就省略 例如x => x,always 总是有括号
  "htmlWhitespaceSensitivity": "strict" //html空格严格程度,可选<css|strict|ignore>
}

配置文件的位置从被格式化的文件的位置找起,然后沿着文件系统向上寻找。注意,prettier 没有全局的配置文件。

Kubernetes集群安装

安装

我们只是搭建一个 mini 的类似于真实的 kubernetes 环境,用来自己学习,我们也可以选择安装 minikube

安装前的准备工作

  1. 修改 hostname,因为 kubernetes 使用 hostname 来区分集群

    sudo vim /etc/hostname
  2. 使用 docker 作为容器运行时,kubernetes 支持多种容器运行时,使用 docker 比较方便。

    cat <<EOF | sudo tee /etc/docker/daemon.json
    {
      "exec-opts": ["native.cgroupdriver=systemd"],
      "log-driver": "json-file",
      "log-opts": {
        "max-size": "100m"
      },
      "storage-driver": "overlay2"
    }
    EOF
    
    sudo systemctl enable docker
    sudo systemctl daemon-reload
    sudo systemctl restart docker
  3. 修改 iptables 的配置,启用"br_netfilter"

Zabbix 入门

安装

https://blog-img-1259526442.cos.ap-nanjing.myqcloud.com/202304111723534.png

这里选用了如上的配置

1. 安装 Zabbix repository

wget https://repo.zabbix.com/zabbix/6.0/ubuntu/pool/main/z/zabbix-release/zabbix-release_6.0-1+ubuntu20.04_all.deb
sudo dpkg -i zabbix-release_6.0-1+ubuntu20.04_all.deb
sudo apt update

2. 安装 Zabbix server,Web 前端,agent

apt install zabbix-server-mysql zabbix-frontend-php zabbix-nginx-conf zabbix-sql-scripts zabbix-agent

3. 创建初始数据库

create database zabbix character set utf8mb4 collate utf8mb4_bin;
create user zabbix@localhost identified by 'password';
grant all privileges on zabbix.* to zabbix@localhost;

4. 导入初始架构和数据

zcat /usr/share/doc/zabbix-sql-scripts/mysql/server.sql.gz | mysql -uzabbix -p zabbix

5. 配置数据库

编辑配置文件 /etc/zabbix/zabbix_server.conf

正则表达式入门

元字符

特殊单字符

. 任意字符,不包括换行

https://blog-img-1259526442.cos.ap-nanjing.myqcloud.com/202305121437456.png

\d 任意的数字

https://blog-img-1259526442.cos.ap-nanjing.myqcloud.com/202305121439070.png

\D 任意的非数字

https://blog-img-1259526442.cos.ap-nanjing.myqcloud.com/202305121439355.png

\w 任意的字母、数字、下划线

https://blog-img-1259526442.cos.ap-nanjing.myqcloud.com/202305121441651.png

\W 非字母、数字、下划线

https://blog-img-1259526442.cos.ap-nanjing.myqcloud.com/202305121442574.png

\s 空白符号

https://blog-img-1259526442.cos.ap-nanjing.myqcloud.com/202305121443512.png

\S 非空白符号

https://blog-img-1259526442.cos.ap-nanjing.myqcloud.com/202305121443352.png

空白符号

  • \r 回车

  • \n 换行

  • \f 换页

  • \t 制表符

  • \v 垂直制表符

  • \s 任意空白符 \s 能匹配上各种空白符号,也可以匹配上空格。换行有专门的表示方式,在正则中,空格就是用普通的字符英文的空格来表示。