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

八、快速入门Kubernetes之service

文章目录

      • Service
        • :one: VIP和Service代理
          • :star: 代理模式分类
          • 2、`iptables`代理模式
          • 3、`ipvs`代理模式
        • :two: `ClusterIP`
        • :three:实列Service
        • :four: `Headless Service`实列
        • :five: `NodePort`
        • :six: `LoadBalancer`
        • :seven: `ExternalName`

Service

⭐️ 概念:Kubernetes Service 定义了这样-种抽象: 一个Pod的逻辑分组, 一种可以访问它们的策略——通常称为微服务。这一组Pod 能够被Service 访问到,通常是通过Label Selector

image-20240505142344726

⭐️Service能够提供负载均衡的能力,但是在使用上有以下限制:只提供4层负载均衡能力,而没有7层功能,但有时我们可能需要更多的匹配规则来转发请求,这点上4层负载均衡是不支持的,也就是说不能通过我们的主机名和域名来进行负载均衡,所以说要配合ingress来实现7层负载均衡

⭐️ Service在k8s中有4种类型:

  • clusterIP:默认,就仅仅只分配集群内部的应该虚拟IP
  • NodePort:在ClusterIP的基础上,service为每个pod绑定上了对应端口,这样就可以通过访问对应端口来访问对应服务了。
  • LoadBalancer:在NodePort的基础上加上了云厂商提供的外部负载均衡服务器,并将请求转发到NodePort
  • ExternalName:把集群外部的服务引入到集群内部来,在集群内部直接使用。没有任何类型代理被创建,这只有kubernetes 1.7或更高版本的kube-dns才支持,也就是创建一个svc把外部集群的ip和端口号填入svcpod就可以直接访问svc来服务外部集群,假如集群变了,则只需要修改svc地址即可

image-20240505142406852


1️⃣ VIP和Service代理
  • Kubernetes集群中,每个Node运行一个kube-proxy 进程。kube-proxy 负责为Service 实现了一种VIP (虛拟IP)的形式,而不是 ExternalName的形式。在Kubernetes v1.0版本,代理完全在userspace.在Kubernetes v1.1版本,新增了iptables代理,但并不是默认的运行模式。从Kubernetes v1.2起,默认就是iptables代理。在Kubernetes v1.8.0-beta.0中,添加了ipvs代理
  • Kubernetes 1.14版本开始默认使用ipvs代理
  • Kubernetes v1.0版本,Service 是"4层”(TCP/UDP over IP)概念。Kubernetes v1.1版本,新增了Ingress API (beta 版),用来表示"7层”(HTTP)服务
⭐️ 代理模式分类

1、userspace代理模式

iptables规则来访问到kube-proxy在去访问serverPOD,你要访问就要经过kube-proxy,这样kube-porxy就负载很大,又要被监控写iptables规则又要做代理。

image-20240505143249190

2、iptables代理模式

是直接通过iptables规则来直接访问pod

image-20240505144328045

3、ipvs代理模式

⭐️ 是直接通过ipvs规则来直接访问pod这种模式,kube-proxy 会监视Kubernetes Service 对象和Endpoints ,调用netlink 接口以相应地创建ipvs规则并定期与Kubernetes Service 对象和Endpoints 对象同步ipvs规则,以确保ipvs状态与期望一致。访问服务时,流量将被重定向到其中-个后端Pod

⭐️ 与iptables类似,ipvsnetfilterhook功能,但使用哈希表作为底层数据结构并在内核空间中工作。这意味着ipvs可以更快地重定向流量,并且在同步代理规则时具有更好的性能。此外, ipvs 为负载均衡算法提供了更多选项,例如:

  1. rr : 轮询调度
  2. lc : 最小链接数
  3. dh : 目标哈希
  4. sh : 源哈希
  5. sed : 最短期望延迟
  6. nq: 不排队调度

假如上面这几项又一项未达到那么还是继续使用的iptables规则

image-20240505144525965


2️⃣ ClusterIP

⭐️ clusterlP主要在每个node节点使用iptables,将发向clusterIP对应端口的数据,转发到kube-proxy中。然后kube-proxy自己内部实现有负载均衡的方法,并可以查询到这个service下对应pod的地址和端口,进而把数据转发给对应的pod的地址和端口

⭐️ 这里是由你的环境决定的你的环境是ipvsclusterIP就是使用的ipvs

image-20240505144646122

⚠️ 为了实现图上的功能,主要需要以下几个组件的协同工作:

  • apiserver 用户通过kubectl命令向apiserver发送创建service的命令,apiserver接收到请求后将数据存储到etcd中
  • kube-proxy kubernetes的每个节点中都有-一个叫做kube-porxy的进程,这个进程负责感知service,pod的变化,并将变化的信息写入本地的iptables规则中
  • iptables/ipvs使用NAT等技术将virtuallP的流量转至endpoint


3️⃣实列Service

1)创建pod

[root@master ~]# vim pod/svc-deploypod.yamlapiVersion: extensions/v1beta1
kind: Deployment
metadata:name: svc-nginx-deploymentlabels:app: nginx
spec:replicas: 3selector:matchLabels:app: webappversion: v1template:metadata:name: nginxlabels:app: webappversion: v1spec:containers:- name: webappimage: harbor.tanc.com/library/nginximagePullPolicy: IfNotPresentports:- containerPort: 80name: httpprotocol: TCP

2)查看pod和deployment

[root@master ~]# kubectl get deploy
NAME                   READY   UP-TO-DATE   AVAILABLE   AGE
svc-nginx-deployment   3/3     3            3           7m55s[root@master ~]# kubectl get pod
NAME                                   READY   STATUS    RESTARTS   AGE
svc-nginx-deployment-9bf97bf55-54tj4   1/1     Running   0          7m57s
svc-nginx-deployment-9bf97bf55-mx7sk   1/1     Running   0          7m57s
svc-nginx-deployment-9bf97bf55-rljqn   1/1     Running   0          7m57s

3)我们现在是可以用默认的svc来访问到pod

 [root@master ~]# kubectl get svc
NAME         TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
kubernetes   ClusterIP   10.96.0.1    <none>        443/TCP   22h

4)我们查看一下ipvs

[root@master ~]# ipvsadm -ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags-> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  10.96.0.1:443 rr-> 192.168.100.10:6443          Masq    1      3          0         
TCP  10.96.0.10:53 rr-> 10.244.0.2:53                Masq    1      0          0         -> 10.244.0.3:53                Masq    1      0          0         
TCP  10.96.0.10:9153 rr-> 10.244.0.2:9153              Masq    1      0          0         -> 10.244.0.3:9153              Masq    1      0          0         
UDP  10.96.0.10:53 rr-> 10.244.0.2:53                Masq    1      0          0         -> 10.244.0.3:53                Masq    1      0          0         

5)在查看一下pod ip,可以看到ipvs内并没有映射pod

[root@master ~]# kubectl get pod -o wide
NAME                                   READY   STATUS    RESTARTS   AGE     IP            NODE    NOMINATED NODE   READINESS GATES
svc-nginx-deployment-9bf97bf55-54tj4   1/1     Running   0          9m49s   10.244.2.34   node2   <none>           <none>
svc-nginx-deployment-9bf97bf55-mx7sk   1/1     Running   0          9m49s   10.244.1.45   node1   <none>           <none>
svc-nginx-deployment-9bf97bf55-rljqn   1/1     Running   0          9m49s   10.244.1.44   node1   <none>           <none>

6)创建svc

[root@master ~]# vim pod/svc.yaml apiVersion: v1
kind: Service
metadata:name: svc-nginxlabels:app: webappversion: v1
spec:type: ClusterIPselector:app: webappversion: v1ports:- port: 80targetPort: 80

创建后查看

[root@master ~]# kubectl get svc
NAME         TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)   AGE
kubernetes   ClusterIP   10.96.0.1     <none>        443/TCP   22h
svc-nginx    ClusterIP   10.109.8.90   <none>        80/TCP    56s

查看ipvs

[root@master ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags-> RemoteAddress:Port           Forward Weight ActiveConn InActConnTCP  10.109.8.90:80 rr-> 10.244.1.44:80               Masq    1      0          0         -> 10.244.1.45:80               Masq    1      0          0         -> 10.244.2.34:80               Masq    1      0          0         xxxxxxxxxx8 1[root@master ~]# ipvsadm -Ln2IP Virtual Server version 1.2.1 (size=4096)3Prot LocalAddress:Port Scheduler Flags4  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn5  TCP  10.109.8.90:80 rr6  -> 10.244.1.44:80               Masq    1      0          0         7  -> 10.244.1.45:80               Masq    1      0          0         8  -> 10.244.2.34:80               Masq    1      0          0         
  1. 访问
[root@master ~]# curl -L 10.109.8.90
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>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️⃣ Headless Service实列

⭐️ 有时你不想要负载均衡,以及单独的Service IP,遇到这种情况、可以通过指定ClusterIP的值为“None” 来创建Headless Service。这类Service并不会分配Cluster IPKube-proxy不会处理它们,而且平台也不会为它们进行负载均衡和路由,可以通过它来解决hostnameip变化的问题。

1)创建svc

[root@master ~]# cat pod/hd.yaml 
apiVersion: v1
kind: Service
metadata:name: nginx-headless
spec:type: ClusterIPclusterIP: Noneselector:app: webappversion: v1ports:- name: nginxport: 80targetPort: 80protocol: TCP

2)查看svc,我们可以看见是没有ip地址的我们用DNS解析一下svc

[root@master ~]# kubectl get svc
NAME             TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)   AGE
kubernetes       ClusterIP   10.96.0.1     <none>        443/TCP   23h
nginx-headless   ClusterIP   None          <none>        80/TCP    17s
svc-nginx        ClusterIP   10.109.8.90   <none>        80/TCP    37m

pod是可以同时连接多个svc

这个域名是svc名+命名空间名+svc+cluster.local

[root@master ~]# dig -t A svc-nginx.default.svc.cluster.local. @10.244.0.2; <<>> DiG 9.11.4-P2-RedHat-9.11.4-26.P2.el7_9.5 <<>> -t A svc-nginx.default.svc.cluster.local. @10.244.0.2
;; 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: 35197
;; flags: qr aa rd; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
;; WARNING: recursion requested but not available;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;svc-nginx.default.svc.cluster.local. IN	A;; ANSWER SECTION:
svc-nginx.default.svc.cluster.local. 30	IN A	10.109.8.90;; Query time: 0 msec
;; SERVER: 10.244.0.2#53(10.244.0.2)
;; WHEN: Sat Aug 21 04:26:55 EDT 2021
;; MSG SIZE  rcvd: 115

3)解析一下无头服务,可以看见podip地址直接被解析出来了

[root@master ~]# dig -t A nginx-headless.default.svc.cluster.local. @10.244.0.2; <<>> DiG 9.11.4-P2-RedHat-9.11.4-26.P2.el7_9.5 <<>> -t A nginx-headless.default.svc.cluster.local. @10.244.0.2
;; 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: 29123
;; flags: qr aa rd; QUERY: 1, ANSWER: 3, AUTHORITY: 0, ADDITIONAL: 1
;; WARNING: recursion requested but not available;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;nginx-headless.default.svc.cluster.local. IN A;; ANSWER SECTION:
nginx-headless.default.svc.cluster.local. 30 IN	A 10.244.1.45
nginx-headless.default.svc.cluster.local. 30 IN	A 10.244.2.34
nginx-headless.default.svc.cluster.local. 30 IN	A 10.244.1.44;; Query time: 0 msec
;; SERVER: 10.244.0.2#53(10.244.0.2)
;; WHEN: Sat Aug 21 04:29:08 EDT 2021
;; MSG SIZE  rcvd: 237

5️⃣ NodePort

⭐️ nodePort的原理在于在node上开了一个端口, 将向该端口的流量导入到kube-proxy,然后由kube-proxy进一步到给对应的pod,也就是说它会在你的node节点上随机生成一个端口来映射service的端口

1)创建svc

[root@master ~]# cat pod/nodeport.yaml 
apiVersion: v1
kind: Service
metadata:name: nginx-nodeportlabels:app: nodeport
spec:type: NodePortselector:app: webappversion: v1ports:- port: 80targetPort: 80

2)查看svc可以看见80:30664

[root@master ~]# kubectl get svc
NAME             TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE
kubernetes       ClusterIP   10.96.0.1        <none>        443/TCP        24h
nginx-headless   ClusterIP   None             <none>        80/TCP         49m
nginx-nodeport   NodePort    10.108.196.116   <none>        80:30664/TCP   5s
svc-nginx        ClusterIP   10.109.8.90      <none>        80/TCP         86m

3)打开浏览器访问–只要是集群的ip都可以

image-20240505150307959

4)查看ipvs

[root@master ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags-> RemoteAddress:Port           Forward Weight ActiveConn InActConnTCP  192.168.100.10:30664 rr-> 10.244.1.44:80               Masq    1      0          0         -> 10.244.1.45:80               Masq    1      0          0         -> 10.244.2.34:80               Masq    1      1          0  

6️⃣ LoadBalancer

⭐️ loadBalancernodePort其实是同一种方式。区别在于loadBalancernodePort多了一步,就是可以调用cloud provider去创建LB来向节点导流,但是前提是就是pod是在云服务器上

image-20240505150406491


7️⃣ ExternalName

⭐️这种类型的Service通过返回CNAME和它的值,可以将服务映射到externalName字段的内容(例如:hub.atguigu.com )。ExternalName ServiceService的特例,它没有selector,也没有定义任何的端口和Endpoint。相反的,对于运行在集群外部的服务,它通过返回该外部服务的别名这种方式来提供服务

⭐️当查询主机my-service.defalut.svc.cluster.local ( SVC_NAME.NAMESPACE.svc.cluster.local )时,集群的DNS服务将返回-一个值my.database.example.comCNAME记录。访问这个服务的工作方式和其他的相

同,唯一不同的是重定向发生在DNS层,而且不会进行代理或转发

相关文章:

八、快速入门Kubernetes之service

文章目录 Service:one: VIP和Service代理:star: 代理模式分类2、iptables代理模式3、ipvs代理模式 :two: ClusterIP:three:实列Service:four: Headless Service实列:five: NodePort:six: LoadBalancer:seven: ExternalName Service ⭐️ 概念&#xff1a;Kubernetes Service 定…...

JVM 类加载机制详解

JVM 类加载机制详解 在 Java 虚拟机&#xff08;JVM&#xff09;中&#xff0c;类加载机制是一个非常重要的组成部分&#xff0c;它负责将类的字节码文件加载到内存中&#xff0c;并进行一系列的处理&#xff0c;最终使类能够被虚拟机使用。本文将详细介绍 JVM 类加载机制的相…...

在 JavaScript 中,`Array.prototype.filter` 方法用于创建一个新数组,该数组包含通过测试的所有元素

文章目录 1、概念在你的代码中的作用示例总结 2、实战3、formattedProducts4、filteredProducts 1、概念 在 JavaScript 中&#xff0c;Array.prototype.filter 方法用于创建一个新数组&#xff0c;该数组包含通过测试的所有元素。具体来说&#xff0c;filter 方法会遍历数组中…...

63 mysql 的 行锁

前言 我们这里来说的就是 我们在 mysql 这边常见的 几种锁 行共享锁, 行排他锁, 表意向共享锁, 表意向排他锁, 表共享锁, 表排他锁 意向共享锁, 意向排他锁, 主要是 为了表粒度的锁获取的同步判断, 提升效率 意向共享锁, 意向排他锁 这边主要的逻辑意义是数据表中是否有任…...

ubuntu文件编辑操作

Vim 基本操作指南 在 vim 中打开文件后&#xff0c;可以按照以下步骤进行编辑和保存&#xff1a; 进入插入模式 打开文件后&#xff0c;默认情况下 vim 处于命令模式&#xff0c;无法直接输入文本。按下 i 键进入插入模式&#xff08;会看到左下角显示 -- INSERT --&#xff0…...

Nuxt.js 应用中的 nitro:config 事件钩子详解

title: Nuxt.js 应用中的 nitro:config 事件钩子详解 date: 2024/11/2 updated: 2024/11/2 author: cmdragon excerpt: nitro:config 是 Nuxt 3 中的一个生命周期钩子,允许开发者在初始化 Nitro 之前自定义 Nitro 的配置。Nitro 是 Nuxt 3 的服务器引擎,负责处理请求、渲…...

【前端】项目中遇到的问题汇总(长期更新)

一、联调交互类 1、出现一个数据在当前页面进行了修改&#xff0c;另外一个页面的同一数据并未同步更改 当前的数据经过调用接口修改更新以后&#xff0c;if(code 200) 将当前数据存入store.dispatch, 然后另一个地方获取该数据&#xff0c;直接获取存入的数据&#xff0c;这…...

DAY73WEB 攻防-支付逻辑篇篡改属性值并发签约越权盗用算法溢出替换对冲

知识点&#xff1a; 1、支付逻辑-商品本身-修改-数量&价格&属性等 2、支付逻辑-营销折扣-优惠券&积分&签约&试用等 3、支付逻辑-订单接口-替换&并发&状态值&越权支付等 支付逻辑常见测试&#xff1a; 熟悉常见支付流程&#xff1a;选择商品…...

2024 Rust现代实用教程:Ownership与结构体、枚举

文章目录 一、Rust的内存管理模型1.GC&#xff08;Stop the world&#xff09;2.C/C内存错误大全3.Rust的内存管理模型 二、String与&str1.String与&str如何选择2.Example 三、枚举与匹配模式1.常见的枚举类型&#xff1a;Option和Result2.匹配模式 四、结构体、方法、…...

MMed-RAG:专为医学视觉语言模型设计的多功能多模态系统

MMed-RAG&#xff1a;专为医学视觉语言模型设计的多功能多模态系统 论文大纲提出背景全流程优化空雨伞分析空&#xff1a;观察现象层雨&#xff1a;分析原因层伞&#xff1a;解决方案层 三问分析WHAT - 问题是什么&#xff1f;WHY - 原因是什么&#xff1f;HOW - 如何解决&…...

数据采集(全量采集和增量采集)

全量采集&#xff1a;采集全部数据 3、全量采集 vim students_all.json {"job": {"setting": {"speed": {"channel": 1},"errorLimit": {"record": 0,"percentage": 0.02}},"content": [{…...

GPT-Sovits-1-数据处理

1.1 切割音频 将音频切割为多个10s内的片段 1.2 降噪 这一步用的是modelscope的pipeline 如果要去除背景音&#xff0c;可以用傅立叶转为为频谱&#xff0c;去除低频部分后再转回来 1.3 提取音频特征 这里用到了 funasr 库 这一步目的是输出音频样本的《文本标签文件》&am…...

web前端多媒体标签设置(图片,视频,音频)以及图片热区(usemap)的设置

多媒体标签运用 在HTML中有以下常见多媒体标签&#xff1a; <img> &#xff08;图像标签&#xff09; - 作用&#xff1a;用于在网页中嵌入图像。 - 示例&#xff1a; <img src"image.jpg" alt"这是一张图片"> 。其中 src 属性指定图像的…...

尚硅谷react教程_扩展_stateHook

1.类式组件写 import React, {Component} from react;export default class Demo extends Component {state {count:0}add () > {this.setState(state>({count:state.count1}))}render() {return (<div><h2>当前求和为{this.state.count}</h2><b…...

专线物流公共服务平台:数据驱动,标准引领,共创金融双赢新时代

专线物流公共服务平台&#xff1a;数据驱动&#xff0c;标准引领&#xff0c;共创金融双赢新时代 在当今这个数据驱动、标准引领、金融赋能的经济发展新时代&#xff0c;专线物流作为商贸流通领域的重要一环&#xff0c;正面临着前所未有的机遇与挑战。为应对复杂多变的市场环…...

界面控件DevExpress JS ASP.NET Core v24.1亮点 - 支持Angular 18

DevExtreme拥有高性能的HTML5 / JavaScript小部件集合&#xff0c;使您可以利用现代Web开发堆栈&#xff08;包括React&#xff0c;Angular&#xff0c;ASP.NET Core&#xff0c;jQuery&#xff0c;Knockout等&#xff09;构建交互式的Web应用程序。从Angular和Reac&#xff0c…...

Spring之依赖注入(DI)和控制反转(IoC)——配置文件、纯注解

依赖注入 依赖注入(Dependency Injection&#xff0c;简称 DI)与控制反转(loC)的含义相同&#xff0c;只不过这两 个称呼是从两个角度描述的同一个概念。对于一个 Spring 初学者来说&#xff0c;这两种称呼很难理解, 下面我们将通过简单的语言来描述这两个概念。 当Java对象&…...

基于SpringBoot的宠物健康咨询系统的设计与实现

摘 要 传统信息的管理大部分依赖于管理人员的手工登记与管理&#xff0c;然而&#xff0c;随着近些年信息技术的迅猛发展&#xff0c;让许多比较老套的信息管理模式进行了更新迭代&#xff0c;宠物健康知识信息因为其管理内容繁杂&#xff0c;管理数量繁多导致手工进行处理不…...

Lucene的使用方法与Luke工具(2)

文章目录 第2章 Lucene快速入门2.1 项目搭建2.1.1 SQL语句2.1.2 maven依赖2.1.3 实体类&#xff1a;2.1.4 编写DAO&#xff1a; 2.2 建立索引2.2.1 步骤&#xff1a;2.2.2 实现代码&#xff1a; 2.3 Luke工具2.3.1 运行界面介绍&#xff1a;1&#xff09;主界面2&#xff09;文…...

【客户端开发】electron 中无法使用 js-cookie 的问题

产生问题的原因 谷歌浏览器升级之后&#xff0c;出于安全考虑&#xff0c;cookie的SameSite属性默认值由None变为Lax&#xff0c;对于跨域的请求&#xff0c;禁止携带cookie。electron内核是chromium内核,所以也会有这个限制。 Cookie的SameSite属性用来限制第三方 Cookie&…...

FFmpeg 低延迟同屏方案

引言 在实时互动需求激增的当下&#xff0c;无论是在线教育中的师生同屏演示、远程办公的屏幕共享协作&#xff0c;还是游戏直播的画面实时传输&#xff0c;低延迟同屏已成为保障用户体验的核心指标。FFmpeg 作为一款功能强大的多媒体框架&#xff0c;凭借其灵活的编解码、数据…...

【入坑系列】TiDB 强制索引在不同库下不生效问题

文章目录 背景SQL 优化情况线上SQL运行情况分析怀疑1:执行计划绑定问题?尝试:SHOW WARNINGS 查看警告探索 TiDB 的 USE_INDEX 写法Hint 不生效问题排查解决参考背景 项目中使用 TiDB 数据库,并对 SQL 进行优化了,添加了强制索引。 UAT 环境已经生效,但 PROD 环境强制索…...

Debian系统简介

目录 Debian系统介绍 Debian版本介绍 Debian软件源介绍 软件包管理工具dpkg dpkg核心指令详解 安装软件包 卸载软件包 查询软件包状态 验证软件包完整性 手动处理依赖关系 dpkg vs apt Debian系统介绍 Debian 和 Ubuntu 都是基于 Debian内核 的 Linux 发行版&#xff…...

多场景 OkHttpClient 管理器 - Android 网络通信解决方案

下面是一个完整的 Android 实现&#xff0c;展示如何创建和管理多个 OkHttpClient 实例&#xff0c;分别用于长连接、普通 HTTP 请求和文件下载场景。 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas…...

Mybatis逆向工程,动态创建实体类、条件扩展类、Mapper接口、Mapper.xml映射文件

今天呢&#xff0c;博主的学习进度也是步入了Java Mybatis 框架&#xff0c;目前正在逐步杨帆旗航。 那么接下来就给大家出一期有关 Mybatis 逆向工程的教学&#xff0c;希望能对大家有所帮助&#xff0c;也特别欢迎大家指点不足之处&#xff0c;小生很乐意接受正确的建议&…...

前端导出带有合并单元格的列表

// 导出async function exportExcel(fileName "共识调整.xlsx") {// 所有数据const exportData await getAllMainData();// 表头内容let fitstTitleList [];const secondTitleList [];allColumns.value.forEach(column > {if (!column.children) {fitstTitleL…...

如何在看板中有效管理突发紧急任务

在看板中有效管理突发紧急任务需要&#xff1a;设立专门的紧急任务通道、重新调整任务优先级、保持适度的WIP&#xff08;Work-in-Progress&#xff09;弹性、优化任务处理流程、提高团队应对突发情况的敏捷性。其中&#xff0c;设立专门的紧急任务通道尤为重要&#xff0c;这能…...

【JavaWeb】Docker项目部署

引言 之前学习了Linux操作系统的常见命令&#xff0c;在Linux上安装软件&#xff0c;以及如何在Linux上部署一个单体项目&#xff0c;大多数同学都会有相同的感受&#xff0c;那就是麻烦。 核心体现在三点&#xff1a; 命令太多了&#xff0c;记不住 软件安装包名字复杂&…...

pikachu靶场通关笔记22-1 SQL注入05-1-insert注入(报错法)

目录 一、SQL注入 二、insert注入 三、报错型注入 四、updatexml函数 五、源码审计 六、insert渗透实战 1、渗透准备 2、获取数据库名database 3、获取表名table 4、获取列名column 5、获取字段 本系列为通过《pikachu靶场通关笔记》的SQL注入关卡(共10关&#xff0…...

代码随想录刷题day30

1、零钱兑换II 给你一个整数数组 coins 表示不同面额的硬币&#xff0c;另给一个整数 amount 表示总金额。 请你计算并返回可以凑成总金额的硬币组合数。如果任何硬币组合都无法凑出总金额&#xff0c;返回 0 。 假设每一种面额的硬币有无限个。 题目数据保证结果符合 32 位带…...