服务器

Spring Cloud Alibaba 集成 Spring Cloud

Spring Cloud Alibaba 集成 Spring Cloud 需要匹配对应的版本号,可以从以下链接进行匹配:

https://docs.spring.io/spring-cloud/docs/2021.0.x/reference/html/
https://github.com/alibaba/spring-cloud-alibaba/tree/2021.x
https://github.com/alibaba/spring-cloud-alibaba/releases/tag/2021.0.1.0

首先查看 Spring Cloud Alibaba 支持的 Spring Cloud 的版本号,然后从 Spring Cloud Alibaba release 页面的标注支持的详细中间件的版本号。

在 shell 中实现 urlencode 编码

在shell中实现 urlencode编码

在shell中进行urlencode编码有两种方式,一种是通过 curl,另外一种是通过 xxd 来达成结果,经实测使用 curl 来进行urlencode的编码效率更高。以下是两种实现方式:

使用 curl 进行 urlencode编码

脚本首先使用 which 检测 curl 是否已经安装,如果未安装将会编码失败并直接返回传入的参数
function urlencode() {
  which "curl" >/dev/null 2>&1; if [ ! $? -eq 0 ]; then echo -E "$1";return; fi
  encode_str=$(echo -E "$1" |sed "s/%/%%/g")
  printf -- "$encode_str" | curl -Gso /dev/null -w %{url_effective} --data-urlencode @- "" |cut -c 3-
}

将上方的方法直接复制到shell脚本中,然后使用如下方式调用即可:

这只是 urlencode 方法的一个使用示例
send_text=$(urlencode "$text")

这样传入的 $text 会被编码,然后就可以拼接到请求链接中了。不会有任何问题,请求链接的时候使用 $send_text

然后使用 curl 在访问链接的时候,拼接参数即可:

# 拼接到请求的路径中
curl http://example.com/$send_text
 
# 拼接到请求的参数中
curl http://example.com?param=$send_text

这样就不会遇到特殊字符导致请求失败,或参数传递失败的问题了。

Bash shell 的 urlencode() / urldecode()

function urlencode() {
    local length="${#1}"
    for (( i = 0; i < length; i++ )); do
        local c="${1:i:1}"
        case $c in
            [a-zA-Z0-9.~_-]) printf "$c" ;;
            *) printf "$c" | xxd -p -c1 | while read x;do printf "%%%s" "$x";done
        esac
    done
}
function urldecode() {
    # urldecode <string>

    local url_encoded="${1//+/ }"
    printf '%b' "${url_encoded//%/\\x}"
}

Link:

报错java.lang.IllegalArgumentException: Result Maps collection does not contain value解决

使用mybatis报错

java.lang.IllegalArgumentException: Result Maps collection does not contain value for com.xxx.mapper.xxxMapper.xxx

at org.apache.ibatis.session.Configuration$StrictMap.get(Configuration.java:853) ~[mybatis-3.4.0.jar:3.4.0]

at org.apache.ibatis.session.Configuration.getResultMap(Configuration.java:605) ~[mybatis-3.4.0.jar:3.4.0]

at org.apache.ibatis.builder.MapperBuilderAssistant.getStatementResultMaps(MapperBuilderAssistant.java:344)

本人总结了两点原因:

    1. 在mapper.xml文件中,将resultType和resultMap弄混淆。

这个原因一般报错的第一行后面都会有这样一句话 org.apache.ibatis.builder.IncompleteElementException: Could not find result map com.xxx.xxx with root cause

注意:使用resultMap时,必须要有标签指明id和返回类型以及表字段的对应关系。

如果是直接返回一个用户定义的实体类型,则要使用resultType,弄混淆就会报错。

    1. 在mapper.xml头部namespace引入错误。
<mapper namespace="com.xxx.mapper.xxxMapper">

这个namespace引入的mapper文件要和你的mapper.xml文件对应。

一般都是第一条原因

Link:

树莓派 之 dnsmasq搭建DNS服务器

Dnsmasq是一款高性能的DNS缓存软件,可以使用它来搭建一个小型的DNS服务器。在使用时,由于dnsmasq可以将域名缓存下来,这样下次就不用再次请求上游的DNS服务器,使用时极大的加快了上网速度,从而提升了上网体验。如果你有树莓派在闲置,那就赶快利用起来吧,使用你手里的树莓派来搭建一个自己的DNS服务器吧。

安装Dnsmasq

sudo apt-get install dnsmasq

配置Dnsmasq

sudo vim /etc/dnsmasq.conf

修改文件需要修改文件的实际文件:

查看链接文件的实际文件:

ls -l /etc/dnsmasq.conf

去掉strict-order前面的#号
设置listen-address,配置如下:

listen-address=127.0.0.1,192.168.0.80

如果只加上127.0.0.1,表示只能为本机提供dns服务,如果需要为局域网的其他电脑提供dns服务,需要再加上树莓派在局域网内的IP地址。

修改缓存大小

cache-size=10000

保存dnsmasq.conf文件
修改resolv.conf文件,添加以下几行:

nameserver 127.0.0.1
nameserver 223.5.5.5
nameserver 114.114.114.114

第一行是自动生成的,表示查询DNS时首先从本地查找,找不到了才从下面的上游DNS服务器查找。

保存resolv.conf文件
重启dnsmasq

sudo service dnsmasq restart

查看服务状态

sudo service dnsmasq status

OK,安装成功了!在其它电脑上就可以使用树莓派DNS缓存服务器了,明显可以看到解析域名的速度大大提高,基本上第一次解析花点时间,以后访问时的速度有了极大提高。

卸载

sudo apt remove dnsmasq
sudo apt purge dnsmasq

根据删除提示信息,删除其他关联库及文件

使用查找命令,查找关联文件及文件夹并删除:

whereis dnsmasq

sudo rm -rf file[file-dir]

Link:

grep 搜索不包含

grep 是我们在Linux下查找文本内容最常用的命令,通常我们都是获取包含某个字段的内容。当然, grep 也能获取不包含某个字段的内容,同时各个命令能组合使用。下面我们一起来熟悉下。

查找包含某字段:

less file | grep 'keyword'

查找不包含某字段:

less file | grep -v 'keyword'

输出查找到的某字段个数:

less file | grep 'keyword' -c

同时输出查找到的内容的行数:

less file | grep 'keyword' -n

忽略大小写:

less file | grep 'keyword' - i

将查找到的内容高亮显示:

less file | grep 'keyword' --color=auto

更多使用方法,可以使用帮助命令查看:

grep --help

Done.

解决Python3不能导入pip3安装包问题

最近将Hugo博客转移到七牛云,按照要求使用 pip3 命令安装好了相关的模块,结果出现了一个重大的问题,就是使用 python3 命令导入相关模块的时候直接出现了一个很尴尬的问题,无法查找到该模块。如下:

$ python3
Python 3.6.3 (v3.6.3:2c5fed86e0, Oct  3 2017, 00:32:08) 
[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import imutils
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ModuleNotFoundError: No module named 'imutils'

pip3安装包位置与python3引用位置不同

在命令行查看一下 pip3 到底是什么?

$ which pip3
/usr/local/bin/pip3
$ pip3 --version
pip 9.0.1 from usr/local/lib/python3.6/site-packages

注意这里的目录 usr/local/lib/python3.6/site-packages ,下面我们会和它进行对比。

在命令行打开Python3的终端:

$ python3
Python 3.6.3 (v3.6.3:2c5fed86e0, Oct  3 2017, 00:32:08) 
[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> print(sys.path)
['', '/Library/Frameworks/Python.framework/Versions/3.6/lib/python36.zip', '/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6', '/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/lib-dynload', '/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages']
>>>

看最后一个路径 /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages ,和我们上面pip3安装的目录 usr/local/lib/python3.6/site-packages 居然不一样。也就是说我们使用 python3 命令根本就无法导入 pip3 安装的模块,因为完全找不到这个目录下。有些同学可以看一下自己的 python3 输出结果,有的是这个:

$ python3
Python 3.6.3 (v3.6.3:2c5fed86e0, Oct  3 2017, 00:32:08) 
[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> print(sys.path)
['', '/Library/Frameworks/Python.framework/Versions/3.6/lib/python36.zip', '/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6', '/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/lib-dynload', 'usr/local/lib/python3.6/site-packages']
>>>

这种情况的话就可以直接导入成功了。我也不太清楚为啥同样是Homebrew安装Python,结果有的同学是这个结果,有的同学是那个结果,不过没关系,下面我们提出解决方案。

建立一个软链将两个 site-packages 合并

其实我们是希望 python3 能够找到 pip3 安装的模块,但是无法找到 usr/local/lib/python3.6/site-packages 这个目录,我们可以将这个 site-packages 去掉,将它变成 /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages 的一个软链接,这样的话,我们使用pip3安装的模块都会直接进入 /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages 这个目录了,导入自然就没问题了。

$ cd /usr/local/lib/python3.6
$ mv site-packages site-packages.bak
$ ln -s /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages site-packages

这样软链就创建完成了,关于 site-packages.bak 这个目录,如果你觉的没什么用就可以直接删除了。这样我们再次使用 pip3 安装 imutils 这个模块,就会直接进入 /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages 这个目录。我们接下来再次使用 python3 导入一下这个模块:

$ python3
Python 3.6.3 (v3.6.3:2c5fed86e0, Oct  3 2017, 00:32:08) 
[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import imutils
>>>

说明导入成功了!

其它博客的解决方案

在网上之前找了很多解决方案,其中比较多的就是说在 /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages 目录中建立一个 .pth 文件,指定另一个 site-packages 目录的地址,然后 site.py 文件会自动去查找,但是这种方案仅针对 python2.7 ,我还没有试过,不过觉得比较麻烦,而且不一定能成功,所以就没有采取这种方法。

PyCharm安装目录

我们在使用 PyCharm 去安装一些模块的时候会到这里进行安装:

pycharm-pip.png

看到上面的项目解释器( Project Interpreter ),就是我们上面提到的 Python3.6.3 ,它的安装目录地址就是 /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages ,因此 PyCharm 在这个解释器的情况下会安装到 /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages 这个目录。和我们在命令行使用 pip3 安装模块的目录是一样的。我们使用 pip3 安装一些目录以后,重新打开这个窗口,就会发现这里全部显示出来了。

总结

这个应该算是Python环境里面的一个大坑了吧,对于Python不太熟悉的朋友很有可能会被这么多的安装位置搞晕,搞懵。不过我们在遇到这个问题的时候还是要冷静思考,多Google,看得多了,自己也就对这个问题慢慢熟悉了,然后才能有自己的解决方案。所以一定要有足够的Input,才能有Output。

Link: 解决Python3不能导入pip3安装包问题

Ubuntu 18.04安装Java JDK8

Java JDK在linux系统有两个版本,一个开源版本Openjdk,还有一个oracle官方版本jdk,oracle JDK既可以通过添加ppa源命令行安装,也可以去官网下载jdk压缩包安装

安装openjdk

1、更新软件包列表:

sudo apt-get update

2、安装openjdk-8-jdk:

sudo apt-get install openjdk-8-jdk

3、查看java版本,看看是否安装成功:

java -version
openjdk version "1.8.0_252"
OpenJDK Runtime Environment (build 1.8.0_252-8u252-b09-1~18.04-b09)
OpenJDK 64-Bit Server VM (build 25.252-b09, mixed mode)

Link: Ubuntu 18.04安装Java JDK8三种方式

Nginx Access Log日志统计分析常用命令

IP相关统计

统计IP访问量

awk '{print $1}' access.log | sort -n | uniq | wc -l

查看某一时间段的IP访问量(4-5点)

grep "07/Apr/2017:0[4-5]" access.log | awk '{print $1}' | sort | uniq -c| sort -nr | wc -l

查看访问最频繁的前100个IP

awk '{print $1}' access.log | sort -n |uniq -c | sort -rn | head -n 100

查看访问100次以上的IP

awk '{print $1}' access.log | sort -n |uniq -c |awk '{if($1 >100) print $0}'|sort -rn

查询某个IP的详细访问情况,按访问频率排序

grep '104.217.108.66' access.log |awk '{print $7}'|sort |uniq -c |sort -rn |head -n 100

页面访问统计

查看访问最频的页面(TOP100)

awk '{print $7}' access.log | sort |uniq -c | sort -rn | head -n 100

查看访问最频的页面([排除php页面】(TOP100)

grep -v ".php"  access.log | awk '{print $7}' | sort |uniq -c | sort -rn | head -n 100

查看页面访问次数超过100次的页面

cat access.log | cut -d ' ' -f 7 | sort |uniq -c | awk '{if ($1 > 100) print $0}' | less

查看最近1000条记录,访问量最高的页面

tail -1000 access.log |awk '{print $7}'|sort|uniq -c|sort -nr|less

每秒请求量统计

统计每秒的请求数,top100的时间点(精确到秒)

awk '{print $4}' access.log |cut -c 14-21|sort|uniq -c|sort -nr|head -n 100

每分钟请求量统计

统计每分钟的请求数,top100的时间点(精确到分钟)

awk '{print $4}' access.log |cut -c 14-18|sort|uniq -c|sort -nr|head -n 100

每小时请求量统计

统计每小时的请求数,top100的时间点(精确到小时)

awk '{print $4}' access.log |cut -c 14-15|sort|uniq -c|sort -nr|head -n 100

性能分析

在nginx log中最后一个字段加入$request_time

列出传输时间超过 3 秒的页面,显示前20条

cat access.log|awk '($NF > 3){print $7}'|sort -n|uniq -c|sort -nr|head -20

列出php页面请求时间超过3秒的页面,并统计其出现的次数,显示前100条

cat access.log|awk '($NF > 1 &&  $7~/\.php/){print $7}'|sort -n|uniq -c|sort -nr|head -100

蜘蛛抓取统计

统计蜘蛛抓取次数

grep 'Baiduspider' access.log |wc -l

统计蜘蛛抓取404的次数

grep 'Baiduspider' access.log |grep '404' | wc -l

TCP连接统计

查看当前TCP连接数

netstat -tan | grep "ESTABLISHED" | grep ":80" | wc -l

用tcpdump嗅探80端口的访问看看谁最高

tcpdump -i eth0 -tnn dst port 80 -c 1000 | awk -F"." '{print $1"."$2"."$3"."$4}' | sort | uniq -c | sort -nr

Link: Nginx Access Log日志统计分析常用命令

Linux 下如何退出 tmux 和重新进入 tmux

tmux是一个优秀的终端复用软件

进入 tmux

tmux

退出(detach)当前tmux

ctrl+d

重新进入tmux

tmux attach -t <target-session>

如:当前有很多session,那么选择哪一个呢?

  1. 使用命令tmux ls来获取target-session
tmux ls
1: 1 windows (created Tue Jan 17 09:28:05 2019) [207x86]
13: 1 windows (created Tue Jan 17 17:49:10 2019) [207x86]
16: 1 windows (created Thu Jan 17 10:41:44 2019) [207x86]
19: 5 windows (created Tue Jan 17 10:53:06 2019) [207x86]
  1. 进入target-session为13的窗口
tmux attach -t 13

更多使用方式,参考百度百科

Link: linux下如何退出tmux和重新进入tmux