Kubernetes Ingress暴露应用的工作流程
文章目录
- 一、Igress是什么
- 二、安装Igress Controller
- 三、Service NodePort模式暴露Ingress Controller
- 四、创建ingress 进行访问
- 查看ingress controller生成的规则(两种类型通用)
- 五、HostNetwork模式暴露Ingress Controller
- 总结:
一、Igress是什么
一般负载均衡器分为:
四层(传输层):基于ip和端口进行转发,例如lvs、nginx、haproxy
七层(应用层):基于应用层协议进行转发的,例如http,可以根据域名、url等转发,例如nginx、haproxy
Service NodePort存在的不足:
- 一个端口只能由一个服务使用,端口需要提前规划
- 只支持4层负载均衡(ip:port)
ingress可以实现集群中全局的负载均衡(只需一个到两个端口来实现分别为 80,443)为集群提供一个统一的访问入口,也可以基于url、域名实现七层的负载均衡技术来进行给应用分流 进而转发到不同的services上;
- ingress:k8s中的一个抽象资源,给管理员提供一个暴露应用的入口定义方法
- ingress Controller:根据Ingress生成具体的路由规则,并对pod进行负载均衡
Ps:Ingress Controller是基于域名进行分流的
二、安装Igress Controller
Ingress controller默认在k8s中是没有部署的;
Ingress controller有很多实现,我们这里采用官方维护的基于Nginx实现的控制器
项目地址:https://github.com/kubernetes/ingress-nginx
文档:https://kubernetes.github.io/ingress-nginx/deploy/
其他控制器(里面有k8s所支持的控制器的集合):https://kubernetes.io/docs/concepts/services-networking/ingress-controllers/
项目地址里会有各个ingress版本所支持的k8s版本及nginx的版本
在部署ingress的时候需要看下与自己k8s版本的兼容情况,以避免部署不起来
然后在项目地址里点击"Getting Started "或者直接点击上面的文档地址来进行选择部署ingress controller,这里我们选择自建k8s集群的方式来部署
1.下载ingress的yml文件
[root@k8s-master ~]# wget -c https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.3.0/deploy/static/provider/baremetal/deploy.yaml
#下载其它版本的话直接修改中间的版本号就行
[root@k8s-master1 ~]# mv deploy.yaml ingress-controller.yaml
2.修改ingress配置
(1)需要将镜像地址(registry.k8s.io)修改为国内的(lank8s.cn)否则会下不了镜像
[root@k8s-master ~]# grep -r "image:" deploy.yaml image: registry.k8s.io/ingress-nginx/controller:v1.3.0@sha256:d1707ca76d3b044ab8a28277a2466a02100ee9f58a86af1535a3edf9323ea1b5image: registry.k8s.io/ingress-nginx/kube-webhook-certgen:v1.1.1@sha256:64d8c73dca984af206adf9d6d7e46aa550362b1d7a01f3a0a91b20cc67868660image: registry.k8s.io/ingress-nginx/kube-webhook-certgen:v1.1.1@sha256:64d8c73dca984af206adf9d6d7e46aa550362b1d7a01f3a0a91b20cc67868660
[root@k8s-master ~]# mv deploy.yaml ingress-controller.yaml
[root@k8s-master ~]# grep -r "image:" ingress-controller.yaml image: registry.k8s.io/ingress-nginx/controller:v1.3.0@sha256:d1707ca76d3b044ab8a28277a2466a02100ee9f58a86af1535a3edf9323ea1b5image: registry.k8s.io/ingress-nginx/kube-webhook-certgen:v1.1.1@sha256:64d8c73dca984af206adf9d6d7e46aa550362b1d7a01f3a0a91b20cc67868660image: registry.k8s.io/ingress-nginx/kube-webhook-certgen:v1.1.1@sha256:64d8c73dca984af206adf9d6d7e46aa550362b1d7a01f3a0a91b20cc67868660
[root@k8s-master ~]# sed -i 's/registry.k8s.io/lank8s.cn/g' ingress-controller.yaml
[root@k8s-master ~]# grep -r "image:" ingress-controller.yaml image: lank8s.cn/ingress-nginx/controller:v1.3.0@sha256:d1707ca76d3b044ab8a28277a2466a02100ee9f58a86af1535a3edf9323ea1b5image: lank8s.cn/ingress-nginx/kube-webhook-certgen:v1.1.1@sha256:64d8c73dca984af206adf9d6d7e46aa550362b1d7a01f3a0a91b20cc67868660image: lank8s.cn/ingress-nginx/kube-webhook-certgen:v1.1.1@sha256:64d8c73dca984af206adf9d6d7e46aa550362b1d7a01f3a0a91b20cc67868660
修改完镜像地址后,需要选择下面一种暴露ingress controller方式来进行部署(正常情况下HostNetwork模式居多);
三、Service NodePort模式暴露Ingress Controller
- Service NodePort暴露Ingress Controller
ingress controller是以k8s pod的方式进行部署的,我们可以使用service nodeport的方式来随机生成或指定暴露端口来将请求转发到ingress controller上,ingress controller就会根据我们创建的ingress规则来转发至相应的pod上;
当我们下载好ingress的配置文件后,它默认使用的就是NodePort类型来暴露自己pod的80和443端口,也就是一个service暴露多个端口
ingress controller使用的是Depolyment进行部署的,默认的副本数为1
其实使用NodePort方式进行部署ingress是不需要对配置文件进行改动的,直接下载下来apply部署一下就可以
[root@k8s-master ~]# kubectl apply -f ingress-controller.yaml
#默认会将ingress controller给我部署到"ingress-nginx"这个命名空间下
namespace/ingress-nginx created
serviceaccount/ingress-nginx created
serviceaccount/ingress-nginx-admission created
role.rbac.authorization.k8s.io/ingress-nginx created
role.rbac.authorization.k8s.io/ingress-nginx-admission created
clusterrole.rbac.authorization.k8s.io/ingress-nginx created
clusterrole.rbac.authorization.k8s.io/ingress-nginx-admission created
rolebinding.rbac.authorization.k8s.io/ingress-nginx created
rolebinding.rbac.authorization.k8s.io/ingress-nginx-admission created
clusterrolebinding.rbac.authorization.k8s.io/ingress-nginx created
clusterrolebinding.rbac.authorization.k8s.io/ingress-nginx-admission created
configmap/ingress-nginx-controller created
service/ingress-nginx-controller created
service/ingress-nginx-controller-admission created
deployment.apps/ingress-nginx-controller created
job.batch/ingress-nginx-admission-create created
job.batch/ingress-nginx-admission-patch created
ingressclass.networking.k8s.io/nginx created
validatingwebhookconfiguration.admissionregistration.k8s.io/ingress-nginx-admission created[root@k8s-master ~]# kubectl get pod -n ingress-nginx
NAME READY STATUS RESTARTS AGE
ingress-nginx-admission-create-9qfbs 0/1 Completed 0 2d18h
ingress-nginx-admission-patch-w2252 0/1 Completed 2 2d18h
ingress-nginx-controller-dc9c4bf8f-9nl2t 1/1 Running 0 2d18h
当ingress启动之后,我们可以查看下它暴露的端口
[root@k8s-master ~]# kubectl get pod,svc -n ingress-nginx
NAME READY STATUS RESTARTS AGE
pod/ingress-nginx-admission-create-9qfbs 0/1 Completed 0 2d18h
pod/ingress-nginx-admission-patch-w2252 0/1 Completed 2 2d18h
pod/ingress-nginx-controller-dc9c4bf8f-9nl2t 1/1 Running 0 2d18hNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/ingress-nginx-controller NodePort 10.96.212.26 <none> 80:32337/TCP,443:31950/TCP 2d18h
service/ingress-nginx-controller-admission ClusterIP 10.110.231.235 <none> 443/TCP 2d18h
可以看到ingress暴露的端口为32337和31950
,分别对应着它容器内部的80和443端口
;当请求到ingress-controller上时 会把请求转发到相应的pod上
四、创建ingress 进行访问
官方创建ingress配置示例:https://kubernetes.io/docs/concepts/services-networking/ingress/
或者通过命令来进行创建示例
例:
[root@k8s-master ~]# kubectl create ingress --help
Usage:kubectl create ingress NAME --rule=host/path=service:port[,tls[=secret]]
[options]
[root@k8s-master ~]# kubectl create ingress web1 --rule=host/path=web:80 --dry-run=client -o yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:creationTimestamp: nullname: web1
spec:rules:- host: hosthttp:paths:- backend:service:name: webport:number: 80path: /pathpathType: Exact
status:loadBalancer: {}
1.这里使用官方示例来进行创建ingress
[root@k8s-master ~]# vim web-ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:name: web
spec:#指定ingress控制器类型为nginx,不同的控制器表示不一样,可以查看官方文档进行查阅ingressClassName: nginxrules:#指定请求的域名- host: web.study.comhttp:paths:#指定请求的路径- path: /pathType: Prefixbackend:#指定要暴露的应用(Pod)的service,所以使用ingress之前是一定要先创建service的,它是基于service来发现这一组要被请求的pod的service:name: web#指定要暴露的service的内部port端口port:number: 80[root@k8s-master ~]# kubectl apply -f web-ingress.yaml
ingress.networking.k8s.io/web created
2.使用apply来创建ingress并进行访问
创建ingress后,ingress controller会基于nginx来自动生成ingress转发规则
[root@k8s-master ~]# kubectl get ingress
NAME CLASS HOSTS ADDRESS PORTS AGE
web nginx web.study.com 80 13s
测试访问:
因为我们使用的是NodePort的方式部署的ingress controller,使用当我们要去访问ingress的时候,也需要使用Service NodeProt的方式去访问
ingress controller暴露的端口为80:32337/TCP,443:31950/TCP
又因为我们上面创建ingress 的时候绑定了域名,应该使用域 名:nodeport(80:32337/TCP,443:31950/TCP)进行去访问
例如:
web.study.com:32337
注:如果这里配置的域名可以直接解析到(公网IP)的话,直接访问就行了,如果是个人学习环境 解析不到的话,就需要在本地电脑绑定hosts记录对应着ingress里面配置的域名
例: < NodeIP > web.study.com
查看ingress controller生成的规则(两种类型通用)
因为这里使用的是nginx类型的ingress控制器(ingress-nginx),所以我们可以进入到这个ingress控制器里查看生成的nginx配置(ingress规则)
[root@k8s-master ~]# kubectl get pod -n ingress-nginx
NAME READY STATUS RESTARTS AGE
ingress-nginx-admission-create-9qfbs 0/1 Completed 0 3d17h
ingress-nginx-admission-patch-w2252 0/1 Completed 2 3d17h
ingress-nginx-controller-dc9c4bf8f-9nl2t 1/1 Running 0 3d17h[root@k8s-master ~]# kubectl exec -it pod/ingress-nginx-controller-dc9c4bf8f-9nl2t -n ingress-nginx /bin/bash
bash-5.1$ vi /etc/nginx/nginx.conf
可以看到如下ingress controller会帮我们自动生成一个nginx的虚拟主机server的配置,也就是在这里会基于这个域名来进行分流
## start server web.study.com server { server_name web.study.com ;listen 80 ;...## end server web.study.com
五、HostNetwork模式暴露Ingress Controller
Service NodePort 模式暴露Ingress的痛点:
由于NodePort模式进行访问时需要域名加端口(web.study.com:32337)来进行访问,先是经过Service NodePort转发到ingress controller上,再由ingress controller转发到pod上;而且一个请求流的过程 太过繁琐,使用共享宿主机网络模式整体流程会更加清晰
- 共享宿主机网络(hostNetwork:True)
指定ingress controller这个pod保持跟宿主机的网络保持一致,用同一个网络命名空间,这样我们访问node节点就是相当于请求到了ingress controller里,再根据我们设置的ingress规则,来转发至相应的pod上;
1.共享宿主机模式部署ingress controller
apiVersion: apps/v1
kind: Deployment
...spec: #共享宿主机的网络协议栈(不给ingress controller分配独立的网路命名空间,与宿主机网络命名空间共享)hostNetwork: True#将Pod调度到指定的Node上,不经过调度器#nodeName: k8s-master#根据标签控制pod在哪个node节点上,受scheduler调度器控制(例如有污点便不能调度)#例如将pod调度到含有[test-label-ingress-controller: "true"]标签的节点上#nodeSelector: # test-label-ingress-controller: "true" containers:- args:- /nginx-ingress-controller...
修改完后apply重新应用ingress controller控制器
[root@k8s-master ~]# kubectl apply -f ingress-controller.yaml
[root@k8s-master ~]# kubectl get pod -n ingress-nginx -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
ingress-nginx-admission-create-9qfbs 0/1 Completed 0 7d17h 10.244.36.65 k8s-node1 <none> <none>
ingress-nginx-admission-patch-w2252 0/1 Completed 2 7d17h 10.244.107.193 k8s-node3 <none> <none>
ingress-nginx-controller-55b4c7fdcf-68stc 1/1 Running 0 7m24s 192.168.1.1 k8s-master <none> <none>
#此时已经不会再给ingress controller这个Pod分配IP了,而是直接使用了k8s-master这个宿主机的IP进行监听,也就是除了网络没有和宿主机进行隔离,其他都是隔离的;
可以看到ingress controller被分配到了master上(也可以根据调度指定节点),然后我们将hosts解析改成分配到的pod,再直接使用域名访问
注:如果这里配置的域名可以直接解析到(公网IP)的话,直接访问就行了,如果是个人学习环境 解析不到的话,就需要在本地电脑绑定hosts记录对应着ingress里面配置的域名
需要注意的是,我们只能访问将域名解析改为ingress controller所在的节点上,因为在使用host方式的时候,ingress controller只会监听它所在的节点的端口,其他节点没有ingress controller,就不会监听
#查看k8s-master节点上ingress controller监听的80端口
[root@k8s-master ~]# ss -unptl | grep 80
tcp LISTEN 0 128 *:80 *:* users:(("nginx",pid=41316,fd=10),("nginx",pid=41311,fd=10))
tcp LISTEN 0 128 192.168.1.1:2380 *:* users:(("etcd",pid=2912,fd=3))
tcp LISTEN 0 128 [::]:80 [::]:* users:(("nginx",pid=41316,fd=11),("nginx",pid=41311,fd=11))#查看k8s-node1节点是否有监听
[root@k8s-node1 ~]# ss -unptl | grep 80
拓展:
只要我们访问的节点上有ingress controller这个pod,就可以访问我们后端的pod,所以,我们可以指定ingress controller的 副本 以及根据相应的 调度策略 来实现多个指定的节点上跑ingress controller的pod来实现host方式的 ingress controller 高可用;
总结:
Service NodePort访问的ingress controller流程:
域名 web.study.com:32337 --> service nodeprot(80:32337/TCP,443:31950/TCP)(iptables/ipvs) --> ingress controller(nginx 基于域名来进行分流) --> 分布在各个节点的pod
#当用户根据域名:端口请求
时,先是Service NodePort(主要作用是将ingress controller暴露出去)会将请求转发至ingress controller,然后ingress controller 会基于域名来帮我们转发到后端service(在这里service提供的只是服务发现的机制,并不提供转发的路径)关联的pod上;
前者(Service NodePort)根据iptables/ipset来实现转发,后者(ingress controller)基于nginx来实现;
hostNetwork方式的ingress-nginx整体的工作流程是:
域名 web.study.com:80 --> 宿主机80端口 是ingress controller监听的 --> ingress controller(nginx 基于域名来进行分流) --> 分布在各个节点的pod
#当用户直接请求域名
时,此时的请求也就是"域名:80",只要域名解析正确(可以解析到ingress controller所在的宿主机),这个请求就会直接到ingress controller上,然后ingress controller会基于域名来帮我们转发到后端service关联的pod上;
相关文章:

Kubernetes Ingress暴露应用的工作流程
文章目录 一、Igress是什么二、安装Igress Controller三、Service NodePort模式暴露Ingress Controller四、创建ingress 进行访问查看ingress controller生成的规则(两种类型通用) 五、HostNetwork模式暴露Ingress Controller总结: 一、Igress是什么 一般负载均衡器…...

Redis应用(1)缓存(1.2)------Redis三种缓存问题
三者出现的根本原因是:Redis缓存命中率下降,请求直接打到DB上了。 一、 缓存穿透: 1、定义: 缓存穿透是指客户端请求的数据在缓存中和数据库中都不存在,这样缓存永远不会生效,这些请求都会打到数据库。…...
安全 专题
[实践总结] 日志注入问题(log4j2) [实践总结] Java 防止SQL注入的四种方案 [实践总结] 如何防护 order by 导致的SQL注入 [实践总结] 限制正则表达式匹配次数/时间 防止DoS攻击 [实践总结] java XML解析防止外部实体注入 [Ref] yaml.load的漏洞利用…...

自然语言处理-文本对分类或回归
我们研究了自然语言推断。它属于文本对分类,这是一种对文本进行分类的应用类型。 以一对文本作为输入但输出连续值,语义文本相似度是一个流行的“文本对回归”任务。 这项任务评估句子的语义相似度。例如,在语义文本相似度基准数据集&#x…...

以梦为码,CodeArts Snap 缩短我与算法的距离
背景 最近一直在体验华为云的 CodeArts Snap,逐渐掌握了使用方法,代码自动生成的准确程度大大提高了。 自从上次跟着 CodeArts Snap 学习用 Python 编程,逐渐喜欢上了 Python。 我还给 CodeArts Snap 起了一个花名: 最佳智能学…...

SpringMVC-HttpMessageConverter 报文信息转化器
文章目录 HttpMessageConverter一、概念二、RequestBody三、RequestEntity四、 ResponseBody1.返回JSON格式的字符串 五、RestController六、ResponseEntity HttpMessageConverter 一、概念 报文信息转化器,将请求报文转化为Java对象,或将Java对象转化…...

[AG32VF407]国产MCU+FPGA 使用I2C测试陀螺仪MPU6050
视频讲解 [AG32VF407]国产MCUFPGA 使用I2C测试陀螺仪MPU6050 实验过程 查看原理图中定义的I2C的管脚,PB0和PB1 在board.ve中定义的引脚功能 I2C0_SDA PIN_36 I2C0_SCL PIN_35新建工程 测试代码 #include "board.h"#define MIN_IRQ_PRIORITY 1 #define …...
ES 可扩展、高可靠、使用场景等常见问题
ElasticSearch的常见问题 什么是ElasticSearch ElasticSearch是一款非常强大的、基于Lucene的开源搜索及分析引擎;它是一个实时的分布式搜索分析引擎,它能让你以前所未有的速度和规模,去探索你的数据。 它被用作全文检索、结构化搜索、分析…...
<网络安全>《4 网络安全产品之web应用防护系统》
1 基本概念 1.1 WAF Web应用防护系统(也称为:网站应用级入侵防御系统。英文:Web Application Firewall,简称:WAF)。一般作为网关设备,防护Web、Webmail服务器等。 1.2 本质 WAF的本质是Web应…...

如何解决Flutter应用程序的兼容性问题
随着移动应用开发领域的不断发展,Flutter作为一种跨平台框架,受到了越来越多开发者的青睐。要确保Flutter应用程序能够在不同的设备和操作系统上稳定运行,并提供一致的用户体验,我们需要重视应用程序的兼容性问题。下面将简单的介…...

详解Mockito
详解Mockito 1. Mockito简介 在我们的编程世界中,测试是一个非常重要的环节,它能帮助我们确保代码的质量和稳定性。而在众多的测试方法中,Mock测试是一种非常有效的手段。 1.1 什么是 Mock 测试 Mock测试,顾名思义,…...

【论文+App试玩+图像到视频】2311.Animate-anyone:上传1张图片为任何人制作动画(用于角色动画的一致且可控的图像到视频合成)(暂未开源)
项目主页:https://humanaigc.github.io/animate-anyone/ 论文: Animate Anyone: Consistent and Controllable Image-to-Video Synthesis for Character Animation 摩尔线程复现代码:https://github.com/MooreThreads/Moore-AnimateAnyone 摩尔windows一…...

【深度学习实验】TensorBoard使用教程【SCALARS、IMAGES、TIME SERIES】
文章目录 一、环境二、TensorBoard1. 使用TensorBoardXa. 安装TensorBoardXb. 使用示例 2. PyTorch内置的TensorBoard3. 启动TensorBoard服务 三、实战1. SCALARS(标量)找不同关卡1关卡2关卡3关卡4 Show data download linksIgnore outliers in chart sc…...

渗透测试(12)- WireShark 网络数据包分析
目录 1、WireShack 简介 2、WireShark 基本使用方法 3、 WireShack 抓包分析 3.1 Hypertext Transfer Protocol (应用层) 3.2 Transmission Control Protocol (传输层) 3.3 Internet Protocol Version 4(网络层) 3.4 Ethernet Il (链路层): 数据链路层以太网头部信息 …...

XSS_Labs靶场通关笔记
每一关的方法不唯一;可以结合源码进行分析后构造payload; 通关技巧(四步): 1.输入内容看源码变化; 2.找到内容插入点; 3.测试是否有过滤; 4.构造payload绕过 第一关 构造paylo…...
基于本地缓存制作一个分库分表的分布式ID生成器
引言: 代码在 https://gitee.com/lbmb/mb-live-app 中 【mb-live-id-generate-provider】 模块里面 如果喜欢 希望大家给给star 项目还在持续更新中。 背景介绍 项目整体架构是 基于springboot 3.0 开发 rpc 调用采用 dubbo 注册配置中心 使用 nacos 采用shardin…...
美易平台:金融市场的晴雨表与创新服务的融合
在金融市场中,利率的微妙变动往往预示着经济活动的脉动,而美国纽约联储发布的最新数据显示,上个交易日(1月25日)担保隔夜融资利率(SOFR)小幅上升至5.32%,而同期有效的联邦基金利率保…...

文旅项目包括什么?
文旅项目是指与文化和旅游相结合的项目,旨在通过提供丰富的文化体验和旅游服务来吸引游客,促进地方经济发展。 文旅项目通常包括多个方面,以下是对每块内容的详细介绍: 文化旅游景区:这类项目以展示人类文化和历史遗产…...
Pointnet++改进优化器系列:全网首发AdamW优化器 |即插即用,实现有效涨点
简介:1.该教程提供大量的首发改进的方式,降低上手难度,多种结构改进,助力寻找创新点!2.本篇文章对Pointnet++特征提取模块进行改进,加入AdamW优化器,提升性能。3.专栏持续更新,紧随最新的研究内容。 目录 1.理论介绍 2.修改步骤 2.1 步骤一 2.2 步骤二 2.3 步...

stm32 FOC 电机介绍
今年开始学习foc控制无刷电机,这几天把所学整理一下,记录一下知识内容。 前言: 为什么要学习FOC? 1.电机控制是自动化控制领域重要一环。 2.目前直流无刷电机应用越来越广泛,如无人机、机械臂、云台、仿生机器人等等。 需要什么基础&…...
【位运算】消失的两个数字(hard)
消失的两个数字(hard) 题⽬描述:解法(位运算):Java 算法代码:更简便代码 题⽬链接:⾯试题 17.19. 消失的两个数字 题⽬描述: 给定⼀个数组,包含从 1 到 N 所有…...

高频面试之3Zookeeper
高频面试之3Zookeeper 文章目录 高频面试之3Zookeeper3.1 常用命令3.2 选举机制3.3 Zookeeper符合法则中哪两个?3.4 Zookeeper脑裂3.5 Zookeeper用来干嘛了 3.1 常用命令 ls、get、create、delete、deleteall3.2 选举机制 半数机制(过半机制࿰…...

Nuxt.js 中的路由配置详解
Nuxt.js 通过其内置的路由系统简化了应用的路由配置,使得开发者可以轻松地管理页面导航和 URL 结构。路由配置主要涉及页面组件的组织、动态路由的设置以及路由元信息的配置。 自动路由生成 Nuxt.js 会根据 pages 目录下的文件结构自动生成路由配置。每个文件都会对…...

Android15默认授权浮窗权限
我们经常有那种需求,客户需要定制的apk集成在ROM中,并且默认授予其【显示在其他应用的上层】权限,也就是我们常说的浮窗权限,那么我们就可以通过以下方法在wms、ams等系统服务的systemReady()方法中调用即可实现预置应用默认授权浮…...
Java多线程实现之Thread类深度解析
Java多线程实现之Thread类深度解析 一、多线程基础概念1.1 什么是线程1.2 多线程的优势1.3 Java多线程模型 二、Thread类的基本结构与构造函数2.1 Thread类的继承关系2.2 构造函数 三、创建和启动线程3.1 继承Thread类创建线程3.2 实现Runnable接口创建线程 四、Thread类的核心…...
【Java学习笔记】BigInteger 和 BigDecimal 类
BigInteger 和 BigDecimal 类 二者共有的常见方法 方法功能add加subtract减multiply乘divide除 注意点:传参类型必须是类对象 一、BigInteger 1. 作用:适合保存比较大的整型数 2. 使用说明 创建BigInteger对象 传入字符串 3. 代码示例 import j…...

基于TurtleBot3在Gazebo地图实现机器人远程控制
1. TurtleBot3环境配置 # 下载TurtleBot3核心包 mkdir -p ~/catkin_ws/src cd ~/catkin_ws/src git clone -b noetic-devel https://github.com/ROBOTIS-GIT/turtlebot3.git git clone -b noetic https://github.com/ROBOTIS-GIT/turtlebot3_msgs.git git clone -b noetic-dev…...
uniapp 字符包含的相关方法
在uniapp中,如果你想检查一个字符串是否包含另一个子字符串,你可以使用JavaScript中的includes()方法或者indexOf()方法。这两种方法都可以达到目的,但它们在处理方式和返回值上有所不同。 使用includes()方法 includes()方法用于判断一个字…...

保姆级【快数学会Android端“动画“】+ 实现补间动画和逐帧动画!!!
目录 补间动画 1.创建资源文件夹 2.设置文件夹类型 3.创建.xml文件 4.样式设计 5.动画设置 6.动画的实现 内容拓展 7.在原基础上继续添加.xml文件 8.xml代码编写 (1)rotate_anim (2)scale_anim (3)translate_anim 9.MainActivity.java代码汇总 10.效果展示 逐帧…...

Spring AOP代理对象生成原理
代理对象生成的关键类是【AnnotationAwareAspectJAutoProxyCreator】,这个类继承了【BeanPostProcessor】是一个后置处理器 在bean对象生命周期中初始化时执行【org.springframework.beans.factory.config.BeanPostProcessor#postProcessAfterInitialization】方法时…...