Skip to main content

· One min read

auth api

# cd /var/run/secrets/kubernetes.io/serviceaccount 默认token目录
CA_CERT=/var/run/secrets/kubernetes.io/serviceaccount/ca.crt
TOKEN=$(cat /var/run/secrets/kubernetes.io/serviceaccount/token)
NAMESPACE=$(cat /var/run/secrets/kubernetes.io/serviceaccount/namespace)

curl --cacert $CA_CERT -H "Authorization: Bearer $TOKEN" "https://10.10.18.158:6443/api/v1/namespaces/$NAMESPACE/services/"
# 失败 需要 bind role
k get clusterroles
k -nccm-perf create rolebinding my-view --serviceaccount=ccm-perf:default --clusterrole=view
k -nccm-perf create rolebinding my-view --serviceaccount=ccm-perf:default --clusterrole=admin
k get rolebinding

log app

/var/lib/docker/containers/{}/{}-json.log
/var/lib/kubelet/pods/{}/volumes/kubernetes.io~empty-dir/log

ingress gzip

# configmap nginx-configuration add
use-gzip: true

ingress limit

kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/limit-rpm: "1000"
nginx.ingress.kubernetes.io/limit-burst-multiplier: "1"

pvc

volumes:
- name: mypd
persistentVolumeClaim:
claimName: pvc-oss-test
volumeMounts:
- name: mypd
mountPath: "/pvvv-test"

helm

## install
wget https://get.helm.sh/helm-v2.16.0-linux-amd64.tar.gz
tar -zxvf helm-v2.16.0-linux-amd64.tar.gz
mv linux-amd64/helm /usr/local/bin/

## helm init
kubectl create serviceaccount --namespace kube-system tiller
kubectl create clusterrolebinding tiller-cluster-rule --clusterrole=cluster-admin --serviceaccount=kube-system:tiller
helm init --service-account tiller --upgrade
helm install stable/redis --name redis

· One min read

doc

install

https://www.terraform.io/downloads.html

wget https://releases.hashicorp.com/terraform/0.12.18/terraform_0.12.18_linux_amd64.zip
unzip terraform_0.12.18_linux_amd64.zip -d .
mv terraform /usr/bin/

cache

export TF_PLUGIN_CACHE_DIR="$HOME/.terraform.d/plugin-cache" # windows is must
~/.terraform.rc

tee ~/.terraformrc <<-'EOF'
plugin_cache_dir = "$HOME/.terraform.d/plugin-cache"
disable_checkpoint = true
EOF

cmd

  • terraform init
  • terraform apply -target=docker_container.mysql-1
provider "docker" {
default = "unix:///var/run/docker.sock"
# default = "tcp://127.0.0.1:2375"
}

variable "edf" {
default = "qqqq"
}

resource "docker_container" "ptest" {
name = "ptest"
image = "ptest"
ports {
internal = 5000
external = 2222
}
provisioner "local-exec" {
command = "echo ${var.password}"
}
}

resource "docker_container" "mysql-1" {
restart = "unless-stopped"
name = "mysql-1"
image = "mysql:8.0.15"
command = [
"--character-set-server=utf8mb4",
"--collation-server=utf8mb4_unicode_ci",
]
env = [
"MYSQL_ROOT_PASSWORD=${var.password}",
"TZ=Asia/Shanghai",
]
ports {
internal = 3306
external = 3306
}
}

· 2 min read

gradle home: /usr/local/Cellar/gradle/5.4.1/libexec

wget https://services.gradle.org/distributions/gradle-5.4.1-bin.zip
mkdir /opt/gradle
unzip -d /opt/gradle gradle-5.4.1-bin.zip

# vi
export PATH=$PATH:/opt/gradle/gradle-5.4.1/bin

task run

GRADLE_OPTS: "-Dorg.gradle.daemon=false"
./gradlew
./gradlew :base:bundleDebug
./gradlew -p egids-webapp jibDockerBuild

gradle

task +参数

def versionName = project.hasProperty('vest') ? project.property('vest') : "123"

task myTask {
println "config myTask${versionName} hello"
}

./gradlew :myTask -Pvest=3333

demo

build.gradle

plugins {
id 'java'
}

group 'com.zx5435'
version '1.0-SNAPSHOT'
sourceCompatibility = 1.8

jar {
from {
configurations.compile.collect { it.isDirectory() ? it : zipTree(it) }
}
manifest {
attributes 'Main-Class': 'Hello'
}
}

repositories {
mavenLocal()
maven { url "https://maven.aliyun.com/nexus/content/groups/public" }
mavenCentral()
}

dependencies {
implementation 'org.springframework.boot:spring-boot-starter-json:2.6.4'
implementation 'org.springframework.boot:spring-boot-starter-logging:2.6.4'

// lombok
compileOnly 'org.projectlombok:lombok:1.18.22'
annotationProcessor 'org.projectlombok:lombok:1.18.22'

compile "cn.hutool:hutool-all:$ver"
testCompile group: 'junit', name: 'junit', version: '4.12'
}

ext {
ver = '4.3.1'
}

settings.gradle

rootProject.name = 'gradle-test'

gradle springcloud

parent

plugins {
id 'org.springframework.boot' version '2.1.4.RELEASE' // 重点
id 'java'
}

allprojects {
apply plugin: 'java'
apply plugin: 'io.spring.dependency-management'
apply plugin: 'org.springframework.boot'

group = 'com.zx5435'
version = '1.0'
sourceCompatibility = '1.8'

repositories {
mavenCentral()
mavenLocal()
}
}

subprojects {
dependencyManagement {
imports {
mavenBom 'org.springframework.cloud:spring-cloud-dependencies:Greenwich.RELEASE' // 重点
}
}

dependencies {
compile "cn.hutool:hutool-all:4.3.1"
testCompile 'junit:junit:4.11'
// testCompile 'org.springframework.boot:spring-boot-starter-test:2.1.4.RELEASE'
}
}

sub

dependencies {
// compile 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-server'
compile 'org.springframework.boot:spring-boot-starter-web'
}

· 24 min read

https://github.com/randian666/algorithm-study https://www.itcodemonkey.com/article/13260.html

JAVA基础

JVM知识

开源框架知识

操作系统

多线程与并发

TCP与HTTP

架构设计与分布式

数据结构与算法

数据库

消息队列

  • 消息队列的使用场景。 https://blog.csdn.net/seven__________7/article/details/70225830
  • 消息的重发,补充策略。
  • 如何保证消息的有序性。
  • 用过哪些MQ,和其他mq比较有什么优缺点,MQ的连接是线程安全的吗,你们公司的MQ服务
  • 架构怎样的。
  • MQ系统的数据如何保证不丢失。
  • rabbitmq如何实现集群高可用。
  • kafka吞吐量高的原因。 https://my.oschina.net/runningwork/blog/918613
  • kafka架构和原理 http://lxw1234.com/archives/2015/09/504.htm
  • 利用mq怎么实现最终一致性。
  • 使用kafka有没有遇到什么问题,怎么解决的。
  • MQ有可能发生重复消费,如何避免,如何做到幂等。
  • MQ的消息延迟了怎么处理,消息可以设置过期时间么,过期了你们一般怎么处理。

缓存

· 11 min read

doc https://linuxtools-rst.readthedocs.io/zh_CN/latest/tool/lsof.html

lsof

https://mp.weixin.qq.com/s/IV-JZw6WZoaJPVN4AJrkOw

目标

前言

我们都知道,在linux下,“一切皆文件”,因此有时候查看文件的打开情况,就显得格外重要,而这里有一个命令能够在这件事上很好的帮助我们-它就是lsof。

linux下有哪些文件

在介绍lsof命令之前,先简单说一下,linux主要有哪些文件:

  • 普通文件
  • 目录
  • 符号链接
  • 面向块的设备文件
  • 面向字符的设备文件
  • 管道和命名管道
  • 套接字

以上各类文件类型不多做详细介绍。

lsof命令实用用法介绍

lsof,是list open files的简称。它的参数很多,但是我们这里只介绍一些实用的用法(注意有些情况需要root权限执行)。

查看当前打开的所有文件

一般来说,直接输入lsof命令产生的结果实在是太多,可能很难找到我们需要的信息。不过借此说明一下一条记录都有哪些信息。

`$ lsof(这里选取一条记录显示)  
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
vi 27940 hyb 7u REG 8,15 16384 137573 /home/hyb/.1.txt.swp`

lsof显示的结果,从左往右分别代表:打开该文件的程序名,进程id,用户,文件描述符,文件类型,设备,大小,iNode号,文件名。

我们暂且先关注我们知道的列。这条记录,表明进程id为27940的vi程序,打开了文件描述值为7,且处于读写状态的,在/home/hyb目录下的普通文件( REG regular file).1.txt.swap,当前大小16384字节。

列出被删除但占用空间的文件

在生产环境中,我们可能会使用df命令看到磁盘空间占满了,然而实际上又很难找到占满空间的文件,这常常是由于某个大文件被删除了,但是它却被某个进程打开,导致通过普通的方式找不到它的踪迹,最常见的就是日志文件。我们可以通过lsof来发现这样的文件:

`$ lsof |grep deleted  
Xorg 1131 root 125u REG 0,5 4 61026 /memfd:xshmfence (deleted)
Xorg 1131 root 126u REG 0,5 4 62913 /memfd:xshmfence (deleted)
Xorg 1131 root 129u REG 0,5 4 74609 /memfd:xshmfence (deleted)`

可以看到这些被删除的但仍然被打开文件,最后查找出来的时候,会被标记deleted。这个时候就可以根据实际情况分析,到底哪些文件可能过大但是却被删除了,导致空间仍然占满。

恢复打开但被删除的文件

前面我们可以找到被删除但是仍然被打开的文件,实际上文件并没有真正的消失,如果是意外被删除的,我们还有手段恢复它。以/var/log/syslog文件为例,我们先删除它( root用户):

`$ rm /var/log/syslog`

然后使用lsof查看那个进程打开了该文件:

`$ lsof |grep syslog  
rs:main 993 1119 syslog 5w REG 8,10 78419 528470 /var/log/syslog (deleted)`

可以找到进程id为993的进程打开了该文件,我们知道每个进程在/proc下都有文件描述符打开的记录:

`$ ls -l /proc/993/fd  
lr-x------ 1 root root 64 3月 5 18:30 0 -> /dev/null
l-wx------ 1 root root 64 3月 5 18:30 1 -> /dev/null
l-wx------ 1 root root 64 3月 5 18:30 2 -> /dev/null
lrwx------ 1 root root 64 3月 5 18:30 3 -> socket:[15032]
lr-x------ 1 root root 64 3月 5 18:30 4 -> /proc/kmsg
l-wx------ 1 root root 64 3月 5 18:30 5 -> /var/log/syslog (deleted)
l-wx------ 1 root root 64 3月 5 18:30 6 -> /var/log/auth.log`

这里就找到了被删除的syslog文件,文件描述符是5,我们把它重定向出来:

`$ cat /proc/993/fd/5 > syslog  
$ ls -al /var/log/syslog
-rw-r--r-- 1 root root 78493 3月 5 19:22 /var/log/syslog`

这样我们就恢复了syslog文件。

查看当前文件被哪些进程打开

Windows下经常遇到要删除某个文件,然后告诉你某个程序正在使用,然而不告诉你具体是哪个程序。我们可以在资源管理器-性能-资源监视器-cpu-关联的句柄处搜索文件,即可找到打开该文件的程序,但是搜索速度感人。

linux就比较容易了,使用lsof命令就可以了,例如要查看当前哪些程序打开了hello.c:

`$ lsof hello.c  
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
tail 28731 hyb 3r REG 8,15 228 138441 hello.c`

但是我们会发现,使用vi打开的hello.c并没有找出来,这是因为vi打开的是一个临时副本。我们换一种方式查找:

`$ lsof |grep hello.c  
tail 28906 hyb 3r REG 8,15 228 138441 /home/hyb/workspaces/c/hello.c
vi 28933 hyb 9u REG 8,15 12288 137573 /home/hyb/workspaces/c/.hello.c.swp`

这样我们就找到了两个程序和hello.c文件相关。

这里grep的作用是从所有结果中只列出符合条件的结果。

查看某个目录文件被打开情况

`$ lsof +D ./`

查看当前进程打开了哪些文件

使用方法:lsof -c 进程名
通常用于程序定位问题,例如用于查看当前进程使用了哪些库,打开了哪些文件等等。假设有一个循环打印字符的hello程序:

`$ lsof -c hello  
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
hello 29190 hyb cwd DIR 8,15 4096 134538 /home/hyb/workspaces/c
hello 29190 hyb rtd DIR 8,10 4096 2 /
hello 29190 hyb txt REG 8,15 9816 138314 /home/hyb/workspaces/c/hello
hello 29190 hyb mem REG 8,10 1868984 939763 /lib/x86_64-linux-gnu/libc-2.23.so
hello 29190 hyb mem REG 8,10 162632 926913 /lib/x86_64-linux-gnu/ld-2.23.so
hello 29190 hyb 0u CHR 136,20 0t0 23 /dev/pts/20
hello 29190 hyb 1u CHR 136,20 0t0 23 /dev/pts/20
hello 29190 hyb 2u CHR 136,20 0t0 23 /dev/pts/20`

我们可以从中看到,至少它用到了/lib/x86_64-linux-gnu/libc-2.23.so以及hello文件。

也可以通过进程id查看,可跟多个进程id,使用逗号隔开:

`$ lsof -p 29190  
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
hello 29190 hyb cwd DIR 8,15 4096 134538 /home/hyb/workspaces/c
hello 29190 hyb rtd DIR 8,10 4096 2 /
hello 29190 hyb txt REG 8,15 9816 138314 /home/hyb/workspaces/c/hello
hello 29190 hyb mem REG 8,10 1868984 939763 /lib/x86_64-linux-gnu/libc-2.23.so
hello 29190 hyb mem REG 8,10 162632 926913 /lib/x86_64-linux-gnu/ld-2.23.so
hello 29190 hyb 0u CHR 136,20 0t0 23 /dev/pts/20
hello 29190 hyb 1u CHR 136,20 0t0 23 /dev/pts/20
hello 29190 hyb 2u CHR 136,20 0t0 23 /dev/pts/20`

当然这里还有一种方式,就是利用proc文件系统,首先找到hello进程的进程id
:

`$ ps -ef|grep hello  
hyb 29190 27929 0 21:14 pts/20 00:00:00 ./hello 2
hyb 29296 28848 0 21:18 pts/22 00:00:00 grep --color=auto hello`

可以看到进程id为29190,查看该进程文件描述记录目录:

`$ ls -l /proc/29190/fd  
lrwx------ 1 hyb hyb 64 3月 2 21:14 0 -> /dev/pts/20
lrwx------ 1 hyb hyb 64 3月 2 21:14 1 -> /dev/pts/20
lrwx------ 1 hyb hyb 64 3月 2 21:14 2 -> /dev/pts/20`

这种方式能够过滤很多信息,因为它只列出了该进程实际打开的,这里它只打开了0,1,2,即标准输入,标准输出和标准错误。

查看某个端口被占用情况

在使用数据库或者启用web服务的时候,总能遇到端口占用问题,那么怎么查看某个端口是否被占用呢?

`$ lsof -i :6379  
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
redis-ser 29389 hyb 6u IPv6 534612 0t0 TCP *:6379 (LISTEN)
redis-ser 29389 hyb 7u IPv4 534613 0t0 TCP *:6379 (LISTEN)`

这里可以看到redis-ser进程占用了6379端口。

查看所有的TCP/UDP连接

`$ lsof -i tcp  
ava 2534 hyb 6u IPv6 31275 0t0 TCP localhost:9614 (LISTEN)
java 2534 hyb 22u IPv6 96922 0t0 TCP localhost:9614->localhost:39004 (ESTABLISHED)
java 2534 hyb 23u IPv6 249588 0t0 TCP localhost:9614->localhost:45460 (ESTABLISHED)`

当然我们也可以使用netstat命令。

`$ netstat -anp|grep 6379`

这里的-i参数可以跟多种条件:

  • -i 4 #ipv4地址
  • -i 6 #ipv6地址
  • -i tcp #tcp连接
  • -i :3306 #端口
  • -i @ip #ip地址

因此需要查看与某个ip地址建立的连接时,可以使用下面的方式:

`$ lsof -i@127.0.0.1`

查看某个用户打开了哪些文件

linux是一个多用户操作系统,怎么知道其他普通用户打开了哪些文件呢?可使用-u参数

`$ lsof -u hyb  
(内容太多,省略)`

列出除了某个进程或某个用户打开的文件

实际上和前面使用方法类似,只不过,在进程id前面或者用户名前面加^,例如:

`lsof -p ^1     #列出除进程id为1的进程以外打开的文件  
lsof -u ^root #列出除root用户以外打开的文件`

总结

以上介绍基于一个条件,实际上多个条件可以组合,例如列出进程id为1的进程打开的tcp套接字文件:

`lsof -p 1 -i tcp`

lsof参数很多,具体的可以使用man命令查看,但是对于我们来说,知道这些实用的基本足够。 去除 iconfinder 上 icon 的水印

原理

利用水印像素点和原图像素点颜色合并的原理,如果拥有加过水印的图片和水印图片,就可以反向推出原图原像素点的颜色;前提是你得拥有他的水印图片

· One min read

npm install -g pm2

for java

{
"name": "j-a",
"script": "java",
"args": [
"-jar",
"base-eureka/build/libs/base-eureka-1.0.jar"
],
"exec_interpreter": "",
"exec_mode": "fork"
}

npm install -g pm2

for k3s

{
"name": "k3s",
"script": "k3s",
"args": [
"server",
"--docker"
],
"exec_interpreter": "",
"exec_mode": "fork"
}

pm2 start pm2.json

log

~/.pm2/logs

常用

pm2 ls
pm2 start app
pm2 stop app
pm2 delete app
pm2 restart app

· One min read

jenkins

Docker持续部署图文详解 http://www.csdn.net/article/2015-07-21/2825266 使用Docker构建持续集成与自动部署的Docker集 https://my.oschina.net/jayqqaa12/blog/633683

install

mkdir jk && cd jk
# 注意是当前user
docker run --restart=unless-stopped --name jenkins -it -d \
--privileged=true \
-u root \
-p 8080:8080 -p 50000:50000 \
-v "$PWD":/var/jenkins_home jenkins:2.60.3

proxy

jenkins->系统管理->管理插件->高级 把:http://updates.jenkins-ci.org/update-center.json 换成:http://mirror.esuni.jp/jenkins/updates/update-center.json

时区问题

【系统管理】->【脚本命令行】运行下面的命令 System.setProperty('org.apache.commons.jelly.tags.fmt.timeZone', 'Asia/Shanghai')

· One min read

cache

  • @Cacheable(key = "#id")
  • @CachePut(key = "#user.id")
  • @CacheEvict(key = "#id")

async

springcloud

  • eureka server 服务注册 http://localhost:8761/
  • eureka client 可以起多个
  • call service: Ribbon, Feign(主流,再封装)
  • zipkin 链路追踪
  • config 总线 amqp重载
  • hystrix 熔断器,监控
  • zuul 网关