网易传媒在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-democlusterName: ngo-demo-local

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

go run . -c ./app.yaml

So Cool!更多示例,我们可以进入examples目录查看。

ngo访问地址如下

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

--End--

欢迎热衷于云原生的攻城狮加入网易传媒,一起打造稳定、可靠的云原生基础架构,有兴趣的同学可以发邮件:chaikebin@corp.netease.com

职位介绍

  • 岗位:Service Mesh开发工程师

  • Base:北京

工作职责

  • 服务网易传媒的 Service Mesh 系统的架构设计与实现

  • 支持 Service Mesh 在业务落地,支撑起微服务的发现、治理、安全、流控、遥测全流程

  • 构建大规模 Service Mesh 集中管控系统,支持海量发布、质量控制、观测诊断

  • 构建跨Kubernets集群的Service Mesh解决方案

职位要求

  • 本科及以上学历,计算机、通信等相关专业

  • 熟练掌握Linux系统及常用操作

  • 精通Go/C/C++中一门或多门语言

  • 有深度参与Istio、Envoy的相关开发经验者优先

  • 深入理解RPC原理,熟悉相关开源框架,如 Thrift/dubbo/gRPC 等

  • 具备扎实的操作系统、数据结构与算法能力,代码风格良好,可扩展性强

职位介绍

  • 岗位:Serverless开发工程师

  • Base:北京

工作职责

  • 服务网易传媒的Serverless系统的架构设计与实现

  • 支持Serverless在业务落地,支撑起业务弹性需求

  • 构建大规模 Serverless 集中管控、弹性、可观测诊断

  • 构建Faas Runtime框架

  • 构建Envoy和Serverless代理的统一

职位要求

  • 本科及以上学历,计算机、通信等相关专业

  • 熟练掌握Linux系统及常用操作

  • 精通Go/C/C++中一门或多门语言

  • 对 Serverless 相关领域有较深了解,有深度参与Knative的相关开发经验者优先,有 Firecracker、KVM、Kubernetes、OpenFaaS、Knative 等开源产品经验

  • 有阿里、腾讯、华为、 AWS Lambda、Google Function、Azure Function相关Faas/Serverless相关平台经验者优先

  • 具备扎实的操作系统、数据结构与算法能力,代码风格良好,可扩展性强