k8s 对外服务之 Ingress(HTTPS/HTTP 代理访问 以及Nginx 进行 BasicAuth )

目录

一   Ingress HTTP 代理访问虚拟主机

(一)原理

(二)实验

1,准备

2,创建虚拟主机1资源

3,创建虚拟主机2资源

4,创建ingress资源

5,查看相关参数

6,测试访问

二  Ingress  HTTPS 代理访问

(一)理论

(二) 实验

1,准备

2,创建ssl证书

3,创建 secret 资源进行存储 

3.1 创建Secret资源​编辑

3.2 获取Secret资源信息

3.3  查看Secret资源

4, 创建 deployment、Service、Ingress Yaml 资源

5,  查看配置

6,真机做映射  访问测试

三    Nginx 进行 BasicAuth 

(一)理论

1,是什么

2, 使用场景

(二)实验

1,准备

2, 生成用户密码认证文件,创建 secret 资源进行存储

3, 创建Secret资源

4, 创建Ingress资源

5, 查看相关配置

6, 访问测试

四     Nginx重写

(一)理论

1,  作用

2,步骤

3, metadata.annotations 配置说明

(二)  实验

1,创建重写Ingress资源 

2,yaml 文件

3, 访问测试


一   Ingress HTTP 代理访问虚拟主机

(一)原理

Ingress HTTP 代理访问虚拟主机,使用同一个nginx-ingress-controller,根据不同的域名,代理到不同的后端服务

例如访问www.china.com触发规则后,代理到service-01;访问www.zg.com触发规则二

Ingress可以基于虚拟主机进行配置。虚拟主机是一种特殊的软硬件技术,可以将网络上的每一台计算机分成多个虚拟主机,每个虚拟主机可以独立对外提供web服务。Ingress可以将Ingress配置为提供服务外部可访问的URL、负载均衡流量、终止SSL/TLS并提供基于名称的虚拟主机。

(二)实验

1,准备

mkdir /opt/ingress-nodeport/vhost
cd /opt/ingress-nodeport/vhost

2,创建虚拟主机1资源

在Kubernetes集群中创建一个名为deployment1的Deployment和一个名为svc-1的Service。

vim deployment1.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: deployment1
spec:
  replicas: 2
  selector:
    matchLabels:
      name: nginx1
  template:
    metadata:
      labels:
        name: nginx1
    spec:
      containers:
        - name: nginx1
          image: soscscs/myapp:v1
          imagePullPolicy: IfNotPresent
          ports:
            - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: svc-1
spec:
  ports:
    - port: 80
      targetPort: 80
      protocol: TCP
  selector:
    name: nginx1
kubectl apply -f deployment1.yaml #启动主机1资源

3,创建虚拟主机2资源

vim deployment2.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: deployment2
spec:
  replicas: 2
  selector:
    matchLabels:
      name: nginx2
  template:
    metadata:
      labels:
        name: nginx2
    spec:
      containers:
        - name: nginx2
          image: soscscs/myapp:v2
          imagePullPolicy: IfNotPresent
          ports:
            - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: svc-2
spec:
  ports:
    - port: 80
      targetPort: 80
      protocol: TCP
  selector:
    name: nginx2
kubectl apply -f deployment2.yaml #启动主机2资源

4,创建ingress资源

vim ingress-nginx.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: ingress1
spec:
  rules:
    - host: www01.zzz.com
      http:
        paths:
        - path: /
          pathType: Prefix
          backend:
            service:
              name: svc-1
              port:
                number: 80
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: ingress2
spec:
  rules:
    - host: www02.zzz.com
      http:
        paths:
        - path: /
          pathType: Prefix
          backend:
            service:
              name: svc-2
              port:
                number: 80

在该文件中定义了两个Ingress资源,ingress1和ingress2。
ingress1配置了一个规则,当访问www01.zzz.com时,流量将被路由到名为svc-1的服务的端口80。
ingress2配置了一个规则,当访问www02.zzz.com时,流量将被路由到名为svc-2的服务的端口80。


kubectl apply -f ingress-nginx.yaml

5,查看相关参数

可以看到对外的端口是31101   

[root@master01 vhost]#kubectl get deployment
NAME          READY   UP-TO-DATE   AVAILABLE   AGE
deployment1   2/2     2            2           16m
deployment2   2/2     2            2           16m

[root@master01 vhost]#kubectl get pod,svc -owide
NAME                               READY   STATUS    RESTARTS   AGE   IP            NODE     NOMINATED NODE   READINESS GATES
pod/deployment1-c8d988f6c-mtnfb    1/1     Running   0          16m   10.244.1.18   node01   <none>           <none>
pod/deployment1-c8d988f6c-p27db    1/1     Running   0          16m   10.244.2.12   node02   <none>           <none>
pod/deployment2-5588d5cdcd-77pnj   1/1     Running   0          16m   10.244.2.13   node02   <none>           <none>
pod/deployment2-5588d5cdcd-krltr   1/1     Running   0          16m   10.244.1.19   node01   <none>           <none>

NAME                 TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)   AGE   SELECTOR
service/kubernetes   ClusterIP   10.96.0.1       <none>        443/TCP   24m   <none>
service/svc-1        ClusterIP   10.96.105.191   <none>        80/TCP    16m   name=nginx1
service/svc-2        ClusterIP   10.96.171.171   <none>        80/TCP    16m   name=nginx2

[root@master01 vhost]#kubectl get ingress
NAME                  CLASS    HOSTS                        ADDRESS        PORTS   AGE
ingress1              <none>   www01.zzz.com                10.96.67.162   80      15m
ingress2              <none>   www02.zzz.com                10.96.67.162   80      15m
nginx-ingress-test    <none>   www.china.com                10.96.67.162   80      4h58m
nginx-vhost-ingress   <none>   www.chinese.com,www.zg.com   10.96.67.162   80      179m

[root@master01 vhost]#kubectl get svc -n ingress-nginx
NAME            TYPE       CLUSTER-IP     EXTERNAL-IP   PORT(S)                      AGE
ingress-nginx   NodePort   10.96.67.162   <none>        80:31101/TCP,443:30796/TCP   5h39m

6,测试访问

做页面 

做映射

访问测试

二  Ingress  HTTPS 代理访问

(一)理论

在Kubernetes集群中配置HTTPS代理访问通常涉及以下步骤:

  • 获取或生成SSL/TLS证书和私钥。
  • 将证书和私钥文件放置在集群节点可以访问的位置,例如您刚刚创建的https目录。
  • 创建Ingress资源的YAML配置文件,指定SSL/TLS证书和私钥的位置,以及需要启用HTTPS的虚拟主机规则。

一旦这些步骤完成,就可以使用kubectl apply命令应用Ingress配置,从而启用HTTPS代理访问。这将允许外部用户通过安全的HTTPS连接访问您的服务

(二) 实验

1,准备

mkdir /opt/ingress-nodeport/https
cd /opt/ingress-nodeport/https

2,创建ssl证书

生成一个自签名的TLS证书,用于在实验中配置HTTPS代理访问时使用

一般的话去你买域名的网站,下载

openssl req -x509 -sha256 -nodes -days 365 -newkey rsa:2048 -keyout tls.key -out tls.crt -subj "/CN=nginxsvc/0=nginxsvc"
 
 
 
# -x509:表示生成自签名的证书。
# -sha256:表示使用SHA-256算法进行证书签名。
# -nodes:表示生成的私钥不加密。
# -days 365:表示证书的有效期为365天。
# -newkey rsa:2048:表示生成一个2048位的RSA私钥。
# -keyout tls.key:表示将生成的私钥保存到名为tls.key的文件中。
# -out tls.crt:表示将生成的证书保存到名为tls.crt的文件中。
# -subj "/CN=nginxsvc/O=nginxsvc":表示指定证书的主题信息,其中/CN表示Common Name(通用名称),/O表示Organization(组织)。

3,创建 secret 资源进行存储 

3.1 创建Secret资源
kubectl create secret tls tls-secret --key tls.key --cert tls.crt

命令详细解释如下:

  • kubectl: 这是与Kubernetes集群进行交互的命令行工具。

  • create: 这个子命令告诉kubectl去创建一个新的资源对象。

  • secret: 指定要创建的资源类型为“secret”。Kubernetes中的secret可以有多种类型,这里使用的是TLS类型。

  • tls-secret: 这是自定义的secret名称。你可以根据需要更改这个名字,它将在Kubernetes中作为标识这个secret的唯一名称。

  • --key tls.key: --key标志后面跟着的是TLS密钥文件的路径。在这个例子中,文件名为tls.key。这个文件包含了私钥,是TLS证书对的一部分,用于服务端验证和加密通信。

  • --cert tls.crt: --cert标志后面跟着的是TLS证书文件的路径。在这个例子中,文件名为tls.crt。这个文件包含了公钥以及由认证机构签署的相关信息,用于客户端验证服务端的身份。

综上所述,这个命令的作用是使用指定的TLS密钥(tls.key)和证书(tls.crt)文件,在Kubernetes集群中创建一个名为tls-secret的TLS类型的secret。这个secret随后可以被Pods或者Services等Kubernetes资源引用,以便在需要TLS安全通信的场景下使用这些证书和密钥。

3.2 获取Secret资源信息

kubectl get secrets

3.3  查看Secret资源

kubectl describe secret tls-secret
  • 使用kubectl describe secret tls-secret命令获取tls-secret的详细信息。

  • 可以看到了Secret资源的类型为kubernetes.io/tls,并且包含了证书和私钥的数据。

现在,可以在创建Ingress资源时引用这个Secret,以便为Ingress Controller配置HTTPS支持。这将允许Ingress Controller使用这个SSL证书来终止外部HTTPS请求。 

4, 创建 deployment、Service、Ingress Yaml 资源

vim ingress-https.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-app-https  #修改名字,防止重复
spec:
  replicas: 2
  selector:
    matchLabels:
      name: nginx
  template:
    metadata:
      labels:
        name: nginx
    spec:
      containers:
        - name: nginx
          image: nginx
          imagePullPolicy: IfNotPresent
          ports:
            - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: nginx-svc-https  #后端服务的名称为nginx-svc-https
spec:
  ports:
    - port: 80
      targetPort: 80
      protocol: TCP
  selector:
    name: nginx
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: nginx-https
spec:
  tls:
    - hosts:
      - www3.zzz.com
      secretName: tls-secret   # 存储TLS证书和私钥的 Secret 对象的名称为tls-secret
  rules:
    - host: www3.zzz.com
      http:
        paths:
        - path: /
          pathType: Prefix
          backend:
            service:
              name: nginx-svc-https  #后端服务的名称为nginx-svc-https
              port:
                number: 80

YAML配置文件解读:

  • 在该文件中定义一个Deployment(nginx-app-https),它包含两个Nginx容器的副本。
  • 定义一个Service(nginx-svc-https),它将端口80的流量转发到标签为name: nginx的Pod。
  • 定义一个Ingress资源(nginx-https),它配置了HTTPS支持,使用之前创建的tls-secret证书和私钥。
  • Ingress资源中定义了一个规则,当访问www03.zzz.com时,流量将被路由到nginx-svc服务的端口80。

使用kubectl apply -f ingress-https.yaml命令将这些配置应用到Kubernetes集群中。

kubectl apply -f ingress-https.yaml

5,  查看配置

6,真机做映射  访问测试

在宿主机的 C:\Windows\System32\drivers\etc\hosts 文件中添加映射

浏览器访问

 

三    Nginx 进行 BasicAuth 

(一)理论

1,是什么

Nginx 中的 BasicAuth 是一种基于HTTP基本认证(HTTP Basic Access Authentication)的认证方式,用于限制对web资源的访问。当启用了BasicAuth后,Nginx会要求尝试访问受保护资源的用户在浏览器中输入用户名和密码。这种认证过程发生在HTTP协议层面,是一种简单而广泛使用的身份验证机制。

具体来说,当客户端(如浏览器)请求一个受保护的URL时,Nginx服务器会返回一个401 Unauthorized响应,并在响应头中包含一个WWW-Authenticate字段,要求客户端提供凭证。浏览器随后会弹出一个对话框,要求用户输入用户名和密码用户输入的凭据会被Base64编码并发送回服务器(注意:Base64编码并不是加密,只是编码,因此依然可以通过解码查看原始信息,但相比明文还是有所增加安全性)。

2, 使用场景

总之,Nginx的BasicAuth提供了一种简易的方法来保护网站的部分或全部内容,确保只有拥有有效凭证的用户才能访问。尽管它简单易用,但由于安全性较低(因为Base64编码容易被解码,且传输过程中如果没有使用HTTPS则密码可能被截取),所以在安全性要求较高的场景下,可能需要配合SSL/TLS(HTTPS)或其他更安全的认证机制一起使用

(二)实验

1,准备

mkdir /opt/ingress-nodeport/basic-auth
cd /opt/ingress-nodeport/basic-auth

2, 生成用户密码认证文件,创建 secret 资源进行存储

yum -y install httpd
htpasswd -c auth wyq			#认证文件名必须为 auth
kubectl create secret generic basic-auth --from-file=auth

3, 创建Secret资源

kubectl create secret generic basic-auth --from-file=auth
  • 使用kubectl create secret generic basic-auth --from-file=auth命令创建一个新的Kubernetes Secret资源,名为basic-auth,并将之前生成的auth文件作为数据。

4, 创建Ingress资源

vim ingress-auth.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: ingress-auth
  annotations:
    #设置认证类型basic
    nginx.ingress.kubernetes.io/auth-type: basic
        #设置secret资源名称basic-auth
    nginx.ingress.kubernetes.io/auth-secret: basic-auth
        #设置认证窗口提示信息
    nginx.ingress.kubernetes.io/auth-realm: 'Authentication Required - wyq'
spec:
  rules:
  - host: auth.wyq.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service: 
            name: nginx-svc
            port:
              number: 80

使用vim编辑器创建一个名为ingress-auth.yaml的YAML文件。(如上代码)

在该文件中定义了一个Ingress资源,名为ingress-auth,它包含了基本认证的配置。
使用注解设置了认证类型(basic)、认证使用的Secret资源名称(basic-auth)以及认证窗口提示信息。
定义了一个规则,当访问auth.zzz.com时,流量将被路由到nginx-svc服务的端口80

具体详细设置方法可参考官网

https://kubernetes.github.io/ingress-nginx/examples/auth/basic/

启动

kubectl apply -f ingress-auth.yaml

5, 查看相关配置

数据流向就是:

当我们浏览器访问  auth.wyq.com:31101    数据流向通过nodeport对外暴露的端口到

  7层的反向代理 ingress-nginx的网络

ingress-nginx 这个七层反向代理  根据规则  将流量转到

业务pod  (nginx) 的svc

再根据标签选择器 到达对应的业务pod

6, 访问测试

先做映射 

真机访问  auth.wyq.com:31101    会要求验证

 

输入账号密码  

 

四     Nginx重写

(一)理论

1,  作用

当域名更新之后,可以使用重写功能,使旧域名,跳转到新的域名当中

例如当访问www.old.com时,使用重写功能跳转到www.new.com

 

2,步骤

在Kubernetes集群中配置Nginx Ingress Controller以实现URL重写,可以配置 Nginx Ingress Controller,然后通过编辑 Ingress 资源规则,使用 Nginx 的 rewrite 指令来修改传入请求的 URL 路径实现定制的路由和重定向功能

3, metadata.annotations 配置说明

Nginx 进行重写
 
#metadata.annotations 配置说明
●nginx.ingress.kubernetes.io/rewrite-target: <字符串> #必须重定向流量的目标URI
●nginx.ingress.kubernetes.io/ssl-redirect: <布尔值> #指示位置部分是否仅可访问SSL(当Ingress包含证书时,默认为true)
●nginx.ingress.kubernetes.io/force-ssl-redirect: <布尔值> #即使Ingress未启用TLS,也强制重定向到HTTPS
●nginx.ingress.kubernetes.io/app-root: <字符串> #定义Controller必须重定向的应用程序根,如果它在'/'上下文中
●nginx.ingress.kubernetes.io/use-regex: <布尔值> #指示Ingress上定义的路径是否使用正则表达式

(二)  实验

1,创建重写Ingress资源 

mkdir rewrite
cd rewrite
vim ingress-rewrite.yaml

2,yaml 文件

即   当访问re.kgc.com     都会被重写为http://auth.wyq.com:31101

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: nginx-rewrite
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: http://auth.wyq.com:31101
spec:
  rules:
  - host: re.kgc.com #由于re.kgc.com只是用于跳转不需要真实站点存在,因此svc资源名称可随意定义
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: nginx-svc
            port:
              number: 80

3, 访问测试

做映射

 

浏览器访问 re.kgc.com:31101    就会跳转到 http://auth.wyq.com:31101

五    总结

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ai写作工具哪些好用,分享4种ai智能写作软件

当我们踏入这个充满创意与无限可能的自媒体时代&#xff0c;ai写作工具就如同一盏盏闪耀的明灯&#xff0c;照亮我们的创作之路。那么&#xff0c;市面上的ai写作工具哪些好用呢&#xff1f;对于这个问题&#xff0c;今天&#xff0c;本文就带领大家一同揭开那神秘的面纱&#…

编译等底层知识

目录 一. GCC命令语句大全 二. GCC编译4个阶段 三. makefile的使用 四. CMake 五. GNU工具链开发流程图 六. Keil中的地址段 七. 静态库和动态库 一. GCC命令语句大全 -c只编译源文件&#xff0c;生成目标文件&#xff08;.o 文件&#xff09;&#xff0c;不进行链接。…

如何查询公网IP?

在互联网中&#xff0c;每个设备都有一个唯一的公网IP地址&#xff0c;用于标识设备在全球范围内的位置。查询公网IP是一个常见的需求&#xff0c;无论是用于远程访问、网络配置还是其他目的&#xff0c;了解自己的公网IP地址都是很有必要的。本文将介绍几种常见的方法来查询公…

Java并发编程中Future使用

Future类有什么用 Future类是异步思想的典型应用&#xff0c;主要用在一些需要执行耗时任务的场景&#xff0c;避免程序一直原地等待耗时任务完成&#xff0c;执行效率太低。具体来说&#xff1a;**当我们执行某一个耗时的任务时&#xff0c;可以将这个耗时任务交给一个子线程…

python3 -m http.server 检查打包前端的项目

python3 -m http.server这是 Python 提供的一个内置的简单 HTTP 服务器。当你在终端中运行 python3 -m http.server 命令时(在对应的打包目录比如dist目录)&#xff0c;Python 会启动一个 HTTP 服务器&#xff0c;它会将当前工作目录下的文件作为静态文件提供给浏览器。这个服务…

selenium非全新的方式同时启动多个浏览器又互不影响的一种实现方法,欢迎讨论!

最近在做模拟浏览器批量定时自动点击实现批量操作功能&#xff0c;主要使用selenium&#xff0c;但是发现selenium直接调用本地浏览器&#xff0c;启动的是一个全新的&#xff08;与手动打开的不一致&#xff09;&#xff0c;网站可以检测到&#xff0c;每次都要双重验证(密码登…

UnityXR Interaction Toolkit 如何使用XRHand手部识别

前言 Unity的XR Interaction Toolkit是一个强大的框架,允许开发者快速构建沉浸式的VR和AR体验。随着虚拟现实技术的发展,手部追踪成为了提升用户交互体验的关键技术之一。 本文将介绍如何在Unity中使用XR Interaction Toolkit实现手部识别功能。 准备工作 在开始之前,请…

论文阅读 A Distributional Framework for Data Valuation

本论文解决的问题 量化数据价值&#xff08;机器学习模型训练中各个数据点的贡献&#xff09; 避免数据价值受到其所处数据集的影响&#xff0c;使数据点的估值更加稳定、一致 变量假设 假设 D 表示一个在全集 Z 上的数据分布。对于监督学习问题&#xff0c;我们通常认为 Z…

RapidMiner数据挖掘4 —— 决策树

0. 序章 0.1 文本说明 所有应用程序操作的名称和编程说明都以黄色背景书写&#xff0c;问题以蓝色背景书写&#xff0c;以方便他们在文本中识别。 在整个课程中&#xff0c;请逐步遵循所有说明&#xff0c;并确保获得预期结果&#xff0c;然后再继续下一部分或问题。 通过在Ub…

Hadoop3:MapReduce源码解读之Map阶段的CombineFileInputFormat切片机制(4)

Job那块的断点代码截图省略&#xff0c;直接进入切片逻辑 参考&#xff1a;Hadoop3&#xff1a;MapReduce源码解读之Map阶段的Job任务提交流程&#xff08;1&#xff09; 6、CombineFileInputFormat原理解析 类的继承关系 与TextInputFormat切片机制的区别 框架默认的TextI…

api接口模块封装

1&#xff1a;前端封装接口 前端请求的统一封装也是为了方便前端项目的请求维护起来更加方便&#xff0c;将页面中的请求封装到js文件中&#xff0c;不同的页面需要用到相同的请求可以直接进行复用。 第一步创建一个api文件夹和js文件 第二步&#xff1a;在文件中导入axios&am…

精妙无比的App UI 风格

精妙无比的App UI 风格

springboot vue 开源 会员收银系统 (6) 收银台的搭建

前言 完整版演示 前面我们对会员系统 分类和商品的开发 完成了收银所需的基础信息 下面我们开始完成收银台的开发 简单画了一个收银的流程图大家参考下 从这张图我们可以分析一下几点 可以选择会员或散客收银选择会员使用相应的会员价结算使用会员卡则在价格基础根据卡折扣…

Day22 客户端添加IDialogService 弹窗服务

​ 本章节实现了首页点击待办事项或备忘录的时候,弹出一个对话服务窗口 当用户点击首页的“添加备忘录”或“待办事项”按钮时,系统应弹出一个对话框,以便用户执行相关的内容添加操作。下面就开始实现这个弹窗服务。 一.在Views文件夹中,再创建一个Dialog 文件夹,用于放置…

【Selenium+java环境配置】(超详细教程常见问题解决)

Seleniumjava环境配置 windows电脑环境搭建-chrome浏览器1. 下载chrome浏览器2. 查看chrome浏览器版本3. 下载chrome浏览器驱动4.配置系统环境变量PATH 验证环境是否搭建成功1. 创建java项目&#xff0c;添加pom文件中添加依赖2. 编写代码运行 常见问题&解决办法1.访问失败…

防病毒克星——白名单可信系统

白名单作为一种网络安全措施&#xff0c;其核心概念在于限制用户只能访问网络所有者定义的受信任内容。这种机制在保护系统免受恶意软件、病毒等攻击方面发挥着重要作用。然而&#xff0c;关于白名单是否可以防病毒的问题&#xff0c;实际上涉及了多个方面的考虑。 首先&#x…

【C++题解】1074 - 小青蛙回来了

问题&#xff1a;1074 - 小青蛙回来了 类型&#xff1a;需要找规律的循环 题目描述&#xff1a; 关于小青蛙爬井的故事&#xff0c;你应该早就听过了&#xff1a;井深10 尺&#xff0c;小青蛙从井底向上爬&#xff0c;每个白天向上爬 3 尺&#xff0c;每个晚上又滑下来 2 尺&…

基于Sentry+OpenTelemetry实现微服务前后端全链路监控

文章目录 前⾔背景技术⽅案Sentry私有化部署部署环境准备 项目集成前端后端agent探针集成sentry sdk集成增强探针为⽇志注⼊TraceID异常处理SDK⾃定义开发sentry sdk⾃定义开发⾃定义SentryEvent注⼊otel追踪信息⾃定义全局异常上报issue事件新增动态过滤功能 Java Agent Exten…

c++ 里函数选择的优先级:普通函数、模板函数、万能引用,编译器选择哪个执行呢?

看大师写的代码时&#xff0c;除了在类里定义了 copy 构造函数&#xff0c;移动构造函数&#xff0c;还定义了对形参采取万能引用的构造函数&#xff0c;因此有个疑问&#xff0c;这时候的构造函数优先级是什么样的呢&#xff1f;简化逻辑测试一下&#xff0c;如下图&#xff0…

MySQL主从同步优化指南:架构、瓶颈与解决方案

前言 ​ 在现代数据库架构中&#xff0c;MySQL 主从同步是实现高可用性和负载均衡的关键技术。本文将深入探讨主从同步的架构、延迟原因以及优化策略&#xff0c;并提供专业的监控建议。 MySQL 主从同步架构 ​ 主从复制流程&#xff1a; 从库生成两个线程&#xff0c;一个…