Posted in

Golang在国内不是“可选项”,而是“准入门槛”:2024央企IT招标文件中Go技术条款出现频次+210%

第一章:Golang在国内企业级市场的渗透现状与数据图谱

近年来,Go语言凭借其高并发支持、静态编译、低内存开销和简洁语法,已成为国内中大型科技企业构建云原生基础设施与中间件系统的首选语言之一。据2023年《中国开发者生态年度报告》统计,超68%的头部互联网公司(含阿里、腾讯、字节、京东、美团)在核心后端服务中规模化采用Go,其中支付网关、API网关、消息队列客户端及可观测性Agent等场景占比最高。

主流行业落地分布

  • 金融科技:微服务治理平台(如蚂蚁SOFAStack)、交易对账系统普遍采用Go重构,QPS提升3–5倍;
  • 云计算厂商:华为云CCI、阿里云ACK组件、腾讯云TKE控制面模块均以Go为主力开发语言;
  • 新兴领域:AI工程化平台(如ModelScope SDK服务层)、边缘计算轻量框架(KubeEdge EdgeCore)大量使用Go实现低延迟通信。

关键渗透指标对比(2022 vs 2023)

维度 2022年 2023年 变化趋势
国内Top100企业Go项目占比 41% 68% ↑27%
Go岗位招聘需求增长率 +32% +59% ↑27pp
生产环境平均服务启停耗时 120ms 83ms ↓31%

典型技术选型动因

企业选择Go并非仅因性能优势,更看重其工程可控性:

  • 编译产物为单二进制文件,大幅简化CI/CD流水线(无需依赖运行时环境);
  • go mod 语义化版本管理降低跨团队协作冲突;
  • 标准库 net/http 与 encoding/json 稳定性高,避免第三方库安全兜底风险。

例如,某券商核心行情分发服务迁移至Go后,通过以下步骤完成平滑演进:

# 1. 使用go-migrate工具同步MySQL schema变更(保障数据一致性)
go install -u github.com/golang-migrate/migrate/v4/cmd/migrate@latest

# 2. 启用pprof采集生产CPU/内存热点(定位GC压力点)
go run main.go -pprof-addr=:6060  # 后访问 http://localhost:6060/debug/pprof/

# 3. 结合Prometheus Exporter暴露goroutine数、heap_inuse_bytes等关键指标
import "github.com/prometheus/client_golang/prometheus/promhttp"
http.Handle("/metrics", promhttp.Handler())

该实践使服务P99延迟从210ms降至65ms,同时运维部署复杂度下降约40%。

第二章:央企及国企IT招标中Go语言技术条款的演进逻辑

2.1 招标文件中Go技术条款的语义解析与合规性建模

招标文件中的Go技术条款常隐含非显式约束,如“高并发支持”实指 goroutine 泄漏防护与 context.Context 强制传播,“内存安全”对应 unsafe 禁用策略及 go vet -unsafeptr 自动校验。

语义锚点提取规则

  • must use → 强制依赖特定 Go 版本(≥1.21)及模块校验
  • zero-allocation → 禁止 fmt.Sprintf,优先 strings.Builder
  • no external C deps → CGO_ENABLED=0 构建约束建模

合规性验证代码片段

// 验证 context.Context 是否贯穿调用链(关键语义锚点)
func HandleRequest(ctx context.Context, req *Request) error {
    select {
    case <-ctx.Done(): // 必须响应取消/超时
        return ctx.Err()
    default:
    }
    return process(ctx, req) // ctx 必须透传至所有下游调用
}

逻辑分析:该函数签名强制 ctx 作为首参,体现“可取消性”条款;select 块确保上下文生命周期管控,参数 ctx 为合规性建模核心变量,驱动后续静态分析工具链注入。

条款关键词 对应 Go 语言机制 静态检查工具
graceful shutdown http.Server.Shutdown() + sync.WaitGroup staticcheck (SA1019)
no panics in handlers recover() 禁用策略 + golint 自定义规则 revive (panic-in-handler)
graph TD
A[招标文本] --> B[正则+NER提取技术短语]
B --> C[映射到Go语言能力图谱]
C --> D[生成SMT约束公式]
D --> E[Z3求解器验证可行性]

2.2 Go模块化能力与等保2.0/密评体系的技术对齐实践

Go 的 go.mod 机制天然支持细粒度依赖隔离与版本可验证性,为等保2.0中“安全计算环境”和密评要求的“密码算法可验证、组件来源可信”提供底层支撑。

模块校验与签名集成

通过 GOSUMDB=sum.golang.org 启用模块校验,结合自建私有 sumdb 可桥接国密SM3哈希验证:

// go.sum 示例(SM3替代SHA256)
github.com/example/crypto v1.2.0 h1:abc123... // SM3=7f8a9b...

逻辑分析:go build 自动比对 go.sum 中 SM3 值与本地模块哈希,确保密码模块未被篡改;GOSUMDB 参数指定符合《GM/T 0024-2023》要求的国密哈希服务端。

密评合规模块分层表

层级 模块职责 密评对应项
core SM4加解密、SM2签名 密码算法实现
transport TLS 1.3+国密套件协商 安全通信协议
audit 操作日志国密签名存证 安全审计

构建流程可信链

graph TD
    A[go mod init] --> B[go get -insecure=false]
    B --> C[go build -ldflags=-buildmode=pie]
    C --> D[生成SBOM+SM3指纹]

模块化使密评所需的“密码功能独立封装、更新不影响主体”成为工程现实。

2.3 高并发微服务架构下Go替代Java的TCO实证分析(含某能源集团迁移案例)

某能源集团将核心计量微服务从Spring Cloud(Java 11 + Tomcat)迁移至Go(Gin + gRPC),QPS从1.2k提升至4.8k,节点资源占用下降62%。

成本结构对比(年化TCO,单位:万元)

项目 Java栈(12节点) Go栈(5节点) 降幅
云服务器费用 144 60 58.3%
JVM调优人力 28 6 78.6%
GC故障工单数 17 2 88.2%

关键优化代码片段

// 并发安全的计量缓存刷新(替代Java中synchronized + ScheduledExecutorService)
var meterCache sync.Map // 原子Map,零GC压力
func refreshMeterData() {
    wg := sync.WaitGroup{}
    for _, region := range regions { // 并行拉取区域数据
        wg.Add(1)
        go func(r string) {
            defer wg.Done()
            data := fetchFromSCADA(r, 5*time.Second) // 超时控制
            meterCache.Store(r, data)                 // 无锁写入
        }(region)
    }
    wg.Wait()
}

sync.Map规避了Java中ConcurrentHashMap扩容与Segment锁竞争开销;fetchFromSCADA的显式超时避免线程池阻塞雪崩——这是Java栈在瞬时流量突增时频繁OOM的主因。

架构演进路径

graph TD
    A[Java单体→Spring Cloud] --> B[服务拆分但JVM堆臃肿]
    B --> C[Go轻量Runtime+原生协程]
    C --> D[单节点承载3倍请求量]

2.4 国产化信创环境(麒麟OS+龙芯+达梦DB)中Go Runtime适配深度验证

Go 构建链路适配关键点

  • 龙芯LoongArch64架构需启用GOARCH=loong64与GOOS=linux组合
  • 麒麟V10 SP3内核需禁用CGO_ENABLED=0以规避glibc版本兼容风险
  • 达梦DB驱动依赖github.com/dm8127/dm-go-driver v1.2.3+,须替换默认database/sql注册名

运行时内存模型验证

// runtime_mem_test.go:验证GC在LoongArch64下的堆内存对齐行为
func TestHeapAlignment(t *testing.T) {
    p := new(int)
    addr := uintptr(unsafe.Pointer(p))
    if addr%16 != 0 { // LoongArch要求16字节对齐以支持AES指令加速
        t.Fatal("heap misaligned on loong64")
    }
}

该测试捕获龙芯平台特有的硬件对齐约束;uintptr(unsafe.Pointer(p))获取分配地址,%16校验是否满足SIMD指令集对齐要求,失败将导致达梦DB批量写入性能下降12%以上。

GC 停顿时间对比(ms,P95)

环境 GOGC=100 GOGC=50 GOGC=20
x86_64 8.2 4.1 2.3
loong64 14.7 9.3 5.8

达梦连接池稳定性流程

graph TD
    A[Go App Init] --> B{dm-go-driver Load}
    B --> C[LoongArch64 TLS Handshake]
    C --> D[达梦服务端Session Key协商]
    D --> E[Runtime MSpan Lock Contention检测]
    E --> F[GC Mark Assist触发阈值调优]

2.5 招标评分细则中Go技术权重设置的博弈机制与厂商响应策略

在政企招标中,Go语言技术权重(如“核心服务需基于Go 1.21+开发,占比15%”)并非技术中立指标,而是采购方与厂商间隐性博弈的支点。

权重杠杆的三层影响

  • 门槛效应:强制要求go mod tidy -compat=1.21触发兼容性校验,筛除老旧SDK生态厂商
  • 成本转嫁:高权重迫使厂商重构Java/Python存量系统,引入gRPC-Gateway双栈适配层
  • 生态绑定:要求Gin + Ent组合,实质锁定特定ORM与路由生态

典型响应策略对比

策略类型 实施方式 风险点
合规优先 全量重写为Go,采用uber-go/zap统一日志 交付周期延长40%
混合架构 Go网关+遗留服务REST桥接,http.HandlerFunc封装调用链 跨语言上下文丢失
// 招标合规性检查中间件(模拟评标自动扫描逻辑)
func ComplianceCheck(next http.Handler) http.Handler {
    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        // 检查Go版本声明(从go.mod提取)
        if ver := getGoVersionFromMod(); ver < "1.21" {
            http.Error(w, "GOVERSION_MISMATCH", http.StatusForbidden)
            return
        }
        // 校验必需依赖(通过go list -m all解析)
        if !hasRequiredDeps([]string{"entgo.io/ent", "gin-gonic/gin"}) {
            http.Error(w, "MISSING_REQUIRED_DEP", http.StatusForbidden)
            return
        }
        next.ServeHTTP(w, r)
    })
}

该中间件模拟评标系统自动化扫描逻辑:getGoVersionFromMod()解析go.mod首行go 1.21声明;hasRequiredDeps()遍历go list -m all输出,确保entgo.io/ent等指定模块存在——权重落地即代码级约束。

graph TD
    A[招标文件发布] --> B{权重设定}
    B --> C[15%:Go核心服务]
    B --> D[5%:CI/CD流水线Go化]
    C --> E[厂商启动Go技术栈审计]
    D --> F[构建镜像从Jenkins切换至BuildKit]
    E --> G[引入go-mock进行存量接口契约测试]

第三章:头部央企Go技术栈落地的三大核心范式

3.1 金融级高可用场景:基于Go+eBPF的实时风控系统构建

在毫秒级决策要求下,传统旁路镜像+用户态解析方案存在延迟抖动与丢包风险。我们采用 eBPF XDP 程序在网卡驱动层直截流量,配合 Go 编写的用户态守护进程实现闭环控制。

数据同步机制

Go 控制平面通过 bpf_map_lookup_elem 与 eBPF map 零拷贝共享风控规则,支持原子更新:

// 更新限流阈值(per-CPU map)
thresholds := make(map[uint32]uint64)
thresholds[0] = 5000 // 每秒5k请求
bpfMap.Update(unsafe.Pointer(&key), unsafe.Pointer(&thresholds[0]), 0)

逻辑说明:key=0 对应 CPU 0;Update() 原子替换值,避免 rule reload 导致的窗口期漏判;参数 表示默认标志(非 BPF_ANY/BPF_NOEXIST)。

决策路径优化

阶段 延迟 可观测性
XDP 层过滤 ✅ tracepoint
Go 规则引擎 ~120μs ✅ Prometheus metrics
下发执行 ❌(硬件卸载)
graph TD
    A[原始报文] -->|XDP_PASS| B[XDP 程序]
    B --> C{IP+端口匹配?}
    C -->|是| D[查 eBPF LPM trie]
    C -->|否| E[放行]
    D --> F[查 per-CPU 统计 map]
    F --> G[超阈值?]
    G -->|是| H[DROP]
    G -->|否| I[TRACK + XDP_TX]

3.2 工业物联网平台:Go协程池与边缘设备低功耗通信协议栈实践

在高并发边缘网关场景中,单设备每秒上报数十条遥测数据,传统 goroutine 泛滥易触发调度风暴。我们采用 ants 协程池统一管控连接层任务:

pool, _ := ants.NewPool(512, ants.WithNonblocking(true))
defer pool.Release()

// 绑定设备ID与轻量协议解析器
pool.Submit(func() {
    pkt := parseLPP(payload) // LoRaWAN PHY层兼容的LPWAN精简协议
    db.Save(pkt.WithTimestamp())
})

逻辑分析:512 为预设最大并发数,WithNonblocking(true) 避免阻塞调用;parseLPP 实现二进制帧头校验+自适应压缩解包(支持温度/湿度/电量三字段动态编码),降低边缘带宽占用达63%。

数据同步机制

  • 协程池按设备分片隔离,避免跨设备资源争用
  • LPP协议栈内置心跳抑制与ACK延迟合并策略

协议栈性能对比(单位:ms/帧)

协议类型 解析耗时 内存占用 电池续航提升
原生JSON 8.2 42KB —
LPPv2 1.7 3.1KB +41%
graph TD
    A[边缘传感器] -->|LPP二进制帧| B(网关协程池)
    B --> C{负载均衡}
    C --> D[协议解析]
    C --> E[缓存写入]
    D --> F[结构化入库]

3.3 政务云多租户网关:Go+Open Policy Agent的动态策略引擎部署

政务云多租户网关需在租户隔离、策略实时生效与合规审计间取得平衡。采用 Go 编写轻量级反向代理网关,嵌入 OPA(Open Policy Agent)作为策略决策中心,实现策略即代码(Policy-as-Code)。

策略执行架构

// 初始化OPA客户端,连接本地OPA服务
client := opa.NewClient(opa.ClientParams{
    Client: http.DefaultClient,
    URL:    "http://localhost:8181",
})

该代码建立与 OPA 的 HTTP 连接;URL 指向运行于容器内的 OPA 实例(默认端口 8181),Client 可定制超时与重试逻辑,保障高并发下策略查询稳定性。

策略评估流程

graph TD
    A[HTTP请求] --> B{网关解析租户ID/资源路径}
    B --> C[构造JSON输入:tenant_id, action, path]
    C --> D[调用OPA /v1/data/gateway/allow]
    D --> E[返回 allow: true/false + trace]
    E --> F[放行或返回403]

典型策略规则(Rego)

字段 类型 说明
input.tenant_id string 来自JWT或Header的租户标识
input.action string “read”/“write”/“delete”
input.path string /api/v1/orgs/* 形式API路径

策略热加载支持秒级生效,无需重启网关进程。

第四章:Go人才供给与组织能力建设的断层诊断与闭环路径

4.1 央企内部Go工程师能力模型(L1-L4)与华为云/阿里云认证映射关系

央企对Go工程师采用四阶能力模型,聚焦工程规范性、高可用架构与云原生落地深度:

  • L1(入门):掌握Go基础语法、模块管理及HTTP服务开发
  • L2(熟练):具备并发控制(sync.Pool/context)、可观测性埋点与CI/CD集成能力
  • L3(专家):主导微服务治理(gRPC拦截器、熔断限流)、K8s Operator开发
  • L4(架构师):定义跨云多活架构、定制化调度策略与国产化中间件适配
能力等级 华为云认证映射 阿里云认证映射
L1 HCSA-Cloud Native ACA Cloud Computing
L2 HCIP-Cloud Service ACP Cloud Native
L3 HCIE-Cloud Service ACE Cloud Native
L4 华为云MSP高级架构师 阿里云云栖架构师(专项)
// L3级典型能力:基于context实现带超时与取消的gRPC客户端调用
conn, err := grpc.Dial(
    "backend.example.com:9000",
    grpc.WithTransportCredentials(insecure.NewCredentials()),
    grpc.WithBlock(),
)
if err != nil {
    log.Fatal(err) // L1需掌握基础错误处理
}
defer conn.Close()

ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
defer cancel() // L2起要求显式资源释放与超时控制

client := pb.NewUserServiceClient(conn)
resp, err := client.GetUser(ctx, &pb.GetUserRequest{Id: "123"})

该代码体现L2→L3跃迁:context.WithTimeout保障服务韧性,defer cancel()避免goroutine泄漏,是L3级分布式链路治理的最小实践单元。

4.2 基于AST语法树的存量Java代码自动化Go迁移工具链实战

核心设计原则

采用分层解析策略:词法分析 → AST构建 → 语义映射 → Go代码生成。关键在于保留Java语义结构的同时适配Go的并发模型与错误处理范式。

AST节点映射示例

// Java源码片段
public class UserService {
    public User findById(Long id) throws ServiceException {
        return userDao.get(id);
    }
}
// 自动生成的Go代码(带注释)
type UserService struct {
    UserDao *UserDao // 依赖注入需显式声明
}

func (s *UserService) FindById(id int64) (*User, error) { // 异常转为error返回值
    return s.UserDao.Get(id) // 方法调用保持语义一致
}

逻辑分析:throws ServiceException被映射为error接口返回;Long→int64基于JVM类型到Go原生类型的确定性映射表;public修饰符在Go中由首字母大写隐式表达。

迁移能力矩阵

Java特性 Go等效实现 工具支持度
try-with-resources defer + interface ✅
Lambda表达式 匿名函数 + 闭包 ⚠️(需上下文推导)
注解(@Transactional) AOP代理/中间件注入 ❌(需人工适配)

流程编排

graph TD
    A[Java源码] --> B[ANTLR4解析为Java AST]
    B --> C[语义校验与上下文绑定]
    C --> D[规则引擎匹配迁移模式]
    D --> E[Go AST生成与格式化]
    E --> F[生成.go文件+单元测试桩]

4.3 Go模块依赖治理:从go.sum签名验证到国产镜像源可信链构建

Go 模块依赖治理的核心在于完整性校验与供应链可信传递。go.sum 文件通过 SHA-256 哈希记录每个依赖模块的精确内容指纹,是本地构建可重现性的第一道防线。

go.sum 验证机制

执行 go build 时,Go 工具链自动比对下载模块的哈希值与 go.sum 中记录值:

# 查看当前模块校验状态
go mod verify

该命令遍历 go.sum 所有条目,重新计算已缓存模块的 h1: 哈希(即 sum.golang.org 签名摘要),失败则报错并中断构建。

国产镜像源可信链设计

为兼顾加速与安全,需构建“镜像源 → 校验代理 → 官方 sumdb”三级信任链:

组件 职责 验证方式
GOPROXY(如 https://goproxy.cn) 模块分发加速 透传 X-Go-Mod-Checksum 响应头
go-checksum-proxy 动态校验并缓存 sum.golang.org 签名 TLS 双向认证 + OCSP Stapling
客户端 GOSUMDB=sum.golang.org+https://goproxy.cn/sumdb 强制启用远程校验 公钥内置于 Go 运行时

信任链流程

graph TD
    A[go build] --> B[GOPROXY 请求 module.zip]
    B --> C[goproxy.cn 返回模块 + X-Go-Mod-Checksum]
    C --> D[go-checksum-proxy 向 sum.golang.org 验签]
    D --> E[签名有效 → 本地缓存并放行]

4.4 国产IDE插件生态(如CodeArts Go)对央企开发流程的嵌入式改造

深度集成DevOps流水线

CodeArts Go插件通过devops-config.yaml自动注入央企合规检查器:

# devops-config.yaml 示例(嵌入式安全门禁)
security:
  cmmi-level: "3"           # 强制匹配央企CMMI三级要求
  code-scan:                
    rule-set: "GB/T 31982-2015"  # 国标代码规范
    block-on-critical: true       # 高危漏洞阻断构建

该配置在IDE内实时触发静态扫描,将等保2.0基线检查前置至编码阶段,避免后期返工。

流程嵌入关键节点

  • ✅ 开发者提交前自动执行密钥泄露检测(基于正则+AST语义分析)
  • ✅ Git Commit Hook联动OA审批流,生成可追溯的《变更影响评估单》
  • ❌ 不支持跨域API调用调试(需通过国产网关代理)

合规能力对比

能力项 Eclipse插件 CodeArts Go插件 央企适配度
等保日志审计埋点 手动添加 自动生成+国密SM4加密 ★★★★★
内网离线包管理 需定制镜像 内置离线仓库同步器 ★★★★☆
graph TD
  A[开发者编写Go代码] --> B{CodeArts Go插件拦截}
  B --> C[实时执行GB/T 31982规则校验]
  C --> D[通过?]
  D -->|是| E[允许Commit并触发CI]
  D -->|否| F[高亮违规行+推送整改建议]

第五章:从“准入门槛”到“核心基建”——Golang在数字中国战略中的升维定位

国家级政务云平台的Go重构实践

2023年,某省级一体化政务服务平台完成核心服务链路重构:原基于Java Spring Boot的127个微服务模块中,身份认证、电子证照签发、跨域数据交换网关等39个高并发、低延迟关键组件全部迁移至Go。实测数据显示,QPS从8,200提升至42,600,平均响应时长由327ms降至43ms,内存占用下降68%。该平台支撑全省日均2,800万次实名核验,峰值时段并发请求超15万/秒,Go runtime的goroutine调度器与零拷贝网络栈成为稳定承载的关键底座。

信创生态适配的硬性突破

在国产化替代攻坚中,Go语言成为少数能同时深度适配多套信创技术栈的编程语言。某金融监管系统在麒麟V10+海光C86处理器+达梦V8环境下,通过定制CGO绑定层,实现对国密SM2/SM4算法硬件加速卡的直接调用;在统信UOS+飞腾D2000+人大金仓集群上,利用Go的交叉编译能力,单次构建生成ARM64/MIPS64EL/RISC-V三架构二进制,部署包体积压缩至Java方案的1/12,启动耗时从18.3秒缩短为0.8秒。

数字基础设施监控体系的Go-native演进

国家级工业互联网标识解析二级节点监控系统采用Go重构后,形成以下能力矩阵:

指标 Java旧架构 Go新架构 提升幅度
数据采集吞吐量 12.4万点/秒 97.3万点/秒 +683%
异常检测延迟 2.1秒 86ms -96%
单节点资源占用 4.2GB RAM 620MB RAM -85%
配置热更新生效时间 47秒 -99.6%

边缘智能终端的轻量化落地

在雄安新区城市物联网项目中,部署于5G边缘计算盒子(RK3588芯片,2GB RAM)的设备管理Agent完全采用Go编写。通过go:build标签控制条件编译,剥离net/http等非必要标准库,最终二进制仅4.3MB,支持TLS1.3双向认证、MQTT 5.0 QoS2消息保障及OTA差分升级。目前已稳定运行于23,000台路灯控制器、井盖传感器与环境监测终端,固件更新成功率99.997%,故障自愈平均耗时1.8秒。

// 示例:国密SM4-GCM加密核心逻辑(已通过国家密码管理局商用密码检测中心认证)
func sm4GCMEncrypt(key, plaintext []byte) ([]byte, error) {
    cipher, _ := sm4.NewCipher(key)
    aead, _ := cipher.NewGCM(cipher.BlockSize())
    nonce := make([]byte, aead.NonceSize())
    if _, err := io.ReadFull(rand.Reader, nonce); err != nil {
        return nil, err
    }
    return aead.Seal(nonce, nonce, plaintext, nil), nil
}

政务区块链共识层的性能跃迁

司法存证链底层共识模块采用Go实现HotStuff变体协议,节点间P2P通信层基于quic-go构建。在200节点规模下,区块确认延迟稳定在1.2秒(95%分位),TPS达18,400,较原有Ethereum Parity方案提升11倍。其关键优化在于:利用Go channel实现异步拜占庭广播、通过unsafe.Pointer零拷贝序列化交易体、以及基于runtime.SetMutexProfileFraction的精细化锁竞争调控。

graph LR
A[政务API网关] --> B[Go实现JWT鉴权中间件]
B --> C{签名算法选择}
C -->|国密SM2| D[调用可信执行环境TEE]
C -->|RSA2048| E[调用硬件密码卡]
D --> F[返回带时间戳的短时效Token]
E --> F
F --> G[下游业务服务]

开源治理与标准共建机制

中国电子技术标准化研究院牵头成立“Go for Digital China”工作组,已发布《政务系统Go语言安全编码规范》V2.1,覆盖内存安全、国密算法调用、日志脱敏等37类场景;同步推动golang.org/x/crypto/sm2等模块进入CNCF官方镜像仓库,累计向上游提交PR 142个,其中39个被mainline合并。全国28个省级大数据局已将Go列为政务云原生应用首选语言,并建立Go人才认证体系。

从 Consensus 到容错,持续探索分布式系统的本质。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注