【云原生】Service服务暴露详细
Service服务
文章目录
- Service服务
- 一、Service介绍
- 1.1、介绍
- 1.2、Kubernetes中的Service
- 二、Service服务类型
- 2.1、ClusterIP
- 2.2、NodePort
- 2.3、LadBalancer
- 2.4、ExternalName
- 三、Service玩法
- 3.1、定义Service
- 3.2、端口定义别名
- 3.3、多端口Service
- 四、Service类型
- 4.1、Cluster IP类型
- 4.2、NodePort类型
- 4.3、ExternalName类型Service简介
一、Service介绍
1.1、介绍
- Kubernetes中Service是将运行在一个或一组Pod上的网络用用程序公开为网络服务的方法。
- Kubernetes中Service的一个关键目标是让你无需修改现有应用以使用某种不熟悉的服务发现机制。你可以在Pod集合中运行代码,无论该代码是为云原生环境设计的,还是被容器化的老应用。你可以使用Service让一个组Pod可以在网络上被访问,这样客户端就能与之交互。
- 如果你使用Deployment来运行你的应用,Deployment可以动态地创建和销毁Pod。在任何时刻,你都不需要知道有多少个这样的Pod正在工作以及它们是否健康;你可能甚至不知道如何辨别健康的Pod。Kubernetes Pod的创建和销毁是为了匹配集群的预期状态。Pod是临时资源(你不应该期待单个Pod即可靠又耐用)。
- 每个Pod会获得属于自己的IP地址(Kubernetes期待网络插件来保证这一点)。对于集群中给定的某个Deployment,这一刻运行的Pod集合可能不同于下一刻运行该应用的Pod集合。
- 这就带来了一个问题:如果某组Pod(成为后端)为集群内的其他Pod(成为前端)集合提供功能,前端要如何发现并跟踪要连接的IP地址,以便使用负载的后端组件呢?
1.2、Kubernetes中的Service
-
Service API是kubernetes的组成部分,它是一种抽象,邦族你将Pod集合在网络上公开出去。每个Service对象定义端点的一个逻辑集合(通常这些端点就是Pod)以及如何访问到这些Pod的策略。
-
例如,开了一个无状态的图像处理端,其中运行3个副本(Replicas)。这些副本是可互换的——前端不需要关心它们调用的是哪个后端,即便构成后端集合的实际Pod可能会发生变化,前端客户端不应该也没有必要知道这些,而且它们也不必亲自跟踪后端的状态变化。
-
Service抽象使这种解耦成为可能。
-
Service对应的Pod集合通常由你定义的标签来确定。
-
如果你的工作负载使用HTTP通信,你可能会选择使用Ingress来控制Web流量如何到达该工作负载。Ingress不是一种Service,但它可用作集群的入口点。Ingress能让你的路由规则整合到同一个资源内,这样你就能工作负载的多个组件公开出去,这些组件使用同一个侦听器,但各自独立运行在集群中。
二、Service服务类型
- 对一些应用的某些部分(如前端),你可能希望将其公开于某外部IP地址,也就是可以从集群外部访问的某个地址。
- Kubernetes Service类型允许指定你所需要的Service类型。
2.1、ClusterIP
- 通过集群的内部IP公开Service,选择该值时Service只能够在集群内部访问。这也是你没有为Service显式指定
type
时使用的默认值。你可以使用Ingress
或者Gateway API
向公共互联网公开服务。- 此默认Service类型从你的集群中为此预留的IP地址池中分配一个IP地址。
- 其他几种Service类型在
ClusterIP
类型的基础上进行构建。 - 如果你定义的Service将
.spec.clusterIP
设置为"None"
则Kubernetes不会为其分配IP地址。
2.2、NodePort
- 通过每个节点上的IP和静态端口(NodePort)公开Service。为了让Service可通过节点端口访问,Kubernetes会为Service配置集群IP地址,相当于你请求了
type: ClusterIP
的Service。- 如果你将
type
字段设置为NodePort
,则Kubernetes控制平面将在--service-node-port-range
标志所指定的范围内分配端口(默认值:30000-32767)每个节点将该端口(每个节点上的相同端口号)上的流量代理到你的Service。你的Service在其.spec.ports[*].nodePort
字段中指定分配的对外访问的端口。 - 使用NodePort可以让你自由设置自己的负载均衡解决方案,配置Kubernetes不完全支持你的环境,甚至直接公开一个或多个节点的IP地址。
- 对于NodePort类型Service,Kubernetes额外分配一个端口(TCP、UDP或者其他匹配Service的协议)。集群中的每个节点都将自己配置为监听所分配的端口,并将流量转发到与该Service关联的某个就绪端点。通过使用合适的协议(例如TCP)和适当的端口(分配给该Service)连接到任何一个接待你,你就能够从集群外部访问
type: NodePort
服务
- 如果你将
2.3、LadBalancer
- 使用云平台的负载均衡器向外公开Service。kubernetes不直接提供负载均衡组件;你必须提供一个,或者将你的Kubernetes集群与某个云平台集成。
- 在使用支持外部负载均衡器的云平台时,如果将
type
设置为"LadBanlancer"
,则平台会为Service提供负载均衡器。负载均衡器的实际创建过程是异步进行的,关于所制备的负载均衡器的信息将会通过Service的status.loadBalancer
字段公开出来
- 在使用支持外部负载均衡器的云平台时,如果将
2.4、ExternalName
- 将服务映射到externalName字段的内容(例如,映射到主机名api.foo.bar.example)。该映射将集群的DNS服务器配置为返回具有该外部主机名值得CNAME记录。集群不会为之创建任何类型代理。
- 类型为ExternalName的Service将Service映射到DNS名称,而不是典型的选择算符。
三、Service玩法
- Kubernetes中的Service是一个对象(与Pod或ConfigMap类似)。你可以使用Kubernetes API创建,查看你或修改Service定义。通常你会使用
kubectl
这类工具来替你发起这些API调用。
3.1、定义Service
- 例如,假定有一组Pod,每个Pod都在侦听TCP端口9376,并且它们还被打上
app.kubernetes.io/name=MyApp
标签。你可以定义一个Service来发布该TCP侦听器。
[root@master ~]# vim service.yaml
apiVersion: "v1"
kind: Service
metadata:name: my-service
spec:# 标签选择器,意味着将会把流量路由到带有此标签的Pod上selector:app.kubernetes.io/name: MyAppports: # ports定义Service暴露的端口信息- name: http # 为端口起个名字,可以清晰标识每个端口的作用protocol: TCP # 指定了端口使用的协议,这里指定的是TCPport: 80 # 定义Service对外暴露的端口targetPort: 9376 # 定义如果访问到Service对外暴露的80端口,流量将会被路由到9376容器侦听端口上# 应用上述清单时,系统将创建一个名为“my-service”的、服务类型默认为ClusterIP的Service。该Service指向带有标签"app.kubernetes.io/name: MyApp"的所有Pod的TCP端口9376
# Kubernetes为该Service分配一个IP地址(称为集群IP),供虚拟IP地址机制使用
# 此Service的控制器会不断操作与其选择算符匹配的Pod集合,然后对Service的EndpointSlice集合执行必要的更新。
# Service对象的名称必须是有效的RFC 1035标签名称
# 说明:Service能够任意入站,port映射到某个targetPort。默认情况下,出于方便考虑,targetPort会被设置为与port字段相同的值
# 加载资源
[root@master ~]# kubectl apply -f service.yaml
# 你可以使用此命令查看刚刚创建的Service对象
[root@master ~]# kubectl get svc my-service
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
my-service ClusterIP 10.96.239.56 <none> 80/TCP 30m
3.2、端口定义别名
- Pod中的端口定义是有名字的,你可以在Service的
targetPort
属性中引用这些名字。例如,我们可以通过以下方式将Service的targetPort
绑定到Pod端口:
[root@master ~]# vim service.yaml
apiVersion: "v1"
kind: Pod
metadata:name: nginxlabels:app: nginx
spec:containers:- name: nginximage: nginx:latestimagePullPolicy: IfNotPresentports: # 定义容器要暴露的端口- containerPort: 80 # 指定容器内部监听的端口name: http-web-svc # 为这个端口指定一个名称,通过端口名称可以更灵活引用端口---apiVersion: "v1"
kind: Service
metadata:name: nginx-service
spec:selector: # 标签选择器app: nginx # Service会把流量路由到带有app=nginx标签的Pod上ports:- name: name-of-service-port # 定义service端口名称protocol: TCP # 指定网络协议port: 80 # 定义service的端口号(对外暴露的端口)targetPort: http-web-svc # 指定Pod中监听端口名称# 即使在Service中混合使用配置名称相同的多个Pod,各Pod通过不同的端口号支持相同的网络协议,此机制也可以工作。这一机制为Service的部署和演化提供了较高的灵活性。例如,你可以在后端软件新版本中更改Pod的公开端口号,但不会影响到客户端。
# Service的默认协议是TCP;你还可以使用其他受支持的任何协议
# 由于许多Service需要公开多个端口,所以Kubernetes为同一Service定义多个端口。每个端口定义可以具有相同的protocol,也可以具有不同协议。
# 创建资源
[root@master ~]# kubectl apply -f service.yaml
# 查看pod和service资源
[root@master ~]# kubectl get pod,svc
NAME READY STATUS RESTARTS AGE
pod/nginx 1/1 Running 0 26mNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 5d12h
service/nginx-service ClusterIP 10.109.37.65 <none> 80/TCP 26m
# 你可以通过刚刚查看到service的集群IP地址访问后端Pod
[root@master ~]# curl 10.109.37.65
<!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>
3.3、多端口Service
- 对于某些Service,你需要公开多个端口。Kubernetes允许你为Service对象配置多个端口定义。为Service使用多个端口时,必须为所有端口提供名称,以使它们无歧义。
[root@master ~]# vim service.yaml
apiVersion: "v1"
kind: Pod
metadata:name: nginxlabels:app: nginx
spec:containers:- name: nginximage: nginx:latestimagePullPolicy: IfNotPresentports: # 定义容器要暴露的端口- containerPort: 80 # 指定容器内部监听的端口name: http-web-svc # 为这个端口指定一个名称,通过端口名称可以更灵活引用端口---apiVersion: "v1"
kind: Service
metadata:name: nginx-service
spec:selector: # 标签选择器app: nginx # Service会把流量路由到带有app=nginx标签的Pod上ports:- name: http # 定义service端口名称protocol: TCP # 指定网络协议port: 80 # 定义service的端口号(对外暴露的端口)targetPort: http-web-svc # 指定Pod中监听端口名称- name: https protocol: TCPport: 443 # Service对外暴露的端口targetPort: 80 # 此处直接指定了Pod内部暴露的端口
# 创建资源
[root@master ~]# kubectl apply -f service.yaml
# 查看Pod和Service资源
[root@master ~]# kubectl get pod,svc
NAME READY STATUS RESTARTS AGE
pod/nginx 1/1 Running 0 36sNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 5d12h
service/nginx-service ClusterIP 10.105.238.225 <none> 80/TCP,443/TCP 36s
# 你可以通过刚刚查看到service的集群IP地址访问后端Pod# 访问http
[root@master ~]# curl 10.105.238.225: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># 访问https
[root@master ~]# curl 10.105.238.225:443
<!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>
四、Service类型
- 常用的Service类型有三种
4.1、Cluster IP类型
- 这种类型的Service只会得到虚拟IP和端口,只能在Kubernetes集群内部被访问,此模型为默认类型。
[root@master ~]# vim service_clusterip.yaml
apiVersion: "apps/v1"
kind: Deployment
metadata:name: nginxlabels:app: nginx
spec:replicas: 2selector:matchLabels:app: nginxtemplate:metadata:labels:app: nginxspec:containers:- name: test-nginximage: nginx:latestimagePullPolicy: IfNotPresentports:- containerPort: 80---apiVersion: "v1"
kind: Service
metadata:name: nginx
spec:selector: # 标签选择器app: nginx # 指定后端服务Pod,把流量路由到带有app=nginx的后端Pod上type: ClusterIPports:- port: 80 # 对外暴露80端口targetPort: 80 # 此处填写容器真实暴露出来的端口,流量将会被路由到这个端口上
# 创建资源
[root@master ~]# kubectl apply -f service_clusterip.yaml
# 查看Pod和Service资源
[root@master ~]# kubectl get pod,svc
NAME READY STATUS RESTARTS AGE
pod/nginx-585dbbb7c7-hq98j 1/1 Running 0 115s
pod/nginx-585dbbb7c7-t6dh7 1/1 Running 0 115sNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 5d13h
service/nginx ClusterIP 10.107.19.45 <none> 80/TCP 115s
# 你可以通过刚刚查看到service的集群IP地址访问后端Pod
# ClusterIP类型只能在集群内部访问
[root@master ~]# curl 10.107.19.45
<!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 ~]# curl 10.107.19.45
<!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>
4.2、NodePort类型
- 这种类型的Service除了会得到虚拟IP地址和端口,Kubernetes还会再所有Node节点上为其分配端口,分配端口的值可以通过
.spec.ports.nodePort
指定,或由Kubernetes再配置好的池里面分配(默认为30000-32767)即可从Kubernetes集群通过虚拟IP:端口访问也可以从集群外部通过Node节点的IP:nodePort访问
# 以下是type: NodePort服务的一个清单示例,其中指定了NodePort值(本次案例为30007)
[root@master ~]# vim service_nodePort.yaml
apiVersion: "apps/v1"
kind: Deployment
metadata:name: my-nginxlabels:run: my-nginx
spec:selector:matchLabels:run: my-nginxreplicas: 2template:metadata:labels:run: my-nginxspec:containers:- name: my-nginximage: nginx:latestimagePullPolicy: IfNotPresentports:- containerPort: 80---apiVersion: "v1"
kind: Service
metadata:name: my-nginxlabels:run: my-nginx
spec:selector:run: my-nginx # 定义标签选择器,将会把流量路由到带有run=my-nginx标签的pod上的端口上 type: NodePortports:# 默认情况下,为了方便起见,'targetPort'被设置为与'port'字段相同的值- port: 80protocol: TCPtargetPort: 80# nodePort可选字段# 默认情况下,为了方便起见,kubernetes控制平面会从某个范围内分配一个端口号# (默认情况:30000-32767)nodePort: 30007
# 创建资源
[root@master ~]# kubectl apply -f service_nodePort.yaml
# 查看Pod和Service资源
# nodePor类型的Service可以从集群外部访问
[root@master ~]# kubectl get pod,svc
NAME READY STATUS RESTARTS AGE
pod/my-nginx-597fd96b76-hqvcv 1/1 Running 0 85s
pod/my-nginx-597fd96b76-vv8p9 1/1 Running 0 85sNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 5d13h
service/my-nginx NodePort 10.107.85.136 <none> 80:30007/TCP 85s
# 你可以通过刚刚查看到service的集群IP地址访问后端Pod
# 访问的时候集群任意节点IP地址加上暴露出去的NodePort端口
C:\Users\Lenovo>curl http://192.168.93.145:30007
<!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>
4.3、ExternalName类型Service简介
- externalName Service是K8S中一个特俗的service类型,它不需要指定selector去选择哪些Pod实例提供服务,而是使用DNS CNAME机制把自己CNAME到你指定的另外一个域名上,你可以提供集群内的名字,比如mysql.db.svc这样的简历在db名称空间内的mysql服务,也可以指定http:///mysql.example.com这样的外部真实域名。
# 定义ExternalName类型的ServiceapiVersion: "v1"
kind: Namespace
metadata:name: dev---apiVersion: "v1"
kind: Pod
metadata:name: nginxnamespace: dev
spec:containers:- name: nginximage: nginx:latestimagePullPolicy: IfNotPresentports:- containerPort: 80---apiVersion: "v1"
kind: Service
metadata:name: searchnamespace: dev
spec:type: ExternalNameexternalName: www.baidu.com # 访问这个特定的service路径将会访问到www.baidu.com
# 创建资源
[root@master ~]# kubectl apply -f externalname-nginx.yaml
# 查看Pod和Service资源
[root@master ~]# kubectl get pod,svc -n dev
NAME READY STATUS RESTARTS AGE
pod/nginx 1/1 Running 0 6sNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/search ExternalName <none> www.baidu.com <none> 4m26s
# 此时,在集群内部的Pod就可以通过search.dev.svc.cluster.local访问www.baidu.comle
# 下面验证一下,首先查看K8s内部使用的DNS地址
[root@master ~]# kubectl exec -it -n dev nginx -- cat /etc/resolv.conf
nameserver 10.96.0.10 # 这个就是k8s内部的DNS地址
search dev.svc.cluster.local svc.cluster.local cluster.local
options ndots:5
# 然后使用dig命令验证
[root@master ~]# yum -y install bind-utils-9.11.4-26.P2.el7_9.16.x86_64
[root@master ~]# dig @10.96.0.10 search.dev.svc.cluster.local; <<>> DiG 9.11.4-P2-RedHat-9.11.4-26.P2.el7_9.16 <<>> @10.96.0.10 search.dev.svc.cluster.local
; (1 server found)
;; global options: +cmd
;; Got answer:
;; WARNING: .local is reserved for Multicast DNS
;; You are currently testing what happens when an mDNS query is leaked to DNS
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 44519
;; flags: qr aa rd; QUERY: 1, ANSWER: 4, AUTHORITY: 0, ADDITIONAL: 1
;; WARNING: recursion requested but not available;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;search.dev.svc.cluster.local. IN A;; ANSWER SECTION:
search.dev.svc.cluster.local. 30 IN CNAME www.baidu.com.
www.baidu.com. 30 IN CNAME www.a.shifen.com.
www.a.shifen.com. 30 IN A 220.181.38.150
www.a.shifen.com. 30 IN A 220.181.38.149;; Query time: 57 msec
;; SERVER: 10.96.0.10#53(10.96.0.10)
;; WHEN: 一 8月 05 22:51:59 CST 2024
;; MSG SIZE rcvd: 219
相关文章:
【云原生】Service服务暴露详细
Service服务 文章目录 Service服务一、Service介绍1.1、介绍1.2、Kubernetes中的Service 二、Service服务类型2.1、ClusterIP2.2、NodePort2.3、LadBalancer2.4、ExternalName 三、Service玩法3.1、定义Service3.2、端口定义别名3.3、多端口Service 四、Service类型4.1、Cluste…...
实名认证次数限制
在业务层实现实名认证次数限制 这个功能是通过以下步骤实现实名认证的次数限制: 每日失败尝试次数限制:限制用户每天可以尝试失败的次数。失败后的冷却时间:用户在连续失败几次后需要等待一段时间才能再次尝试。成功认证后的限制࿱…...
【如何在Python中使用pathlib模块】
在Python中使用pathlib模块主要涉及创建Path对象,并利用这些对象提供的方法来执行文件系统的各种操作。以下是一些详细的步骤和示例,帮助你了解如何在Python中有效地使用pathlib模块。 1. 导入Path类 首先,从pathlib模块中导入Path类。 fr…...

sqli-labs第一关详细解答
首先判断是否有注入点 发现and 11 和 and 12结果一样,所以应该是字符型注入,需要对单引号做闭合 做闭合后发现报错,提示Limit 0,1,那就说明存在注入点,但是要注释掉后面的limit 0,1 使用--注释掉limit 0,1后ÿ…...

分布式事务一站式解决方案-Seata
分布式事务一站式解决方案- 分布式事务一站式解决方案分布式事务产生背景三个概念Seata下载和安装实际业务模拟演示不加 GlobalTransactional 注解,正常操作下单不加 GlobalTransactional 注解,下单过程出异常或者超时了加 GlobalTransactional 注解&…...
openwrt 使用ftace工具追踪协议栈转发流程
开这四个宏 CONFIG_KERNEL_DYNAMIC_FTRACEy CONFIG_KERNEL_FTRACEy CONFIG_KERNEL_FUNCTION_GRAPH_TRACERy CONFIG_KERNEL_FUNCTION_TRACERy 如果/sys/kernel/debug/tracing没有,可以挂载 mount -t debugfs nodev /sys/kernel/debug 挂载报错: mo…...

ElasticSearch优化实战:打造高性能搜索引擎的秘籍
在当今这个大数据时代,信息的海量增长对搜索技术提出了前所未有的挑战。用户不仅需要快速准确地从数以亿计的数据中找到所需信息,还希望搜索引擎能够提供个性化和智能化的搜索体验。ElasticSearch作为市场上领先的搜索引擎,因其强大的全文搜索…...

【STL】| C++ 栈和队列(详解、容器适配器的初步引入)
目录 前言 总代码 容器适配器的引入 栈 stack 队列 queue 栈和队列用法简介 栈 队列 deque简介(了解即可) 结语 前言 今天我们要讲解的结构是栈和队列 这两个的具体实现相比于前面我们学的string、vector、list都要简单得多(因为容…...

xss漏洞(二,xss靶场搭建以及简单利用)
本文仅作为学习参考使用,本文作者对任何使用本文进行渗透攻击破坏不负任何责任。 一,环境搭建。 使用工具:PHP study,dvwa靶场。 1,GitHub上下载dvwa到PHP study的WWW文件夹内,并解压。 dvwa下载地址 …...

深度学习--------------Kaggle房价预测
目录 下载和缓存数据集访问和读取数据集总代码 数据预处理训练K折交叉验证模型选择总代码提交你的Kaggle预测提交Kaggle 下载和缓存数据集 import hashlib import os import tarfile import zipfile import requests# download传递的参数分别是数据集的名称、缓存文件夹的路径…...
cpio 命令
前言 cpio(Copy In and Out)是一种在类 Unix 操作系统中处理归档文件的多功能工具。与 tar 不同,cpio 有其独特的优势和使用场景,特别是在与其他命令结合使用时。本文将带你了解 cpio 的基础知识、用法及实际示例。 什么是 cpio…...
TreeMap自定义排序
我们都知道TreeMap可以根据key按字典升序排序。但在某些场景下,我们需要自定义排序规则,为了代码优雅一些,我们也希望在stream中groupingBy时自定义排序规则,就可以参考本文的实现。 1. 使用TreeMap默认的排序规则(按…...
我的CSDN 512天创作纪念日-20240807
机缘 在 2023 年 3 月 13 日,我撰写了第一篇技术博客《软考高级-系统分析师-案例分析-系统维护与设计模式》。那一天,我决定将自己的实战项目经验和学习心得记录下来,与更多志同道合的朋友分享。成为一名专业 IT 作者的梦想,促使我…...

微服务-实现nacos的集群和Gateway网关的实现、认证校验、解决跨域
1. nacos的集群模式 1.1 分析 nacos在企业中的使用100%都是集群模式。需要掌握nacos集群的搭建 nacos的数据存放在derby本地磁盘中,nacos集群模式会导致数据库数据不一致,使用加一层思想,修改nacos的数据库,使用mysql数据库&…...

数据库中的约束,聚合函数以及联合查询
目录 数据库中的约束 not null unique default primary key foreign key 表的设计 聚合函数(查询) 分组 联表查询(多表查询) 内连接 外连接 左外连接 右外连接 自连接 子查询 合并查询 数据库中的约束 为了保证…...

【AI大模型】Ollama+OpenWebUI+llama3本地大模型
本地部署大模型 0.引言1.部署安装1.1部署工具1.2 概念介绍1.3 ollama安装后的基本使用1.4 大模型权重下载1.4.1 ollama在线下载1.4.2 huggingFace下载大模型权重及如何使用ollama进行调用 2.带有UI界面的使用3.参考 0.引言 (1)目的 本教程主要关于开源A…...
习题20240807
文章目录 题目 1: 泛型类题目 2: 泛型方法题目 3: 泛型接口题目 4: 泛型约束题目 5: 泛型集合题目6:题目7:题目8:题目9: 题目 1: 泛型类 编写一个泛型类 Box,它能够存储一个类型为 T 的值,并提供方法 SetI…...

src挖掘-记一次有趣的逻辑漏洞分享
漏洞挖掘-记一次有趣的逻辑漏洞挖掘 前言简述1、信息收集2、找功能点3、挖掘漏洞案例一:任意用户注册漏洞案例二-垂直越权导致管理员密码重置获得管理员后台权限漏洞总结 前言 此文章是小白的学习笔记,请不要利用文章内相关知识点进行非法渗透ÿ…...

【C++】STL | list (链表)详解及重要函数的实现
目录 前言 总代码 ListNode类框架的建立 (成员与模板) list类的框架 普通构造 与 empty_init(适合不同类型构造函数的小函数) list的迭代器 引子 operator、operator--(前置与后置) operator 与 operator! operator* 与 …...

警惕智能手机的“隐形眼”:如何保护我们的数字隐私堡垒
随着智能手机深入我们生活的方方面面,它变得无所不在,甚至无所不知。 但你是否意识到,你的手机可能正在悄无声息地“监听”你的一举一动? 从你的搜索习惯到日常对话,手机的个性化推荐系统正不断收集你的数据。 本文…...

7.4.分块查找
一.分块查找的算法思想: 1.实例: 以上述图片的顺序表为例, 该顺序表的数据元素从整体来看是乱序的,但如果把这些数据元素分成一块一块的小区间, 第一个区间[0,1]索引上的数据元素都是小于等于10的, 第二…...

shell脚本--常见案例
1、自动备份文件或目录 2、批量重命名文件 3、查找并删除指定名称的文件: 4、批量删除文件 5、查找并替换文件内容 6、批量创建文件 7、创建文件夹并移动文件 8、在文件夹中查找文件...

关于nvm与node.js
1 安装nvm 安装过程中手动修改 nvm的安装路径, 以及修改 通过nvm安装node后正在使用的node的存放目录【这句话可能难以理解,但接着往下看你就了然了】 2 修改nvm中settings.txt文件配置 nvm安装成功后,通常在该文件中会出现以下配置&…...

376. Wiggle Subsequence
376. Wiggle Subsequence 代码 class Solution { public:int wiggleMaxLength(vector<int>& nums) {int n nums.size();int res 1;int prediff 0;int curdiff 0;for(int i 0;i < n-1;i){curdiff nums[i1] - nums[i];if( (prediff > 0 && curdif…...

什么是库存周转?如何用进销存系统提高库存周转率?
你可能听说过这样一句话: “利润不是赚出来的,是管出来的。” 尤其是在制造业、批发零售、电商这类“货堆成山”的行业,很多企业看着销售不错,账上却没钱、利润也不见了,一翻库存才发现: 一堆卖不动的旧货…...
MVC 数据库
MVC 数据库 引言 在软件开发领域,Model-View-Controller(MVC)是一种流行的软件架构模式,它将应用程序分为三个核心组件:模型(Model)、视图(View)和控制器(Controller)。这种模式有助于提高代码的可维护性和可扩展性。本文将深入探讨MVC架构与数据库之间的关系,以…...
第25节 Node.js 断言测试
Node.js的assert模块主要用于编写程序的单元测试时使用,通过断言可以提早发现和排查出错误。 稳定性: 5 - 锁定 这个模块可用于应用的单元测试,通过 require(assert) 可以使用这个模块。 assert.fail(actual, expected, message, operator) 使用参数…...
sqlserver 根据指定字符 解析拼接字符串
DECLARE LotNo NVARCHAR(50)A,B,C DECLARE xml XML ( SELECT <x> REPLACE(LotNo, ,, </x><x>) </x> ) DECLARE ErrorCode NVARCHAR(50) -- 提取 XML 中的值 SELECT value x.value(., VARCHAR(MAX))…...
【HarmonyOS 5 开发速记】如何获取用户信息(头像/昵称/手机号)
1.获取 authorizationCode: 2.利用 authorizationCode 获取 accessToken:文档中心 3.获取手机:文档中心 4.获取昵称头像:文档中心 首先创建 request 若要获取手机号,scope必填 phone,permissions 必填 …...

AI书签管理工具开发全记录(十九):嵌入资源处理
1.前言 📝 在上一篇文章中,我们完成了书签的导入导出功能。本篇文章我们研究如何处理嵌入资源,方便后续将资源打包到一个可执行文件中。 2.embed介绍 🎯 Go 1.16 引入了革命性的 embed 包,彻底改变了静态资源管理的…...