乐趣区

关于golang:Go语言通用开发框架Ngo开源啦

网易传媒在 2020 年底开始尝试应用 Go 语言做业务开发,并在 2021 年应用 Go 语言重构外围业务,目前超过一半的业务都曾经重构为 Go 语言,并在线上提供服务。

1、为什么要用 Go 语言

Go 语言于 2009 年 11 月正式发表推出,它是 Google 开发的一种动态强类型、编译型、并发型、并具备垃圾回收性能的编程语言,它的个性包含:

  • 编译速度快
  • 语法简略
  • 像动静语言一样开发
  • 资源耗费少
  • 为并发 IO 而生
  • 可运维性好
  • 与 C /C++ 兼容
  • 对立而齐备的工具集

网易传媒的次要开发语言是 Java,在业务全副接入容器后,在线业务也面临着以下一些问题:

  1. 在线业务内存使用量偏高:传媒次要开发语言是 Java,应用 SpringBoot 框架,起码应用 2G 内存,广泛内存使用量都在 4G 以上,还有 8G、16G、32G 等内存应用的利用。
  2. 在线业务编译速度和启动速度偏慢:应用 maven 编译、打包、打镜像、传镜像都比拟耗时,拖慢了整个 CI 的流程。
  3. 占用空间较大:因为应用 Java,JVM 在镜像实例都须要上百兆(400M 以上)的空间,拉取,上传都比拟耗时。

网易传媒于 2020 年将外围业务全副迁入容器,在容器和微服务的大背景下,利用的小而快显得就分外的重要,Go 语言就比拟适宜于咱们的需要,目前曾经有很多互联网厂商都在踊跃推动 Go 语言的利用,于是,网易传媒在 2020 年底开始尝试 Go 语言的摸索,并在 2021 年应用 Go 语言重构外围业务,目前超过一半的业务都曾经重构为 Go 语言,并在线上提供服务。

2、Ngo 是什么

在传媒技术团队中推广 Go 语言,亟需一个 Web 框架提供给业务开发共事应用,内含业务开发罕用库,防止反复造轮子影响效率,并且须要无感知的主动监控数据上报,能在框架层面反对业务的优雅高低线、对云原生监控的反对等,于是就孕育出 ngo 框架。

因为 Go 的开源 Web 框架没有相似 Spring Boot 大而全的,而最大的框架也是很受用户欢送的框架是 Beego,为什么没有间接应用 Beego 呢?次要有以下几个起因:

  • HTTP Server 的性能不现实
  • 不足大量业务所需库,比方 kafka、redis、rpc、分布式锁等,如果在其根底上开发不如从零抉择更适宜的库
  • 大部分库无奈注入回调函数
  • 若干模块如 ORM 不够好用

基于以上的起因,传媒外部孕育出了 ngo 框架,次要指标如下:

  • 提供比原有 Java 框架更高的性能和更低的资源占用率
  • 尽量为业务开发者提供所需的全副工具库
  • 嵌入云原生监控,主动上传监控数据
  • 嵌入全链路监控,提供规范的 opentracering 协定,和第三方的全链路监控零碎联合 (Jaeger、Zipkin)
  • 主动加载配置和初始化程序环境,开发者能间接应用各种库
  • 与线上的健康检查、运维接口等运行环境匹配,无需用户手动开发配置

ngo 防止反复造轮子,所有模块都是在多个开源库中比照并筛选其一,而后减少局部必须性能,整个架构如下图所示:

Ngo 框架为业务抉择并包装了用到的中间件和根底服务,让业务能够疾速的进入到业务开发的阶段,省去了钻研和比拟一些根底组件的工夫,大大节俭了业务的开发周期。

3、疾速开始

让咱们从一个最简略的 HelloWorld 开始 Ngo 之旅吧

首先,将代码从 github 上 clone 下来

git clone https://github.com/NetEase-Media/ngo.git

其次,进入 sample 目录

cd ./ngo/examples/quickstart

查看代码如下:

 
package main
 
import (
"context"
 
"github.com/NetEase-Media/ngo/adapter/log"
"github.com/NetEase-Media/ngo/adapter/protocol"
"github.com/NetEase-Media/ngo/server"
"github.com/gin-gonic/gin"
)
 
func main() {s := server.Init()
  s.PreStart = func() error {log.Info("do pre-start...")
return nil
  }
 
  s.PreStop = func(ctx context.Context) error {log.Info("do pre-stop...")
return nil
  }
 
  s.AddRoute(server.GET, "/hello", func(ctx *gin.Context) {ctx.JSON(protocol.JsonBody("hello"))
  })
  s.Start()}

查看 yaml 配置如下:​​​​​​​

service:
  appName: ngo-demo
  clusterName: ngo-demo-local

运行以下命令,最简略的服务便启动了

go run . -c ./app.yaml

So Cool!更多示例,咱们能够进入 examples 目录查看。
Ngo 拜访地址如下:
Ngo GitHub

退出移动版