探讨 Go 和 Docker,探索微服务架构

2016.11.14

黄庆兵 bingohuang.com

网易云 网易蜂巢

自我介绍

2

目录

3

Go

4

编程语言历史与现状

- 单机时代
- C 语言
- 成功原因:简单、对机器的绝佳抽象
- 互联网时代
- Java 语言
- 成功原因:机器性能的提升,软件规模与复杂度提高
- Java 语言的份额继续下滑,最终被 C 和 Go 语言超越
- C    语言将长居编程榜第二的位置,有望在 Go 取代 Java 前重获语言榜第一的宝座
- Go   语言最终会取代 Java 居于编程榜之首
- 成功原因:Go 以 C 语言为原型,以降低心智负担为设计理念,易学习,高品质,大道至简,目标解放程序员
5

TIOBE Top10 指数走势(2002-2016)

6

Go 发展历程

7

Go 发展历程

- 创始者三剑客:Ken Thompson, Rob Pike 和 Robert Griesemer
- 而后加入的人:Russ Cox, Ian Lance Taylor, Brad Fitzpatrick, Andrew Gerrand 等
- 有Google这个显赫的爹
- Go 1   (3月  2012)
- Go 1.1 (5月  2013)
- Go 1.2 (12月 2013)
- Go 1.3 (6月  2014)
- Go 1.4 (12月 2014)
- Go 1.5 (8月  2015)
- Go 1.6 (2月  2016)
- Go 1.7 (8月  2016)
8

TIOBE 2016年10月榜 TOP20 编程语言榜单

9

TIOBE 2016年11月榜 TOP20 编程语言榜单

10

TIOBE 年度编程语言(2003-2015)

11

Go 趋势图

12

Go 趋势图

13

Go Team

14

Go Team - 三个泰斗级的人物

- 设计了B语言、C语言。创建了Unix和Plan 9操作系统,UTF-8的主要设计者。1983年图灵奖得主。Go的创立者之一。
- Unix小组成员,参与Plan 9、Inferno操作系统。UTF-8编码的创立者之一,r@google.com。Go的创立者之一。
- 曾设计了Chrome浏览器的JavaScript V8引擎,协助制作Java的HotSpot编译器。Go的创立者之一。
15

Go Team - 几个独当一面的人物

- 参与Plan 9操作系统开发。Google Code Search项目负责人
- gcc 社区的活跃人物。gold连接器和gcc过程间优化LTO的主要设计者,Zembu公司的创始人。
- LiveJournal 创始人,著名开源项目memcached的作者
- 2010年2月加入Google和Go team,多次担任 Go 的发言人。澳大利亚人,本科专业摄影,艺术学位。
16

Go Team - “炉边谈话”

www.youtube.com/watch?v=sln-gJaURzk

www.youtube.com/watch?v=p9VUCp98ay4

www.youtube.com/watch?v=ynQoaajojIs

17

Go 的创立故事

18

Go 的创立故事

19

Go 的创立故事

20

Go 最初的代码提交

$ git log --before={2008-03-03} --reverse
21

Go 语言起源

哪些早期的编程语言对Go语言的设计产生了重要影响
22

Go 主要特性列表 - "21世纪的C语言"

- 垃圾回收(GC)

- 轻量级线程(goroutine)和消息通信(channel)

- 反射(reflect)

- 字母大小写设置可见性(letter case sets visibility)

- 函数多返回值、更好的错误处理规范

- 匿名函数和闭包

- 类型(type)和接口(interface)接口只有方法(没有数据)

- 包(package)(无循环依赖)

- 更丰富的内置类型:slice、string、map等

- 更丰富的标准库
23

Go 版本变更总结

- Go语言4年发布了7个大版本,语言特性没有实质性的变化
- 降低心智负担
- 细节完善
- 工程化
- 性能,性能,性能!性能优化,尤其是GC
- 更多平台的移植
- 更进一步的标准化,强化社区约定
- 3到5年内,Go的主攻方向仍然是服务端开发
- 站在10年的维度,Go语言会在桌面端(Mobile)大放异彩, 占据重要地位
24

Go 学习实践

25

学习 Go 的八大理由 - By ASTA谢

- 类C语法,GC内置
- 工程工具
- 接近C的运行效率
- 接近PHP的开发效率
- 诞生于几位泰山北斗之手
- 出生于Google这个名门
- 组合的思想
- 无侵入式的接口
26

学习 Go 的八大理由 - By ASTA谢

- 互联网应用
- 系统编程,网络编程
- 二进制文件
- copy 部署
- 降低心智的并发
- 简易的数据同步
- 强大的编译检查,严格的编码规范
- 完整的软件生命周期工具
27

学习方式

- 学习基本语法和命令操作,参照实例学习
- Go Tour
- How to Write Go Code
- Effective Go : gitbook@bingohuang
- Go By Example
- 无闻的《Go 编程基础》
- 郝林的《Go 语言第一课》
- 进阶:web开发《Beego 视频教程》
- Go Team《The Go Programming》又称 《Go 语言圣经》
- asta谢 《Go Web 编程》*开源书籍
- 许式伟  《Go 语言编程》
- 郝林   《Go 并发编程》
- 雨痕   《Go 学习笔记》 *开源书籍
28

学习方式

- Go Tour: http://tour.golang.org/
- How to Write Go Code: http://golang.org/doc/code.html
- Effective Go: https://www.gitbook.com/book/bingohuang/effective-go-zh-en/details
- Go By Example: http://gobyexample.com/
- 《Go 编程基础》: http://study.163.com/course/introduction.htm?courseId=306002#/courseDetail
- 《Go 语言第一课》: http://www.imooc.com/learn/345
- 《Beego 视频教程》: http://beego.me/video
- 《Go Web 编程》: https://www.gitbook.com/book/astaxie/build-web-application-with-golang/details
- 《Go 学习笔记》: https://github.com/qyuhen/book
29

如何实践:编程实践+社区开源

30

Go 编程实践

// +build OMIT

package main

import "fmt"

// 反转字符串
func Reverse(s string) string {
    r := []rune(s)
    for i, j := 0, len(r)-1; i < len(r)/2; i, j = i+1, j-1 {
        r[i], r[j] = r[j], r[i] // 先计算出所有右值,然后再依次完成赋值操作
    }
    return string(r)
}

func main() {
    fmt.Println(Reverse("!界世 ,olleH"))
}
31

Go 在云计算和微服务领域的开源项目

32

Go 在网易云的应用实践


33

Q&A

me@bingohuang.com
http://github.com/bingohuang
http://gitbook.com/@bingohuang

34

Docker

35

容器技术的历史

36

Docker 的诞生

- 2013 年 3 月 15日,在 加利福尼亚州 圣克拉拉市 举办的 Python 开发者大会上, dotCloud 的创始人兼 CEO
- Solomon Hykes, 在一个微型演讲《The future of Linux Containers》(只有5分钟)中向世人宣布了 Docker
- 演讲链接:https://youtu.be/wW9CAH9nSLs
- 源码托管在 GitHub 中:https://github.com/docker/docker
37

Docker VS 集装箱

38

Docker VS 集装箱

39

Docker VS 集装箱

类比传统的航运基础设施

- 集装箱        =>     容器
- 货物          =>     应用
- 集装箱拖船     =>     云服务器
- 集装箱吊车     =>     容器编排工具
- 集装箱仓库     =>     镜像仓库
- 拖车          =>     镜像发布工具
- 港口          =>     公有云
- 海运公司       =>     云计算厂商
40

Docker VS 集装箱

41

Docker VS 虚拟机

好比:公寓套间 VS 一个房间
42

Docker VS 虚拟机

43

Docker 特性

1. 不变 :将操作系统、依赖库、应用程序等都打包在 Container 內,确保每次构建的 Container 都拥有同样的行为。

2. 轻量 :Container 不需消耗太多内存,只需使用主程序所需的用量,在多加上数十 MB 内存就足夠。

3. 快速 :Container 启动就如同平时启动 Linux 程序一样快,仅需耗費几秒钟的时间。

44

Docker 基本概念

Docker 是一套以容器技术为核心的,用于应用的构建、分发和执行的体系和生态。

三个基本概念:

45

Docker Images

46

Docker Container

47

Docker Repository

48

从三个问题入手

49

Docker 的应用场景

- Web应用服务
- 微服务架构使用
- 跑一次性/定时任务
- 科学计算/大数据分析服务
- 金融和游戏等
50

Docker 实践经验

拓展阅读:Docker也在不断完善当中:Docker实战,一部失败史

51

Docker 实践演示

用 docker 部署 Go 程序

main.go
Dockerfile
docker build -t go-docker-demo .
docker run --publish 12306:8080 --name go-docker --rm go-docker-demo /go/bin/app --help
docker run --publish 12306:8080 --name go-docker --rm go-docker-demo /go/bin/app -version 1.7.3
docker tag go-docker-demo hub.c.163.com/bingohuang/go-docker-demo
docker login hub.c.163.com
docker push hub.c.163.com/bingohuang/go-docker-demo
52

Q&A

me@bingohuang.com
http://github.com/bingohuang
http://gitbook.com/@bingohuang

53

Microservice

54

从一篇漫画说起

西乔漫画:当一个项目里的代码超过一百万行……

55

软件架构模式 - 抽象

56

软件架构模式 - 具体

57

微型机器人 VS 微服务架构

58

软件架构演进

让我们来开发一个应用
59

软件架构演进

刚开始时
60

软件架构演进

随着开发语言的发展
61

软件架构演进

在框架和设计模式的帮助下
62

软件架构演进

单体模式 (Monolith)

- 一个单独的 Java WAR 文件
- Rails 或 Node.JS 代码中的一个单独的目录结构
- 一个 Go 的可执行文件
63

软件架构演进

单体模式的优势

在项目刚开始的时候并不是一个错误的选择

- 利用已有的工具和环境
- 快速开发一个模型
- 不必担心应用的分布式部署
- 并没有遇到其他开发模式所解决的问题
64

软件架构演进

单体模式的优势

65

软件架构演进

单体模式的不足

- 应用工程变得又大又复杂
- 敏捷开发和部署举步维艰
- 启动时间长
- 可靠性差
- 难以采用新技术新语言
66

软件架构演进

使用微服务架构重新设计我们的应用

67

软件架构演进

应用架构继续变得复杂

68

软件架构演进

微服务架构

- 由多个独立运行的微小服务构成
- 通过轻量级的机制通信
- 独立构建部署
- 每个服务可以使用不同语言
- 每个服务可以使用不同数据库
69

软件架构演进

微服务架构优缺点

70

微服务架构实践 - 基于蜂巢的网易众筹平台

71

Thank you

2016.11.14

黄庆兵 bingohuang.com

网易云 网易蜂巢

Use the left and right arrow keys or click the left and right edges of the page to navigate between slides.
(Press 'H' or navigate to hide this message.)