简栈

拥抱AI,持续成长

背景

我是Mac系统与Win10系统同时使用,但大部分还是在Mac系统上,有时候为了保持2个系统的“一致性”,会用到一些云盘或者Git等。这次是属于保证学习spring源代码的时候版本内容一致。

https://github.com/spring-projects/spring-framework/tree/v5.1.4.RELEASE

spring-framework是用gradle来管理包依赖的,在编译过程中,Win系统同遇到了一些问题。

升级gradle

之前我是用的gradle-4.10.2,找了一些文章建议升级,所以我干脆就升级到最新的版本。

官网下载地址:https://gradle.org/releases/,然后我选择的是6.0的版本。

配置GRADLE_HOMEpath

配置GRADLE_HOME:

http://static.cyblogs.com/QQ截图20191117000656.png

阅读全文 »

背景

作为一名后端开发人员,其实需要掌握的知识还真的需要很多的很多的。这也是我自己一直为什么觉得作为程序员是一种幸福,因为很多的知识与技术都掌握在了其他的人前面,可能享受到这个世界知识带来的红利。但技术也是孤独的,越是往深的地方走,越是觉得自己的无知。

这几个月对于知识的深入也是养成了一些习惯,对于源码与原理性的东西越发的感兴趣。也想着自己多输出一些东西出来。也算是记录自己的一个成长吧!

TCP的三次握手

三次握手主要是针对于Client与Server建立连接来描述的。

https://img-blog.csdn.net/20170911145000723

**第一次握手:**由客户端发起TCP连接的请求,此时客户端发送一条报文,其中包含SYN标志位,将SYN设置为1; 以及seq位。设seq = x ; 该报文段成为SYN报文段;

**第二次握手:**服务器收到这条报文后,返回给客户端一条报文,包含ack位、SYN、以及seq位。 其中ack = x+1; SYN = 1; seq = y。该报文段称为SYNACK报文段;

**第三次握手:**当客户端收到SYNACK报文段之后,客户端需要再给服务器发送另外一个报文段,进行确认。该报文段的SYN = 0, seq = x +1,ack = y+1;

总结一下,就是客户端先跟服务端做一个试探,看看服务端是不是可以被连接的,如果回复是可以的,那么客户端才真的发起请求过去。

阅读全文 »

环境

spring-framework:5.1.x

spring-boot: v2.1.2.RELEASE

看一眼历史的感觉

先看一眼我们很久以前用的XML的配置方式,我举得用最原始的方式来学习会相对于简单,因为很多的配置都是显性的。我只截取最核心的部分,大概找一下感觉。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
<?xml version="1.0" encoding="UTF-8" ?>
<web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="
http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">

<context-param>
<param-name>contextConfigLocation</param-name> <!--参数名字不能随意取,约定的。-->
<param-value>classpath:context.xml</param-value>
</context-param>

<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
</filter>

<servlet>
<servlet-name>dispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:config/spring-mvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>

</web-app>

上面的配置基本就把一个SpringMVC的项目配置完成了,大家都了解。web.xml是一个WEB项目的入口,而这里面就把Spring与Servlet关联起来了。

Loader1:org.springframework.web.context.ContextLoaderListenerIOC容器,管理所有的Bean

Loader2:org.springframework.web.servlet.DispatcherServletIOC容器,主要关于与WEB相关的一些配置,比如:ControllerHandlerMapping等等。

这里粗略的描述一下WEB项目的一个加载顺序:listener → filter → servlet。

阅读全文 »

证书申请

关于证书申请,其实我们可以申请免费的证书即可,在阿里云或者腾讯云等地方都能申请到免费一年的证书,具体的申请步骤这里就就不细细描述了,因为比较简单。但这里指的提醒一下的是,二级域名与三级域名是要区别开来的,一个证书对应一个域名。

比如:cyblogs.comgitlab.cyblogs.com是需要单独申请的,我这里的话因为域名解析是在dnspod解析的,所以我也就在它那里申请了。

如果是在阿里云申请,而在其他地方做的域名解析,第一次需要单独配置一次解析才行。

http://static.cyblogs.com/QQ截图20191103175026.png

Nginx的安装技巧

gitlab.cyblogs.com.conf文件内容,之类把你的证书存放在你想放的位置,我这里是:/usr/local/nginx/ssl

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132

upstream gitlab {
server unix:/var/opt/gitlab/gitlab-rails/sockets/gitlab.socket fail_timeout=0;
}

upstream gitlab-workhorse {
server unix://var/opt/gitlab/gitlab-workhorse/socket fail_timeout=0;
}

server {
listen 0.0.0.0:80;
server_name gitlab.cyblogs.com;
server_tokens off;
return 301 https://$server_name$request_uri;
access_log /usr/local/nginx/conf/logs/gitlab_access.log;
error_log /usr/local/nginx/conf/logs/gitlab_error.log;
}

server {
listen 0.0.0.0:443 ssl;
server_name gitlab.cyblogs.com;
server_tokens off;
root /opt/gitlab/embedded/service/gitlab-rails/public;

client_max_body_size 20m;

ssl_certificate /usr/local/nginx/ssl/gitlab.cyblogs.com_bundle.crt;
ssl_certificate_key /usr/local/nginx/ssl/gitlab.cyblogs.com.key;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 5m;

access_log /usr/local/nginx/conf/logs/gitlab_access.log;
error_log /usr/local/nginx/conf/logs/gitlab_error.log;

location /uploads/ {
gzip off;
proxy_read_timeout 300;
proxy_connect_timeout 300;
proxy_redirect off;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Frame-Options SAMEORIGIN;
proxy_pass https://gitlab;
}

location @gitlab {
gzip off;
proxy_read_timeout 300;
proxy_connect_timeout 300;
proxy_redirect off;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Frame-Options SAMEORIGIN;
proxy_pass http://localhost:8081;
}

location ~ ^/[\w\.-]+/[\w\.-]+/gitlab-lfs/objects {
client_max_body_size 0;
error_page 418 = @gitlab-workhorse;
return 418;
}

location ~ ^/[\w\.-]+/[\w\.-]+/(info/refs|git-upload-pack|git-receive-pack)$ {
client_max_body_size 0;
error_page 418 = @gitlab-workhorse;
return 418;
}

location ~ ^/[\w\.-]+/[\w\.-]+/repository/archive {
client_max_body_size 0;
error_page 418 = @gitlab-workhorse;
return 418;
}

location ~ ^/api/v3/projects/.*/repository/archive {
client_max_body_size 0;
error_page 418 = @gitlab-workhorse;
return 418;
}

location ~ ^/[\w\.-]+/[\w\.-]+/builds/download {
client_max_body_size 0;
error_page 418 = @gitlab-workhorse;
return 418;
}

location ~ /ci/api/v1/builds/[0-9]+/artifacts {
client_max_body_size 0;
error_page 418 = @gitlab-workhorse;
return 418;
}

location @gitlab-workhorse {
client_max_body_size 0;
gzip off;
proxy_buffering off;

proxy_read_timeout 300;
proxy_connect_timeout 300;
proxy_redirect off;

proxy_http_version 1.1;

proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-Ssl on;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_pass http://gitlab-workhorse;
}

location ~ ^/(assets)/ {
root /opt/gitlab/embedded/service/gitlab-rails/public;
gzip_static on;
expires max;
add_header Cache-Control public;
}

location ~ / {
root /opt/gitlab/embedded/service/gitlab-rails/public;
try_files $uri $uri/index.html $uri.html @gitlab;
}

error_page 502 /502.html;
}

SSH拉取OK,Http方式不行

http://static.cyblogs.com/QQ截图20191103175454.png

阅读全文 »

准备

大家在安装Kubernetes的时候,大多数人都遇到了一直处理starting的状态。其实都是因为依赖的docker images不存在。而且由于墙等问题的存在,大家可以安装之前提前把镜像下载好。

我这里找到了很多的文档,找齐了我这边能支持跑起来的image

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
➜  kubernetes  docker images
REPOSITORY TAG
k8s.gcr.io/kube-apiserver v1.16.0
registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver v1.16.0
k8s.gcr.io/kube-proxy v1.16.0
registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy v1.16.0
k8s.gcr.io/kube-proxy v1.14.6
k8s.gcr.io/kube-apiserver v1.14.6
k8s.gcr.io/kube-scheduler v1.14.6
k8s.gcr.io/kube-controller-manager v1.14.6
docker/kube-compose-controller v0.4.23
docker/kube-compose-api-server v0.4.23
k8s.gcr.io/coredns 1.3.1
k8s.gcr.io/kubernetes-dashboard-amd64 v1.10.1
k8s.gcr.io/etcd 3.3.10
k8s.gcr.io/kube-proxy-amd64 v1.10.11
k8s.gcr.io/kube-apiserver-amd64 v1.10.11
k8s.gcr.io/kube-controller-manager-amd64 v1.10.11
k8s.gcr.io/kube-scheduler-amd64 v1.10.11
docker/kube-compose-controller v0.4.12
docker/kube-compose-api-server v0.4.12
k8s.gcr.io/etcd-amd64 3.1.12
k8s.gcr.io/k8s-dns-dnsmasq-nanny-amd64 1.14.8
k8s.gcr.io/k8s-dns-sidecar-amd64 1.14.8
k8s.gcr.io/k8s-dns-kube-dns-amd64 1.14.8
k8s.gcr.io/pause-amd64 3.1
k8s.gcr.io/pause 3.1
k8s.gcr.io/storage-provisioner v1.8.1
registry.cn-hangzhou.aliyuncs.com/google_containers/storage-provisioner v1.8.1

再启动,等一会儿就应该能看到Docker与Kubernetes都起来了。

http://static.cyblogs.com/WX20191015-184532@2x.png

创建kubernetes-dashboard

接下来我们可以使用 kubectl 命令来创建简单的 kubernetes-dashboard 服务:

1
2
3
4
5
6
7
8
9
10
11
kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v1.10.1/src/deploy/recommended/kubernetes-dashboard.yaml
# 这个可以把文件下载下来,后面就可以本地了。

kubectl apply -f /Users/chenyuan/Tools/Docker/kubernetes/kubernetes-dashboard.yaml

secret "kubernetes-dashboard-certs" created
serviceaccount "kubernetes-dashboard" created
role "kubernetes-dashboard-minimal" created
rolebinding "kubernetes-dashboard-minimal" created
deployment "kubernetes-dashboard" created
service "kubernetes-dashboard" created

服务安装完毕后可以查看部署的容器与服务:

阅读全文 »

虚拟机创建

在自己的Mac系统里面利用Parallels Desktop创建3台虚拟机,具体信息如下:

1
2
3
4
5
6
7
8
9
10
11
CentOS7-Node1:
10.211.55.7
parallels/centos-test

CentOS7-Node2:
10.211.55.8
parallels/centos-test

CentOS7-Node3:
10.211.55.9
parallels/centos-test

Master安装

选择CentOS7-Node1机器作为Master节点。

配置yum

更新yum源:

1
2
3
4
5
6
7
8
[parallels@CentOS7-Node1 yum.repos.d]$ cd /etc/yum.repos.d
[parallels@CentOS7-Node1 yum.repos.d]$ sudo touch kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
安装Kubernetes环境

评估下来,利用kubeadm来搭建是大家比较推荐的,而且公司的集群也是。所以毫不忧虑就用kubeadm。

阅读全文 »

设置yum源

1
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

让yum更新到最新

1
sudo yum update

查看仓库中所有docker的版本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
[parallels@CentOS7-Node1 ~]$ yum list docker-ce --showduplicates | sort -r
* updates: mirrors.njupt.edu.cn
Loaded plugins: fastestmirror, langpacks
* extras: mirrors.njupt.edu.cn
docker-ce.x86_64 3:19.03.4-3.el7 docker-ce-stable
docker-ce.x86_64 3:19.03.3-3.el7 docker-ce-stable
docker-ce.x86_64 3:19.03.2-3.el7 docker-ce-stable
docker-ce.x86_64 3:19.03.1-3.el7 docker-ce-stable
docker-ce.x86_64 3:19.03.0-3.el7 docker-ce-stable
docker-ce.x86_64 3:18.09.9-3.el7 docker-ce-stable
docker-ce.x86_64 3:18.09.8-3.el7 docker-ce-stable
docker-ce.x86_64 3:18.09.7-3.el7 docker-ce-stable
docker-ce.x86_64 3:18.09.6-3.el7 docker-ce-stable
docker-ce.x86_64 3:18.09.5-3.el7 docker-ce-stable
docker-ce.x86_64 3:18.09.4-3.el7 docker-ce-stable
docker-ce.x86_64 3:18.09.3-3.el7 docker-ce-stable
docker-ce.x86_64 3:18.09.2-3.el7 docker-ce-stable
docker-ce.x86_64 3:18.09.1-3.el7 docker-ce-stable
docker-ce.x86_64 3:18.09.0-3.el7 docker-ce-stable
docker-ce.x86_64 18.06.3.ce-3.el7 docker-ce-stable
docker-ce.x86_64 18.06.2.ce-3.el7 docker-ce-stable
docker-ce.x86_64 18.06.1.ce-3.el7 docker-ce-stable
docker-ce.x86_64 18.06.0.ce-3.el7 docker-ce-stable
docker-ce.x86_64 18.03.1.ce-1.el7.centos docker-ce-stable
docker-ce.x86_64 18.03.0.ce-1.el7.centos docker-ce-stable
docker-ce.x86_64 17.12.1.ce-1.el7.centos docker-ce-stable
docker-ce.x86_64 17.12.0.ce-1.el7.centos docker-ce-stable
docker-ce.x86_64 17.09.1.ce-1.el7.centos docker-ce-stable
docker-ce.x86_64 17.09.0.ce-1.el7.centos docker-ce-stable
docker-ce.x86_64 17.06.2.ce-1.el7.centos docker-ce-stable
docker-ce.x86_64 17.06.1.ce-1.el7.centos docker-ce-stable
docker-ce.x86_64 17.06.0.ce-1.el7.centos docker-ce-stable
docker-ce.x86_64 17.03.3.ce-1.el7 docker-ce-stable
docker-ce.x86_64 17.03.2.ce-1.el7.centos docker-ce-stable
docker-ce.x86_64 17.03.1.ce-1.el7.centos docker-ce-stable
docker-ce.x86_64 17.03.0.ce-1.el7.centos docker-ce-stable
Determining fastest mirrors
* base: mirrors.aliyun.com
Available Packages

安装docker

1
2
sudo yum install docker-ce #由于repo中默认只开启stable仓库
sudo yum install <FQPN> # 例如:sudo yum install docker-ce-18.09.9-3.el7

启动并加入开机启动项

1
2
sudo systemctl start docker
sudo systemctl enable docker
阅读全文 »

在搭建Kubernetes环境的时候报了一个错误,顺便温习一下防火墙的知识。

查看防火墙状态

1
2
[parallels@CentOS7-Node1 Workspace]$ sudo firewall-cmd --state
running

停止防火墙

1
2
3
4
[parallels@CentOS7-Node1 Workspace]$ sudo systemctl stop firewalld.service 
[sudo] password for parallels:
[parallels@CentOS7-Node1 Workspace]$ sudo firewall-cmd --state
not running

禁止firewall开机启动

1
systemctl disable firewalld.service

更换yum源

为了加快速度,首先可以更换yum的源

1
[root@iZ94tq694y3Z ghost]#touch /etc/yum.repos.d/gitlab_gitlab-ce.repo

替换内容为:

1
2
3
4
5
[gitlab-ce]
name=Gitlab CE Repository
baseurl=https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el$releasever/
gpgcheck=0
enabled=1

安装

用root用户安装:

1
2
3
4
5
6
7
yum install curl openssh-server openssh-clients postfix cronie
service postfix start
chkconfig postfix on

yum makecache
yum install gitlab-ce
gitlab-ctl reconfigure

由于自己的阿里云服务器太渣渣了,所以在这里一直卡主了。看了一下阿里云的服务监控。内存已经爆满了,不得不去花钱升级了一下配置。现在是1CPU and 2GB内存。

继续执行,还是报错了。

阅读全文 »

背景

在测试环境,有个同事发现了一个ID插入的时候报了主键冲突。这是一件很奇怪的事情,在大家的理解中,使用了Sequence功能,每个节点的内存拿的ID段应该都是不同的,不可能会出现这个问题。不然这又要颠覆认知了~

思考

  • 是否有人手动插入了一条数据,然后出入的时候手动设置了ID呢?
  • 是否有人手动调整了Sequencevalue呢?
  • 为什么数据库还存在了ID相同,但在不同表的数据呢?是不是多线程写的有毛病啊?

初步排查

  • 确认没有人手动插入ID,都是用程序获取的方式;
  • 那有时间与精力去手动设置Sequencevalue啊,确实谁去没事儿管这个;
  • 数据ID相同数据在不同表,明显是2台不同的项目Node导致的。

总结:确定问题出现了2台机器获取的Sequencevalue范围冲突了。

问题表现出来的确实如此,难道真的要颠覆我们的认知吗?因为问题算比较严重,所以非常的重视。一定要找到问题的原因所在!

具体排查

此时,我们发现代码有一处调整过,就是配置TDDLSequenceinnerStep(内部步长),由原来的1000调整为5000。为什么调整大了,是因为在数据迁移的时候,数据量很大,减少由于ID扩容对数据库操作的时间(其实在这里,可以看出这位开发同学已经非常优秀了,其他地方也一定会非常的注意性能的设计)。

阅读全文 »
0%