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: 2selector:matchLabels:name: nginx1template:metadata:labels:name: nginx1spec:containers:- name: nginx1image: soscscs/myapp:v1imagePullPolicy: IfNotPresentports:- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:name: svc-1
spec:ports:- port: 80targetPort: 80protocol: TCPselector:name: nginx1
kubectl apply -f deployment1.yaml #启动主机1资源

3,创建虚拟主机2资源

vim deployment2.yaml
apiVersion: apps/v1
kind: Deployment
metadata:name: deployment2
spec:replicas: 2selector:matchLabels:name: nginx2template:metadata:labels:name: nginx2spec:containers:- name: nginx2image: soscscs/myapp:v2imagePullPolicy: IfNotPresentports:- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:name: svc-2
spec:ports:- port: 80targetPort: 80protocol: TCPselector: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.comhttp:paths:- path: /pathType: Prefixbackend:service:name: svc-1port:number: 80
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:name: ingress2
spec:rules:- host: www02.zzz.comhttp:paths:- path: /pathType: Prefixbackend:service:name: svc-2port: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: 2selector:matchLabels:name: nginxtemplate:metadata:labels:name: nginxspec:containers:- name: nginximage: nginximagePullPolicy: IfNotPresentports:- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:name: nginx-svc-https  #后端服务的名称为nginx-svc-https
spec:ports:- port: 80targetPort: 80protocol: TCPselector:name: nginx
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:name: nginx-https
spec:tls:- hosts:- www3.zzz.comsecretName: tls-secret   # 存储TLS证书和私钥的 Secret 对象的名称为tls-secretrules:- host: www3.zzz.comhttp:paths:- path: /pathType: Prefixbackend:service:name: nginx-svc-https  #后端服务的名称为nginx-svc-httpsport: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-authannotations:#设置认证类型basicnginx.ingress.kubernetes.io/auth-type: basic#设置secret资源名称basic-authnginx.ingress.kubernetes.io/auth-secret: basic-auth#设置认证窗口提示信息nginx.ingress.kubernetes.io/auth-realm: 'Authentication Required - wyq'
spec:rules:- host: auth.wyq.comhttp:paths:- path: /pathType: Prefixbackend:service: name: nginx-svcport: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-rewriteannotations: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: Prefixbackend:service:name: nginx-svcport:number: 80

3, 访问测试

做映射

 

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

五    总结

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

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

相关文章

【文末附gpt升级秘笈】埃隆·马斯克芯片调配策略对特斯拉股价的影响分析

埃隆马斯克芯片调配策略对特斯拉股价的影响分析 一、引言 在现代商业环境中&#xff0c;企业间的资源调配与策略布局往往对其股价产生深远影响。据外媒CNBC报道&#xff0c;埃隆马斯克在芯片资源分配上的决策引起了业界的广泛关注。他秘密要求英伟达将原本预留给特斯拉的高端…

如何为律师制作专业的商务名片?含电子名片二维码

律师关注细节&#xff0c;律师名片也不例外。它们不仅仅是身份的象征&#xff0c;更是律师专业形象的代表&#xff0c;传递专业知识和信任。今天就来和我们一起来看看制作律师商务名片的注意事项&#xff0c;以及如何制作商务名片上的电子名片二维码&#xff1f; 一、名片的主…

【Text2SQL】评估 LLM 的 Text2SQL 能力

论文&#xff1a;Evaluating the Text-to-SQL Capabilities of Large Language Models ⭐⭐⭐⭐ arXiv:2204.00498 一、论文速读 本论文尝试了多种 prompt 结构&#xff0c;并且评估了他们在 Codex 和 GPT-3 上的表现。下面介绍这些 prompt 结构&#xff1a; 二、不同的 prom…

优思学院|谈汽车零部件企业生产精益及现场管理

精益生产&#xff08;Lean Production&#xff09;和现场管理作为现代制造企业的核心管理理念&#xff0c;正在越来越多的企业中得到应用。尤其是在中国&#xff0c;许多汽车零部件企业通过精益管理和六西格玛方法&#xff0c;显著提高了生产效率&#xff0c;降低了生产成本&am…

大数据之CDH对Hdfs做Balance数据均衡/数据平衡/数据倾斜

问题的来源: 由于在hive工具运行sql,出现sql卡顿的情况,去cdh上查看yarn资源的分布情况,发现了整个cdh平台中hdfs和yarn资源分布不均匀,大量的爆红显示: 以下 DataNode 数据目录 位于小于其可用空间 10.0 吉字节 的文件系统中。 /data1/dfs/dn&#xff08;可用&#xff1a;7.2 …

C++的类和new和delete和菱形继承机制

文章目录 参考虚函数使用虚函数的class结构相关实现源码IDA反编译子类虚表和父类虚表调用函数菱形继承 参考 https://showlinkroom.me/2017/08/21/C-%E9%80%86%E5%90%91%E5%88%86%E6%9E%90/ https://www.cnblogs.com/bonelee/p/17299985.html https://xz.aliyun.com/t/5242?t…

hadoop疑难问题解决_NoClassDefFoundError: org/apache/hadoop/fs/adl/AdlFileSystem

1、问题描述 impala执行查询&#xff1a;select * from stmta_raw limit 10; 报错信息如下&#xff1a; Query: select * from sfmta_raw limit 10 Query submitted at: 2018-04-11 14:46:29 (Coordinator: http://mrj001:25000) ERROR: AnalysisException: Failed to load …

Linux进程无法被kill

说明&#xff1a;记录一次应用进程无法被kill的错误&#xff1b; 场景 在一次导出MySQL数据时&#xff0c;使用下面的命令&#xff0c;将数据库数据导出为.sql文件&#xff0c;数据量大&#xff0c;导出时间长&#xff0c;于是我就将服务器重启了。 mysqldump -u username -…

springboot大学生就业管理系统-计算机毕业设计源码89344

摘 要 信息化社会内需要与之针对性的信息获取途径&#xff0c;但是途径的扩展基本上为人们所努力的方向&#xff0c;由于站在的角度存在偏差&#xff0c;人们经常能够获得不同类型信息&#xff0c;这也是技术最为难以攻克的课题。针对大学生就业管理系统等问题&#xff0c;对大…

vs中C++项目中没有QT(.pro)文件怎么生成翻译ts文件

目录 使用 CMake 生成翻译文件 1.创建 CMakeLists.txt 文件 2.添加翻译生成规则 3.运行 CMake 4.生成翻译文件 使用命令行工具生成翻译文件 1.运行 lupdate 2.编辑 .ts 文件 3.运行 lrelease 网络上说的情况都是一个qt程序在VS中打开&#xff0c;拥有.pro文件的情况&a…

C++ 11【右值引用】

&#x1f493;博主CSDN主页:麻辣韭菜&#x1f493;   ⏩专栏分类&#xff1a;C修炼之路⏪   &#x1f69a;代码仓库:C高阶&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学习更多C知识   &#x1f51d;&#x1f51d; 1.C 11 简介 目录 1.C 11 简介 2. 统一的列表…

Vue3【四】使用Vue2的写法写一个新的组件子组件和根组件

Vue3【四】使用Vue2的写法写一个新的组件 Vue3【四】使用Vue2的写法写一个新的组件 Vue3是向下兼容的&#xff0c;所有可以使用Vue的选项式写法 运行截图 目录结构 文件源码 App.vue <template><div class"app"><h1>你好世界! 我是App根组件<…

数据分析常用模型合集(二)RARRA模型、RFM模型

随着互联网的发展&#xff0c;前期平台的砸钱拉新、抢占市场&#xff0c;大家都叫AARRR小甜甜&#xff1b; 现在市场基本抢占得差不多&#xff0c;形成了一个平衡&#xff0c;新人基本拉不到多少&#xff0c;用户都知道干什么事有哪些平台&#xff0c;比如买东西主流淘宝、京东…

动态IP基础解析:为什么我们需要它?

在深入探讨互联网世界的运作机制时&#xff0c;IP地址无疑是其核心要素之一。IP地址&#xff0c;作为网络设备的唯一标识&#xff0c;不仅确保了数据的准确传输&#xff0c;更是网络安全和管理的基石。本文将深入解析动态IP的基础知识&#xff0c;并探讨其重要性及在多种场景下…

大语言模型应用与传统程序的不同

大语言模型&#xff08;LLM&#xff09; 被描述的神乎其神&#xff0c;无所不能&#xff0c;其实&#xff0c;大语言模型只是一个模型&#xff0c;它能够理解和生成自然语言&#xff0c;唯有依靠应用程序才能够发挥作用。例如&#xff0c;基于大模型可以构建一个最简单的会话机…

神经网络 torch.nn---Non-Linear Activations (ReLU)

ReLU — PyTorch 2.3 documentation torch.nn - PyTorch中文文档 (pytorch-cn.readthedocs.io) 非线性变换的目的 非线性变换的目的是为神经网络引入一些非线性特征&#xff0c;使其训练出一些符合各种曲线或各种特征的模型。 换句话来说&#xff0c;如果模型都是直线特征的…

拼多多面试:Netty如何解决粘包问题?

粘包和拆包问题也叫做粘包和半包问题&#xff0c;它是指在数据传输时&#xff0c;接收方未能正常读取到一条完整数据的情况&#xff08;只读取了部分数据&#xff0c;或多读取到了另一条数据的情况&#xff09;就叫做粘包或拆包问题。 从严格意义上来说&#xff0c;粘包问题和…

全球AI新闻速递6.5

全球AI新闻速递 1.昆仑万维&#xff1a;开源2 千亿稀疏大模型天工Skywork-MoE&#xff0c;首个支持单台RTX 4090服务器。 2.字节豆包推出桌面客户端&#xff1a;支持 Windows / macOS&#xff0c;快捷启动、AI 划词、 AI 搜索。 3.东风柳汽与优必选科技签署人形机器人汽车制造…

FreeRTOS手表项目多级菜单的实现

一、首先介绍一下智能手表项目的背景&#xff1a; 如图&#xff0c;关注焦点是任务&#xff1a; 1、在一个确定时刻&#xff0c;在那一圈任务中&#xff08;写有只有一个任务解挂&#xff09;只有一个任务处在运行&#xff0c;界面显示的是该任务应该显示的内容&#xff1b; …

vscode运行Java utf-8文件中文乱码报错

问题现象 vscode 运行utf-8 java文,爆出如下错误 hello.java:5: &#xfffd;&#xfffd;&#xfffd;&#xfffd;: &#xfffd;&#xfffd;&#xfffd;&#xfffd;GBK&#xfffd;IJ&#xfffd;&#xfffd;&#xfffd;ӳ&#xfffd;&#xfffd;&#xfffd;ַ&a…