简栈

拥抱AI,持续成长

定义

**数据结构(Data Structure)**是带有结构特性的数据元素的集合,它研究的是数据的逻辑结构和数据的物理结构以及它们之间的相互关系,并对这种结构定义相适应的运算,设计出相应的算法,并确保经过这些运算以后所得到的新结构仍保持原来的结构类型。简而言之,数据结构是相互之间存在一种或多种特定关系的数据元素的集合,即带“结构”的数据元素的集合。“结构”就是指数据元素之间存在的关系,分为逻辑结构和存储结构。

分类:

  • 数组(英语:Array),是由相同类型的元素(element)的集合所组成的数据结构,分配一块连续的内存来存储。利用元素的索引(index)可以计算出该元素对应的存储地址。

  • (英语:stack)又称为堆叠,是计算机科学中的一种抽象数据类型,只允许在有序的线性数据集合的一端(称为堆栈顶端,英语:top)进行加入数据(英语:push)和移除数据(英语:pop)的运算。因而按照后进先出(LIFO, Last In First Out)的原理运作。

  • 队列,又称为伫列(queue),是先进先出(FIFO, First-In-First-Out)的线性表。在具体应用中通常用链表或者数组来实现。队列只允许在后端(称为rear)进行插入操作,在前端(称为front)进行删除操作。

  • 链表(Linked list)是一种常见的基础数据结构,是一种线性表,但是并不会按线性的顺序存储数据,而是在每一个节点里存到下一个节点的指针(Pointer)。由于不必须按顺序存储,链表在插入的时候可以达到O(1)的复杂度,比另一种线性表顺序表快得多,但是查找一个节点或者访问特定编号的节点则需要O(n)的时间,而顺序表相应的时间复杂度分别是O(logn)和O(1)。最常见的三种链表结构有:单链表、双向链表、循环链表。

  • (英语:tree)是一种抽象数据类型(ADT)或是实现这种抽象数据类型的数据结构,用来模拟具有树状结构性质的数据集合。它是由n(n>0)个有限节点组成一个具有层次关系的集合。把它叫做“树”是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。它具有以下的特点:

    • 每个节点都只有有限个子节点或无子节点;
    • 没有父节点的节点称为根节点;
    • 每一个非根节点有且只有一个父节点;
    • 除了根节点外,每个子节点可以分为多个不相交的子树;
    • 树里面没有环路(cycle)
  • 散列表Hash table,也叫哈希表),是根据(Key)而直接访问在内存存储位置的数据结构。也就是说,它通过计算一个关于键值的函数,将所需查询的数据映射到表中一个位置来访问记录,这加快了查找速度。这个映射函数称做散列函数,存放记录的数组称做散列表

  • (英语:Heap)是计算机科学中的一种特别的树状数据结构。若是满足以下特性,即可称为堆:“给定堆中任意节点P和C,若P是C的母节点,那么P的值会小于等于(或大于等于)C的值”。若母节点的值恒小于等于子节点的值,此堆称为最小堆(min heap);反之,若母节点的值恒大于等于子节点的值,此堆称为最大堆(max heap)。在堆中最顶端的那一个节点,称作根节点(root node),根节点本身没有母节点(parent node)。

  • (Graph)是由顶点的有穷非空集合和顶点之间的边的集合组成,通常表示为:G(V,E)。其中,G 表示一个图,V是图G中顶点的集合,E是图G中边的集合。

    • 图中数据元素叫做顶点(Vertext)。

    • 在图中,不允许没有顶点。若 V 是图的顶点的集合,那么,V 是非空
      有穷集合。

    • 图的任意两个顶点之间都可能有关系,它们的关系用边来表示。边集可
      以是空的。

http://static.cyblogs.com/WX20191219-151801@2x.png

再了解树之前,我们对一些专业术语普及一下:度、阶、高度、深度、根、叶子、兄弟节点、关键字。

参考地址:

背景

我是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内存。

继续执行,还是报错了。

阅读全文 »
0%