k8s之Ingress

news2024/11/11 5:46:39

Ingress和Ingress控制器介绍

Ingress官方文档:https://kubernetes.io/zh-cn/docs/concepts/services-networking/ingress/
Ingress控制器官方文档:https://kubernetes.io/zh-cn/docs/concepts/services-networking/ingress-controllers/

在k8s中将一个服务暴露出去通常会使用NodePort或LoadBalancer类型的Service,但随着服务数量的增多,使用NodePort会存在一些问题,可用作NodePort的端口是一个有限的范围,不容易记忆,不好管理。另外, 如果在公有云使用LoadBalancer类型的Service上会产生额外的成本。

所以k8s提供了另一种方式,使用Ingress和Ingress控制器来对外暴露服务,Ingress控制器作为统一的流量入口,管理内部各种必要的服务,并通过Ingress资源来描述如何区分流量及内部的路由逻辑。有了Ingress和Ingress控制器,就可以通过定义路由流量的规则来实现服务发布,而无需创建NodePort或LoadBalancer类型的Service,并且流量也会由Ingress控制器直达Pod,不需要再由Service转发。

简单来说,Ingress资源就是基于HTTP虚拟主机或URL路径的流量转发规则(类似于nginx中的虚拟主机定义或location转发规则定义),它把需要暴露给集群外的每个Service对象,映射为Ingress控制器上的一个虚拟主机或某虚拟主机的一个URL路径。如下图所示:
在这里插入图片描述

但Ingress资源本身只是一组路由规则定义,这些规则想要真正的生效还需要借助其它功能的辅助,例如监听某套接字、根据路由规则匹配机制将客户端请求进行转发等。实现这些功能的组件就是Ingress控制器(Ingress Controller)。Ingress Controller是Kubernetes的一个附件需要单独部署。

Ingress Controller部署

目前可选择使用的Ingress控制器有很多,可以参考官方介绍:https://kubernetes.io/zh-cn/docs/concepts/services-networking/ingress-controllers/ ,下面以nginx Ingress控制器为例进行部署。

nginx Ingress控制器github地址:https://github.com/kubernetes/ingress-nginx
nginx Ingress控制器官方文档:https://kubernetes.github.io/ingress-nginx/

常用的的Ingress控制器部署方式有两种:

  1. 以Deployment方式部署Ingress控制器Pod资源,通过NodePort或LoadBalancer类型的Service或者通过拥有外部IP地址(externalIP)的Service对象为其接入集群外部的客户端请求流量。这意味着,在生产环境以这种方式部署一个Ingress控制器时,必须在其前端定义一个负载均衡器,这个负载均衡器可以是LoadBalancer类型的Service,也可以是用户自行管理的负载均衡器。
    在这里插入图片描述

  2. 以DaemonSet方式部署Ingress控制器Pod资源,Ingress控制器的各Pod分别以单一实例的方式运行在集群的所有节点或部分专用节点之上,并配置这些Pod对象以hostPort或hostNetwork的方式在当前节点接入外部流量。在这种方式下,前端还是需要一个负载均衡器,作为客户端流量的统一入口,然后转发给Ingress控制器Pod
    在这里插入图片描述

在nginx Ingress控制器官方提供的部署文件中,默认使用第一种方式,使用Deployment+NodePort Service来部署。

Deployment方式部署

选定好版本,下载对应的部署文件

wget https://github.com/kubernetes/ingress-nginx/archive/refs/tags/controller-v1.3.1.tar.gz
tar xvf controller-v1.3.1.tar.gz
cd ingress-nginx-controller-v1.3.1/deploy/static/provider/baremetal/
#修改当前目录下的deploy.yaml,将镜像修改未国内镜像源
cat deploy.yaml |grep image
        image: registry.cn-hangzhou.aliyuncs.com/google_containers/nginx-ingress-controller:v1.3.1
        imagePullPolicy: IfNotPresent
        image: registry.cn-hangzhou.aliyuncs.com/google_containers/kube-webhook-certgen:v1.3.0
        imagePullPolicy: IfNotPresent
        image: registry.cn-hangzhou.aliyuncs.com/google_containers/kube-webhook-certgen:v1.3.0
        imagePullPolicy: IfNotPresent

kubectl apply -f deploy.yaml

部署完成后,查看相关资源状态
在这里插入图片描述
默认情况下,ingress-nginx-controller只有一个副本,可以按需调整

在负载均衡器中添加ingress-nginx-controller后端,以haproxy为例

cat /etc/haproxy/harpoxy.cfg
#################################
listen ingress-nginx-controller-80
       bind 192.168.211.15:80
       option  tcplog
       mode tcp
       balance source
       server ingress-controller-server1 192.168.211.11:31303 check inter 2000 fall 3 rise 5
       server ingress-controller-server2 192.168.211.12:31303 check inter 2000 fall 3 rise 5

listen ingress-nginx-controller-443
       bind 192.168.211.15:443
       option  tcplog
       mode tcp
       balance source
       server ingress-controller-server1 192.168.211.11:30964 check inter 2000 fall 3 rise 5
       server ingress-controller-server2 192.168.211.12:30964 check inter 2000 fall 3 rise 5
###########################
systemctl restart haproxy

DaemonSet方式部署

对前面的deploy.yaml进行修改,主要修改3个配置

  1. 删除掉ingress-ingress-controller Service资源定义
  2. 将Deployment修改未DaemonSet
  3. 配置Pod使用hostNetwork和hostPID
apiVersion: apps/v1
kind: DaemonSet		#类型修改为DaemonSet
metadata:
  labels:
    app.kubernetes.io/component: controller
    app.kubernetes.io/instance: ingress-nginx
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/part-of: ingress-nginx
    app.kubernetes.io/version: 1.3.1
  name: ingress-nginx-controller
  namespace: ingress-nginx
spec:
  minReadySeconds: 0
  revisionHistoryLimit: 10
  selector:
    matchLabels:
      app.kubernetes.io/component: controller
      app.kubernetes.io/instance: ingress-nginx
      app.kubernetes.io/name: ingress-nginx
  template:
    metadata:
      labels:
        app.kubernetes.io/component: controller
        app.kubernetes.io/instance: ingress-nginx
        app.kubernetes.io/name: ingress-nginx
    spec:
      hostPID: true		#Pod使用主机PID名称空间
      hostNetwork: true	#Pod使用主机网络
      containers:
      .......

修改完成后将资源部署到集群上,等待部署完成后,查看相关资源状态
在这里插入图片描述
同样的,也需要在负载均衡器中添加ingress-nginx-controller后端,以haproxy为例

cat /etc/haproxy/haproxy.cfg
#############################
listen ingress-nginx-controller-80
       bind 192.168.211.15:80
       option  tcplog
       mode tcp
       balance source
       server ingress-controller-server1 192.168.211.11:80 check inter 2000 fall 3 rise 5
       server ingress-controller-server2 192.168.211.12:80 check inter 2000 fall 3 rise 5

listen ingress-nginx-controller-443
       bind 192.168.211.15:443
       option  tcplog
       mode tcp
       balance source
       server ingress-controller-server1 192.168.211.11:443 check inter 2000 fall 3 rise 5
       server ingress-controller-server2 192.168.211.12:443 check inter 2000 fall 3 rise 5
################################
systemctl restart haproxy

Ingress示例

Ingress资源规范

Ingress资源的可用字段和含义如下:

apiVersion: networkking.k8s.io/v1
kind: Ingress
metadata:
  name: ...
  namespace: ...
  annotations: 	#资源注解
    kubernetes.io/ingress.class: <string>	#指明此Ingress资源由哪个Ingress控制器来解析,目前也可以使用spec.ingressClassName字段代替
spec:
  rules:	#Ingress路由规则列表
  - host: <string>	#虚拟主机的域名,支持*前缀匹配,但不支持IP,不支持端口
    http:
      paths:	#虚拟主机的PATH路径列表,由path和backend组成
      - path: <string>	#流量匹配的HTTP URL路径,必须以/开头
        pathType: <string>	#URL路径匹配方式,支持Exact(精准匹配)、Prefix(前缀匹配)和ImplementationSpecific,详细介绍可以参考官网文档
        backend:	#匹配到的流量要转发到的后端定义
          service:	#后端关联的Service对象定义
            name: <string>	#Service对象名称
            port:	#Service对象端口
              number: <int>		#端口号
              name: <string>	#端口名称
  tls:	#tls配置,用于指定上边rules字段下哪些host需要使用https
  - hosts: <[]string>	#使用同一组证书的主机名称列表
    secretName: <string>	#保存证书的Secret资源名称
  defaultBackend: <Object>	#默认后端定义,可嵌套使用字段与上面的backend字段相同
  ingressClassName: <string>	#ingressClass资源名称,作用类似于上面的注解信息,用于指定适配的Ingress控制器

先创建一下资源,用于测试Ingress功能,部署文件如下,包含两个tomcat-pod和两个对应的Service:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: tomcat-app1
spec:
  replicas: 1
  selector:
    matchLabels:
      app: tomcat-app1
  template:
    metadata:
      labels:
        app: tomcat-app1
    spec:
      containers:
      - name: tomcat
        image: tomcat:10.1.2
        ports:
        - name: http
          containerPort: 8080

---
apiVersion: v1
kind: Service
metadata:
  name: tomcat-app1-svc
spec:
  selector:
    app: tomcat-app1
  ports:
  - name: http
    port: 8080
    targetPort: 8080
    protocol: TCP

---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: tomcat-app2
spec:
  replicas: 1
  selector:
    matchLabels:
      app: tomcat-app2
  template:
    metadata:
      labels:
        app: tomcat-app2
    spec:
      containers:
      - name: tomcat
        image: tomcat:10.1.2
        ports:
        - name: http
          containerPort: 8080

---
apiVersion: v1
kind: Service
metadata:
  name: tomcat-app2-svc
spec:
  selector:
    app: tomcat-app2
  ports:
  - name: http
    port: 8080
    targetPort: 8080
    protocol: TCP

在这里插入图片描述
pod创建成功后 exec到里面创建一个测试页面
在这里插入图片描述
在这里插入图片描述

单域名Ingress资源

将访问www.linux.io域名的流量转发至tomcat-app1-svc,Ingress部署文件如下:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: ingress-tomcat-app1
  annotations:
    kubernetes.io/ingress.class: "nginx"   #指定由哪个Ingress Controller解析
    nginx.ingress.kubernetes.io/use-regex: "true" ##指定后面rules定义的path可以使用正则表达式
    nginx.ingress.kubernetes.io/proxy-connect-timeout: "600" ##连接超时时间,默认为5s
    nginx.ingress.kubernetes.io/proxy-send-timeout: "600" ##后端服务器回转数据超时时间,默认为60s
    nginx.ingress.kubernetes.io/proxy-read-timeout: "600" ##后端服务器响应超时时间,默认为60s
    nginx.ingress.kubernetes.io/proxy-body-size: "50m" ##客户端上传文件,最大大小,默认为20m
    #nginx.ingress.kubernetes.io/rewrite-target: / ##URL重写
    nginx.ingress.kubernetes.io/app-root: /index.html
spec:
  rules:
  - host: www.linux.io
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: tomcat-app1-svc
            port:
              number: 8080

查看Ingress资源详情
在这里插入图片描述
访问测试,在windows上添加域名解析,然后访问www.linux.io测试
在这里插入图片描述
在这里插入图片描述
测试结果正确,删除Ingres资源

多域名Ingress资源

将访问www.linux.io域名的流量转发至tomcat-app1-svc,访问www.ubuntu.io域名的流量转发至tomcat-app2-svc,Ingress部署文件如下:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: ingress-tomcat-app
  annotations:
    kubernetes.io/ingress.class: "nginx"
    nginx.ingress.kubernetes.io/use-regex: "true"
    nginx.ingress.kubernetes.io/proxy-connect-timeout: "600"
    nginx.ingress.kubernetes.io/proxy-send-timeout: "600"
    nginx.ingress.kubernetes.io/proxy-read-timeout: "600"
    nginx.ingress.kubernetes.io/proxy-body-size: "50m"
    #nginx.ingress.kubernetes.io/rewrite-target: /
    nginx.ingress.kubernetes.io/app-root: /index.html
spec:
  rules:
  - host: www.linux.io
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: tomcat-app1-svc
            port:
              number: 8080
  - host: www.ubuntu.io
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: tomcat-app2-svc
            port:
              number: 8080

创建之后查看Ingress资源
在这里插入图片描述

windows上添加域名解析,然后访问测试
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
测试结果正确,删除Ingress资源

基于URL的 Ingress资源

将访问www.linux.io/app1的流量转发至tomcat-app1-svc,将访问www.linux.io/app2的流量转发至tomcat-app2-svc,Ingress部署文件如下:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: ingress-url-demo
  annotations:
    kubernetes.io/ingress.class: "nginx"
    nginx.ingress.kubernetes.io/use-regex: "true"
    nginx.ingress.kubernetes.io/proxy-connect-timeout: "600"
    nginx.ingress.kubernetes.io/proxy-send-timeout: "600"
    nginx.ingress.kubernetes.io/proxy-read-timeout: "600"
    nginx.ingress.kubernetes.io/proxy-body-size: "50m"
    #nginx.ingress.kubernetes.io/rewrite-target: /
    nginx.ingress.kubernetes.io/app-root: /index.html
spec:
  rules:
  - host: www.linux.io
    http:
      paths:
      - path: /app1
        pathType: Prefix
        backend:
          service:
            name: tomcat-app1-svc
            port:
              number: 8080
      - path: /app2
        pathType: Prefix
        backend:
          service:
            name: tomcat-app2-svc
            port:
              number: 8080

在这里插入图片描述

访问测试
在这里插入图片描述
在这里插入图片描述

使用https 的Ingress资源

首先准备www.linux.io域名的证书,然后将证书保存为Secret

mkdir ingress-cert && cd ingress-cert
openssl genrsa -out ca.key 4096
openssl req -x509 -new -nodes -sha512 -days 100 \
 -subj "/C=CN/ST=Beijing/L=Beijing/O=example/OU=Personal/CN=linux.io" \
 -key ca.key \
 -out ca.crt
openssl genrsa -out www.linux.io.key 4096
openssl req -sha512 -new \
    -subj "/C=CN/ST=Beijing/L=Beijing/O=example/OU=Personal/CN=www.linux.io" \
    -key www.linux.io.key \
    -out www.linux.io.csr
openssl x509 -req -sha512 -days 3650 \
    -CA ca.crt -CAkey ca.key -CAcreateserial \
    -in www.linux.io.csr \
    -out www.linux.io.crt
rm -f www.linux.io.csr
kubectl create secret   tls www.linux.io --cert ./www.linux.io.crt --key ./www.linux.io.key

在这里插入图片描述

Ingress部署文件如下

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: ingress-url-demo
  annotations:
    kubernetes.io/ingress.class: "nginx"
    nginx.ingress.kubernetes.io/use-regex: "true"
    nginx.ingress.kubernetes.io/proxy-connect-timeout: "600"
    nginx.ingress.kubernetes.io/proxy-send-timeout: "600"
    nginx.ingress.kubernetes.io/proxy-read-timeout: "600"
    nginx.ingress.kubernetes.io/proxy-body-size: "50m"
    #nginx.ingress.kubernetes.io/rewrite-target: /
    nginx.ingress.kubernetes.io/app-root: /index.html
spec:
  rules:
  - host: www.linux.io
    http:
      paths:
      - path: /app1
        pathType: Prefix
        backend:
          service:
            name: tomcat-app1-svc
            port:
              number: 8080
      - path: /app2
        pathType: Prefix
        backend:
          service:
            name: tomcat-app2-svc
            port:
              number: 8080
  tls:	#如果多个域名都使用https,再添加一个列表项即可
  - hosts: ["www.linux.io"]		#如果多个域名使用相同的证书,在这里的列表添加一个域名即可
    secretName: www.linux.io

访问测试
在这里插入图片描述

https证书更新

假设网站的https证书即将过期,在不影响业务的前提下,可以直接更新其引用的Secret中保存的证书来实现网站https证书更新。在生产环境需要提前做好计划,并选择合适时间执行。

首先重新签发一套证书

openssl genrsa -out www.linux.io-new.key 4096
openssl req -sha512 -new \
    -subj "/C=CN/ST=Beijing/L=Beijing/O=example/OU=Personal/CN=www.linux.io" \
    -key www.linux.io-new.key \
    -out www.linux.io-new.csr
openssl x509 -req -sha512 -days 100 \
    -CA ca.crt -CAkey ca.key -CAcreateserial \
    -in www.linux.io-new.csr \
    -out www.linux.io-new.crt
rm -f www.linux.io-new.csr

将证书和key的内容进行base64编码,然后编辑相应的Secret对象,修改tls.key和tls.crt的值为编码后的内容

root@master-01:~/resources/ingress-cert# base64 www.linux.io-new.key -w 0
LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS.............ZLS0tLS0K
root@master-01:~/resources/ingress-cert# base64 www.linux.io-new.crt -w 0
LS0tLS1CRUdJTiBDRVJ..............FTkQgQ0VSVElGSUNBVEUtLS0tLQo=
root@master-01:~# kubectl edit secret/www.linux.io

在这里插入图片描述
访问测试,验证证书是否更新
在这里插入图片描述

在这里插入图片描述

和之前的访问结果进行对比,可以看到证书已经被更新

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Multipartfile判断文件类型的简单处理办法。

通过浏览器上传的文件在后台需要验证文件类型。如果单纯匹配后缀名的方式是有风险的&#xff0c;容易被换了后缀的病毒文件给破坏掉。 比如&#xff1a; 如果我上传已修改的文件。&#xff08;把xlsx改成了jpg&#xff09; 这样&#xff0c;无法识别出来真实的内容。 所以为了…

java基础巩固-宇宙第一AiYWM:为了维持生计,架构知识+分布式微服务+高并发高可用高性能知识序幕就此拉开(六:Hystrix之熔断、降级、限流)~整起

Hystrix 中文文档&#xff1a;https://www.apiref.com/spring-cloud-zh/dalston/#_circuit_breaker_hystrix_clients服务雪崩&#xff1a;服务 A 调用了服务 B&#xff0c;服务 B 再调用了服务 C&#xff0c;但是因为某些原因&#xff0c;服务 C 顶不住了&#xff0c;这个时候大…

Strimzi Kafka Bridge(桥接)实战之三:自制sdk(golang版本)

欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码)&#xff1a;https://github.com/zq2599/blog_demos 本篇概览 本文是《Strimzi Kafka Bridge(桥接)实战》的第三篇&#xff0c;前文咱们掌握了Strimzi Kafka Bridge的基本功能&#xff1a;基于http提供各种kafk…

特海国际通过港交所上市聆讯:翻台率下滑明显,张勇夫妇为实控人

撰稿|汤汤 来源|贝多财经 近日&#xff0c;海底捞&#xff08;HK:06862&#xff09;海外业务分拆公司特海国际控股有限公司&#xff08;下称“特海国际”&#xff09;通过港交所上市聆讯。据贝多财经了解&#xff0c;特海国际将以介绍形式于港交所主板上市。所谓介绍形式&…

数据挖掘Java——Apriori算法的实现

一、Apriori算法的前置知识 Apriori算法是一种挖掘关联规则的频繁项集算法&#xff0c;其核心思想是通过候选集生成和向下封闭检测两个阶段来挖掘频繁项集。 关联规则挖掘是数据挖掘中最活跃的研究方法之一&#xff0c;最初的动机是针对购物篮分析问题提出的&#xff0c;其目…

[附源码]Node.js计算机毕业设计工会会员管理系统Express

项目运行 环境配置&#xff1a; Node.js最新版 Vscode Mysql5.7 HBuilderXNavicat11Vue。 项目技术&#xff1a; Express框架 Node.js Vue 等等组成&#xff0c;B/S模式 Vscode管理前后端分离等等。 环境需要 1.运行环境&#xff1a;最好是Nodejs最新版&#xff0c;我…

【Linux学习】多线程

目录前言一、初识线程1. 线程的概念2. 线程的优缺点3. 线程异常4. 线程的用途二、Linux中的线程和进程1. 进程和线程的区别2. 进程中的线程共享三、Linux线程控制1. POSIX线程库2. 创建线程3. 线程终止4. 线程等待5. 线程分离四、Linux线程互斥1. 线程互斥的概念2. 互斥量mutex…

蓝桥杯基础算法(一)—— 快速排序

文章目录1. 基本思想2. 图解过程3. 代码模板4. 例题讲解&#x1f351; 快速排序&#x1f351; 第 k 个数1. 基本思想 快速排序是 Hoare 于 1962年 提出的一种二叉树结构的交换排序方法。 其基本思想为&#xff1a; &#xff08;1&#xff09;确定分界点&#xff1a;在数组中…

从零开始的MySQL(1)

目录1.MySQL的安装2.MySQL的基本操作2.1 展示数据库2.2 创建数据库2.3 选中数据库2.4 删除数据库2.5 常用数据类型2.5.1 整形2.5.2 浮点数2.6 创建表2.7 查看表2.7 查看表结构2.8 删除表3.数据库增删改查3.1 单行插入3.2 多行插入3.3 插入日期3.4 select查询3.4.1 select3.4.2 …

Jprofiler监控服务器的cpu

现象&#xff1a;压测过程中&#xff0c;发现应用服务器的cpu使用率比较高>80%&#xff0c;我们就可以判断服务器的cpu使用率太高了。 一般cpu太高有两种情况&#xff0c; 1.接口的性能非常好&#xff0c;比如响应时间<10ms&#xff0c;tps很高&#xff0c;此时的cpu使用…

CSDN官方插件猿如意可以用ChatGPT啦!

什么是 ChatGPT Chat GPT 是一种由 AI 技术驱动的自然语言处理工具&#xff0c;可让您与聊天机器人进行类似人类的对话等它是基于OpenAI的GPT-3架构进行构建的&#xff0c;并经过训练&#xff0c;以便能够回答人类的问题并进行自然对话ChatGPT可以回答关于各种话题的问题&#…

基于SSM广州旅游攻略网站的设计与实现

开发工具(eclipse/idea/vscode等)&#xff1a; 数据库(sqlite/mysql/sqlserver等)&#xff1a; 功能模块(请用文字描述&#xff0c;至少200字)&#xff1a;

【Unity】摄像机跟随鼠标移动以物体为中心旋转 物体根据视线方向移动

描述 实现摄像机根据鼠标移动跟随物体旋转&#xff0c;以摄像机前物体为中心&#xff0c;摄像机围绕物体旋转&#xff0c;并使摄像机时刻指向物体 实现效果 Unity 组件设置 Camera 组件设置 Body 组件设置 实现代码 CameraRotateMove.cs 摄像机跟随和旋转 using System.Co…

神经网络常用的训练方式,什么是神经网络训练法

1、神经网络中的模型训练是什么意思? 无导师学习网络 神经网络中的模型训练是通过自动寻找样本中的内在规律和本质属性,自组织、自适应地改变网络参数与结构。 神经网络在系统辨识、模式识别、智能控制等领域有着广泛而吸引人的前景&#xff0c;特别在智能控制中&#xff0c;…

寄存器内存读写指令(二) —— 多寄存器读写 LDM / STM

有的时候&#xff0c;CPU可能会遇到 a; b; c&#xff0c;这个时候为了提升效率&#xff0c;CPU可能会一次将多个寄存器里的变量保存到内存中。这个时候之前介绍的 LDR / STR 指令虽然也能实现&#xff0c;但只能操作一个寄存器的读写。 因此&#xff0c;考虑到这点&#xff0c…

基于FPGA的PWM发生器设计

目录 引言 设计说明 设计特点 设计思路 设计源码 整数除法模块

超级好看的 Edge 浏览器新标签页插件:好用、好看、免费浏览器必备

BdTab 新标签页 BdTab新标签页扩展是一款免费无广告、简单好用的的高颜值新标签页扩展。 BdTab它颜值高、简单好用、支持高度自定义&#xff1a; 在登录之后支持云备份&#xff0c;支持快速切换搜索引擎&#xff0c;支持快速查看浏览历史记录和书签&#xff0c;用起来非常方便…

数据结构与算法——Java实现排序算法(一)

目录 一、排序算法 1.1 排序算法基本介绍 1.2 衡量程序执行的方法 1.2.1 事后统计法 1.2.2 事前估算的方法 二、 时间复杂度 2.1 时间频度 2.2 时间复杂度 2.2.1 常见的时间复杂度 2.2.2 常数阶O(1) 2.2.3 对数阶O(log2底n) 2.2.4 线性阶O(n) 2.2.5 线性对数阶O(n…

2022年PAT冬季甲级考试 25 A-3 Articulation Points

A-3 Articulation Points 分数 25 In graph theory, given a connected graph G, the vertices whose removal would disconnect G are known as articulation points. For example, vertices 1, 3, 5, and 7 are the articulation points in the graph shown by the above fi…

WAYON维安功率肖特基二极管,适配器领域的助推器

WAYON维安功率肖特基二极管&#xff0c;适配器领域的助推器。 维安功率肖特基二极管&#xff0c;适配器领域的助推器 导言 肖特基二极管&#xff0c;是以它的发明人肖特基博士名字而命名的&#xff0c;又被称作是肖特基势垒二极管。它是金属与半导体材料相互接触&#xff0c;且…