当前位置: 首页 > news >正文

Kubernetes学习(三)Service

Service对象

为什么需要Service

每个Pod都有自己的IP地址,但是在Deployment中,在同一时刻运行的Pod集合可能与稍后运行该应用程序的Pod集合不同。

这就导致了一个问题:如果一组Pod(称为后端)为集群内其他Pod(称为前端)提供功能,那么前端如何找出并跟踪要连接的IP地址,以便前端可以使用后端服务?

Service定义

将运行在一组Pods上的应用程序公开为网络服务的抽象方法

使用Kubernetes服务无需修改应用程序即可使用通用的服务发现机制。Kubernetes为Pods提供自己的IP地址,并为一组Pod提供相同的DNS,并且可以在他们之间进行负载均衡。

定义Service

Service在Kubernetes中是一个REST对象,和Pod类似。像所有的REST对象一样,Service定义可以基于POST方式,请求API server创建新的实例。

例如,有一组Pod,它们对外暴露9376端口,同时还被打上app=myapp标签

apiVersion: v1
kind: Service
metadata:name: my-service
spec:selector:app: myappports:- port: 80targetPort: 9376
[root@master k8s]# kubectl get service
NAME         TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)   AGE
kubernetes   ClusterIP   10.96.0.1        <none>        443/TCP   2d22h
my-service   ClusterIP   10.104.177.192   <none>        80/TCP    7s

上述配置创建一个名为my-service的Service对象,它会将请求代理到使用tcp端口的9376,并且具有标签app=myapp的Pod上,Kubernetes为该服务分配了一个IP地址(或集群IP),改IP地址有服务代理使用。

需要注意的是,Service能够将一个接口port映射到任意的tatgetPort。默认情况下,targetPort与port字段值相同。

用Service暴露Pod服务地址

在集群中暴露Pod

创建一个nginx pod,声明具有一个80的容器端口

nginx-deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:name: my-nginx
spec:selector:matchLabels:run: my-nginxreplicas: 2template:metadata:labels:run: my-nginxspec:containers:- name: my-nginximage: nginxresources:limits:memory: "128Mi"cpu: "500m"ports:- containerPort: 80

Pod 的 IP 地址:

[root@master k8s]# kubectl get pods -l run=my-nginx -o yaml | grep podIPpodIP: 10.244.2.23podIPs:podIP: 10.244.1.11podIPs:
[root@master k8s]#

此时能够通过 ssh 登录到集群中的任何一个节点上,使用 curl 也能调通所有 IP 地址。 需要注意的是,容器不会使用该节点上的 80 端口,也不会使用任何特定的 NAT 规则去路由流量到 Pod 上。 这意味着可以在同一个节点上运行多个 Pod,使用相同的容器端口,并且可以从集群中任何其他的 Pod 或节点上使用 IP 的方式访问到它们。

创建Service

Kubernetes Service 从逻辑上定义了运行在集群中的一组 Pod,这些 Pod 提供了相同的功能。 当每个 Service 创建时,会被分配一个唯一的 IP 地址(也称为 clusterIP)。 这个 IP 地址与一个 Service 的生命周期绑定在一起,当 Service 存在的时候它也不会改变。 可以配置 Pod 使它与 Service 进行通信,Pod 知道与 Service 通信将被自动地负载均衡到该 Service 中的某些 Pod 上。

示例:nginx-service.yaml

apiVersion: v1
kind: Service
metadata:name: my-nginxlabels:run: my-nginx
spec:ports:- port: 80protocol: TCPselector:run: my-nginx

上述规约将创建一个 Service,对应具有标签  `run: my-nginx`  的 Pod,目标 TCP 端口 80, 并且在一个抽象的 Service 端口(`targetPort`:容器接收流量的端口;`port`:抽象的 Service 端口,可以使任何其它 Pod 访问该 Service 的端口)上暴露。 

[root@master k8s]# kubectl get service my-nginx
NAME       TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)   AGE
my-nginx   ClusterIP   10.111.78.3   <none>        80/TCP    57s
[root@master k8s]# 

正如前面所提到的,一个 Service 由一组 backend Pod 组成。这些 Pod 通过  `endpoints`  暴露出来。 Service Selector 将持续观察,结果被 POST 到一个名称为  `my-nginx`  的 Endpoint 对象上。 当 Pod 终止后,它会自动从 Endpoint 中移除,新的能够匹配上 Service Selector 的 Pod 将自动地被添加到 Endpoint 中。 检查该 Endpoint,注意到 IP 地址与在第一步创建的 Pod 是相同的。

[root@master k8s]# kubectl describe  service my-nginx
Name:              my-nginx
Namespace:         default
Labels:            <none>
Annotations:       <none>
Selector:          run=my-nginx
Type:              ClusterIP
IP Family Policy:  SingleStack
IP Families:       IPv4
IP:                10.111.78.3
IPs:               10.111.78.3
Port:              <unset>  80/TCP
TargetPort:        80/TCP
Endpoints:         10.244.1.11:80,10.244.2.23:80
Session Affinity:  None
Events:            <none>
[root@master k8s]# 
[root@master k8s]# kubectl get ep my-nginx
NAME       ENDPOINTS                       AGE
my-nginx   10.244.1.11:80,10.244.2.23:80   2m14s
[root@master k8s]# 

现在,能够从集群中任意节点上使用 curl 命令请求 Nginx Service  `:`  。 注意 Service IP 完全是虚拟的,它从来没有走过网络。

[root@master k8s]# curl 10.111.78.3:80
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p><p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p><p><em>Thank you for using nginx.</em></p>
</body>
</html>
[root@master k8s]# 

集群内Pod通信机制

Kubernetes支持两种基本的服务发现模式--环境变量和DNS

环境变量

当Pod运行在Node上,kubelet会为每个活跃的Service添加一组环境变量。它同时支持Dockerlinks、简单的{SVCNAME}_SERVICE_HOST和{SVCNAME}_SERVICE_PORT变量。这里Service的名称需大写,横线被转换成下划线。

实例,一个名为my-nginx的Service暴露了TCP端口80,同时分配了Cluster IP地址10.1.180.155,这个Service生成了如下的环境变量:

MY_NGINX_PORT_80_TCP_PORT=80

MY_NGINX_PORT_80_TCP_PROTO=tcp

MY_NGINX_PORT_80_TCP_ADDR=10.1.180/155

注意:当具有需要访问服务的Pod时,并且正在使用环境变量的方法将端口和集群IP发布到客户端Pod时,必须在客户端Pod出现之前创建服务。否则,这些客户端Pod将不会设定其环境变量

DNS

可以使用附加组件为Kubernetes集群设置DNS服务

支持集群的DNS服务器(例如CoreDNS)监视Kubernetes API中的新服务,并为每个服务创建一组DNS记录。如果整个集群中都启用了DNS,则所有的Pod都应该能够通过其DNS名称自动解析服务。

例如,在Kubernetes命名空间my-ns中有一个名为my-service的服务,则控制节点和DNS服务共同为my-service.my-ns创建DNS记录。my-ns命名空间中的Pod能够通过简单的对my-service进行名称查找来找到它。

其他命名空间中的Pod必须将名称限定为my-service.my-ns,这些名称将解析为服务分配的集群IP

Service创建DNS记录

Kubernetes DNS在集群上调度DNS Pod和服务,并配置kubelet以告知各个容器使用DNS服务的IP来解析DNS名称

服务

  • A/AAAA记录

普通服务会以my-svc.my-namespace.svc.cluster-domain.example这种名称的形式被分配一个DNS A或AAAA记录,取决于服务的IP协议族,该名称会解析成对应服务的集群IP

  • Pods A/AAAA记录

经由Deployment或者DaemonSet所创建的所有Pods都会有如下DNS解析项与之对应:

pod-ip-address.deploymnet-name.my-namespace.svc.cluster-domain.example

Pod规约中包含一个可选的hostname字段,可以用来指定Pod的主机名,当这个字段被设置是,它将优先于Pod的名字称为该Pod的主机名、举例,给定一个hostname为my-host的Pod,该Pod的主机名将被设置成my-host

Pod规约中还有一个可选的subdomain字段,可以用来指定Pod子域名。举例,某Pod hostname=foo,subdomain=bar,在命名空间my-ns中对应的完全限定域名为foo.bar.my-ns.svc.cluster-domain.example

实例:dns.yaml

apiVersion: v1
kind: Service
metadata:name: busybox
spec:selector:app: busyboxports:- port: 80targetPort: 80
---
apiVersion: v1
kind: Pod
metadata:name: busybox-1labels:app: busybox
spec:hostname: busybox-1subdomain: default-subdomaincontainers:- name: busyboximage: busybox:1.28command: ["sh", "-c", "sleep 1h"]resources:limits:memory: "128Mi"cpu: "500m"ports:- containerPort: 80
---
apiVersion: v1
kind: Pod
metadata:name: busybox-2labels:app: busybox
spec:hostname: busybox-2subdomain: default-subdomaincontainers:- name: myappimage: busybox:1.28command: ["sh", "-c", "sleep 1h"]resources:limits:memory: "128Mi"cpu: "500m"ports:- containerPort: 80
[root@master k8s]# kubectl exec -it busybox-1 sh
kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead.
/ # hostname -f
busybox-1.default-subdomain.default.svc.cluster.local

从集群外部访问Service

从集群外部访问Service的方法:

1、Cluster IP

仅仅使用一个集群内部的Ip地址(默认值)。选择这个值意味着只想这个服务在集群内部才可以被访问到

2、NodePort

在集群内部IP的基础上,在集群每个节点的端口上开发这个服务。可以再任意NodePort地址上访问这个服务

3、LoadBalancer

在使用一个集群内部IP地址和在NodePort上开放一个服务外,像云提供商申请一个负载均衡器,会让流量转发到每个在节点上移NodePort形式开放的服务上。

在使用一个集群内部IP地址和在NodePort上开放一个Service的基础上,像云提供商申请一个负载均衡器,会让流量转发到每个在节点上移NodePort形式开放的Service上。

示例:

1、创建nginx pod

apiVersion: apps/v1
kind: Deployment
metadata:name: nginx
spec:selector:matchLabels:app: nginxtemplate:metadata:labels:app: nginxspec:containers:- name: nginximage: registry.cn-beijing.aliyuncs.com/qingfeng666/nginxresources:limits:memory: "128Mi"cpu: "500m"ports:- containerPort: 80

2、创建NodePort类型的Service

apiVersion: v1
kind: Service
metadata:name: nginx
spec:selector:app: nginxtype: NodePortports:- port: 80targetPort: 80nodePort: 30001

Ingress

Ingress是对集群中服务的外部访问进行管理的api对象,典型的访问方式是http

Ingress公开了从集群外部带内部服务的http和https路由。流量路由由ingress资源上定义的规则控制

图示是一个将所有流量都发送到同一个Service的简单Ingress示例:

可以将Ingress配置为服务提供外部可访问的URL、负载均衡流量、终止SSL/TLS,以及提供基于名称的虚拟主机等能力。Ingress控制器通常负责通过负载均衡器来实现Ingress

环境准备

必须具有Ingress控制器才能满足Ingress的要求,仅创建Ingress资源本身没有任何效果,需要部署Ingress控制器,例如ingress-nginx

Ingress资源

最小的Ingress资源示例

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:name: example-ingressannotations:nginx.ingress.kubernetes.io/rewrite-target: /
spec:rules:- host: hello-world.infohttp:paths:- path: /pathType: Prefixbackend:service:name: webport:number: 8080

Ingress资源仅支持用于转发http流量的规则

Ingress规则

每个HTTP规则都包含以下信息:

1、可选的host。若果未指定host,则规则只适用于通过指定IP地址的所有入站http通信;如果提供了host(例如foo.bar.com),则规则适用于该host

2、路径列表paths,每个路径都有一个有serviceName和servicePod定义的关联后端。在负载均衡器将流量定向到引用的服务之前,主机和路径都必须匹配传入请求的内容

3、backend是Service服务和端口组合。与规则host和path匹配的Ingress的HTTP请求将发送到列出的backend

安装Nginx Ingress控制器

https://github.com/kubernetes/ingress-nginx

版本对应

下载对应版本的ingress-nginx,提取部署文件 deploy/static/provider/cloud/deploy.yaml

# 修改Service(名称:ingress-nginx-controller)的type为NodePort
apiVersion: v1
kind: Service
metadata:labels:app.kubernetes.io/component: controllerapp.kubernetes.io/instance: ingress-nginxapp.kubernetes.io/name: ingress-nginxapp.kubernetes.io/part-of: ingress-nginxapp.kubernetes.io/version: 1.5.1name: ingress-nginx-controllernamespace: ingress-nginx
spec:externalTrafficPolicy: LocalipFamilies:- IPv4ipFamilyPolicy: SingleStackports:- appProtocol: httpname: httpport: 80protocol: TCPtargetPort: http- appProtocol: httpsname: httpsport: 443protocol: TCPtargetPort: httpsselector:app.kubernetes.io/component: controllerapp.kubernetes.io/instance: ingress-nginxapp.kubernetes.io/name: ingress-nginxtype: NodePort

替换国内镜像

registry.aliyuncs.com/google_containers/nginx-ingress-controller:v1.5.1

registry.aliyuncs.com/google_containers/kube-webhook-certgen:v20220916-gd32f8c343

查询 ingress-nginx 命名空间下的 deployment、pod、service 资源

get deployment,pods,service -n ingress-nginx -o wide
NAME                                       READY   UP-TO-DATE   AVAILABLE   AGE   CONTAINERS   IMAGES                                                                    SELECTOR
deployment.apps/ingress-nginx-controller   1/1     1            1           41s   controller   registry.aliyuncs.com/google_containers/nginx-ingress-controller:v1.5.1   app.kubernetes.io/component=controller,app.kubernetes.io/instance=ingress-nginx,app.kubernetes.io/name=ingress-nginxNAME                                           READY   STATUS      RESTARTS   AGE   IP            NODE    NOMINATED NODE   READINESS GATES
pod/ingress-nginx-admission-create-czqlz       0/1     Completed   0          41s   10.244.2.25   node2   <none>           <none>
pod/ingress-nginx-admission-patch-9j694        0/1     Completed   2          41s   10.244.1.13   node1   <none>           <none>
pod/ingress-nginx-controller-fbd49d74b-r8cxg   1/1     Running     0          41s   10.244.1.14   node1   <none>           <none>NAME                                         TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)                      AGE   SELECTOR
service/ingress-nginx-controller             NodePort    10.97.172.217   <none>        80:19386/TCP,443:13175/TCP   41s   app.kubernetes.io/component=controller,app.kubernetes.io/instance=ingress-nginx,app.kubernetes.io/name=ingress-nginx
service/ingress-nginx-controller-admission   ClusterIP   10.109.60.199   <none>        443/TCP                      41s   app.kubernetes.io/component=controller,app.kubernetes.io/instance=ingress-nginx,app.kubernetes.io/name=ingress-nginx
[root@master k8s]#

Nginx Ingress流量验证

1、创建一个Deployment

[root@master k8s]# kubectl create deployment web --image=registry.cn-beijing.aliyuncs.com/qingfeng666/hello-app:1.0
deployment.apps/web created

2、暴露Deployment

[root@master k8s]# kubectl expose deployment web --type=NodePort --port=8080
service/web exposed[root@master k8s]# kubectl get service
NAME         TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)          AGE
kubernetes   ClusterIP   10.96.0.1     <none>        443/TCP          5d23h
web          NodePort    10.108.4.70   <none>        8080:18455/TCP   89s
[root@master k8s]#

访问

[root@master k8s]# curl node1:18455
Hello, world!
Version: 1.0.0
Hostname: web-5978f64c6-jk64w

3、创建Ingress资源

ingress-example.yaml

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:name: example-ingressannotations:nginx.ingress.kubernetes.io/rewrite-target: /
spec:rules:- host: hello-world.infohttp:paths:- path: /pathType: Prefixbackend:service:name: webport:number: 8080

创建ingress

[root@master k8s]# kubectl get ingress
NAME              CLASS   HOSTS              ADDRESS         PORTS   AGE
example-ingress   nginx   hello-world.info   10.97.172.217   80      3m34s

修改hosts

[root@master k8s]# cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
179.220.56.230 master
179.220.56.231 node1
179.220.56.232 node2
10.97.172.217 hello-world.info

访问hello-world.info

[root@master k8s]# curl hello-world.info
Hello, world!
Version: 1.0.0
Hostname: web-5978f64c6-khzk6

相关文章:

Kubernetes学习(三)Service

Service对象 为什么需要Service 每个Pod都有自己的IP地址&#xff0c;但是在Deployment中&#xff0c;在同一时刻运行的Pod集合可能与稍后运行该应用程序的Pod集合不同。 这就导致了一个问题&#xff1a;如果一组Pod&#xff08;称为后端&#xff09;为集群内其他Pod&#x…...

数学小课堂:古德-图灵折扣估计法和插值法(防范黑天鹅事件的方法)

文章目录 引言I 黑天鹅事件产生的原因1.1 置信度1.2 数据的稀疏性1.3 零概率问题II 防范黑天鹅事件的方法2.1 古德-图灵折扣估计法2.2 插值法引言 防范黑天鹅事件的方法 古德-图灵折扣估计法:它主要是解决零概率的事件古德的方法虽然解决了零概率的问题,但是依然没有解决数据…...

redis getshell方法

前言 参考文章 https://paper.seebug.org/1169 https://blog.csdn.net/weixin_55843787/article/details/123829606 https://blog.csdn.net/chenglanqi6606/article/details/100909518 Redis是什么 Redis是一款基于键值对的NoSQL数据库&#xff0c;它的值支持多种数据结构 …...

【ONE·C || 程序编译简述】

总言 C语言&#xff1a;程序编译相关。    文章目录总言1、程序的翻译环境和运行环境1.1、简述1.2、翻译环境&#xff1a;程序编译与链接1.2.1、简介&#xff1a;程序如何从.c文件形成.exe可执行程序1.2.2、过程说明1.3、运行环境2、预处理详解2.1、预定义符号2.2、#define2.…...

MGAT: Multimodal Graph Attention Network for Recommendation

模型总览如下&#xff1a; 图1&#xff1a;多模态图注意力网络背景&#xff1a;本论文是对MMGCN&#xff08;Wei et al., 2019&#xff09;的改进。MMGCN简单地在并行交互图上使用GNN&#xff0c;平等地对待从所有邻居传播的信息&#xff0c;无法自适应地捕获用户偏好。 MMGCN…...

在SNAP中用sentinel-1数据做InSAR测量,以门源地震为例

在SNAP中用sentinel-1数据做InSAR0 写在前面1 数据下载2 处理步骤2.1 split2.2 apply orbit 导入精密轨道2.3 查看数据的时空基线base line2.4 back-geocoding 配准2.5 Enhanced Spectral Diversity2.6 Deburst2.7 Interogram Formation 生成干涉图2.8 Multilook 多视2.9 Golds…...

MySQL常用函数

什么是函数&#xff1f; 函数是指一段可以直接被另一段程序调用的程序或代码。 字符串函数 函数功能CONCAT(S1,S2,…Sn)字符串拼接&#xff0c;将S1&#xff0c;S2&#xff0c;… Sn拼接成一个字符串LOWER(str)将字符串str全部转为小写LOWER(str)将字符串str全部转为小写LPAD(…...

51单片机数字电子钟开题报告

目录 选题背景 初步设计方案 芯片的选型 编译环境 关键问题 策略 方案 参考文献 选题背景 数字电子钟是一种受到越来越多人喜爱的钟表&#xff0c;其准确性和稳定性成为设计和研发的重要考虑因素。在现代社会&#xff0c;时间的准确性对于各行各业都非常重要&#xff0…...

day7 HTTP协议

HTTP协议 什么是协议&#xff1f; 协议实际上是某些人&#xff0c;或者某些组织提前制定好的一套规范&#xff0c;大家都按照这个规范来&#xff0c;这样可以做到沟通无障碍。协议就是一套规范&#xff0c;就是一套标准。由其他人或其他组织来负责制定的。我说的话你能听懂&…...

3DCAT+一汽奥迪:共建线上个性化订车实时云渲染方案

近年来&#xff0c;随着5G网络和云计算技术的不断发展&#xff0c;交互式3D实时云看车正在成为一种新的看车方式。与传统的到4S店实地考察不同&#xff0c;消费者可以足不出户&#xff0c;通过网络与终端设备即可实现全方位展示、自选汽车配色、模拟效果、快捷选车并进行个性化…...

yii2项目使用frp https2http插件问题

yii2内网项目&#xff0c;使用frp进行内网穿透&#xff0c;使用 https2http插件把内网服务器http流量转成https&#xff0c;会存在一个问题&#xff1a;当使用 $this->redirect(...) 或 $this->goHome() &#xff08;其实用的也是前者&#xff09;等重定向时&#xff0c;…...

关于 interface{} 会有啥注意事项?下

我们一起来回顾一下上一次说到的 interface{} 可以用来做多态 接口类型分为空接口类型和非空接口类型&#xff0c;他们的底层数据结构不太一样 这里顺便说一下&#xff0c;用来作态需要满足这样的条件&#xff1a; 首先得有父类指针指向子类的对象这个接口还必须是非空接口…...

ansible组件介绍和简单playbook测试

一、ansible inventory 在大规模的配置管理工作中&#xff0c;管理不同业务的机器&#xff0c;机器的信息都存放在ansible的inventory组件里面。在工作中&#xff0c;配置部署针对的主机必须先存放在Inventory里面&#xff0c;然后ansible才能对它进行操作。默认的Ansible的in…...

[数据结构]:13-插入排序(顺序表指针实现形式)(C语言实现)

目录 前言 已完成内容 插入排序实现 01-开发环境 02-文件布局 03-代码 01-主函数 02-头文件 03-PSeqListFunction.cpp 04-SortCommon.cpp 05-SortFunction.cpp 结语 前言 此专栏包含408考研数据结构全部内容&#xff0c;除其中使用到C引用外&#xff0c;全为C语言代…...

es6 new Promise

Promise 是一个构造函数&#xff0c;本身身上有 all、reject、resolve 这几个方法&#xff0c;原型上有 then、catch 等方法。所以 Promise new 出来的对象确定就有 then、catch 方法。Promise 的构造函数接收一个参数&#xff0c;是函数&#xff0c;而且传入两个参数&#xff…...

Python爬虫实战:使用Requests和BeautifulSoup爬取网页内容

标题&#xff1a;Python爬虫实战&#xff1a;使用Requests和BeautifulSoup爬取网页内容 Python爬虫技术是网络爬虫中的一种&#xff0c;它可以从互联网上抓取各种网页信息&#xff0c;如文本、图片、视频等&#xff0c;并将它们存储在本地数据库中。Python语言具有简单易学、语…...

质量指标——什么是增量覆盖率?它有啥用途?

目录 引言 什么是增量覆盖率 增量覆盖率有啥用途 1、对不同角色同学的用途 2、对不同规模的业务需求的用途 增量覆盖率的适用人员 增量覆盖率不太适用的情况 引言 有些质量团队&#xff0c;有时会拿「增量覆盖率」做出测试的准出卡点。 但在实际的使用过程中&#xff0c;…...

Hive---拉链表

拉链表 文章目录拉链表定义用途案例全量流程增量流程合并过程第一步第二步第三步案例二&#xff08;含分区&#xff09;创建外部表orders增量分区表历史记录表定义 拉链表是一种数据模型&#xff0c;主要是针对数据仓库设计中表存储数据的方式而定义的&#xff0c;顾名思义&am…...

日常文档标题级别规范

这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题&#xff0c;有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注…...

C++学习记录——십이 vector

文章目录1、vector介绍和使用2、vector模拟实现insert和erase和迭代器失效补齐其他函数深浅拷贝难点思考1、vector介绍和使用 vector可以管理任意类型的数组&#xff0c;是一个表示可变大小数组的序列容器。 通过vector文档来看它的使用。 #include <iostream> #inclu…...

Lombok常见用法总结

目录一、下载和安装二、常见注释&#xff08;一&#xff09;Data&#xff08;二&#xff09;Getter和Setter&#xff08;三&#xff09;NonNull和NotNull&#xff08;不常用&#xff09;&#xff08;四&#xff09;ToString&#xff08;不常用&#xff09;&#xff08;五&#…...

【Ajax】异步通信

一.概述 概念&#xff1a;AJAX(Asynchronous JavaScript And XML)&#xff1a;异步的 JavaScript 和 XML 作用&#xff1a; 与服务器进行数据交换&#xff1a;通过AJAX可以给服务器发送请求&#xff0c;并获取服务器响应的数据 使用了AJAX和服务器进行通信&#xff0c;就可以使…...

近红外吸收荧光染料IR-808,IR-808 NH2,IR-808 amine,发射808nm 性质分享

中文名称&#xff1a;IR-808 氨基英文名称&#xff1a;IR-808 NH2&#xff0c;IR-808 amine&#xff0c;IR-808-NH2规格标准&#xff1a;10mg&#xff0c;25mg&#xff0c;50mgCAS&#xff1a;N/A产品描述&#xff1a;IR-808&#xff0c;发射808nm&#xff0c;酯溶性染料修饰氨…...

一图来看你需要拥有那些知识储备

技术实践 数据 关系型数据 MySQLSQLServerOraclePostgrSQLDB2 大数据存储 RedisMemcacheMongoDBHBaseHive 大数据处理 Hadoop 数据报表看板 DataGearGrafanaKibanaMetaBase 消息对列 Rabbit MQRock MQActive MQKafka 大数据搜索 SolrElasticSearchLucenHive 服务提…...

复位和时钟控制(RCC)

目录 复位 系统复位 电源复位 备份区复位 时钟控制 什么是时钟&#xff1f; 时钟来源 二级时钟源: 如何使用CubeMX配置时钟 复位 系统复位 当发生以下任一事件时&#xff0c;产生一个系统复位&#xff1a;1. NRST引脚上的低电平(外部复位) 2. 窗口看门狗计数终止(WWD…...

OpenWrt 专栏介绍00

文章目录OpenWrt 专栏介绍00专栏章节介绍关于联系方式OpenWrt 专栏介绍00 专栏章节介绍 本专栏主要从开发者角度&#xff0c;一步步深入理解OpenWrt开发流程&#xff0c;本专栏包含以下章节&#xff0c;内如如下&#xff1a; 01.OperWrt 环境搭建02.OperWrt 包管理系统03.Op…...

udk开发-稀里糊涂

一、EDK2简介 1.EDK2工作流 ​ 二、EDK2 Packages 1.Packages介绍 ​ EDK2 Packages是一个容器&#xff0c;其中包含一组模块及模块的相关定义。每个Package是一个EDK2单元。 整个Project的源代码可以被分割成不同的Pkg。这样的设计不仅可以降低耦合性&#xff0c;还有利于分…...

Java之内部类

目录 一.内部类 1.什么是内部类 2.内部类存在的原因 3. 内部类的分类 4.内部类的作用 二.成员内部类 1.基本概念 2.成员内部类的注意点 1.成员内部类可以用private方法进行修饰 2.成员内部类可以直接访问外部类的私有属性 3.外部类可以通过对象访问内部类的私有属性 …...

【MyBatis】篇二.MyBatis查询与特殊SQL

文章目录1、MyBatis获取参数值case1-单个字面量类型的参数case2-多个字面量类型的参数case3-map集合类型的参数case4-实体类类型的参数case5-使用Param注解命名参数总结2、MyBatis的各种查询功能case1-查询结果是一个实体类对象case2-查询结果是一个List集合case3-查询单个数据…...

CE认证机构和CE证书的分类

目前&#xff0c;CE认证已普遍被应用在很多行业的商品中&#xff0c;也是企业商品进入欧洲市场的必备安全合格认证。在船舶海工行业中&#xff0c;也同样普遍应用&#xff0c;很多时候&#xff0c;对于规范中没有明确认证要求的设备或材料&#xff0c;而船舶将来还会去欧洲水域…...

大型网站制作流程/搜索网页内容

接着上篇《编写高效Excel VBA代码的最佳实践(一)》 尽可能少使用“.”&#xff0c;使用对象变量 在前面已经介绍过的对长对象引用使用对象变量以及使用With…End With等都是简化”.”的方法。因为在代码中的每个句点都表示至少一个(而且可能是多个)过程调用&#xff0c;而这些过…...

wordpress 主页布局/nba赛季排名

RCF的使用教程 RCF(Remote Call Framework)是一个使用C编写的RPC框架&#xff0c;在底层RCF支持多种传输实现方式(transport implementations). 包括TCP&#xff0c;UDP&#xff0c;多播&#xff0c;组播&#xff0c;win32命名管道和unix domain socket。下面我以一个例子讲述…...

织梦可以做家教网站吗/佛山市seo推广联系方式

Lind.DDD.Authorization是Lind.DDD框架的组成部分&#xff0c;之所以把它封装到框架里&#xff0c;原因就是它的通用性&#xff0c;几乎在任何一个系统中&#xff0c;都少不了用户授权功能&#xff0c;用户授权对于任何一个系统来说都是必要的&#xff0c;像管理型的页面都需要…...

江宁区财政局网站开发区分局/搜索引擎营销的实现方法有

1.DB LUW简介: 1.DB LUW全称:Database Logical Unit of Work2.从数据库编程的角度来看,DB LUW 是一个不可分割的数据库操作序列,以事务的提交或回滚结束3.DB LUW 要么完全由数据库系统执行,要么根本不执行4.如果 DB LUW 中发生错误,则自 DB LUW 中所有数据库更改都将被回…...

地勘网站建设方案/熊猫关键词工具

罗德与施瓦茨 (Rohde & Schwarz, R&S) 公司成立于1933年&#xff0c;总部位于德国慕尼黑&#xff0c;是一家技术公司&#xff0c;为企业和政府机构开发、生产和销售广泛的电子产品&#xff0c;业务核心在于提供各类解决方案以打造一个更加安全的互联世界。 罗德与施瓦…...

移动互联网开发找工作/武汉seo结算

综观多家企业的ERP实施情况&#xff0c;笔者发现有一个比较大的误区&#xff0c;即都忽视了计划在工作中的作用。有些企业虽然意识到计划的重要性&#xff0c;但是在实际工作中会因为种种原因无法落实到实处。笔者认为&#xff0c;计划是ERP项目中的灵魂&#xff0c;企业用户应…...