一、安装docker

参考:https://www.cnblogs.com/uestc2007/p/15598527.html

二、安装rancher

1、Rancher概述

  • rancher官方文档
  • Rancher 是一个 Kubernetes 管理工具,让你能在任何地方和任何提供商上部署和运行集群。
  • Rancher 可以创建来自 Kubernetes 托管服务提供商的集群,创建节点并安装 Kubernetes,或者导入在任何地方运行的现有 Kubernetes 集群。
  • Rancher 基于 Kubernetes 添加了新的功能,包括统一所有集群的身份验证和 RBAC,让系统管理员从一个位置控制全部集群的访问。
  • 此外,Rancher 可以为集群和资源提供更精细的监控和告警,将日志发送到外部提供商,并通过应用商店(Application Catalog)直接集成 Helm。如果你拥有外部 CI/CD 系统,你可以将其与 Rancher 对接。没有的话,你也可以使用 Rancher 提供的 Fleet 自动部署和升级工作负载。
  • Rancher 是一个 全栈式 的 Kubernetes 容器管理平台,为你提供在任何地方都能成功运行 Kubernetes 的工具。

2、安装环境

软件 版本
cnetos7 20.04.2
docker 20.10.6

3、环境初始化

1、关闭swap分区
sudo swapoff -a #验证
free -m 2、 确保时区,时间正确
sudo timedatectl 3、确保虚机不会自动suspend
sudo systemctl mask sleep.target suspend.target hibernate.target hybrid-sleep.target 4、加载内核模块br_netfilter,并调整参数
#执行
sudo modprobe br_netfilter #确认已加载
lsmod | grep br_netfilter #调整内核参数,修改 /etc/sysctl.conf
#将桥接的IPv4流量传递到iptables的链 vim /etc/sysctl.conf cat > /etc/sysctl.conf << EFO
net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EFO #使配置生效,执行:
sudo sysctl --system 5、设置rp_filter的值
#执行
sudo vi /etc/sysctl.d/10-network-security.conf #将文件中如下两个参数的值从2修改为1
net.ipv4.conf.default.rp_filter=1
net.ipv4.conf.all.rp_filter=1 #使配置生效,执行:
sudo sysctl --system

4、创建rancher挂载目录

#创建rancher的持久化目录
mkdir -p /opt/data/rancher_data

#创建SSL根目录
mkdir -p /opt/data/rancher_ssl

#创建审计日志目录
mkdir -p /opt/data/rancher_auditlog

5、下载安全证书(如果有ssl证书请使用)Apache 下载证书

  对应关系(阿里云ssl证书):public.crt-->cert.pem  xxxx.com.key->key.pem  chain.crt-->cacerts.pem

6、安装rancher

如不安装证书去掉红色部分内容,rancher会自动安装一个证书(线上环境建议配置ssl)

docker run -d --restart=unless-stopped \
-p 80:80 -p 443:443 \
-v /opt/data/rancher_ssl/xxx.com_public.crt:/etc/rancher/ssl/cert.pem \
-v /opt/data/rancher_ssl/xxx.com.key:/etc/rancher/ssl/key.pem \
-v /opt/data/rancher_ssl/xxx.com_chain.crt:/etc/rancher/ssl/cacerts.pem \
--privileged \
-v /opt/data/rancher_data:/var/lib/rancher \
-v /opt/data/rancher_auditlog:/var/log/auditlog \
-e AUDIT_LEVEL=1 \
rancher/rancher:v2.7.5

注:版本自定义

7、通过命令查看rancher是否启动

查看STATUS 如果1分钟内,没有出现重启之类的问题,那么这个docker便已经启动成功。

 docker ps

8、访问rancher

在浏览器访问 https://IP:port即可看到效果

9、通过命令获取密码

1、通过docker ps 获取容器iD

2、docker logs 容器id 2>&1 | grep "Bootstrap Password:"

设置密码,最少12位

至此,Rancher安装完成!

三、使用Rancher搭建K8S集群

3.1、导入k8s集群

如果已经存在k8s集群,可以导入已存在

3.1.1 生成kubeconfig文件(可选)

vi restore-kube-config.sh

#!/bin/bash

help ()
{
echo ' ================================================================ '
echo ' --master-ip: 指定Master节点IP,任意一个K8S Master节点IP即可。'
echo ' 使用示例:bash restore-kube-config.sh --master-ip=1.1.1.1 '
echo ' ================================================================'
} case "$1" in
-h|--help) help; exit;;
esac if [[ $1 == '' ]];then
help;
exit;
fi CMDOPTS="$*"
for OPTS in $CMDOPTS;
do
key=$(echo ${OPTS} | awk -F"=" '{print $1}' )
value=$(echo ${OPTS} | awk -F"=" '{print $2}' )
case "$key" in
--master-ip) K8S_MASTER_NODE_IP=$value ;;
esac
done # 获取Rancher Agent镜像
RANCHER_IMAGE=$( sudo docker images --filter=label=io.cattle.agent=true |grep 'v2.' | \
grep -v -E 'rc|alpha|<none>' | head -n 1 | awk '{print $3}' ) if [ -d /opt/rke/etc/kubernetes/ssl ]; then
K8S_SSLDIR=/opt/rke/etc/kubernetes/ssl
else
K8S_SSLDIR=/etc/kubernetes/ssl
fi CHECK_CLUSTER_STATE_CONFIGMAP=$( sudo docker run --rm --entrypoint bash --net=host \
-v $K8S_SSLDIR:/etc/kubernetes/ssl:ro $RANCHER_IMAGE -c '\
if kubectl --kubeconfig /etc/kubernetes/ssl/kubecfg-kube-node.yaml \
-n kube-system get configmap full-cluster-state | grep full-cluster-state > /dev/null; then \
echo 'yes'; else echo 'no'; fi' ) if [ $CHECK_CLUSTER_STATE_CONFIGMAP != 'yes' ]; then sudo docker run --rm --net=host \
--entrypoint bash \
-e K8S_MASTER_NODE_IP=$K8S_MASTER_NODE_IP \
-v $K8S_SSLDIR:/etc/kubernetes/ssl:ro \
$RANCHER_IMAGE \
-c '\
kubectl --kubeconfig /etc/kubernetes/ssl/kubecfg-kube-node.yaml \
-n kube-system \
get secret kube-admin -o jsonpath={.data.Config} | base64 --decode | \
sed -e "/^[[:space:]]*server:/ s_:.*_: \"https://${K8S_MASTER_NODE_IP}:6443\"_"' > kubeconfig_admin.yaml if [ -s kubeconfig_admin.yaml ]; then
echo '恢复成功,执行以下命令测试:'
echo ''
echo "kubectl --kubeconfig kubeconfig_admin.yaml get nodes"
else
echo "kubeconfig恢复失败。"
fi else sudo docker run --rm --entrypoint bash --net=host \
-e K8S_MASTER_NODE_IP=$K8S_MASTER_NODE_IP \
-v $K8S_SSLDIR:/etc/kubernetes/ssl:ro \
$RANCHER_IMAGE \
-c '\
kubectl --kubeconfig /etc/kubernetes/ssl/kubecfg-kube-node.yaml \
-n kube-system \
get configmap full-cluster-state -o json | \
jq -r .data.\"full-cluster-state\" | \
jq -r .currentState.certificatesBundle.\"kube-admin\".config | \
sed -e "/^[[:space:]]*server:/ s_:.*_: \"https://${K8S_MASTER_NODE_IP}:6443\"_"' > kubeconfig_admin.yaml if [ -s kubeconfig_admin.yaml ]; then
echo '恢复成功,执行以下命令测试:'
echo ''
echo "kubectl --kubeconfig kubeconfig_admin.yaml get nodes"
else
echo "kubeconfig恢复失败。"
fi
fi

执行sh

sudo bash restore-kube-config.sh --master-ip=K8S Master节点IP

3.1.2点击 导入已有集群:

选择 导入 Kubernetes 集群:

输入集群名称:

执行下图命令:

3.2部署k8s

3.2.1准备开始创建 k8s

3.2.2 创建集群,下边数据默认就行

3.2.3 在master主节点运行,选中 etcd、 Control Plane、Worker, 复制下边代码到master节点执行

3.2.4 在node节点执行,只需要选中 Worker 复制下边代码到node节点

有多个node节点,每个节点都要执行

3.2.5 如果之前有安装过,需要将之前安装的容器删除,并清空挂载卷目录

rm -rf /etc/ceph \
/etc/cni \
/etc/kubernetes \
/opt/cni \
/opt/rke \
/run/secrets/kubernetes.io \
/run/calico \
/run/flannel \
/var/lib/calico \
/var/lib/etcd \
/var/lib/cni \
/var/lib/kubelet \
/var/lib/rancher/rke/log \
/var/log/containers \
/var/log/pods \
/var/run/calico

3.2.6 查看集群是否正常

3.2.7测试集群

我们来创建一个工作负载,运行一个 nginx,看一下最终效果。进入集群,创建 Deployment ,配置好映射端口、镜像,点击创建:

等待安装完成,在浏览器访问 http://IP:30080, 即可看到 nginx 的欢迎页面

四 Rancher的使用

4.1 创建命名空间

创建项目:

根据需求创建命名空间和设置资源

4.2 Secret

首先创建Harbor私库的密钥
选择 存储=> Secrets(密文) =>创建

命名空间选择之前自己创建的,填写名称,然后选择 Custom,仓库地址就是Harbor的地址,再输入Habor的用户名和密码。

Harbor的搭建参考:https://blog.csdn.net/zhilianxian2212/article/details/127412858?spm=1001.2014.3001.5501

4.3Deployment

4.3.1 概述一个 Deployment 为 Pod 和 ReplicaSet 提供声明式的更新能力。

你负责描述 Deployment 中的 目标状态,而 Deployment 控制器(Controller) 以受控速率更改实际状态, 使其变为期望状态。你可以定义 Deployment 以创建新的 ReplicaSet,或删除现有 Deployment, 并通过新的 Deployment 收养其资源。

说明:
不要管理 Deployment 所拥有的 ReplicaSet 。 如果存在下面未覆盖的使用场景,请考虑在 Kubernetes 仓库中提出 Issue。

4.3.2 用例

以下是 Deployments 的典型用例:

  • 创建 Deployment 以将 ReplicaSet 上线。ReplicaSet 在后台创建 Pod。 检查 ReplicaSet 的上线状态,查看其是否成功。
  • 通过更新 Deployment 的 PodTemplateSpec,声明 Pod 的新状态 。 新的ReplicaSet 会被创建,Deployment 以受控速率将 Pod 从旧 ReplicaSet 迁移到新 ReplicaSet。每个新的 ReplicaSet 都会更新 Deployment 的修订版本。
  • 如果 Deployment 的当前状态不稳定,回滚到较早的Deployment 版本。 每次回滚都会更新 Deployment 的修订版本。
  • 扩大 Deployment 规模以承担更多负载。 暂停Deployment 以应用对 PodTemplateSpec 所作的多项修改, 然后恢复其执行以启动新的上线版本。
  • 使用Deployment 状态来判定上线过程是否出现停滞。
  • 清理较旧的不再需要的 ReplicaSet 。

4.3.3 创建 Deployment

4.3.3.1 使用表单编辑创建Deployment

4.3.3.2 使用YAML文件创建Deployment

  • YAML文件包含四个部分:**

apiVersion: 表示版本
kind: 表示资源
metadata: 表示元信息
spec: 资源规范字段

下面是具体的字段说明:

apiVersion: apps/v1         # 指定api版本,此值必须在kubectl api-versions中
kind: Deployment # 指定创建资源的角色/类型
metadata: # 资源的元数据/属性
name: dnehsa-bizc # 资源的名字,在同一个namespace中必须唯一
namespace: gdfw # 部署在哪个namespace中
labels: # 设定资源的标签
app: dnehsa-bizc
spec: # 资源规范字段
replicas: 1 # 声明副本数目
revisionHistoryLimit: 10 # 保留历史版本
selector: # 选择器
matchLabels: # 匹配标签
app: dnehsa-bizc
strategy: # 策略
rollingUpdate: # 滚动更新
maxSurge: 25% # 最大额外可以存在的副本数,可以为百分比,也可以为整数
maxUnavailable: 25% # 表示在更新过程中能够进入不可用状态的 Pod 的最大值,可以为百分比,也可以为整数
type: RollingUpdate # 滚动更新策略
template: # 模版
metadata: # 资源的元数据/属性
labels: # 设定资源的标签
app: dnehsa-bizc
spec: # 资源规范字段
containers:
- name: dnehsa-bizc # 容器的名字
image: 192.168.20.4:8930/library/dnehsa_bizc:v1.0 # 容器使用的镜像地址
imagePullPolicy: Always # 每次Pod启动拉取镜像策略,三个选择 Always、Never、IfNotPresent
# Always,每次都检查;Never,每次都不检查(不管本地是否有);IfNotPresent,如果本地有就不检查,如果没有就拉取 resources: # 资源管理
limits: # 最大使用
cpu: 300m # CPU,1核心 = 1000m
memory: 500Mi # 内存,1G = 1000Mi
requests: # 容器运行时,最低资源需求,也就是说最少需要多少资源容器才能正常运行
cpu: 100m
memory: 100Mi
livenessProbe: #存活探针器配置
httpGet: #1.存活探针器三种方式 1.cmd命令方式进行探测 2.http 状态码方式 3.基于tcp端口探测
path: /healthy #k8s源码中healthz 实现 https://github.com/kubernetes/kubernetes/blob/master/test/images/agnhost/liveness/server.go
port: 32189 #应用程序监听端口
failureThreshold: 3 #处于成功时状态时,探测操作至少连续多少次的失败才被视为检测不通过,显示为#failure属性.默认值为3,最小值为 1,存活探测情况下的放弃就意味着重新启动容器。
initialDelaySeconds: 600 #存活性探测延迟时长,即容器启动多久之后再开始第一次探测操作,显示为delay属性.默认值为0,即容器启动后立刻便开始进行探测.
periodSeconds: 10 #执行探测的时间间隔(单位是秒)。默认是 10 秒。最小值是 1秒,过高的频率会对Pod对象带来较大的额外开销,而过低的频率又会使得对错误的反应不及时.
successThreshold: 1 #处于失败状态时,探测操作至少连续多少次的成功才被人为是通过检测,显示为#success属性,默认值为1,最小值也是1
timeoutSeconds: 3 #存活性探测的超时时长,显示为timeout属性,默认值1s,最小值也是1s
readinessProbe: #定义就绪探测器
failureThreshold: 3 #处于成功时状态时,探测操作至少连续多少次的失败才被视为检测不通过,显示为#failure属性.默认值为3,最小值为 就绪探测情况下的放弃 Pod 会被打上未就绪的标签.
tcpSocket: # 1.就绪探针三种方式 1.cmd命令方式进行探测 2.http 状态码方式 3.基于tcp端口探测
port: 32189 #应用程序监听端口
initialDelaySeconds: 10 #执行探测的时间间隔(单位是秒)。默认是 10 秒。最小值是 1秒,过高的频率会对Pod对象带来较大的额外开销,而过低的频率又会使得对错误的反应不及时.
periodSeconds: 10 #执行探测的时间间隔(单位是秒)。默认是 10 秒。最小值是 1秒,过高的频率会对Pod对象带来较大的额外开销,而过低的频率又会使得对错误的反应不及时
successThreshold: 1 #处于失败状态时,探测操作至少连续多少次的成功才被人为是通过检测,显示为#success属性,默认值为1,最小值也是1
timeoutSeconds: 3 #存活性探测的超时时长,显示为timeout属性,默认值1s,最小值也是1s
env: #环境变量
- name: TZ
value: Asia/Shanghai
# JVM env
- name: JAVA_OPTS
value: -Xms1024m -Xmx2048m -Dfile.encoding=UTF-8
# profile
- name: PROFILE
value: dev
volumeMounts: # 使用存储卷
- mountPath: /var/logs # 将存储卷挂载到容器内部路径
name: log-volume
dnsPolicy: ClusterFirst # 使用宿主机dns ; None 无任何策略 ;ClusterFirst 集群DNS优先;ClusterFirstWithHostNet 集群 DNS 优先,并伴随着使用宿主机网络
imagePullSecrets: # 镜像仓库拉取密钥
- name: harbor # 镜像Secrets需要在集群中手动创建
restartPolicy: Always # 重启策略
volumes: # 定义存储卷
- name: log-volume # 卷名称
hostPath: # 卷类型详细见:https://kubernetes.io/zh/docs/concepts/storage/volumes/
path: /data/logs/prod/dnehsa_bizc # 宿主机存在的目录路径
type: DirectoryOrCreate # 如果在给定路径上什么都不存在,那么将根据需要创建空目录,权限设置为 0755,具有与 kubelet 相同的组和属主信息
- name: sidecar #
emptyDir: {} #emptyDir 卷的存储介质(磁盘、SSD 等)是由保存 kubelet 数据的根目录 (通常是 /var/lib/kubelet)的文件系统的介质确定。

创建一个Deployment后,还会自动创建一个Pod。
这边状态显示为Active,说明创建成功。

4.4 Pod

Pod 是可以在 Kubernetes 中创建和管理的、最小的可部署的计算单元。

Pod(就像在鲸鱼荚或者豌豆荚中)是一组(一个或多个) 容器; 这些容器共享存储、网络、以及怎样运行这些容器的声明。 Pod 中的内容总是并置(colocated)的并且一同调度,在共享的上下文中运行。 Pod 所建模的是特定于应用的 “逻辑主机”,其中包含一个或多个应用容器, 这些容器相对紧密地耦合在一起。 在非云环境中,在相同的物理机或虚拟机上运行的应用类似于在同一逻辑主机上运行的云应用。

除了应用容器,Pod 还可以包含在 Pod 启动期间运行的 Init 容器。 你也可以在集群支持临时性容器的情况下, 为调试的目的注入临时性容器。

4.4.1 什么是 Pod?

说明: 除了 Docker 之外,Kubernetes 支持很多其他容器运行时, Docker 是最有名的运行时, 使用 Docker 的术语来描述 Pod 会很有帮助。
Pod 的共享上下文包括一组 Linux 名字空间、控制组(cgroup)和可能一些其他的隔离方面, 即用来隔离容器的技术。 在 Pod 的上下文中,每个独立的应用可能会进一步实施隔离。

Pod 类似于共享名字空间并共享文件系统卷的一组容器。

4.4.2 使用Pod

Pod 通常不是直接创建的,而是使用工作负载资源创建的。
这边状态显示为Running,说明正在运行。
Execute Shell 可以进入Pod的容器中,相当于执行命令:kubectl exec -it podName -n namespaceName – /bin/sh
View Logs 查看日志,相当于执行命令:kubectl logs -f --tail 500 podName -n namespaceName

4.5 Service

将运行在一组 Pods 上的应用程序公开为网络服务的抽象方法。
使用 Kubernetes,你无需修改应用程序即可使用不熟悉的服务发现机制。 Kubernetes 为 Pod 提供自己的 IP 地址,并为一组 Pod 提供相同的 DNS 名, 并且可以在它们之间进行负载均衡。

动机
创建和销毁 Kubernetes Pod 以匹配集群的期望状态。 Pod 是非永久性资源。 如果你使用 Deployment 来运行你的应用程序,则它可以动态创建和销毁 Pod。
每个 Pod 都有自己的 IP 地址,但是在 Deployment 中,在同一时刻运行的 Pod 集合可能与稍后运行该应用程序的 Pod 集合不同。
这导致了一个问题: 如果一组 Pod(称为“后端”)为集群内的其他 Pod(称为“前端”)提供功能, 那么前端如何找出并跟踪要连接的 IP 地址,以便前端可以使用提供工作负载的后端部分?
进入 Services。

具体可看服务(Service)

4.5.1 创建Service

创建Service成功后,就可以访问到服务了。说明:如果你将 type 字段设置为 NodePort,则 Kubernetes 控制平面将在 --service-node-port-range 标志指定的范围内分配端口(默认值:30000-32767)。详情请看:发布服务(服务类型)

4.5.1.1 使用表单编辑创建Service

4.5.1.2 使用YAML文件创建Service

下面是具体的字段说明:

apiVersion: v1            # 指定api版本,此值必须在kubectl api-versions中
kind: Service # 指定创建资源的角色/类型
metadata: # 资源的元数据/属性
name: dnehsa-bizc-svc # 资源的名字,在同一个namespace中必须唯一
namespace: gdfw # 部署在哪个namespace中
labels: # 设定资源的标签
app: dnehsa-bizc-svc
spec: # 资源规范字段
type: NodePort # 类型:集群IP,外部DNS服务名称,Headless,负载均衡器,节点端口
ports:
- name: dnehsa-bizc-svc # 端口名称
nodePort: 30006 # 节点端口
port: 30006 # 监听端口
protocol: TCP # 协议
targetPort: 30006 # 目标端口
selector: # 选择器
app: dnehsa-bizc

4.6动态扩缩容 

##kubectl scale --replicas=3 资源类型/资源名称
kubectl scale --replicas=3 deploy/test-deploy

图形化操作

4.7回滚/升级 项目

4.8创建PV挂载(PersistentVolume)

4.9 创建PVC挂载(PersistentVolumeClaim)

5. 进入rancher控制台

通过部署rancher的容器进入

docker exec -it rancher bash

rancher安装及部署k8s的更多相关文章

  1. 当AI遇上K8S:使用Rancher安装机器学习必备工具JupyterHub

    Jupyter Notebook是用于科学数据分析的利器,JupyterHub可以在服务器环境下为多个用户托管Jupyter运行环境.本文将详细介绍如何使用Rancher安装JupyterHub来为数 ...

  2. centos7.8 安装部署 k8s 集群

    centos7.8 安装部署 k8s 集群 目录 centos7.8 安装部署 k8s 集群 环境说明 Docker 安装 k8s 安装准备工作 Master 节点安装 k8s 版本查看 安装 kub ...

  3. 企业运维实践-还不会部署高可用的kubernetes集群?使用kubeadm方式安装高可用k8s集群v1.23.7

    关注「WeiyiGeek」公众号 设为「特别关注」每天带你玩转网络安全运维.应用开发.物联网IOT学习! 希望各位看友[关注.点赞.评论.收藏.投币],助力每一个梦想. 文章目录: 0x00 前言简述 ...

  4. 【02】Kubernets:使用 kubeadm 部署 K8S 集群

    写在前面的话 通过上一节,知道了 K8S 有 Master / Node 组成,但是具体怎么个组成法,就是这一节具体谈的内容.概念性的东西我们会尽量以实验的形式将其复现. 部署 K8S 集群 互联网常 ...

  5. 菜鸟系列k8s——快速部署k8s集群

    快速部署k8s集群 1. 安装Rancher Rancher是业界唯一完全开源的企业级容器管理平台,为企业用户提供在生产环境中落地使用容器所需的一切功能与组件. Rancher2.0基于Kuberne ...

  6. 使用RKE快速部署k8s集群

    一.环境准备 1.1环境信息 IP地址 角色 部署软件 10.10.100.5 K8s Master Etcd.Control 10.10.100.17 K8s Worker1 Worker 10.1 ...

  7. 企业级rancher搭建Kubernetes(采用rancher管理平台搭建k8s)

    一.简介 Rancher简介 来源官方:https://www.cnrancher.com/ Rancher是一个开源的企业级容器管理平台.通过Rancher,企业再也不必自己使用一系列的开源软件去从 ...

  8. Docker容器管理平台Rancher高可用部署——看这篇就够了

    记得刚接触Rancher时,看了官方文档云里雾里,跟着官网文档部署了高可用Rancher,发现不管怎么折腾都无法部署成功(相信已尝试的朋友也有类似的感觉),今天腾出空来写个总结,给看到的朋友留个参考( ...

  9. 微服务架构 - 离线部署k8s平台并部署测试实例

    一般在公司部署或者真实环境部署k8s平台,很有可能是内网环境,也即意味着是无法连接互联网的环境,这时就需要离线部署k8s平台.在此整理离线部署k8s的步骤,分享给大家,有什么不足之处,欢迎指正. 1. ...

  10. ansible一键部署k8s单机环境

    一.虚拟机准备 干净的Centsot7.4.4G内存.2个CPU 最小化安装,最好带虚拟化 二.执行初始化脚本 注意:脚本中配置静态网卡根据实际网卡名称配置,我用的是ens33 可以用 sed -i ...

随机推荐

  1. pandas 根据内容匹配并获取索引

    bool = ExcelDataStr.str.contains("Item No./Customer/Saler") # 初始位置:initial position, 终位置:e ...

  2. Abstract Factory 抽象工厂模式简介与 C# 示例【创建型1】【设计模式来了_1】

    〇.简介 1.什么是抽象工厂模式? 一句话解释:   提供一个接口,以创建一系列相关或相互依赖的抽象对象,而无需指定它们具体的类.(将一系列抽象类装进接口,一次接口实现,就必须实例化这一系列抽象类) ...

  3. 零基础入门——从零开始学习PHP反序列化笔记(二)

    魔术方法 魔术方法介绍 __construct() 触发时机:实例化对象之前 构造函数,在实例化一个对象的时候,首先会去自动执行的一个方法; <?php class User { public ...

  4. quarkus依赖注入之五:拦截器(Interceptor)

    欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 本篇概览 本文是<quarkus依赖注入> ...

  5. Go 语言入门指南: 环境搭建、基础语法和常用特性解析 | 青训营

    Go 语言入门指南: 环境搭建.基础语法和常用特性解析 | 青训营 从零开始 Go 语言简介 Go 是一个开源的编程语言,它能让构造简单.可靠且高效的软件变得容易. Go是从2007年末由Robert ...

  6. AcWing 4799. 最远距离题解

    请看: 我们规定,如果一个无向连通图满足去掉其中的任意一条边都会使得该图变得不连通,则称该图为有效无向连通图. 去掉一条边就不连通了,这不就是树吗? (否则如果是图(就是不是树的图)的话,一定有环,拆 ...

  7. 全免费开源-国内搭建ChatGPT个人镜像站与维护全攻略

    本教程收集于:AIGC从入门到精通教程汇总 全免费开源,仅需一个域名就可以部署国内的ChatGPT镜像版本. One-Click to deploy well-designed ChatGPT web ...

  8. Fabric 2.x 智能合约开发记录

    表象:Return schema invalid. required items must be unique [recovered] 虽然 Fabric v2.2 已经发布了很久了,但之前因为项目历 ...

  9. 将Python程序打包成Linux可执行文件

    将Python程序打包成Linux可执行文件 安装环境 首先我们要安装pip,命令如下: sudo apt install python3-pip 使用的工具是pyinstaller,打开终端输入su ...

  10. 基于go语言gin框架的web项目骨架

    该骨架每个组件之间可单独使用,组件之间松耦合,高内聚,组件的实现基于其他三方依赖包的封装. 目前该骨架实现了大多数的组件,比如事件,中间件,日志,配置,参数验证,命令行,定时任务等功能,目前可以满足大 ...