一、了解一下什么是go开发语言
### Tomcat 简介
**Apache Tomcat** 是一个开源的 **Java Servlet** 容器和 **JavaServer Pages (JSP)** 引擎,由 Apache 软件基金会开发和维护。它实现了 Java Servlet 和 JSP 规范,提供了一个运行 Java Web 应用程序的环境。
### 主要功能
1. **Servlet 容器**:
- 支持 Java Servlet 规范,处理 HTTP 请求并生成响应。
2. **JSP 引擎**:
- 支持 JavaServer Pages (JSP),允许在 HTML 中嵌入 Java 代码。
3. **Web 服务器**:
- 提供基本的 Web 服务器功能,如静态内容服务和 SSL/TLS 支持。
4. **轻量级**:
- 设计简洁,资源占用少,适合中小型应用。
5. **可扩展性**:
- 支持通过插件和自定义配置进行扩展。
### 核心组件
1. **Catalina**:
- Servlet 容器,负责处理请求和响应。
2. **Coyote**:
- HTTP 连接器,处理 HTTP 请求。
3. **Jasper**:
- JSP 引擎,将 JSP 页面编译为 Servlet。
4. **Cluster**:
- 提供负载均衡和故障转移功能。
5. **Realm**:
- 管理用户认证和授权。
### 使用场景
1. **开发环境**:
- 常用于开发和测试 Java Web 应用。
2. **生产环境**:
- 适合中小型生产环境,尤其是资源有限的情况。
3. **嵌入式系统**:
- 可作为嵌入式服务器,集成到其他应用中。
### 安装与配置
1. **下载**:
- 从 [Apache Tomcat 官网](https://tomcat.apache.org/) 下载最新版本。
2. **安装**:
- 解压下载的文件,无需复杂安装步骤。
3. **配置**:
- 通过 `conf/server.xml` 配置端口、连接器等。
4. **启动**:
- 运行 `bin/startup.sh`(Linux/Mac)或 `bin/startup.bat`(Windows)。
5. **访问**:
- 启动后,通过 `http://localhost:8080` 访问默认页面。
### 优点
1. **开源免费**:
- 完全免费,源代码开放。
2. **跨平台**:
- 支持多种操作系统。
3. **社区支持**:
- 拥有活跃的社区和丰富的文档。
4. **易于集成**:
- 可与其他 Apache 项目(如 Apache HTTP Server)集成。
### 缺点
1. **性能限制**:
- 相比专业服务器(如 JBoss、WebLogic),性能较弱。
2. **功能较少**:
- 缺少一些高级功能,如分布式事务。
### 总结Apache Tomcat 是一个轻量级、易用的 Java Web 服务器,适合开发和中小型生产环境。尽管功能不如专业服务器全面,但其简单性和灵活性使其广受欢迎。
二、企业实战
[root@cjr ~]# yum -y install go
[root@cjr ~]# cd test/
[root@cjr test]# go mod init test
go: creating new go.mod: module test
go: to add module requirements and sums:
go mod tidy
[root@cjr test]# go env -w GOPROXY=https://goproxy.cn,direct
[root@cjr test]# go mod tidy
go: finding module for package github.com/gin-gonic/gin
go: downloading github.com/gin-gonic/gin v1.10.0
go: found github.com/gin-gonic/gin in github.com/gin-gonic/gin v1.10.0
go: downloading github.com/gin-contrib/sse v0.1.0
go: downloading github.com/mattn/go-isatty v0.0.20
go: downloading golang.org/x/net v0.25.0
go: downloading github.com/stretchr/testify v1.9.0
go: downloading google.golang.org/protobuf v1.34.1
go: downloading github.com/go-playground/validator/v10 v10.20.0
go: downloading github.com/pelletier/go-toml/v2 v2.2.2
go: downloading github.com/ugorji/go/codec v1.2.12
go: downloading gopkg.in/yaml.v3 v3.0.1
go: downloading github.com/bytedance/sonic v1.11.6
go: downloading github.com/goccy/go-json v0.10.2
go: downloading github.com/json-iterator/go v1.1.12
go: downloading golang.org/x/sys v0.20.0
go: downloading github.com/davecgh/go-spew v1.1.1
go: downloading github.com/pmezard/go-difflib v1.0.0
go: downloading github.com/gabriel-vasile/mimetype v1.4.3
go: downloading github.com/go-playground/universal-translator v0.18.1
go: downloading github.com/leodido/go-urn v1.4.0
go: downloading golang.org/x/crypto v0.23.0
go: downloading golang.org/x/text v0.15.0
go: downloading github.com/go-playground/locales v0.14.1
go: downloading github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd
go: downloading github.com/modern-go/reflect2 v1.0.2
go: downloading github.com/cloudwego/base64x v0.1.4
go: downloading golang.org/x/arch v0.8.0
go: downloading github.com/bytedance/sonic/loader v0.1.1
go: downloading github.com/twitchyliquid64/golang-asm v0.15.1
go: downloading github.com/klauspost/cpuid/v2 v2.2.7
go: downloading github.com/cloudwego/iasm v0.2.0
go: downloading github.com/go-playground/assert/v2 v2.2.0
go: downloading github.com/google/go-cmp v0.5.5
go: downloading gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405
go: downloading golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543
You have new mail in /var/spool/mail/root
[root@cjr test]# CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o k8s-demo main.go
[root@cjr test]# ls
go.mod go.sum k8s-demo main.go
[root@cjr test]# ./k8s-demo
[GIN-debug] [WARNING] Running in "debug" mode. Switch to "release" mode in production.
- using env: export GIN_MODE=release
- using code: gin.SetMode(gin.ReleaseMode)
[GIN-debug] GET / --> main.statusOKHandler (2 handlers)
[GIN-debug] GET /version --> main.versionHandler (2 handlers)
[GIN-debug] [WARNING] You trusted all proxies, this is NOT safe. We recommend you to set a value.
Please check https://pkg.go.dev/github.com/gin-gonic/gin#readme-don-t-trust-all-proxies for details.
[GIN-debug] Listening and serving HTTP on :8080
以下是对你执行的命令及其作用的详细解析:
---
### 1. `cd test/`
- **作用**:切换到 `test` 目录。
- **解析**:进入当前用户主目录下的 `test` 文件夹,准备在该目录下进行 Go 项目的初始化。
---
### 2. `go mod init test`
- **作用**:初始化一个新的 Go 模块。
- **解析**:
- `go mod init` 是 Go 模块管理的命令,用于创建一个新的 `go.mod` 文件。
- `test` 是模块的名称,通常与项目名称一致。
- 执行后,会在当前目录生成一个 `go.mod` 文件,内容如下:
```go
module test
go 1.21 // 根据你的 Go 版本自动生成
```
---
### 3. `go env -w GOPROXY=https://goproxy.cn,direct`
- **作用**:设置 Go 模块的代理。
- **解析**:
- `go env -w` 用于永久修改 Go 的环境变量。
- `GOPROXY=https://goproxy.cn,direct` 将 Go 模块的下载代理设置为 `https://goproxy.cn`(一个国内的 Go 模块镜像),以加速模块下载。
- `direct` 表示如果代理无法找到模块,则直接访问源地址。
---
### 4. `go mod tidy`
- **作用**:整理 Go 模块依赖。
- **解析**:
- `go mod tidy` 会做以下事情:
1. 根据代码中的 `import` 语句,自动添加缺失的依赖到 `go.mod` 文件。
2. 移除未使用的依赖。
3. 下载依赖模块到本地缓存(`$GOPATH/pkg/mod`)。
- 在你的例子中,`go mod tidy` 检测到代码中使用了 `github.com/gin-gonic/gin`,因此自动下载了该模块及其依赖。
---
### 5. 下载的依赖模块
- **作用**:下载并缓存 Go 模块及其依赖。
- **解析**:
- 由于你的代码中引入了 `github.com/gin-gonic/gin`(一个流行的 Go Web 框架),`go mod tidy` 自动下载了该模块及其所有依赖。
- 下载的模块包括:
- `github.com/gin-gonic/gin`:Gin 框架的核心模块。
- `github.com/gin-contrib/sse`:Gin 的 SSE(服务器发送事件)支持。
- `golang.org/x/net`:Go 的网络库。
- `github.com/stretchr/testify`:测试工具库。
- 其他依赖:如 JSON 处理、YAML 解析、加密库等。
---
### 6. `You have new mail in /var/spool/mail/root`
- **作用**:系统提示你有新邮件。
- **解析**:
- 这是 Linux 系统的提示信息,表示 `/var/spool/mail/root` 中有新邮件。
- 通常与 Go 命令无关,可能是系统或其他任务的邮件通知。
---
### 总结
1. **初始化项目**:
- 使用 `go mod init` 创建了一个名为 `test` 的 Go 模块。
2. **设置代理**:
- 通过 `go env -w GOPROXY` 设置了国内镜像,加速模块下载。
3. **整理依赖**:
- 使用 `go mod tidy` 自动下载并管理了 `github.com/gin-gonic/gin` 及其依赖。
4. **依赖下载**:
- Go 自动下载了 Gin 框架及其相关依赖,确保项目可以正常运行。
---
### 下一步建议
1. **编写代码**:
- 在 `test` 目录下创建一个 `main.go` 文件,编写 Gin 框架的示例代码。
2. **运行项目**:
- 使用 `go run main.go` 运行项目,测试 Gin 框架是否正常工作。
3. **构建项目**:
- 使用 `go build` 编译项目,生成可执行文件。
4. **查看依赖**:
- 使用 `go list -m all` 查看所有依赖模块及其版本。
以下是对你执行的命令及其输出的详细解析:
---
### 1. **`CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o k8s-demo main.go`**
#### 命令解析:
- **`CGO_ENABLED=0`**:
- 禁用 CGO(C Go 编译器),使生成的二进制文件不依赖外部 C 库。
- 适合需要静态编译的场景(如容器化部署)。
- **`GOOS=linux`**:
- 指定目标操作系统为 Linux。
- **`GOARCH=amd64`**:
- 指定目标架构为 64 位 x86 架构(即常见的 64 位 Linux 服务器架构)。
- **`go build -o k8s-demo main.go`**:
- 编译 `main.go` 文件,生成一个名为 `k8s-demo` 的可执行文件。
- `-o k8s-demo` 指定输出文件名。
#### 作用:
- 将 Go 代码编译为一个适用于 Linux 64 位系统的可执行文件,且不依赖外部 C 库。
---
### 2. **`ls`**
#### 命令解析:
- **`ls`**:
- 列出当前目录下的文件和文件夹。
#### 输出解析:
- **`go.mod`**:
- Go 模块定义文件,记录模块名称和依赖。
- **`go.sum`**:
- Go 模块的依赖校验文件,记录依赖的版本和哈希值。
- **`k8s-demo`**:
- 刚刚编译生成的可执行文件。
- **`main.go`**:
- 项目的入口文件,包含 Go 代码。
#### 作用:
- 查看当前目录下的文件,确认编译成功并生成了 `k8s-demo` 可执行文件。
---
### 3. **`./k8s-demo`**
#### 命令解析:
- **`./k8s-demo`**:
- 运行当前目录下的 `k8s-demo` 可执行文件。
#### 输出解析:
- **`[GIN-debug] [WARNING] Running in "debug" mode. Switch to "release" mode in production.`**:
- Gin 框架提示当前运行在调试模式(`debug` 模式),建议在生产环境中切换到 `release` 模式。
- 切换方法:
- 设置环境变量:`export GIN_MODE=release`
- 或在代码中设置:`gin.SetMode(gin.ReleaseMode)`
- **`[GIN-debug] GET / --> main.statusOKHandler (2 handlers)`**:
- Gin 框架注册了一个路由 `/`,对应的处理函数是 `main.statusOKHandler`。
- `2 handlers` 表示该路由有两个中间件或处理函数。
- **`[GIN-debug] GET /version --> main.versionHandler (2 handlers)`**:
- Gin 框架注册了一个路由 `/version`,对应的处理函数是 `main.versionHandler`。
- **`[GIN-debug] [WARNING] You trusted all proxies, this is NOT safe. We recommend you to set a value.`**:
- Gin 框架提示你信任了所有代理(`TrustedProxies` 设置为 `nil`),这可能不安全。
- 建议设置可信代理,参考文档:[Gin 官方文档](https://pkg.go.dev/github.com/gin-gonic/gin#readme-don-t-trust-all-proxies)。
- **`[GIN-debug] Listening and serving HTTP on :8080`**:
- Gin 框架启动了一个 HTTP 服务器,监听 `8080` 端口。
#### 作用:
- 运行编译后的 Go 程序,启动一个基于 Gin 框架的 HTTP 服务器。
---
### 总结
1. **编译命令**:
- 使用 `CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o k8s-demo main.go` 编译了一个适用于 Linux 64 位系统的可执行文件。
2. **运行程序**:
- 运行 `./k8s-demo` 启动了一个基于 Gin 框架的 HTTP 服务器。
- 服务器监听 `8080` 端口,并注册了两个路由:
- `/`:处理函数为 `main.statusOKHandler`。
- `/version`:处理函数为 `main.versionHandler`。
3. **调试信息**:
- Gin 框架输出了调试信息,提示当前运行在 `debug` 模式,并建议设置可信代理以提高安全性。
---
### 下一步建议
1. **测试 API**:
- 使用浏览器或 `curl` 访问以下地址,测试 API 是否正常工作:
- `http://localhost:8080/`
- `http://localhost:8080/version`
2. **切换到生产模式**:
- 在代码中添加 `gin.SetMode(gin.ReleaseMode)`,或在运行程序前设置环境变量:
```bash
export GIN_MODE=release
./k8s-demo
```
3. **设置可信代理**:
- 在代码中设置 `TrustedProxies`,例如:
```go
router := gin.Default()
router.SetTrustedProxies([]string{"127.0.0.1"}) // 设置可信代理
```
4. **部署到 Kubernetes**:
- 将 `k8s-demo` 打包到 Docker 镜像中,并部署到 Kubernetes 集群。
[root@cjr test]# cat Dockerfile
FROM alpine
MAINTAINER CJR
WORKDIR /data/app/
ADD k8s.demo /data/app/
CMD ["/bin/sh","-c","./k8s-demo"]
[root@cjr test]# vi Dockerfile
[root@cjr test]# docker build -f Dockerfile -t k8sdemo:v1 .
[+] Building 0.2s (8/8) FINISHED docker:default
=> [internal] load build definition from Dockerfile 0.0s
=> => transferring dockerfile: 141B 0.0s
=> [internal] load .dockerignore 0.0s
=> => transferring context: 2B 0.0s
=> [internal] load metadata for docker.io/library/alpine:latest 0.0s
=> [1/3] FROM docker.io/library/alpine 0.0s
=> CACHED [2/3] WORKDIR /data/app/ 0.0s
=> [internal] load build context 0.1s
=> => transferring context: 11.39MB 0.1s
=> [3/3] ADD k8s-demo /data/app/ 0.0s
=> exporting to image 0.1s
=> => exporting layers 0.1s
=> => writing image sha256:3106ef3b3e48cdad3bc1e8edcea3700d999be0077b8e68305e96a5964daf3cd8 0.0s
=> => naming to docker.io/library/k8sdemo:v1