Docker 环境下使用 Traefik 3 的最佳实践:快速上手

news2024/11/20 19:39:12

Traefik 最近终于发布了大版本升级后的第一个修正版本,或许是时候正式迁移程序到新版本了。

写在前面

Traefik 3 正式发布

最近 Traefik 发布了 3.1 版本。作为从 Traefik 1.x 开始使用的用户,Traefik 每个大版本升级都会出现一些配置不兼容的情况,这次 3.x 的正式升级也不例外。

虽然早在 Traefik 3.0 beta 的时候,我就写过尽可能兼容 3.x 版本的上手内容《Traefik v3.0 Docker 全面使用指南:基础篇》,上个季度正式发布 3.0 后,我们还是需要调整一些配置。

为了简化配置和上手的过程,我将我使用的基础配置开源在了 soulteary/traefik-v3-example,有需要可以自取。

下面,让我们来了解 Traefik 3 正式版的使用。

准备工作

为了上手简单,我们使用上面的开源项目代码为基础进行配置。

默认情况下,服务将运行在 80443 端口,所以,需要确保这两个端口没有其他程序占用。

获取基础配置代码

使用 git 将包含基础配置的项目下载到本地:

git clone https://github.com/soulteary/traefik-v3-example.git

然后进入代码目录:

cd traefik-v3-example

Docker 环境

关于 Docker 环境的准备,非常简单。

Docker, Develop faster, Run anywhere.

如果你使用的是图形化界面,尤其是 Windows 或者 macOS,可以访问 “Docker 官方网站”,从网页下载安装程序,“一路下一步”,完成环境准备。

当然,你也可以参考之前的一些文章:

  • 如果你是 Windows 环境,可以参考《基于 Docker 的深度学习环境:Windows 篇》中的“准备 Docker 虚拟化运行环境”来完成环境准备。
  • 如果你是 Linux 操作系统,可以参考《在笔记本上搭建高性价比的 Linux 学习环境:基础篇》中的“更简单的 Docker 安装”来完成环境准备。

准备 Traefik Docker 专用网络

在完成 Docker 的安装后,我们执行代码目录的脚本文件,就能够自动创建 Traefik 运行所需要的虚拟网络了:

bash scripts/prepare-network.sh

命令执行后,如果一切正常,我们能够看到类似下面的日志内容:

# bash scripts/prepare-network.sh

create docker network for traefik ok

让 Traefik 支持使用 HTTPS 证书

Traefik 支持两种方式来使用 HTTPS 证书:一种是使用我们准备好的证书文件,另一种是为我们拥有的域名自动申请“Let’s Encrypt”免费证书。去年这家非盈利证书机构已经为 3.63 亿网站提供了 TLS 证书。

关于第一种方式,我们可以在各种云服务商处购买或者申请免费的 HTTPS 证书,将 HTTPS 证书下载到本地,放在项目目录的 ssl 目录中即可。

当然,我们也可以贯彻免费到底,根据自己需求,自己生成一套证书来使用。

快速生成一套自己的签名证书

这里,推荐一个几年前写的开源证书生成小工具:soulteary/certs-maker。如果你对自签名证书的基础知识、如何快速部署到系统感兴趣,可以阅读之前的文章:《如何制作和使用自签名证书》。

如果你已经完成了 Docker 的安装,那么只需要使用下面的命令,就能够快速的完成自签名证书的生成了:

docker run --rm -it -v `pwd`/ssl:/ssl soulteary/certs-maker:v3.5.0 "--CERT_DNS=lab.com,*.lab.com,*.data.lab.com"

当命令执行后,就能够得到证书文件了。

[soulteary/certs-maker] v3.5.0

Flags:
  - CERT_COUNTRY= CN
  - CERT_STATE= BJ
  - CERT_LOCALITY= HD
  - CERT_ORGANIZATION= Lab
  - CERT_ORGANIZATIONAL_UNIT= Dev
  - CERT_COMMON_NAME= Hello World
  - CERT_DOMAINS= [lab.com *.lab.com *.data.lab.com]
  - APP_FOR_K8S= false
  - APP_FOR_FIREFOX= false
  - APP_OUTPUT_DIR= ./ssl

上面的命令中,我们指定了本地系统目录的 ssl 目录和容器内的 /ssl 目录打通,所以只需要查看本地的 ssl 目录,就能够验收证书了:

ls ssl    
lab.com.conf lab.com.crt  lab.com.key

不论是购买的证书还是自己生成的证书,我们只要放在 ssl 目录中就可以了,一会再用。

更新 Traefik 配置文件

根据你想 Traefik 使用 HTTPS 证书方式的不同,我们需要对示例代码的配置进行一些调整。

如果你选择自签名证书(参考上面的方法生成),或者云服务商处购买的域名,我们需要修改项目中的 .env 配置文件和 config/tls.toml 配置。

.env 配置文件中,我们需要将 Traefik 管理界面的域名地址修改为适配证书的域名:

# 服务域名
SERVICE_DOMAIN=traefik.example.com

并在 config/certs.toml 配置中,更新相关的域名:

[tls.stores.default.defaultCertificate]
certFile = "/data/ssl/example.com.crt"
keyFile = "/data/ssl/example.com.key"

[[tls.certificates]]
certFile = "/data/ssl/example.com.crt"
keyFile = "/data/ssl/example.com.key"

# others...
# [[tls.certificates]]
# certFile = "/data/ssl/lab.com.crt"
# keyFile = "/data/ssl/lab.com.key"

如果你拥有域名,希望使用免费申请的 HTTPS 证书,我们可以删除掉 config/certs.toml 配置文件,然后更新 .env 中的相关配置:

# 服务域名
SERVICE_DOMAIN=traefik.example.com

# 示例,使用 CloudFlare 来申请证书
ACME_PROVIDER=cloudflare
ACME_EMAIL=your-email@company.ltd

# CF DNS API Token
CF_DNS_API_TOKEN=your-cf-dns-api-token

# DNS Domain (main)
DNS_MAIN=example.com
# DNS Domain (list)
DNS_LIST=example.com,*.example.com

除了要和上面一样更新域名之外,我们还需要配置一些申请免费证书必须的配置,包括下面的内容(使用 CloudFlare DNS 申请证书为例):

  • ACME_PROVIDER:使用什么方式来申请免费证书。
  • ACME_EMAIL:申请证书要使用的邮箱。
  • CF_DNS_API_TOKEN:我使用 Cloudflare,这里需要配置 API Token 来操作 DNS 记录,完成域名所有权验证,进行证书申请。
  • DNS_MAINDNS_LIST 我们想要申请的域名证书列表,需要拥有域名所有权,比如,你不能够申请 www.google.com 或者 www.apple.com 这种不属于你的域名。

至于 Cloudflare 的 API Key,我们可以在登录后的“API 令牌”页面获得,配置方式参考下面的图片:

配置 CloudFlare API Key

快速上手

下面来分别介绍两种启动并使用 Traefik ,支持使用 HTTPS 证书的方法。

快速启动一个 Traefik 3 正式版程序

我们先来介绍配合购买或使用自签名的证书文件的使用方式。

想要使用这种方式,我们需要将目录中的 docker-compose.local-certs.yml 重命名为 docker-compose.yml,或者复制一份,将配置文件进行改名:

cp docker-compose.local-certs.yml docker-compose.yml

上面的准备工作结束后,在代码目录中,我们执行下面的命令,就能够自动启动 Traefik 来提供服务了。

docker compose down && docker compose up -d

命令执行后,我们将看到类似下面的日志内容:

# docker compose down && docker compose up -d

[+] Building 0.0s (0/0)                                                                                                                                               docker:desktop-linux
[+] Running 1/1
 ✔ Container traefik  Started

如果我们执行 docker compose ps,将能够看到 Traefik 健康运行:

NAME      IMAGE            COMMAND                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               SERVICE   CREATED         STATUS                   PORTS
traefik   traefik:v3.1.1   "/entrypoint.sh --global.sendanonymoususage=false --global.checknewversion=false --entrypoints.http.address=:80 --entrypoints.https.address=:443 --entryPoints.https.asDefault=true --entryPoints.https.http3 --entryPoints.https.http3.advertisedport=443 --serverstransport.insecureskipverify=true --entryPoints.http.forwardedHeaders.trustedIPs=127.0.0.1/32,172.18.0.1/24 --entryPoints.https.forwardedHeaders.trustedIPs=127.0.0.1/32,172.18.0.1/24 --api=true --api.dashboard=true --ping=true --log.level=INFO --log.maxsize=100 --log.format=common --accesslog=false --providers.docker=true --providers.docker.watch=true --providers.docker.exposedbydefault=false --providers.docker.endpoint=unix:///var/run/docker.sock --providers.docker.useBindPortIP=false --providers.docker.network=traefik --providers.file=true --providers.file.watch=true --providers.file.directory=/etc/traefik/config --providers.file.debugloggeneratedtemplate=true"   traefik   3 minutes ago   Up 3 minutes (healthy)   0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp, 0.0.0.0:443->443/udp

当服务出现问题的时候,Docker 将会自动恢复程序的运行。

在这个示例代码中,默认的自签名证书支持 example.com*.exmaple.com 相关的域名,而 Traefik 默认的管理界面域名是 traefik.example.com

我们可以通过修改系统的 /etc/hosts 或者局域网 DNS 指向,将 traefik.example.com 指向启动 traefik 容器的 IP 地址。比如,我启动的容器在本地:

127.0.0.1 traefik.example.com

使用浏览器访问 https://traefik.example.com ,我们就能够看到 Traefik 的管理界面了:

Traefik 的管理界面

如果你使用的是购买的证书,那么图中的小红锁默认应该就是绿色的。

信任自签名的 HTTPS 证书后,锁子就变绿了

如果你使用的是自签名证书,我们可以通过信任自签名证书,来解决浏览器中展示的“小红锁”,在不泄漏自签名证书的前提下,同样能够保证安全的访问,以及 HTTP2/3 请求特性。

启动 Traefik 并自动申请 HTTPS 证书

如果我们拥有某个域名,并且希望 Traefik 能够自动从网上申请免费的 HTTPS 证书,可以使用下面的方式。

我们需要将目录中的 docker-compose.acme.yml 重命名为 docker-compose.yml,或者复制一份,将配置文件进行改名:

cp docker-compose.acme.yml docker-compose.yml

本文中,我使用的是 CloudFlare 的方式来申请证书,所以我们需要确保配置文件 .env 中的变量 CF_DNS_API_TOKEN 配置在 docker-compose.yml 中:

environment:
  - CF_DNS_API_TOKEN=${CF_DNS_API_TOKEN}

和上文中一样,我们使用下面的命令,就能够创建干净的容器,来运行 Traefik 并自动申请证书了:

docker compose down && docker compose up -d

使用这种方式注册的证书,Traefik 会进行自动维护,在证书到期之前进行自动替换。不过,第一次注册的时候会比较漫长,如果我们打开 Traefik 可能看到它的申请或者证书续期的过程:

# docker compose logs -f

traefik  | 2024-08-04T19:23:17+08:00 INF Traefik version 3.1.1 built on 2024-07-30T13:55:22Z version=3.1.1
traefik  | 2024-08-04T19:23:17+08:00 INF 
traefik  | Stats collection is disabled.
traefik  | Help us improve Traefik by turning this feature on :)
traefik  | More details on: https://doc.traefik.io/traefik/contributing/data-collection/
traefik  | 
traefik  | 2024-08-04T19:23:17+08:00 INF Starting provider aggregator aggregator.ProviderAggregator
traefik  | 2024-08-04T19:23:17+08:00 INF Starting provider *file.Provider
traefik  | 2024-08-04T19:23:17+08:00 INF Starting provider *traefik.Provider
traefik  | 2024-08-04T19:23:17+08:00 INF Starting provider *docker.Provider
traefik  | 2024-08-04T19:23:17+08:00 INF Starting provider *acme.ChallengeTLSALPN
traefik  | 2024-08-04T19:23:17+08:00 INF Starting provider *acme.Provider
traefik  | 2024-08-04T19:23:17+08:00 INF Testing certificate renew... acmeCA=https://acme-v02.api.letsencrypt.org/directory providerName=le.acme
...

一般情况下,3~5 分钟证书就注册好了。

快速启动一个服务,注册到 Traefik 上

接下来,使用一个简单的例子,来说明如何将一个运行在某个具体端口上的程序,注册到 Traefik 网关中,并支持 HTTPS 访问。

还是以之前写过的一个简单的开源程序 flare 为例,下面的命令将下载 flare 并运行它,最终允许我们使用 5005 端口来访问它:

docker pull soulteary/flare:0.5.1
docker run --rm -it -p 5005:5005 soulteary/flare:0.5.1

运行在指定端口上的 Flare 程序

如果我们访问 http://localhost:5005 ,就能够看到上面的界面啦。

我们将上面的命令简化,去掉调试和自动清理容器的参数:

docker run -p 5005:5005 soulteary/flare:0.5.1

使用工具转换 Docker 命令为 Compose 配置

然后,我们将命令粘贴到在线转换 Docker 命令到 Compose 的工具里,可以得到最简单的 Docker Compose 配置文件:

name: flare
services:
  flare:
    ports:
      - 5005:5005
    image: soulteary/flare:0.5.1

我们可以对上面的配置进行一些修改,将上面的通过 5005 端口访问的程序,能够通过 flare.example.com 进行访问,并且支持自动将 HTTP 请求转换为 HTTPS 请求,并对访问内容自动进行 GZIP 压缩,提升访问加速:

name: flare
services:
  flare:
    image: soulteary/flare:0.5.1
    networks:
      - traefik
    labels:
      # 用于 Traefik 服务发现
      - "traefik.enable=true"
      - "traefik.docker.network=traefik"
      # HTTP 相关
      # 使用 HTTP 协议访问 Flare,将使用 `http`(80端口) 提供服务
      - "traefik.http.routers.flare-http.entrypoints=http"
      # 并自动跳转至 HTTPS 协议(443端口)
      - "traefik.http.routers.flare-http.middlewares=redir-https"
      # 默认服务域名为 flare.example.com
      - "traefik.http.routers.flare-http.rule=Host(`flare.example.com`)"
      # 服务名称为 noop@internal,表示不提供任何服务 (因为自动跳转,没必要请求服务)
      - "traefik.http.routers.flare-http.service=noop@internal"
      # HTTPS 相关
      # 使用 HTTPS 协议访问 Flare,将使用 `https`(443端口) 提供服务
      - "traefik.http.routers.flare-https.entrypoints=https"
      # 在这个端口上使用 TLS 协议
      - "traefik.http.routers.flare-https.tls=true"
      # 对响应内容启用 GZIP 压缩
      - "traefik.http.routers.flare-https.middlewares=gzip"
      # 默认服务域名为 flare.example.com
      - "traefik.http.routers.flare-https.rule=Host(`flare.example.com`)"
      # (可选)HTTPS 服务名称为 flare-backend,使用 5005 端口提供服务
      - "traefik.http.routers.flare-https.service=flare-backend"
      # 服务相关
      # 声明服务名称为 flare-backend,使用 5005 端口提供服务
      - "traefik.http.services.flare-backend.loadbalancer.server.scheme=http"
      - "traefik.http.services.flare-backend.loadbalancer.server.port=5005"

networks:
  traefik:
    external: true

我们将上面的内容保存为 docker-compose.flare.yml 后,使用 docker compose -f docker-compose.flare.yml up -d 启动容器后。使用浏览器访问 flare.example.com 就能够通过 HTTPS 的方式来访问到我们的程序啦。

使用域名来快速访问 Flare

其他的程序也是如此,尤其是基于 Docker 运行的程序,都可以使用这个方式来处理,是不是非常简单?

最后

通过上面的介绍,相信你应该已经能够快速的将 Traefik 运行起来,完成一个支持 HTTPS 的网关服务的部署了。

并且,也应该能够快速的将原本只支持使用 HTTP 或者具体端口访问的程序,通过 Traefik 来统一管理和提供服务,告别需要为每一个程序都配置和管理证书的日子了。

–EOF


我们有一个小小的折腾群,里面聚集了一些喜欢折腾、彼此坦诚相待的小伙伴。

我们在里面会一起聊聊软硬件、HomeLab、编程上、生活里以及职场中的一些问题,偶尔也在群里不定期的分享一些技术资料。

关于交友的标准,请参考下面的文章:

致新朋友:为生活投票,不断寻找更好的朋友

当然,通过下面这篇文章添加好友时,请备注实名和公司或学校、注明来源和目的,珍惜彼此的时间 😄

关于折腾群入群的那些事


本文使用「署名 4.0 国际 (CC BY 4.0)」许可协议,欢迎转载、或重新修改使用,但需要注明来源。 署名 4.0 国际 (CC BY 4.0)

本文作者: 苏洋

创建时间: 2024年08月04日
统计字数: 10293字
阅读时间: 21分钟阅读
本文链接: https://soulteary.com/2024/08/04/best-practices-for-traefik-3-in-docker-getting-started-quickly.html

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

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

相关文章

DC-DC芯片:MT2492说明

文章目录 一. MT2492介绍1. 特点2. 应用3. 额定值4. 电气特性5. 引脚说明6. 典型应用电路 二. 功能说明内部调节器过电流保护和打嗝模式误差放大器启动和关闭内部软启动设置输出电压电感器的选择输入电容器的选择输入电容器的选择PCB布局建议 一. MT2492介绍 MT2492是一款完全…

LaneATT推理详解及部署实现(下)

目录 前言一、LaneATT推理(Python)1. LaneATT预测2. LaneATT预处理3. LaneATT后处理4. LaneATT推理 二、LaneATT推理(C)1. ONNX导出2. LaneATT预处理3. LaneATT后处理4. LaneATT推理 三、LaneATT部署1. 源码下载2. 环境配置2.1 配置CMakeLists.txt2.2 配置Makefile 3. ONNX导出…

平衡二叉树 - 力扣(LeetCode) C语言

110. 平衡二叉树 - 力扣(LeetCode)(点击前面链接即可查看题目) 一、题目 给定一个二叉树,判断它是否是 平衡二叉树 是指该树所有节点的左右子树的深度相差不超过 1。 示例 1: 输入:root […

计量经济学(十六)--一文读懂和学会医学统计学中的四种检验方法

1. 统计学是什么? 统计学是应用数学的一个分支,主要通过利用概率论建立数学模型,收集所观察系统的数据,进行量化的分析、总结,并进而进行推断和预测,为相关决策提供依据和参考。它被广泛的应用在各门学科之上,从物理和社会科学到人文科学,甚至被用来工商业及政府的情报…

原神自定义倒计时

<!DOCTYPE html> <html lang"zh-CN"><head><meta charset"UTF-8"><title>原神倒计时</title><style>* {margin: 0;padding: 0;box-sizing: border-box;user-select: none;body {background: #0b1b2c;}}header {…

C++ ---- vector的底层原理剖析及其实现

vector 一、定义二、常用接口及模拟实现三、vector迭代器失效问题四、使用memcpy拷贝会出现的问题五、二维数组vector<vector< T >> vv 一、定义 vector 是 C 标准模板库&#xff08;Standard Template Library, STL&#xff09;中的一个非常有用的容器。它是一个…

SD卡受损数据会消失吗 内存卡坏了数据还能恢复吗 SD卡受损里面的数据怎么办 sd卡受损最简单的修复方法

SD卡里的数据有时候也容易出现消失或者遭到破坏等情况&#xff0c;针对此类情况&#xff0c;给大家详细讲解&#xff0c;SD卡受损数据会消失吗&#xff0c;以及SD卡受损了里面的数据怎么办。 一、SD卡受损数据会消失吗 SD卡本身比较小巧&#xff0c;里面的小芯片比较密集&…

04 RabbitMQ:控制界面详解

04 RabbitMQ&#xff1a;控制界面详解 1. 控制台界面2. 控制界面详解2.1. Overview&#xff08;概览&#xff09;2.1.1. Totals&#xff08;总数&#xff09;2.1.1.1. Queued messages2.1.1.2. Message rates2.1.1.3. Global counts 2.1.2. Nodes&#xff08;节点消息&#xff…

SpringBoot多数据源事务处理

多数据源时,一般会配置多个事务管理器 Spring编程式 第二种方式 不可能去同一个方法上写两个事务注解 不允许 SpringBoot 2.6.0之后禁止自己注入自己 本来可以自己注入自己去调用 (为什么要自己注入自己调用,AOP代理,类不是自己写的类) 最简单方式 引入 <dependency&…

DPDK基础入门(一):认识和理解DPDK

Linux的网络瓶颈 以Linux为例&#xff0c;传统网络设备驱动包处理的动作可以概括如下&#xff1a; 数据包到达网卡设备。网卡设备依据配置进行DMA操作。网卡发送中断&#xff0c;唤醒处理器。驱动软件填充读写缓冲区数据结构。数据报文达到内核协议栈&#xff0c;进行高层处理…

Linux中信号的发送及信号的自定义捕捉方法

预备知识&#xff1a; 信号产生时进程早已知道该信号如何处理。 信号产生时进程可能并不能立即处理信号而是等到合适的时候处理。 信号其他相关常见概念 实际执行信号的处理动作称为信号递达(Delivery) 信号从产生到递达之间的状态,称为信号未决(Pending)。 进程可以选择阻…

C语言第14篇

1.以下定义语句中&#xff0c;错误的是________. A) int a[]{1,2}; B) char a{"test"}; C) char s[10]{"test"}; D) int a[]{a,b,c}; 2.以下定义语句中&#xff0c;错误的是________. A) int a[]{1,2}; B) char a[]{…

扬声器、麦克风的等效电路及相关技术参数(灵敏度等)

扬声器、麦克风都是日常我们所需的电子小器件&#xff0c;今天小编来具体讲解一下有关两者的等效电路及相关技术参数。 1、扬声器 等效电路 Re表示扬声器音圈的直流电阻 Le表示音圈的电感,对高频信号产生的阻抗 Mm表示动圈的等效质量,主要影响扬声器的低频响应 Rm 表示动圈…

算力共享:forward_to_next_shard,推断之间的链接

目录 forward_to_next_shard 参数 函数逻辑 _process_prompt StandardNode get_current_shard map_partitions_to_shards forward_to_next_shard 这段代码定义了一个名为 forward_to_next_shard 的异步函数,它是设计用于在分布式模型或数据处理系统中的节点(或称为“分…

【秋招笔试】2024-08-03-科大讯飞秋招笔试题(算法岗)-三语言题解(CPP/Python/Java)

🍭 大家好这里是清隆学长 ,一枚热爱算法的程序员 💻 ACM金牌团队🏅️ | 多次AK大厂笔试 | 编程一对一辅导 ✨ 本系列打算持续跟新 秋招笔试题 👏 感谢大家的订阅➕ 和 喜欢💗 ✨ 笔试合集传送们 -> 🧷春秋招笔试合集 🍖 本次题目难度中等偏上,最后一题又是…

dfs深搜

Problem - C - Codeforces 无向图,判断是否是子叶.

Co-Detr

参考&#xff1a;https://www.bilibili.com/video/BV1Sh4y1F7ur/?spm_id_from333.788&vd_source156234c72054035c149dcb072202e6be 之前的detr正样本数量少&#xff0c;匹配不平衡。 主要修改两个地方&#xff1a;encoder和decoder。 1.在encoder之后加入RPN&#xff0c;a…

深入理解接口测试:实用指南与最佳实践(二)API文档解析HTTP协议

​ ​ 您好&#xff0c;我是程序员小羊&#xff01; 前言 这一阶段是接口测试的学习&#xff0c;我们接下来的讲解都是使用Postman这款工具&#xff0c;当然呢Postman是现在一款非常流行的接口调试工具&#xff0c;它使用简单&#xff0c;而且功能也很强大。不仅测试人员会使用…

Leetcode75-3 拥有最多糖果的孩子

题目很简单&#xff0c;逻辑就是找到最大值 然后做个比较看看每个值加上extra能不能超过或者等于最大值。 两个知识点遗忘 数组length 获取数组的长度的格式&#xff1a; 数组名称。length 这将会得到一个int数字&#xff0c;代表数组的长度。 数组一旦创建&#xff0c;程…

Effective-Java-Chapter2

https://github.com/clxering/Effective-Java-3rd-edition-Chinese-English-bilingual/blob/dev/ 准则一 考虑以静态工厂方法代替构造函数 优点 静态工厂方法与构造函数相比的第一个优点&#xff0c;静态工厂方法有确切名称。 知名见意&#xff0c;静态方法我们可以通过命名…