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进阶 生命周…...
在rocky linux 9.5上在线安装 docker
前面是指南,后面是日志 sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo dnf install docker-ce docker-ce-cli containerd.io -y docker version sudo systemctl start docker sudo systemctl status docker …...

Vue2 第一节_Vue2上手_插值表达式{{}}_访问数据和修改数据_Vue开发者工具
文章目录 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染2. 插值表达式{{}}3. 访问数据和修改数据4. vue响应式5. Vue开发者工具--方便调试 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染 准备容器引包创建Vue实例 new Vue()指定配置项 ->渲染数据 准备一个容器,例如: …...

页面渲染流程与性能优化
页面渲染流程与性能优化详解(完整版) 一、现代浏览器渲染流程(详细说明) 1. 构建DOM树 浏览器接收到HTML文档后,会逐步解析并构建DOM(Document Object Model)树。具体过程如下: (…...

ETLCloud可能遇到的问题有哪些?常见坑位解析
数据集成平台ETLCloud,主要用于支持数据的抽取(Extract)、转换(Transform)和加载(Load)过程。提供了一个简洁直观的界面,以便用户可以在不同的数据源之间轻松地进行数据迁移和转换。…...
【git】把本地更改提交远程新分支feature_g
创建并切换新分支 git checkout -b feature_g 添加并提交更改 git add . git commit -m “实现图片上传功能” 推送到远程 git push -u origin feature_g...
数据库分批入库
今天在工作中,遇到一个问题,就是分批查询的时候,由于批次过大导致出现了一些问题,一下是问题描述和解决方案: 示例: // 假设已有数据列表 dataList 和 PreparedStatement pstmt int batchSize 1000; // …...

算法笔记2
1.字符串拼接最好用StringBuilder,不用String 2.创建List<>类型的数组并创建内存 List arr[] new ArrayList[26]; Arrays.setAll(arr, i -> new ArrayList<>()); 3.去掉首尾空格...

【分享】推荐一些办公小工具
1、PDF 在线转换 https://smallpdf.com/cn/pdf-tools 推荐理由:大部分的转换软件需要收费,要么功能不齐全,而开会员又用不了几次浪费钱,借用别人的又不安全。 这个网站它不需要登录或下载安装。而且提供的免费功能就能满足日常…...

MySQL 知识小结(一)
一、my.cnf配置详解 我们知道安装MySQL有两种方式来安装咱们的MySQL数据库,分别是二进制安装编译数据库或者使用三方yum来进行安装,第三方yum的安装相对于二进制压缩包的安装更快捷,但是文件存放起来数据比较冗余,用二进制能够更好管理咱们M…...
LangFlow技术架构分析
🔧 LangFlow 的可视化技术栈 前端节点编辑器 底层框架:基于 (一个现代化的 React 节点绘图库) 功能: 拖拽式构建 LangGraph 状态机 实时连线定义节点依赖关系 可视化调试循环和分支逻辑 与 LangGraph 的深…...