【三】kubernetes kuboard部署分布式系统

#服务器 #部署 #云原生 #k8s

目录

    • 一、前言
    • 二、搭建docker私有仓库
    • 三、系统搭建
      • 1、NFS部署
        • 1)部署nfs server (192.168.16.200)
        • 2)部署nfs client (全部节点)
        • 3)在Kuboard中创建 NFS 存储类
      • 2、创建命名空间
      • 3、添加docker密文
      • 4、创建工作负载(workload)
        • 1)部署中间件
        • 2)部署API网关
        • 3) 部署持久层
        • 4)部署微服务层
        • 5)部署展示层
      • 5、验证web-example部署情况

本系列文章:

一、ubuntu20.04上搭建containerd版( 1.2.4 以上)k8s及kuboard V3

二、kubernetes master单节点拓展为集群

一、前言

接上文,我们已经部署了k8s集群,本文将讲解如何利用kuboard部署完整的微服务系统。具体包括docker私有仓库的搭建、工作负载的创建、配置中心、存储挂载、负载均衡等内容。

二、搭建docker私有仓库

  1. 选取任意有docker的主机搭建私有仓库 例如我选取200作为私仓
#拉取私有仓库的镜像
docker pull registry
  1. 为docker registry增加用户密码

安装Apache的htpasswd工具。使用htpasswd生成密钥:

sudo apt-get install apache2-utils
mkdir auth
#"username"和"password"分别是你要设置的用户名和密码
htpasswd -Bc ./auth/htpasswd username
#输入密码
password
#再次确认密码
password
  1. 保存为启动脚本,并执行
vim docker-registry-init.sh
docker run -d \
-p 5000:5000 \
-v ./data:/var/lib/registry \
-v ./auth:/auth \
-e "REGISTRY_AUTH=htpasswd" \
-e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" \
-e "REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd" \
--restart=always \
registry
chmod 777 docker-registry-init.sh
./docker-registry-init.sh
  1. 允许不安全访问

先使用docker login 登录

docker login 192.168.16.200:5000

docker login 之后,会在 /root/.docker/config.json 中保存base64编码后的用户名和密码信息。

执行 sudo cat /root/.docker/config.json 打印文件内容,如下:

{"auths": {"192.168.16.200:5000": {"auth": "Y2p4OnJvb3Q="}}

允许不安全访问

vim /etc/docker/daemon.json{ "registry-mirrors": ["https://your.mirror.aliyuncs.com"],
"insecure-registries":["http://192.168.16.200:5000"]#允许不安全访问
}
  1. 重启docker服务
systemctl restart docker

5.拉取测试用例用到的镜像,并上传到私库

docker pull swr.cn-east-2.myhuaweicloud.com/kuboard-dependency/example-cloud-eureka:v1.0.0-alpha.1
docker pull swr.cn-east-2.myhuaweicloud.com/kuboard-dependency/example-db-example:v1.0.0-alpha.1
docker pull swr.cn-east-2.myhuaweicloud.com/kuboard-dependency/example-gateway-example:v1.0.0-alpha.1
docker pull swr.cn-east-2.myhuaweicloud.com/kuboard-dependency/example-svc-example:v1.0.0-alpha.1
docker pull swr.cn-east-2.myhuaweicloud.com/kuboard-dependency/example-web-example:v1.0.0-alpha.1docker tag swr.cn-east-2.myhuaweicloud.com/kuboard-dependency/example-cloud-eureka:v1.0.0-alpha.1 192.168.16.200:5000/kuboard-dependency/example-cloud-eureka:v1.0.0-alpha.1
docker tag swr.cn-east-2.myhuaweicloud.com/kuboard-dependency/example-db-example:v1.0.0-alpha.1 192.168.16.200:5000/kuboard-dependency/example-db-example:v1.0.0-alpha.1
docker tag swr.cn-east-2.myhuaweicloud.com/kuboard-dependency/example-gateway-example:v1.0.0-alpha.1 192.168.16.200:5000/kuboard-dependency/example-gateway-example:v1.0.0-alpha.1
docker tag swr.cn-east-2.myhuaweicloud.com/kuboard-dependency/example-svc-example:v1.0.0-alpha.1 192.168.16.200:5000/kuboard-dependency/example-svc-example:v1.0.0-alpha.1
docker tag swr.cn-east-2.myhuaweicloud.com/kuboard-dependency/example-web-example:v1.0.0-alpha.1 192.168.16.200:5000/kuboard-dependency/example-web-example:v1.0.0-alpha.1docker push 192.168.16.200:5000/kuboard-dependency/example-cloud-eureka:v1.0.0-alpha.1
docker push 192.168.16.200:5000/kuboard-dependency/example-db-example:v1.0.0-alpha.1
docker push 192.168.16.200:5000/kuboard-dependency/example-gateway-example:v1.0.0-alpha.1
docker push 192.168.16.200:5000/kuboard-dependency/example-svc-example:v1.0.0-alpha.1
docker push 192.168.16.200:5000/kuboard-dependency/example-web-example:v1.0.0-alpha.1

6.查看是否上传成功

#docker push 192.168.16.200:5000/{hubname}/{docker_name}:{docker_version}curl -u username:password -XGET http://192.168.16.200:5000/v2/_catalog

7.containerd中配置允许不安全访问

新版k8s使用containerd去拉取镜像,如果不在containerd中配置registry,k8s会默认使用https拉取镜像,就会出现以下错误:

Failed to pull image "192.168.16.200:5000/kuboard-dependency/example-gateway-example:v1.0.0-alpha.1": failed to pull and unpack image "192.168.16.200:5000/kuboard-dependency/example-gateway-example:v1.0.0-alpha.1": failed to resolve reference "192.168.16.200:5000/kuboard-dependency/example-gateway-example:v1.0.0-alpha.1": failed to do request: Head "https://192.168.16.200:5000/v2/kuboard-dependency/example-gateway-example/manifests/v1.0.0-alpha.1": http: server gave HTTP response to HTTPS client

修改containerd的配置文件(注意!!每个节点上的containerd的配置都要修改)

vim /etc/containerd/config.toml
[plugins."io.containerd.grpc.v1.cri".registry]config_path = ""[plugins."io.containerd.grpc.v1.cri".registry.auths][plugins."io.containerd.grpc.v1.cri".registry.configs][plugins."io.containerd.grpc.v1.cri".registry.configs."192.168.16.200:5000".tls]insecure_skip_verify = true[plugins."io.containerd.grpc.v1.cri".registry.headers][plugins."io.containerd.grpc.v1.cri".registry.mirrors][plugins."io.containerd.grpc.v1.cri".registry.mirrors."192.168.16.200:5000"]endpoint = ["http://192.168.16.200:5000"]
sudo systemctl restart containerd

三、系统搭建

本次实战准备了一个最简单的微服务 example 作为例子,该 example 只实现了对一张简单数据库表执行 CRUD 操作的功能,该 example 的部署架构如下图所示,源代码请参考 kuboard-example (opens new window),也可以直接通过 Kuboard 导入 example 微服务

架构如下:

![[Pasted image 20230905210612.png]]

yaml 下载地址:

https://kuboard.cn/kuboard_example_v3_119.yaml

本文主要的目的是为了让读者能更好地熟悉kuboard中创建工作负载时需要填写的参数与yaml中的参数的映射关系,故不会对容器中所使用到的环境变量、环境变量的值进行详细的讲解。截图中填写的参数值均能从yaml中找到。

1、NFS部署

Kubernetes 对 Pod 进行调度时,以当时集群中各节点的可用资源作为主要依据,自动选择某一个可用的节点,并将 Pod 分配到该节点上。在这种情况下,Pod 中容器数据的持久化如果存储在所在节点的磁盘上,就会产生不可预知的问题,例如,当 Pod 出现故障,Kubernetes 重新调度之后,Pod 所在的新节点上,并不存在上一次 Pod 运行时所在节点上的数据。

为了使 Pod 在任何节点上都能够使用同一份持久化存储数据,我们需要使用网络存储的解决方案为 Pod 提供数据卷。常用的网络存储方案有:NFS/cephfs/glusterfs。

1)部署nfs server (192.168.16.200)
  1. 安装nfs服务
#安装nfs服务
sudo apt install nfs-kernel-server
#创建共享目录
sudo mkdir -p /nfs-data
  1. 编辑配置文件,添加共享目录
#设置共享目录
sudo vim /etc/exports
#添加以下内容
/nfs-data *(rw,sync,no_subtree_check,no_root_squash)
  1. 重启服务
sudo service nfs-kernel-server restart
sudo service nfs-kernel-server status
#校验配置
showmount -e
  1. 创建测试文件
vim test.txt
2)部署nfs client (全部节点)
#安装连接客户端
apt install nfs-common -y#挂载
mkdir /nfs-data
mount 192.168.16.200:/nfs-data /nfs-data#查看测试文件是否存在
ls /nfs-data
3)在Kuboard中创建 NFS 存储类

进入集群管理存储类,创建存储类,将nfs的信息填写到相应参数位置,点击确定

![[../../../附件/Pasted image 20230925185516.png]]

点击应用
![[../../../附件/Pasted image 20230925185630.png]]

nfs已添加
在这里插入图片描述

2、创建命名空间

点击编辑命名空间
在这里插入图片描述
点击创建、填写命名空间,比如我这里就起名为example

![[Pasted image 20230904202145.png]]

3、添加docker密文

填写上面registry的账号密码

  1. 配置中心密文创建Secret
    ![[../../../附件/Pasted image 20231010212924.png]]
    命名为registry-200

4、创建工作负载(workload)

Kubernetes 中,与 Workload 相关的概念非常多,Kuboard 从微服务部署的实际需要出发,按照下图所示的方式理解这些相关概念:

![[../../../附件/Pasted image 20230925211427.png]]

Kuboard 工作负载视图中,关联的 Kubernetes 中如下几个重要的概念:

  • Label / Label Selector
  • Workload Controller 工作负载控制器(Deployment / StatefulSet / DaemonSet)
  • Volume 数据卷
  • ImagePullSecrets (Docker 仓库用户名密码,用于访问私有 docker 镜像仓库)
  • ServiceAccount
  • Container 容器
  • Service 访问方式
  • Ingress 互联网入口

以上摘自:Kuboard控制台官网

1)部署中间件
  1. 基本信息填写
    在这里插入图片描述

2.添加容器信息

添加工作容器

![[../../../附件/Pasted image 20231011170758.png]]
添加服务

在这里插入图片描述

添加应用路由

![[../../../附件/Pasted image 20231011170900.png]]

3.应用 并预览yaml
yaml:

---
apiVersion: apps/v1
kind: StatefulSet
metadata:annotations:k8s.kuboard.cn/displayName: 服务注册k8s.kuboard.cn/ingress: 'true'k8s.kuboard.cn/service: ClusterIPk8s.kuboard.cn/workload: cloud-eurekalabels:k8s.kuboard.cn/layer: cloudk8s.kuboard.cn/name: cloud-eurekaname: cloud-eurekanamespace: exampleresourceVersion: '274940'
spec:persistentVolumeClaimRetentionPolicy:whenDeleted: RetainwhenScaled: RetainpodManagementPolicy: OrderedReadyreplicas: 1revisionHistoryLimit: 10selector:matchLabels:k8s.kuboard.cn/layer: cloudk8s.kuboard.cn/name: cloud-eurekaserviceName: cloud-eurekatemplate:metadata:creationTimestamp: nulllabels:k8s.kuboard.cn/layer: cloudk8s.kuboard.cn/name: cloud-eurekaspec:containers:- env:- name: CLOUD_EUREKA_DEFAULT_ZONEvalue: 'http://cloud-eureka-0:9200/eureka'image: >-192.168.16.200:5000/kuboard-dependency/example-cloud-eureka:v1.0.0-alpha.1imagePullPolicy: IfNotPresentname: cloud-eurekaresources: {}terminationMessagePath: /dev/termination-logterminationMessagePolicy: FilednsPolicy: ClusterFirstimagePullSecrets:- name: registry-200restartPolicy: AlwaysschedulerName: default-schedulersecurityContext: {}terminationGracePeriodSeconds: 30updateStrategy:rollingUpdate:partition: 0type: RollingUpdate
status:availableReplicas: 1collisionCount: 0currentReplicas: 1currentRevision: cloud-eureka-66bd975b65observedGeneration: 1readyReplicas: 1replicas: 1updateRevision: cloud-eureka-66bd975b65updatedReplicas: 1---
apiVersion: v1
kind: Service
metadata:annotations: {}labels:k8s.kuboard.cn/layer: cloudk8s.kuboard.cn/name: cloud-eurekaname: cloud-eurekanamespace: exampleresourceVersion: '274926'
spec:clusterIP: 10.102.213.170clusterIPs:- 10.102.213.170internalTrafficPolicy: ClusteripFamilies:- IPv4ipFamilyPolicy: SingleStackports:- name: mtfsyiport: 9200protocol: TCPtargetPort: 9200selector:k8s.kuboard.cn/layer: cloudk8s.kuboard.cn/name: cloud-eurekasessionAffinity: Nonetype: ClusterIP
status:loadBalancer: {}
2)部署API网关
  1. 基本信息填写

在这里插入图片描述

  1. 添加容器信息

添加工作容器

![[../../../附件/Pasted image 20230925212014.png]]

  1. 添加服务/应用路由

在这里插入图片描述

  1. 预览yaml

![[../../../附件/Pasted image 20230925212421.png]]

yaml:

---
apiVersion: apps/v1
kind: Deployment
metadata:annotations: {}labels:k8s.kuboard.cn/layer: gatewayk8s.kuboard.cn/name: gateway-examplename: gateway-examplenamespace: exampleresourceVersion: '214775'
spec:progressDeadlineSeconds: 600replicas: 1revisionHistoryLimit: 10selector:matchLabels:k8s.kuboard.cn/layer: gatewayk8s.kuboard.cn/name: gateway-examplestrategy:rollingUpdate:maxSurge: 25%maxUnavailable: 25%type: RollingUpdatetemplate:metadata:creationTimestamp: nulllabels:k8s.kuboard.cn/layer: gatewayk8s.kuboard.cn/name: gateway-examplespec:containers:- env:- name: CLOUD_EUREKA_DEFAULT_ZONEvalue: 'http://cloud-eureka:9200/eureka'- name: SPRING_PROFILES_ACTIVEvalue: exampleimage: >-192.168.16.200:5000/kuboard-dependency/example-gateway-example:v1.0.0-alpha.1imagePullPolicy: Alwaysname: gateway-exampleresources: {}terminationMessagePath: /dev/termination-logterminationMessagePolicy: FilednsPolicy: ClusterFirstimagePullSecrets:- name: registry-200restartPolicy: AlwaysschedulerName: default-schedulersecurityContext: {}terminationGracePeriodSeconds: 30
status:conditions:- lastTransitionTime: '2023-09-26T03:13:54Z'lastUpdateTime: '2023-10-10T13:22:14Z'message: ReplicaSet "gateway-example-5bd6ccb5f8" has successfully progressed.reason: NewReplicaSetAvailablestatus: 'True'type: Progressing- lastTransitionTime: '2023-10-10T13:22:43Z'lastUpdateTime: '2023-10-10T13:22:43Z'message: Deployment does not have minimum availability.reason: MinimumReplicasUnavailablestatus: 'False'type: AvailableobservedGeneration: 14replicas: 1unavailableReplicas: 1updatedReplicas: 1---
apiVersion: v1
kind: Service
metadata:annotations: {}labels:k8s.kuboard.cn/layer: gatewayk8s.kuboard.cn/name: gateway-examplename: gateway-examplenamespace: exampleresourceVersion: '163120'
spec:clusterIP: 10.105.223.231clusterIPs:- 10.105.223.231internalTrafficPolicy: ClusteripFamilies:- IPv4ipFamilyPolicy: SingleStackports:- name: pdmd3yport: 9201protocol: TCPtargetPort: 9201selector:k8s.kuboard.cn/layer: gatewayk8s.kuboard.cn/name: gateway-examplesessionAffinity: Nonetype: ClusterIP
status:loadBalancer: {}
  1. 解决warning
    1)使用configmap给容器挂载ca证书
    参考:Managing Service Accounts | Kubernetes
    ![[../../../附件/Pasted image 20231011115528.png]]

点击编辑-存储挂载-配置字典
数据卷名称填写warning中的名称
configMap为kube-root-ca.crt
其他内容如图下所示:
![[../../../附件/Pasted image 20231011120602.png]]

3) 部署持久层
  1. 基本信息填写
    ![[../../../附件/Pasted image 20231011173810.png]]

  2. 添加容器信息

添加工作容器

![[../../../附件/Pasted image 20231011174437.png]]

添加存储挂载

添加存储声明

![[../../../附件/Pasted image 20231011184705.png]]

添加存储挂载信息

![[../../../附件/Pasted image 20231011184854.png]]

这里的/var/lib/mysql是容器内的路径。

  1. 添加Service
    ![[../../../附件/Pasted image 20231011174502.png]]

  2. 应用并预览yaml
    yaml:

---
apiVersion: apps/v1
kind: Deployment
metadata:annotations:k8s.kuboard.cn/displayName: db-examplek8s.kuboard.cn/ingress: 'false'k8s.kuboard.cn/service: ClusterIPk8s.kuboard.cn/workload: db-examplelabels:k8s.kuboard.cn/layer: dbk8s.kuboard.cn/name: db-examplename: db-examplenamespace: exampleresourceVersion: '285120'
spec:progressDeadlineSeconds: 600replicas: 1revisionHistoryLimit: 10selector:matchLabels:k8s.kuboard.cn/layer: dbk8s.kuboard.cn/name: db-examplestrategy:rollingUpdate:maxSurge: 25%maxUnavailable: 25%type: RollingUpdatetemplate:metadata:creationTimestamp: nulllabels:k8s.kuboard.cn/layer: dbk8s.kuboard.cn/name: db-examplespec:containers:- image: >-192.168.16.200:5000/kuboard-dependency/example-gateway-example:v1.0.0-alpha.1imagePullPolicy: Alwaysname: db-exampleresources: {}terminationMessagePath: /dev/termination-logterminationMessagePolicy: FilevolumeMounts:- mountPath: /var/lib/mysqlname: db-example-storagesubPath: mysqldnsPolicy: ClusterFirstimagePullSecrets:- name: registry-200restartPolicy: AlwaysschedulerName: default-schedulersecurityContext: {}terminationGracePeriodSeconds: 30volumes:- name: db-example-storagepersistentVolumeClaim:claimName: db-example-storage
status:availableReplicas: 1conditions:- lastTransitionTime: '2023-10-11T09:45:54Z'lastUpdateTime: '2023-10-11T09:45:54Z'message: Deployment has minimum availability.reason: MinimumReplicasAvailablestatus: 'True'type: Available- lastTransitionTime: '2023-10-11T09:45:54Z'lastUpdateTime: '2023-10-11T10:45:32Z'message: ReplicaSet "db-example-d765d8978" has successfully progressed.reason: NewReplicaSetAvailablestatus: 'True'type: ProgressingobservedGeneration: 3readyReplicas: 1replicas: 1updatedReplicas: 1---
apiVersion: v1
kind: Service
metadata:labels:k8s.kuboard.cn/layer: dbk8s.kuboard.cn/name: db-examplename: db-examplenamespace: exampleresourceVersion: '277172'
spec:clusterIP: 10.98.171.57clusterIPs:- 10.98.171.57internalTrafficPolicy: ClusteripFamilies:- IPv4ipFamilyPolicy: SingleStackports:- name: fp6kswport: 3306protocol: TCPtargetPort: 3306selector:k8s.kuboard.cn/layer: dbk8s.kuboard.cn/name: db-examplesessionAffinity: Nonetype: ClusterIP
status:loadBalancer: {}
4)部署微服务层
  1. 基本信息填写
    添加工作负载基本信息
    ![[../../../附件/Pasted image 20231019153259.png]]

2.添加工作容器
![[../../../附件/Pasted image 20231019153642.png]]

CLOUD_EUREKA_DEFAULT_ZONEDB_EXAMPLE_URL中的cloud-eurekadb-example都是之前创建的Service的name属性,以实现pod之间的通信。

3.应用并预览yaml

---
apiVersion: apps/v1
kind: Deployment
metadata:annotations:k8s.kuboard.cn/displayName: svc-examplek8s.kuboard.cn/ingress: 'false'k8s.kuboard.cn/service: nonek8s.kuboard.cn/workload: svc-examplelabels:k8s.kuboard.cn/layer: svck8s.kuboard.cn/name: svc-examplename: svc-examplenamespace: example
spec:replicas: 1selector:matchLabels:k8s.kuboard.cn/layer: svck8s.kuboard.cn/name: svc-exampletemplate:metadata:labels:k8s.kuboard.cn/layer: svck8s.kuboard.cn/name: svc-examplespec:containers:- env:- name: CLOUD_EUREKA_DEFAULT_ZONEvalue: 'http://cloud-eureka:9200/eureka'- name: DB_EXAMPLE_URLvalue: >-jdbc:mysql://db-example:3306/eip_db_example?characterEncoding=utf8&useSSL=false- name: DB_EXAMPLE_USERNAMEvalue: eip_user- name: DB_EXAMPLE_PASSWORDvalue: 1qaz2wsx- name: snowflake.dataCenterIdvalue: '1'- name: csp.sentinel.dashboard.servervalue: monitor-sentinelimage: >-192.168.16.200:5000/kuboard-dependency/example-svc-example:v1.0.0-alpha.1name: svc-exampleimagePullSecrets:- name: registry-200initContainers: []
5)部署展示层
  1. 基本信息填写
    添加工作负载基本信息
    ![[../../../附件/Pasted image 20231019154343.png]]

  2. 添加工作容器信息
    ![[../../../附件/Pasted image 20231019160140.png]]

  3. 添加服务与路由

服务配置
![[../../../附件/Pasted image 20231019163408.png]]

路由配置

![[../../../附件/Pasted image 20231019161421.png]]

4.应用并预览yaml

---
apiVersion: apps/v1
kind: Deployment
metadata:annotations:k8s.kuboard.cn/displayName: ''k8s.kuboard.cn/ingress: 'true'k8s.kuboard.cn/service: ClusterIPk8s.kuboard.cn/workload: web-examplelabels:k8s.kuboard.cn/layer: webk8s.kuboard.cn/name: web-examplename: web-examplenamespace: exampleresourceVersion: '331193'
spec:replicas: 1selector:matchLabels:k8s.kuboard.cn/layer: webk8s.kuboard.cn/name: web-exampletemplate:metadata:labels:k8s.kuboard.cn/layer: webk8s.kuboard.cn/name: web-examplespec:containers:- args: []command:- nginx- '-g'- daemon off;image: >-192.168.16.200:5000/kuboard-dependency/example-web-example:v1.0.0-alpha.1imagePullPolicy: Alwaysname: web-exampleimagePullSecrets:- name: registry-200initContainers: []---
apiVersion: v1
kind: Service
metadata:annotations: {}labels:k8s.kuboard.cn/layer: webk8s.kuboard.cn/name: web-examplename: web-examplenamespace: example
spec:ports:- name: mawfrpnodePort: 30090port: 80protocol: TCPtargetPort: 80selector:k8s.kuboard.cn/layer: webk8s.kuboard.cn/name: web-exampletype: NodePort---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:annotations:k8s.kuboard.cn/displayName: we-examplek8s.kuboard.cn/workload: web-examplelabels:k8s.kuboard.cn/layer: webk8s.kuboard.cn/name: web-examplename: web-examplenamespace: exampleresourceVersion: '270483'
spec:rules:- host: web-example.example.demo.kuboard.cnhttp:paths:- backend:service:name: web-exampleport:name: mawfrppath: /pathType: Prefix
status:loadBalancer: {}

5、验证web-example部署情况

在浏览器地址栏中输入 http://任意节点IP:30090,将打开如下页面:

![[../../../附件/Pasted image 20231019170245.png]]

点击创建
![[../../../附件/Pasted image 20231019170329.png]]

可以看到已经新增一条条目
![[../../../附件/Pasted image 20231019170421.png]]

🎉🎉🎉

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/167625.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

解决 Could not build wheels for pandas, which is required to install pyproject.toml-based projects

最近在学习李沐老师的深度学习的课程,在安装 d2l 时, pip install d2l0.17.6遇到了问题: ERROR: Could not build wheels for pandas, which is required to install pyproject.toml-based projects 由于我忘记截错误的图了,在论…

基于SSM的图书商城网站设计与实现

末尾获取源码 开发语言:Java Java开发工具:JDK1.8 后端框架:SSM 前端:Vue 数据库:MySQL5.7和Navicat管理工具结合 服务器:Tomcat8.5 开发软件:IDEA / Eclipse 是否Maven项目:是 目录…

Linux下Samba服务安装及启用全攻略

Linux下Samba服务安装及启用全攻略 前言一、安装SSH Server二、安装Samba Server1.安装net-tool2.建立账号的samba3.windows通过Samba与linux共享文件4.使用远程工具登录Linux 总结 前言 提示:本文详解了在Linux系统下如何安装和启用Samba服务,涵盖了从…

5、Kafka集成 SpringBoot

SpringBoot 是一个在 JavaEE 开发中非常常用的组件。可以用于 Kafka 的生产者,也可以 用于 SpringBoot 的消费者。 1)在 IDEA 中安装 lombok 插件 在 Plugins 下搜索 lombok 然后在线安装即可,安装后注意重启 2)SpringBoot 环境准…

三十七、【进阶】SQL的explain

1、explain 2、基础使用 在使用explain关键字时,只需要在所执行语句前加上explain即可 mysql> explain select * from stu where id3; ---------------------------------------------------------------------------------------------------------- | id | s…

shell学习脚本04(小滴课堂)

他就可以直接读出来了。不需要在sh后面加参数。 可以用-s隐藏内容: 可以用-t进行指定几秒后显示。 -n限制内容长度。 输入到长度为5自动打印。 我们把-s放到-p后面的话: 这样会出错。 如果最后加5m会一直闪烁。 大家可以按照需求自行使用。

Qt第六十五章:自定义菜单栏的隐藏、弹出

目录 一、效果图 二、qtDesigner 三、ui文件如下: 四、代码 一、效果图 二、qtDesigner 原理是利用属性动画来控制QFrame的minimumWidth属性。 ①先拖出相应的控件 ②布局一下 ③填上一些样式 相关QSS background-color: rgb(238, 242, 255); border:2px sol…

雪数据同化系统Snow Data Assimilation System数据集

雪数据同化系统(SNODAS) 雪资料同化系统(SNODAS)是国家水文遥感业务中心(NOHRSC)精心开发的综合建模和资料同化系统。其主要目标是提供高度准确的积雪和相关参数估计,作为水文建模和分析的重要…

如何正确维护实验室超声波清洗机

实验室一直被视作一个严谨且严肃的场所,在其中所做的试验都需要遵照一定流程,所用的设备也经过了细致化挑选,例如实验室超声波清洗机,其性能远强于普通类别的清洗机。专门负责采购的实验室人员,通常会对质量优服务好的…

居民小区电动汽车有序充电策略研究

摘 要:针对电动汽车在居民小区无序充电对电网系统产生严重隐患及充电间时过长问题,提出一种采用延迟充电的电动汽车有序充电控制策略,并在分析国内外电动汽车有序充电的研究现状后,设计了居民小区电动汽车有序充电策略的总体框架。…

Linux常用命令——clock命令

在线Linux命令查询工具 clock 用于调整 RTC 时间。 补充说明 clock命令用于调整 RTC 时间。 RTC 是电脑内建的硬件时间,执行这项指令可以显示现在时刻,调整硬件时钟的时间,将系统时间设成与硬件时钟之时间一致,或是把系统时间…

【网络爬虫 | Python】数字货币ok链上bitcoin大额交易实时爬取,存入 mysql 数据库

文章目录 一、网站分析二、js 逆向获取 X-Apikey三、python 调用 js 获取 X-Apikey四、python 爬虫部分五、mysql 数据库、日志、配置文件、目录结构六、结尾 一、网站分析 oklink:https://www.oklink.com/ btc 大额交易:https://www.oklink.com/btc/tx-…

初始Redis 分布式结构的发展演变

目录 Redis的特点和使用场景 分布式系统的引入 单机系统 分布式系统 应用服务器的增多(处理更多的请求) 数据库读写分离(数据服务器的增多) 引入缓存 应对更大的数据量 业务拆分:微服务 Redis的特点和使用场景 我们先来…

Notepad++正则查询替换操作

Notepad编辑器查找功能非常强大,本处记录一些实战中常用到复杂查询替换操作。 注意:如果是重要文件,替换操作前最好备份;当前一个操作后也可以用ctrlz恢复。 查找重复行 用查找(ctrlf)功能,用正则表达式模式匹配。 查…

YOLOV8目标检测——模型训练

文章目录 1下载yolov8([网址](https://github.com/ultralytics/ultralytics))2用pycharm打开文件3训练自己的YOLOV8数据集4run下运行完了之后没有best.pt文件5导出为onnx文件 本章内容主要解决如何训练自己的YOLOV8模型。 1下载yolov8(网址&a…

SpringCloud之OpenFeign调用解读

目录 基本介绍 引进 OpenFeign概述 OpenFeign作用 FeignClient EnableFeignClients Java代码实战 实战架构 父工程pom文件 teacher-service服务 student-service服务 测试 自定义配置 基本介绍 引进 如果我们利用RestTemplate发起远程调用的代码时会存在一些…

[ 云计算 | AWS 实践 ] Java 如何重命名 Amazon S3 中的文件和文件夹

本文收录于【#云计算入门与实践 - AWS】专栏中,收录 AWS 入门与实践相关博文。 本文同步于个人公众号:【云计算洞察】 更多关于云计算技术内容敬请关注:CSDN【#云计算入门与实践 - AWS】专栏。 本系列已更新博文: [ 云计算 | …

Openssl数据安全传输平台004:Socket C-API封装为C++类 / 服务端及客户端代码框架和实现

文章目录 0. 代码仓库1. 客户端C API2. 客户端C API的封装分析2.1 sckClient_init()和sckClient_destroy()2.2 sckClient_connect2.3 sckClient_closeconn()2.4 sckClient_send()2.5 sckClient_rev()2.6 sck_FreeMem 3. 客户端C API4. 服务端C API5. 服务端C6. 客户端和服务端代…

react封装一个简单的upload组件(待完善)

目录 react封装一个简单的upload组件component / uploadImg / uploadImg.jsx使用效果 react封装一个简单的upload组件 component / uploadImg / uploadImg.jsx import React, { useState } from react; import { LoadingOutlined, PlusOutlined } from ant-design/icons; imp…

C#,数值计算——分类与推理Phylo_nj的计算方法与源程序

1 文本格式 using System; using System.Collections.Generic; namespace Legalsoft.Truffer { public class Phylo_nj : Phylagglom { public double[] u; public override void premin(double[,] d, int[] nextp) { i…