k8s ingress高级用法一
前面的文章中,我们讲述了ingress的基础应用,接下来继续讲解ingress的一些高级用法
一、ingress限流
在实际的生产环境中,有时间我们需要对服务进行限流,避免单位时间内访问次数过多,常用的一些限流的参数如下:
- nginx.ingress.kubernetes.io/limit-connections
单个IP地址允许的并发连接数。超出此限制时,将返回503错误。
- nginx.ingress.kubernetes.io/limit-rps
某个IP每秒钟接受的请求数。默认乘数为5。和ingress中这个参数有关nginx.ingress.kubernetes.io/limit-burst-multiplier,默认值为5,可以修改此值的大小与限速配合使用。当客户端超过此限制时,将返回limit-req-status-code默认值: 503。
- nginx.ingress.kubernetes.io/limit-rpm
某个IP每分钟接受的请求数。默认乘数为5。和ingress中这个参数有关nginx.ingress.kubernetes.io/limit-burst-multiplier,默认值为5,可以修改此值的大小与限速配合使用。当客户端超过此限制时,将返回limit-req-status-code默认值: 503。
- nginx.ingress.kubernetes.io/limit-rate
每秒允许发送到给定连接的千字节数。零值禁用速率限制。必须在启用代理缓冲的情况下使用此功能。
- nginx.ingress.kubernetes.io/limit-whitelist
从速率限制中排除的源IP范围。该值是逗号分隔的CIDR列表,如下:
annotations:ingress.kubernetes.io/whitelist-source-range: "10.1.0.0/24,172.10.0.1"
我们使用其中一个进行测试,如下:
测试nginx.ingress.kubernetes.io/limit-rps  
1:编写yaml文件,如下:
[root@node1 yaml]# cat ingress.yaml 
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:annotations:                                nginx.ingress.kubernetes.io/limit-rps: "1"name: ingress-test
spec:ingressClassName: nginxrules:- host: "nginx.test.com"http:paths:- path: "/"pathType: Prefixbackend:service:name: nginx-svcport:number: 80- host: "tomcat.test.com"http:paths:- path: "/"pathType: Prefixbackend:service:name: tomcat-svcport:number: 80802:创建ingress如下:deployment已经提前创建好了
[root@node1 yaml]# kubectl apply -f  ingress.yaml 
ingress.networking.k8s.io/ingress-test created
[root@node1 yaml]# kubectl get  ing
NAME           CLASS   HOSTS                            ADDRESS   PORTS   AGE
ingress-test   nginx   nginx.test.com,tomcat.test.com             80      2s
[root@node1 yaml]# kubectl get  ing
NAME           CLASS   HOSTS                            ADDRESS        PORTS   AGE
ingress-test   nginx   nginx.test.com,tomcat.test.com   192.168.5.79   80      37s3:访问ingress有两种方式
<1>: 部署ingress-controller的时候,使用的是host-network模式,ingress-controller又起在了node上,所有可以直接使用node1的地址+80端口
<2>:查看ingress的svc 端口,使用端口的方式访问,如下:
[root@node1 yaml]# kubectl get  svc -n ingress-nginx
NAME                                 TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)                      AGE
ingress-nginx-controller             NodePort    10.233.51.155   <none>        80:31122/TCP,443:30795/TCP   6d21h
ingress-nginx-controller-admission   ClusterIP   10.233.38.9     <none>        443/TCP                      6d21h
[root@node1 yaml]# 浏览器访问nginx,如下:
 
 多刷新几次,因为默认要乘以5,返回默认的错误代码,如下:
 
二、ingress rewrite
URL重写(URL rewriting)是一种在Web服务器上修改或转换请求URL的过程。它通常涉及使用服务器配置或规则来更改传入的URL,以便在不改变实际请求资源的情况下,实现不同的行为,如重定向、路径映射、参数处理等。在客户端不会感知这些更改。在Nginx、Apache等常见的Web服务器中,URL重写可以通过正则表达式、规则匹配等方式来实现。URL 重写可以用于以下几种场景
- 重定向
将一个URL重写为另一个URL,实现301永久重定向或302临时重定向。
- 路径映射
将一个URL的路径映射到另一个位置,这对于隐藏实际文件路径或路径重组很有用。
- 查询参数处理
在URL中添加、删除或修改查询参数,以适应不同的应用需求。
- 动态URL到静态URL
将动态生成的URL(带有参数)转化为静态URL,更友好且易于索引。
- 隐藏技术细节
可以通过URL重写隐藏后端服务器或应用程序的实际技术细节,提高安全性.
一些内置变量如下:
变量名           定义
$arg_PARAMETER  GET请求中变量名PARAMETER参数的值。
$args   这个变量等于GET请求中的参数。例如,foo=123&bar=blahblah;这个变量只可以被修改
$binary_remote_addr 二进制码形式的客户端地址。
$body_bytes_sent    传送页面的字节数
$content_length 请求头中的Content-length字段。
$content_type   请求头中的Content-Type字段。
$cookie_COOKIE  cookie COOKIE的值。
$document_root  当前请求在root指令中指定的值。
$document_uri   与$uri相同。
$host   请求中的主机头(Host)字段,如果请求中的主机头不可用或者空,则为处理请求的server名称(处理请求的server的server_name指令的值)。值为小写,不包含端口。
$hostname   机器名使用 gethostname系统调用的值
$http_HEADER    HTTP请求头中的内容,HEADER为HTTP请求中的内容转为小写,-变为_(破折号变为下划线),例如:$http_user_agent(Uaer-Agent的值);
$http_user_agent : 客户端agent信息;
$http_cookie : 客户端cookie信息;
$sent_http_HEADER   HTTP响应头中的内容,HEADER为HTTP响应中的内容转为小写,-变为_(破折号变为下划线),例如: $sent_http_cache_control, $sent_http_content_type…;
$is_args    如果$args设置,值为"?",否则为""。
$limit_rate 这个变量可以限制连接速率。
$nginx_version  当前运行的nginx版本号。
$query_string   与$args相同。
$remote_addr    客户端的IP地址。
$remote_port    客户端的端口。
$remote_user    已经经过Auth Basic Module验证的用户名。
$request_filename   当前连接请求的文件路径,由root或alias指令与URI请求生成。
$request_body   这个变量(0.7.58+)包含请求的主要信息。在使用proxy_pass或fastcgi_pass指令的location中比较有意义。
$request_body_file  客户端请求主体信息的临时文件名。
$request_completion 如果请求成功,设为"OK";如果请求未完成或者不是一系列请求中最后一部分则设为空。
$request_method 这个变量是客户端请求的动作,通常为GET或POST。包括0.8.20及之前的版本中,这个变量总为main request中的动作,如果当前请求是一个子请求,并不使用这个当前请求的动作。
$request_uri    这个变量等于包含一些客户端请求参数的原始URI,它无法修改,请查看$uri更改或重写URI,
包含请求参数的原始URI,不包含主机名,如:”/foo/bar.php?arg=baz”。
$scheme 所用的协议,比如http或者是https,比如rewrite ^(.+)$ $scheme://example.com$1 redirect;
$server_addr    服务器地址,在完成一次系统调用后可以确定这个值,如果要绕开系统调用,则必须在listen中指定地址并且使用bind参数。
$server_name    服务器名称。
$server_port    请求到达服务器的端口号。
$server_protocol    请求使用的协议,通常是HTTP/1.0或HTTP/1.1。
$uri    请求中的当前URI(不带请求参数,参数位于args),不同于浏览器传递的args),不同于浏览器传递的args),不同于浏览器传递的request_uri的值,它可以通过内部重定向,或者使用index指令进行修改。uri不包含主机名,如”/foo/bar.html”。
ingress正则表达式匹配
正则表达式匹配,其中:
~       为区分大小写匹配
~*      为不区分大小写匹配
!~和!~*  分别为区分大小写不匹配及不区分大小写不匹配
.      匹配除换行符以外的任意字符
\w     匹配字母或数字或下划线或汉字
\s     匹配任意的空白符
\d     匹配数字
\b     匹配单词的开始或结束
^      匹配字符串的开始
$      匹配字符串的结束
*         重复零次或更多次
+         重复一次或更多次
?         重复零次或一次
{n}       重复n次
{n,}      重复n次或更多次
{n,m}     重复n到m次
*?        复任意次,但尽可能少重复
+?        重复1次或更多次,但尽可能少重复
??        重复0次或1次,但尽可能少重复
{n,m}?    重复n到m次,但尽可能少重复
{n,}?     重复n次以上,但尽可能少重复
\W        匹配任意不是字母,数字,下划线,汉字的字符
\S        匹配任意不是空白符的字符
\D        匹配任意非数字的字符
\B        匹配不是单词开头或结束的位置
[^x]      匹配除了x以外的任意字符
[^aeiou]  匹配除了aeiou这几个字母以外的任意字符   
(exp)         匹配exp,并捕获文本到自动命名的组里
(?<name>exp)  匹配exp,并捕获文本到名称为name的组里,也可以写成(?'name'exp)
(?:exp)       匹配exp,不捕获匹配的文本,也不给此分组分配组号   
(?=exp)       匹配exp前面的位置
(?<=exp)      匹配exp后面的位置
(?!exp)       匹配后面跟的不是exp的位置
(?<!exp)      匹配前面不是exp的位置
(?#comment)   注释分组不对正则表达式的处理产生任何影响
常用的几个annotations参数如下:
 
 举例如下:
1:编写ingress yaml文件
apiVersion: networking.k8s.io/v1
kind: Ingress  
metadata:      annotations: nginx.ingress.kubernetes.io/rewrite-target: /$2name: ingress-test
spec:          ingressClassName: nginxrules:       - host: "nginx.test.com"http:      paths:   - path: "/nginx(/|$)(.*)"pathType: Prefixbackend:service:name: nginx-svcport:number: 80  注意:上面定义的ingress将有以下几种场景
<1>:nginx.test.com/something rewrites to nginx.test.com/
<2>:nginx.test.com/something/ rewrites to nginx.test.com/
<3>:nginx.test.com/something/new rewrites to nginx.test.com/new###############################
2:创建ingress如下: nginx-svc已经提前创建
[root@node1 yaml]# kubectl apply -f ingress-nginx.yaml 
ingress.networking.k8s.io/ingress-test created
[root@node1 yaml]# kubectl get ingress
NAME           CLASS   HOSTS            ADDRESS        PORTS   AGE
ingress-test   nginx   nginx.test.com   192.168.5.79   80      98s
[root@node1 yaml]# 
浏览器访问nginx.test.com/nginx,如下:
 
三、ingress auth验证
顾名思义是在使用域名访问时,需要提供用户名和密码。在ingress中有以下两个参数来实现
 
 使用步骤如下:
1:使用htpasswd工具创建用户密码文件
[root@node1 yaml]# htpasswd -c auth admin
New password: 
Re-type new password: 
Adding password for user admin
[root@node1 yaml]# 2:使用auth文件创建secret
[root@node1 yaml]# kubectl create secret generic basic-auth --from-file=auth
secret/basic-auth created
[root@node1 yaml]# 
[root@node1 yaml]# kubectl get  secret basic-auth -o yaml
apiVersion: v1
data:auth: YWRtaW46JGFwcjEkVlBvTVFNUTYkcW45NUZrSDNUZjBtbFU5a0Fuck1oMQo=
kind: Secret
metadata:creationTimestamp: "2023-11-16T10:44:34Z"name: basic-authnamespace: defaultresourceVersion: "36379081"uid: eac9b232-a6cc-4457-a098-9433d542ae3f
type: Opaque
[root@node1 yaml]# 3: 编辑ingress yaml文件,如下:
apiVersion: networking.k8s.io/v1                                            
kind: Ingress   
metadata:       annotations:  nginx.ingress.kubernetes.io/auth-type: basic                            nginx.ingress.kubernetes.io/auth-secret: basic-auth                     nginx.ingress.kubernetes.io/auth-realm: 'Authentication Required - nginx'name: ingress-test
spec:           ingressClassName: nginxrules:        - host: "nginx.test.com" http:       paths:    - path: "/"                                                                                                                                                          pathType: Prefixbackend:service:name: nginx-svcport:number: 804:创建ingress如下:
[root@node1 yaml]# kubectl apply -f  ingress-auth.yaml
ingress.networking.k8s.io/ingress-test created
[root@node1 yaml]# kubectl get ing -A
NAMESPACE   NAME           CLASS   HOSTS            ADDRESS        PORTS   AGE
default     ingress-test   nginx   nginx.test.com   192.168.5.79   80      83s
[root@node1 yaml]# 
浏览器访问
 
 
 
四、ingress 强制使用https
互联网发展中,安全是非常重要的,由其是现在HTTPS非常普及的情况下,应用程序在公网上一般都会被强制要求HTTPS。应用强制HTTPS,当应用程序识别到用户使用的是HTTP协议访问时,强制跳转至HTTPS。这种场景一般推荐是应用程序直接向外提供服务,不经过Ingress时使用。
Ingress强制使用HTTPS时,可以使用以下参数设置

 步骤如下:
1:创建secret证书,参数步骤https://blog.csdn.net/weixin_40579389/article/details/134338494?spm=1001.2014.3001.5501[root@node1 yaml]# kubectl get secret  | grep tls
tls-secret                    kubernetes.io/tls    2      6d2h
[root@node1 yaml]#2:编辑ingress yaml文件如下:
[root@node1 yaml]# cat ingress-nginx-https.yaml 
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:annotations:nginx.ingress.kubernetes.io/ssl-redirect: "true"nginx.ingress.kubernetes.io/force-ssl-redirect: "true"nginx.ingress.kubernetes.io/rewrite-target: /name: ingress-test
spec:tls:- hosts:- nginx.test.com       ###使用tls的主机secretName: tls-secretingressClassName: nginxrules:- host: "nginx.test.com"http:paths:- path: "/"pathType: Prefixbackend:service:name: nginx-svcport:number: 803:创建ingress 如下:
[root@node1 yaml]# kubectl apply -f  ingress-nginx-https.yaml 
ingress.networking.k8s.io/ingress-test created
[root@node1 yaml]# kubectl get ing 
NAME           CLASS   HOSTS            ADDRESS   PORTS     AGE
ingress-test   nginx   nginx.test.com             80, 443   6s
[root@node1 yaml]# 浏览器访问如下:
 
 如下会自动跳转到https
 
五、ingress 允许最大body
这个主要是针对外部请求,防止将流量打满,proxy-body-size 设置最大请求 body,如果超过则会返回 413 请求错误。它通常用于保护后端服务免受恶意用户发送的大型或潜在有害的请求
通过nginx.ingress.kubernetes.io/proxy-body-size: 10m参数来实现
proxy-body-size单位大小
k 或 K 表示千字节(KB)
m 或 M 表示兆字节(MB)
g 或 G 表示千兆字节(GB)
步骤如下:
######################################################
1:创建ingress,如下:
apiVersion: networking.k8s.io/v1                    
kind: Ingress         
metadata:             annotations:        nginx.ingress.kubernetes.io/proxy-body-size: 10M   ###指定大小为10Mname: ingress-test      
spec:                 ingressClassName: nginx rules:              - host: "nginx.test.com"http:             paths:          - path: "/"   pathType: Prefix  backend:      service:        name: nginx-svc                         port:     number: 80####################################
2:创建ingress,如下:
[root@node1 yaml]# kubectl apply -f  ingress-body-size.yaml 
ingress.networking.k8s.io/ingress-test created
[root@node1 yaml]# kubectl get ing
NAME           CLASS   HOSTS            ADDRESS   PORTS   AGE
ingress-test   nginx   nginx.test.com             80      3s
[root@node1 yaml]# kubectl get ing
NAME           CLASS   HOSTS            ADDRESS        PORTS   AGE
ingress-test   nginx   nginx.test.com   192.168.5.79   80      100s
[root@node1 yaml]# 
六、ingress affinity会话保持
Ingress会话保持,又称会话亲和、粘性会话,指同一客户端的请求在一定时间内会被ingress路由到相同的pod处理
下面举例来验证一下
- 没有配置affinity效果
1:创建nginx deploy,使用三幅本
[root@node1 yaml]# kubectl get po -o wide 
NAME                                      READY   STATUS    RESTARTS       AGE     IP             NODE    NOMINATED NODE   READINESS GATES
nginx-5977dc5756-glczk                    1/1     Running   0              8d      172.16.44.6    node2   <none>           <none>
nginx-5977dc5756-r7z4w                    1/1     Running   0              8m21s   172.16.28.14   node3   <none>           <none>
nginx-5977dc5756-zzv5d                    1/1     Running   0              8m21s   172.16.154.7   node1   <none>           <none>[root@node1 yaml]# kubectl get deploy
NAME                     READY   UP-TO-DATE   AVAILABLE   AGE
nginx                    3/3     3            3           8d
[root@node1 yaml]# 
[root@node1 yaml]# kubectl get svc
NAME         TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)    AGE
kubernetes   ClusterIP   10.233.0.1      <none>        443/TCP    222d
nginx-svc    ClusterIP   10.233.43.219   <none>        80/TCP     8d
[root@node1 yaml]# #################################33
2:创建ingress ,如下:
[root@node1 yaml]# cat ingress.yaml 
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:name: ingress-test
spec:ingressClassName: nginxrules:- host: "nginx.test.com"http:paths:- path: "/"pathType: Prefixbackend:service:name: nginx-svcport:number: 80
[root@node1 yaml]# 
[root@node1 yaml]# kubectl apply -f ingress.yaml 
ingress.networking.k8s.io/ingress-test created
[root@node1 yaml]# 
[root@node1 yaml]# kubectl get ing
NAME           CLASS   HOSTS            ADDRESS        PORTS   AGE
ingress-test   nginx   nginx.test.com   192.168.5.79   80      51s打开浏览器访问nginx.test.com,连续多刷新几次,查看ingress-controller pod日志可以看到每次请求被均匀的分配到了后端的每个pod
 
- 配置affinity效果
1:使用上述创建的deploy、svc
2:编辑ingress yaml文件,如下:
apiVersion: networking.k8s.io/v1                                   
kind: Ingress                                                      
metadata:                                                          annotations:                                                     nginx.ingress.kubernetes.io/affinity: cookie   ###实现会话亲和的方式,目前只支持cookie nginx.ingress.kubernetes.io/affinity-mode: persistent   # 默认是balanced平衡的,伸缩应用时会重新分配一些session, 以确保每个pod处理的会话数均衡;persistent持续的, 保持最大限度的会话亲和nginx.ingress.kubernetes.io/session-cookie-hash: sha1    #哈希算法    nginx.ingress.kubernetes.io/session-cookie-name: ingress-nginx   # 自定义cookie名字, 默认为INGRESSCOOKIE。一定要设置cookie name,避免不同ingress使用相同的cookie name导致冲突                  name: ingress-test                                               
spec:                                                              ingressClassName: nginx                                          rules:                                                           - host: "nginx.test.com"                                         http:                                                          paths:                                                       - path: "/"                                                  pathType: Prefix                                           backend:                                                   service:                                                 name: nginx-svc                                        port:                                                  number: 80    3:创建ingress 
[root@node1 yaml]# kubectl apply -f   ingress-affinity.yaml
ingress.networking.k8s.io/ingress-test created
[root@node1 yaml]# 
[root@node1 yaml]# kubectl get ing
NAME           CLASS   HOSTS            ADDRESS        PORTS   AGE
ingress-test   nginx   nginx.test.com   192.168.5.79   80      60s
打开浏览器访问nginx.test.com,连续多刷新几次,可以看到请求都被分配到同一个pod上
 
 使用curl 命令查看设置的cookie名称,如下:
[root@node1 yaml]# curl -i nginx.test.com
HTTP/1.1 200 OK
Date: Fri, 17 Nov 2023 07:08:40 GMT
Content-Type: text/html
Content-Length: 615
Connection: keep-alive
Set-Cookie: ingress-nginx=e6decf59a107dc5da74a5cd7e13b8da1|996a01b99b36cdd86f627625659ee9ee; Path=/; HttpOnly
Last-Modified: Tue, 25 Jan 2022 15:03:52 GMT
ETag: "61f01158-267"
Accept-Ranges: bytes########################
上面可以看到 Set-Cookie:  后面的名称为设置的ingress-nginx
相关文章:
 
k8s ingress高级用法一
前面的文章中,我们讲述了ingress的基础应用,接下来继续讲解ingress的一些高级用法 一、ingress限流 在实际的生产环境中,有时间我们需要对服务进行限流,避免单位时间内访问次数过多,常用的一些限流的参数如下&#x…...
 
C语言--从键盘输入10个数字放在数组中,并输出
用scanf读取数字的时候要注意,可以输入一个数字,按一下回车,输入一个数字,按一下回车,也可以一次性输入完10个数据。(中间可以用空格隔开,系统会自动识别) 输出一:每按下一个数字&am…...
 
SSL加密
小王学习录 今日摘录前言HTTP + SSL = HTTPSSSL加密1. 对称加密2. 非对称加密 + 对称加密3. 证书今日摘录 但愿四海无尘沙,有人卖酒仍卖花。 前言 SSL表示安全套接层,是一个用于保护计算机网络中数据传输安全的协议。SSL通过加密来防止第三方恶意截取并篡改数据。在实际应用…...
 
一个美观且功能丰富的 .NET 控制台应用程序开源库
推荐一个美观且功能丰富的 .NET 控制台应用程序开源库,从此告别黑漆漆的界面。 01 项目简介 Spectre.Console 是一个开源的 .NET 库,用于创建美观、功能丰富的控制台(命令行)应用程序。它提供了一组易于使用的 API,…...
DispatcherSynchronizationContext and Dispatcher
https://www.cnblogs.com/liangouyang/archive/2008/11/20/1337907.html SynchronizationContext提供一个自由线程的同步上下文,一个常用的用法是把UI线程的同步上下文保存起来,传给另一个线程,因为UI只能再UI线程中操作,在另外一…...
java类型属性set方法无法被赋值
前言 遇到一个基础的问题 方法设置属性值 失败 问题代码 有个内部类的User对象 分别使用 方式一和 方式二 设置User的属性值 发现方式一的属性并不能被设置成功 可以自行测试下 public class Test{public static void main(String[] args) {#方式一 User user new User();u…...
 
【2】SM2验签工具和RSA验签工具
0X01 前言 最近看了好多验签工具,感觉不是很好用,就自己造了个。 0x02 工具功能介绍 对SM2算法进行验签和RSA算分进行验签,签名值可以是base64,也可以是十六进制。 兼容各种输入。 0x03 工具使用 RSA 验签 SM2 验签 0x04 工具…...
 
Python (十一) 迭代器与生成器
迭代器 迭代器是访问集合元素的一种方式,可以记住遍历的位置的对象 迭代器有两个基本的方法:iter() 和 next() 字符串,列表或元组对象都可用于创建迭代器 字符串迭代 str1 Python str_iter iter(str1) print(next(str_iter)) print(next(st…...
 
通过maven命令手动上传jar私服Nexus
Nexus3在界面上传组件时报: Ext.JSON.decode(): Youre trying to decode an invalid JSON String: 查找了很多资料,都没有解决。有哪位大佬知道的评论告诉一下,万分感谢。 于是换成maven命令上传: mvn deploy:deploy-file -Dgr…...
 
记一次用jlink调试正常,不进入调试就不能运行的情况
一、概述 我开机会闪烁所有指示灯,但是重新上电时,指示灯并没有闪烁,就像"卡死"了一样。 使用jlink的swd接口进行调试,需要多点几次运行才能跳转到main函数里面。 调试模式第一次点击运行,暂停查看函数堆栈…...
搞科研、写论文,如何正确使用GPT?AIGC技术解析、提示词工程高级技巧、AI绘图、ChatGPT/GPT4应用
目录 专题一 OpenAI开发者大会最新技术发展及最新功能应用 专题二 AIGC技术解析 专题三 提示词工程高级技巧 专题四 ChatGPT/GPT4的实用案例 专题五 让ChatGPT/GPT4成为你的论文助手 专题六 让ChatGPT/GPT4成为你的编程助手 专题七 让ChatGPT/GPT4进行数据处理 专题八 …...
Java实现的插件化策略模式
Java实现的插件化策略模式 目录结构实现BaseDealAnno.java(注解)BasePluginEnum.java(枚举)BaseDealFactory.javaContextBaseDealListener.java(核心类)BaseDealHandler.java(接口)BaseAudioService.java(可扩展多个)验证目录结构 com.demo.mytest ├── strategy │ ├──…...
【jvm】MinorGC、MajorGC和FullGC
目录 一、说明二、年轻代GC(Minor GC)触发机制三、老年代GC (Major GC/Full GC)触发机制四、Full GC触发机制 一、说明 1.jvm调优的主要目的是GC的时间少一些,用户线程执行的时间多一些 2.主要侧重于MajorGC和FullGC,这两块的GC产生的暂停时间比MinorGC产…...
Redis:java和SpringBoot中使用Redis
目录 Jedis操作Redis6SpringBoot整合Redis Jedis操作Redis6 Jedis是java开发的操作redis的工具包。 引入maven依赖: <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>4.2.1</ve…...
 
Java的XWPFTemplate word生成列表
Java的XWPFTemplate工具类导出word.docx的使用_xwpftemplate 语法_youmdt的博客-CSDN博客 如果是表格的列表参考上面这篇文章即可,比较复杂的列表遍历暂时还没找到方法,只能手动创建表格了 上面是模板,非常简单,以为我们是要自己创…...
基于RFID的自动化仓储设备研发项目可行性研究报告
一、项目概况 基于RFID的自动化仓储设备研发项目,是深圳市飞鸟国际供应链股份有限公司在公司有色金属供应链一站式服务的基础上,针对有色金属供应链的仓储环节进行的研发。 多年来,公司一直坚持以“科技金融”为核心的未来发展战略…...
 
ajax异步传值以及后端接收参数的几种方式
异步传值 第一种呢,也是最简单的一种,通过get提交方式,将参数在链接中以问号的形式进行传递 // 前台传值方法 // 触发该方法调用ajaxfunction testAjax(yourData) {$.ajax({type: "get", // 以get方式发起请求url: "/yo…...
千年TGS服务器日志报错如何解决
大家在修改sdb文件,建议使用sdb修改器。注意:每个文件,每个逗号都很重要;只要其中哪部分少一个逗号或多一个逗号,都很容易发生错误。 一常见 TGS1000.LOG 错误类型,因不同的错误,错误中括号“&…...
读取Json BugFix
遇到的错误如下所示: 遇到的错误如下所示:File ~/miniconda3/lib/python3.9/json/decoder.py:353, in JSONDecoder.raw_decode(self, s, idx)344 """Decode a JSON document from s (a str beginning with345 a JSON document) and retu…...
 
【Gradle构件工具深度学习】
Gradle构件工具深度学习 1. 课程大纲1.1 Gradle入门1.2 与Idea整合1.3 Gradle进阶 2. 常见项目构建工具3. 安装gradle 1. 课程大纲 1.1 Gradle入门 基本介绍、常用指令、项目目录、项目应用 1.2 与Idea整合 Groovy语法、整合IDEA、搭建web工程、项目部署 1.3 Gradle进阶 生命周…...
Java 语言特性(面试系列1)
一、面向对象编程 1. 封装(Encapsulation) 定义:将数据(属性)和操作数据的方法绑定在一起,通过访问控制符(private、protected、public)隐藏内部实现细节。示例: public …...
 
通过Wrangler CLI在worker中创建数据库和表
官方使用文档:Getting started Cloudflare D1 docs 创建数据库 在命令行中执行完成之后,会在本地和远程创建数据库: npx wranglerlatest d1 create prod-d1-tutorial 在cf中就可以看到数据库: 现在,您的Cloudfla…...
 
【入坑系列】TiDB 强制索引在不同库下不生效问题
文章目录 背景SQL 优化情况线上SQL运行情况分析怀疑1:执行计划绑定问题?尝试:SHOW WARNINGS 查看警告探索 TiDB 的 USE_INDEX 写法Hint 不生效问题排查解决参考背景 项目中使用 TiDB 数据库,并对 SQL 进行优化了,添加了强制索引。 UAT 环境已经生效,但 PROD 环境强制索…...
 
(转)什么是DockerCompose?它有什么作用?
一、什么是DockerCompose? DockerCompose可以基于Compose文件帮我们快速的部署分布式应用,而无需手动一个个创建和运行容器。 Compose文件是一个文本文件,通过指令定义集群中的每个容器如何运行。 DockerCompose就是把DockerFile转换成指令去运行。 …...
 
SpringTask-03.入门案例
一.入门案例 启动类: package com.sky;import lombok.extern.slf4j.Slf4j; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cache.annotation.EnableCach…...
 
selenium学习实战【Python爬虫】
selenium学习实战【Python爬虫】 文章目录 selenium学习实战【Python爬虫】一、声明二、学习目标三、安装依赖3.1 安装selenium库3.2 安装浏览器驱动3.2.1 查看Edge版本3.2.2 驱动安装 四、代码讲解4.1 配置浏览器4.2 加载更多4.3 寻找内容4.4 完整代码 五、报告文件爬取5.1 提…...
Swagger和OpenApi的前世今生
Swagger与OpenAPI的关系演进是API标准化进程中的重要篇章,二者共同塑造了现代RESTful API的开发范式。 本期就扒一扒其技术演进的关键节点与核心逻辑: 🔄 一、起源与初创期:Swagger的诞生(2010-2014) 核心…...
 
Springboot社区养老保险系统小程序
一、前言 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,社区养老保险系统小程序被用户普遍使用,为方…...
Python 包管理器 uv 介绍
Python 包管理器 uv 全面介绍 uv 是由 Astral(热门工具 Ruff 的开发者)推出的下一代高性能 Python 包管理器和构建工具,用 Rust 编写。它旨在解决传统工具(如 pip、virtualenv、pip-tools)的性能瓶颈,同时…...
Spring是如何解决Bean的循环依赖:三级缓存机制
1、什么是 Bean 的循环依赖 在 Spring框架中,Bean 的循环依赖是指多个 Bean 之间互相持有对方引用,形成闭环依赖关系的现象。 多个 Bean 的依赖关系构成环形链路,例如: 双向依赖:Bean A 依赖 Bean B,同时 Bean B 也依赖 Bean A(A↔B)。链条循环: Bean A → Bean…...
