Go语言基础,想要了解的可以阅读下

文章分享liyongjing 发表了文章 • 0 个评论 • 208 次浏览 • 2018-02-13 18:53 • 来自相关话题

Go 语言内置类型研读


编程语言底层那些事儿


内容太干,想要了解的可以阅读下

GoCN每日新闻(2018-02-11)

回复

每日新闻lwhile 发起了问题 • 1 人关注 • 0 个回复 • 552 次浏览 • 2018-02-11 09:12 • 来自相关话题

GoCN每日新闻(2018-02-10)

回复

每日新闻mahuaibo 发起了问题 • 1 人关注 • 0 个回复 • 489 次浏览 • 2018-02-10 13:37 • 来自相关话题

一段不是很理解的sql

回复

有问必答小张的烦恼 发起了问题 • 2 人关注 • 0 个回复 • 200 次浏览 • 2018-02-10 09:38 • 来自相关话题

Go 内嵌静态文件工具 packr

文章分享xfstart07 发表了文章 • 0 个评论 • 439 次浏览 • 2018-02-09 18:38 • 来自相关话题

[Go] Go 内嵌静态文件工具 packr

介绍一个简单实用的 Go 内嵌静态文件工具 packr。

安装

$ go get -... 			查看全部
					

[Go] Go 内嵌静态文件工具 packr


介绍一个简单实用的 Go 内嵌静态文件工具 packr。


安装


$ go get -u github.com/gobuffalo/packr/...

使用


使用 packr 打包静态文件非常简单,通过创建一个 box.


// templates 是相对路径,例子是在同一个目录下
box := packr.NewBox("./templates")

// 以字符串的形式获取静态文件
html := box.String("index.html")
fmt.Println("String获取:", html)

html, err := box.MustString("index.html")
if err != nil {
log.Fatal(err)
}
fmt.Println("MustString获取", html)

// 以字节数组的形式获取静态文件
htmlByte := box.Bytes("index.html")
fmt.Println("Bytes: ", htmlByte)
// 对应的还有 MustBytes 方法

packr 在查找文件时的解析规则:



  • 在二进制文件中,在内存中查找文件

  • 开发时,在本地查找文件


在 HTTP 中使用


因为 box 实现了 http.FileSystem 接口,所有可以直接用来提供静态文件访问


package main

import (
"net/http"

"github.com/gobuffalo/packr"
)

func main() {
box := packr.NewBox("./templates")

http.Handle("/", http.FileServer(box))
http.ListenAndServe(":3000", nil)
}

使用 gorilla/mux 作为路由库,mux 也有提供静态文件访问的方式


r := mux.NewRouter()

box := packr.NewBox("./css")
r.PathPrefix("/css").Handler(http.StripPrefix("/css", http.FileServer(box)))

在渲染库(render)中使用


使用 unrolled/render 库来渲染资源,在初始化渲染选项中,将静态文件加入到 Asset 中。


var boxTemp = packr.NewBox("../templates")
var ren = render.New(render.Options{
Directory: "templates",
Asset: func(name string) ([]byte, error) {
// 返回指定路径名称的文件资源
return boxTemp.Bytes("index.html"), nil
},
AssetNames: func() []string {
// 静态文件的路径名称
return []string{"templates/index.html"}
},
Extensions: []string{".html"},
})

使用


ren.HTML(w, http.StatusOK, "index.html", "")

打包命令


使用命令建立二进制文件


packr build 包括了 go build


packr install 包括了 go install


还可以使用 go generate 命令来生成静态资源文件(.go),


package main

// 打包静态文件命令,生成 packr.go 文件
//go:generate packr

func main() {
Run()
}

然后运行命令


go generate && go build

资源


https://github.com/gobuffalo/packr


https://github.com/unrolled/render


https://github.com/gorilla/mux

golang80行代码钉钉群机器人订阅百度新闻

文章分享jjjjerk 发表了文章 • 0 个评论 • 200 次浏览 • 2018-02-09 17:54 • 来自相关话题

1. 资料


1.1.第三方包


1.2.接口


2. 初始化项目变量


package main

import (
"fmt"
"log"
"github.com/PuerkitoBio/goquery"
"github.com/go-redis/redis"
"net/http"
"bytes"
"github.com/astaxie/beego/toolbox"
)

var (
redisClient *redis.Client //redis 缓存
//钉钉群机器人webhook地址
dingdingURL = "https://oapi.dingtalk.com/robot/send?access_token=dingding_talk_group_bot_webhook_token"
//百度新闻搜索关键字URL
baiduNewsUrlWithSearchKeyword = "http://news.baidu.com/ns?cl=2&rn=20&tn=news&word=%E7%89%A9%E8%81%94%E7%BD%91"
)

const (
newsFeed = "news_feed"//爬取到的百度新闻redis key
newsPost = "news_post"//已发送的百度新闻redis key
newsList = "iot_news" //储存了的百度新闻redis key
)
//实例化redis缓存
func init() {
redisClient = redis.NewClient(&redis.Options{
Addr: "127.0.0.1:6379",
Password: "ddfrfgtre4353252", // redis password
DB: 0, // redis 数据库ID
})
}

在机器人管理页面选择“自定义”机器人,输入机器人名字并选择要发送消息的群。如果需要的话,可以为机器人设置一个头像。点击“完成添加”。


点击“复制”按钮,即可获得这个机器人对应的Webhook地址,赋值给 dingdingURl


3 func newsBot


3.1 使用goquery和网页元素选择器语法提取有用信息

func newsBot() error {
// 获取html doc
doc, err := goquery.NewDocument(baiduNewsUrlWithSearchKeyword)
if err != nil {
return nil
}
//使用redis pipeline 减少redis连接数
pipe := redisClient.Pipeline()
// 使用selector xpath 语法获取有用信息
// 储存新闻到redis中 newsList
// 储存新闻ur到redis-set 建newfeed 为以后是用sdiff 找出没有发送的新闻

doc.Find("div.result").Each(func(i int, s *goquery.Selection) {
// For each item found, get the band and title
URL, _ := s.Find("h3 > a").Attr("href")
Source := s.Find("p.c-author").Text()
Title := s.Find("h3 > a").Text()
markdown := fmt.Sprintf("- [%s](%s) _%s_", Title, URL, Source)
pipe.HSet(newsList, URL, markdown)
pipe.SAdd(newsFeed, URL)
})
//执行redis pipeline
pipe.Exec()

3.2 排除以发送的新闻,拼接markdown字符串

        //使用redis sdiff找出没有发送的新闻url
unSendNewsUrls := redisClient.SDiff(newsFeed, newsPost).Val()
//新闻按dingding文档markdonw 规范拼接

content := ""
for _, url := range unSendNewsUrls {
md := redisClient.HGet(newsList, url).Val()
content = content + " \n " + md
//记录已发送新闻的url地址
pipe.SAdd(newsPost, url)
}
pipe.Exec()

3.3 调用钉钉群机器人接口

        //如果有未发送新闻 请求钉钉webhook
if content != "" {
formt := `
{
"msgtype": "markdown",
"markdown": {
"title":"IOT每日新闻",
"text": "%s"
}
}`
body := fmt.Sprintf(formt, content)
jsonValue := []byte(body)
//发送消息到钉钉群使用webhook
//钉钉文档 https://open-doc.dingtalk.com/ ... e%3D1
resp, err := http.Post(dingdingURL, "application/json", bytes.NewBuffer(jsonValue))
if (err != nil) {
return err
}
log.Println(resp)
}
return nil
}

func newsBot函数完成


4. 设置定时任务


func main() {
//销毁redisClient
defer redisClient.Close()

//创建定时任务
//每天 8点 13点 18点 自动执行爬虫和机器人
//
dingdingNewsBot := toolbox.NewTask("dingding-news-bot", "0 0 8,13,18 * * *", newsBot)
//dingdingNewsBot := toolbox.NewTask("dingding-news-bot", "0 40 */1 * * *", newsBot)
//err := dingdingNewsBot.Run()
//检测定时任务
// if err != nil {
// log.Fatal(err)
// }
//添加定时任务
toolbox.AddTask("dingding-news-bot", dingdingNewsBot)
//启动定时任务
toolbox.StartTask()
defer toolbox.StopTask()
select {}
}


spec 格式是参照



5 最终代码



go build main.go
nohup ./main &

最终效果
dingding-webhook-bot


7 最后


GoCN每日新闻(2018-02-09)

回复

每日新闻DennisMao 发起了问题 • 1 人关注 • 0 个回复 • 632 次浏览 • 2018-02-09 09:14 • 来自相关话题

golang restful 框架之 go-swagger

文章分享hatlonely 发表了文章 • 0 个评论 • 246 次浏览 • 2018-02-09 02:53 • 来自相关话题

restful 是这些年的高频词汇了,各大互联网公司也都纷纷推出了自己的 restful api,其实 restful 和 thrift,grpc 类似,就是一种协议,但是这种协议有点特殊的就是使用 http 接口,返回的对象一般是 json 格式,这样... 查看全部

restful 是这些年的高频词汇了,各大互联网公司也都纷纷推出了自己的 restful api,其实 restful 和 thrift,grpc 类似,就是一种协议,但是这种协议有点特殊的就是使用 http 接口,返回的对象一般是 json 格式,这样有个好处,就是可以供前端的 js 直接调用,使用非常方便,但 http 本身并不是一个高效的协议,后端的内部通信还是使用 grpc 或者 thrift 可以获得更高的性能


其实如果只是要用 http 返回 json 本身并不是一件很难的事情,不用任何框架,golang 本身也能很方便做到,但是当你有很多 api 的时候,这些 api 的维护和管理就会变得很复杂,你自己都无法记住这些 api 应该填什么参数,返回什么,当然你可以花很多时间去维护一份接口文档,这样不仅耗时而且很难保证文档的即时性,准确性以及一致性


swagger 有一整套规范来定义一个接口文件,类似于 thrift 和 proto 文件,定义了服务的请求内容和返回内容,同样也有工具可以生成各种不同语言的框架代码,在 golang 里面我们使用 go-swagger 这个工具,这个工具还提供了额外的功能,可以可视化显示这个接口,方便阅读


下面通过一个例子来简单介绍一下这个框架的使用,还是之前的点赞评论系统:https://github.com/hatlonely/microservices


go-swagger 使用方法


api 定义文件


首先需要写一个 api 定义文件,这里我只展示其中一个接口 countlike,请求中带有某篇文章,返回点赞的次数


paths:
/countlike:
get:
tags:
- like
summary: 有多少赞
description: ''
operationId: countLike
consumes:
- application/json
produces:
- application/json
parameters:
- name: title
in: query
description: 文章标题
required: true
type: string
responses:
'200':
description: 成功
schema:
$ref: '#/definitions/CountLikeModel'
'500':
description: 内部错误
schema:
$ref: '#/definitions/ErrorModel'
definitions:
CountLikeModel:
type: object
properties:
count:
type: integer
title:
type: string
example: golang json 性能分析
ErrorModel:
type: object
properties:
message:
type: string
example: error message
code:
type: integer
example: 400

这个是 yaml 语法,有点像去掉了括号的 json


这里完整地定义了请求方法、请求参数、正常返回接口、异常返回结果,有了这个文件只需要执行下面命令就能生成框架代码了


swagger generate server -f api/comment_like/comment_like.yaml

还可以下面这个命令可视化查看这个接口文件


swagger serve api/comment_like/comment_like.yaml

这个命令依赖 swagger 工具,可以通过下面命令获取


Mac


brew tap go-swagger/go-swagger
brew install go-swagger

Linux


go get -u github.com/go-swagger/go-swagger/cmd/swagger
export PATH=$GOPATH/bin:$PATH

执行完了之后,你发现多了几个文件夹,其中 cmd 目录里面包含 main 函数,是整个程序的入口,restapi 文件夹下面包含协议相关代码,其中 configure_xxx.go 是需要特别关注的,你需要在这个文件里面实现你具体的业务逻辑


现在你就其实已经可以运行程序了,go run cmd/comment-like-server/main.go,在浏览器里面访问一下你的 api,会返回一个错误信息,告诉你 api 还没有实现,下面就来实现一下吧


业务逻辑实现


api.LikeCountLikeHandler = like.CountLikeHandlerFunc(func(params like.CountLikeParams) middleware.Responder {
count, err := comment_like.CountLike(params.Title)
if err != nil {
return like.NewCountLikeInternalServerError().WithPayload(&models.ErrorModel{
Code: http.StatusInternalServerError,
Message: err.Error(),
})
}
return like.NewCountLikeOK().WithPayload(&models.CountLikeModel{
Count: count,
Title: params.Title,
})
})

你只需要在这些 handler 里面实现自己的业务逻辑即可,这里对协议的封装非常好,除了业务逻辑以及打包返回,没有多余的逻辑


再次运行,现在返回已经正常了


统一处理


如果你对请求有一些操作需要统一处理,比如输出统一的日志之类的,可以重写这个函数,也在 configure_xxx.go 这个文件中


func setupGlobalMiddleware(handler http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Access-Control-Allow-Origin", "*")
handler.ServeHTTP(w, r)
})
}

这里我统一设置了一下头部,解决跨域访问问题


参考链接




转载请注明出处
本文链接:http://hatlonely.github.io/2018/02/08/golang-restful-%E6%A1%86%E6%9E%B6%E4%B9%8B-go-swagger/


【北京】【云联万维】-招聘后端研发工程师/技术专家

招聘应聘yunion 发表了文章 • 0 个评论 • 173 次浏览 • 2018-02-08 16:12 • 来自相关话题

北京云联万维技术有限公司(www.yunionyun.com)招聘

 云联万维Yunion是云计算软件和服务提供商,专注于混合云和多云管理软件开发,自主研发的YunionCMP产品能够提供跨各种私有云和公有云的资源管理、监控... 			查看全部
					

北京云联万维技术有限公司(www.yunionyun.com)招聘


 云联万维Yunion是云计算软件和服务提供商,专注于混合云和多云管理软件开发,自主研发的YunionCMP产品能够提供跨各种私有云和公有云的资源管理、监控、应用部署、计费等服务。核心团队来自美团网早期员工,成立之初即获得徐小平老师的真格基金的天使轮投资及多个大客户订单。加入我们,团队靠谱/学习成长/有激情/有梦想/有期权/各种福利一应俱全。
欢迎有梦想,有能力的你加入Yunion大家庭,一起实现梦想!
简历投递:liwenzhen@yunionyun.com,成功推荐者,即获价值1000元的京东卡一张!

【高级前端工程师(Vue.js)】


待遇: 月薪30k-40k(有期权)
工作年限:3年以上
招聘人数:2人


岗位职责:



  1. 负责多云管理平台的HTML5 web app产品开发

  2. 根据产品原型图,通过css/javascript/html和后端API配合实现web交互页面

  3. 改进和完善前端架构,持续提高开发效率和质量


任职要求:



  1. 熟练掌握html, css和javascript

  2. 掌握http/https/http2/html5等技术原理

  3. 精通vue.js技术栈

  4. 有3年以上相关项目开发经验

  5. 勤奋好学,有自驱力


【后端研发工程师/技术专家】


待遇: 月薪30k-50k(有期权)
工作年限:3年以上
招聘人数:4人


岗位职责:



  1. 负责多云管理平台的后端开发,为前端提供API服务

  2. 改进和完善后端开发架构和工具链,持续提高开发效率和质量

  3. 开发对接OpenStack/VMWare vCenter/阿里云/AWS/Azure等云平台


任职要求:



  1. 计算机相关专业本科及以上,有两年相关产品研发经验;

  2. 极强的学习能力和动力,对未知技术和领域能快速掌握并实践;

  3. 熟练掌握操作系统原理,Internet网络原理;

  4. 熟练掌握至少一门编程语言,具备根据协议文档开发原型的能力;

  5. 熟练掌握RESTful API规范,并有丰富开发经验;

  6. 熟练掌握多线程编程,IPC编程;

  7. 具备任一以下知识背景者优先考虑:
    a) 对KVM/VMWare ESXi/cgroup/namespace等有深入研究和使用经验;
    b) 有云计算管理平台系统的开发经验,熟悉相关代码,并有部署、使用经验;
    c) 有OpenStack/VMWare vCenter等云平台二次开发经验;
    d) 有阿里云/AWS/Azure等公有云API开发经验;
    e) 有Linux内核内存、IO、网络、cgroup等系统优化和改进经验;

  8. 在开源社群活跃并有积极贡献者优先。


【多云管理平台(CMP)产品专家/总监】


待遇:月薪30k-40k(有期权)
工作年限:5年以上
招聘人数:1人


岗位职责:


1.负责产品团队的搭建



  1. 负责多云管理平台产品的需求分析,功能设计,产品形态定义

  2. 与技术团队紧密配合,高效推进产品的开发迭代

  3. 对产品的功能验证和验收,发现产品存在的缺陷和问题,不断跟踪和验证问题的改善

  4. 产品文档、用户手册,安装部署流程等产品交付流程和交付物的设计

  5. 不断探索产品的创新点


岗位要求:


1.5年以上B端产品经理从业经验,熟悉云计算,devops,运维等技术,且有浓厚兴趣



  1. 有热情、善于沟通,责任心强,有团队合作精神和一定的抗压能力

Traefik 一个反向代理的新工具

文章分享wangxingge 发表了文章 • 0 个评论 • 252 次浏览 • 2018-02-08 14:57 • 来自相关话题

Traefik

由于工作需要最近试用了几个反向路由的开源项目,Traefik就是其中之一。

一,Traefik 是干什么用的

简单来说它就是用来作反向代理和负载均衡的,比较适用于微服务化的场景,支持多种分... 查看全部

Traefik


由于工作需要最近试用了几个反向路由的开源项目,Traefik就是其中之一。


一,Traefik 是干什么用的


简单来说它就是用来作反向代理和负载均衡的,比较适用于微服务化的场景,支持多种分布式的Key-Value存储系统,支持容器技术,下面这个图诠释了它的工作。

image




二,Traefik 的特性


这些特性都是官方自己说的,再加上个人的一点通俗唱法解释。



  • 我很快 --- 经过测试吧,我感觉是速度一般般,但对于新产品来说速度做的还不错。

  • 安装简单 --- 不需要任何依赖,只是一个单独的可执行文件。(安装Traefik真的是简单,这操作给满分。)

  • 镜像很小 --- 有一个很小的官方 Docker Image。(可执行文件43MB,镜像只有45MB,评什么扣分。)

  • RestApi --- 支持Rest-API。(中规中矩。)

  • 配置热更新 --- 无需重启即可应用最新的配置。(其实这里说的配置只是动态的路由配置。)

  • 熔断机制 --- 对于后端服务的保护上支持熔断和重试机制。

  • 负载均衡 --- 负载策略内置两种,Weighted Round-Robin(wrr)和Dynamic Round-Robin(wrr)。

  • 支持Docker --- Docker, Swarm, Kubernetes, Marathon, Mesos。

  • 支持统计 --- Rest, Prometheus, Datadog, Statd。

  • 支持KV --- 支持多种分布式K-V系统,Zookeeper, Consul, Etcd, ECS等。

  • 多种通信协议 --- HTTP/1.1, HTTP/2, Websocket, GRPC等。

  • 支持ACME和HA --- 个人感觉Traefik的HA也就在ACME的场景下才有用。

  • Web-UI --- 有个AngularJS的Web-UI




三,Traefik 的基础组件


就两个组件,就这么简单,支持自己写 middle-ware。



  • Traefik

    Traefik 的主程序,启动时可以指定配置文件,
    ## 启动方式
    ## 默认的文件名是traefik.toml
    ## 寻址文件优先级是1. /etc/traefik, 2. $HOME/.traefik/ -->, 3. working directory.
    traefik --configFile=foo/bar/myconfigfile.toml

  • Dashboard

    一个简单的Dashboard, 可以看当前的路由规则,和转发的结果统计。


四, 配置文件如何使用


Traefik 的配置分为静态配置动态配置两大类。



  1. 动态配置:用来控制路由和负载均衡策略,动态配置不需要重起Traefik就可以生效。

  2. 静态配置:简单的说吧除了动态配置的其他均为静态配置范畴,静态配置需要重启Traefik才能生效。


配置详细说明我就不写了,到官网上找你需要的配置是最明智的(我是明智的官网)。

但是在后面的的练习中会说明部分配置的意义。


注意点



  1. 动态配置可以和静态配置一起在同一个文件里,动态配置写在文件的最后。

  2. 如果想用配置文件来指定路由规则的话,需要将动态配置和静态配置文件分开,如下
    ## 在  "静态配置的最后面"  加入下面信息来指定动态配置文件
    [file]
    watch = true
    filename = "rules.toml"





五,实战


业务需求


  1. 公司有多条产品线,但是每条产品线的负载压力不同,压力由高到低排序为, Mobile--> Web --> PC。

  2. 公司控制成本考虑,要求使用实体服务器,虚拟机或者容器技术来混合部署服务。

  3. 要求可以秒级的动态增加服务和减少服务来应对业务的压力。


画个简单的图来表示

image




基础环境


回顾一下上面的缩略图,发现我们需要下列基本的元素。

我们需要有一个Docker环境,需要有一套分布式K-V系统,K-V系统选择etcd。



  • [x] Real-Machine,用虚拟机来作RealMachine。

  • [x] Docker

  • [x] Etcd-Cluster

  • [x] Traefik

  • [x] Demo-Service

    Question



    1. 手上没有docker和etcd-cluster怎么办?

      Answer: 伸手过来我教你

    2. 不想用etcd,因为公司项目没用这个K-V.

      Answer: 你可以更换到任何一款主流的K-V系统,因为Traefik支持很多种K-V。




DemoService

直接从docker-hub上 pull 已经写好的Image就好了。


docker pull wangxingge/simple-web

Traefik

直接从docker-hub 上 pull下来。


docker pull traefik

货全了,开始搭建配置环境。




Traefik启动与配置文件



  • 创建docker-compose.yml 文件。docker-compose读取yml文件来启动镜像。


#docker-compose.yml

traefik:
image: traefik
command: --logLevel=DEBUG
ports:
- "80"
- "8080"
- "443"
## 端口由docker 自由分配,但是需要指定容器需要多少端口,如果要指定宿主机端口的话就写成
## 80 默认的http端口,443 默认的https端口,8080默认的后台管理页面端口
## ports:
## - "80:80"
## - "8080:8080"
## - "443:443"
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- /opt/traefik/traefik.toml:/traefik.toml
- /opt/traefik/rules.toml:/rules.toml
## 磁盘映射,主要是为了映射配置文件和让traefik读取docker的网络配置
## traefik.toml 是traefik的静态配置文件
## rules.toml 是traefik的动态配置文件,也是路由配置


  • 创建traefik.toml配置文件。

    由于需求是秒级增加服务节点,所以路由配置信息我们不使用 rules.toml的形式提供,而使用分布式K-V来提供。

    在K-V 配置中设置exposebydefault = false 目的是为了不让启动容器时自动添加路由。


#traefik.toml

################################################################
# Common configuration
################################################################
debug=true
logLevel="DEBUG"
[web]
address = ":8080"
ProvidersThrottleDuration = 100000000

################################################################
# Docker configuration backend
################################################################
[docker]
domain = "docker.local"
watch = true
exposedbydefault = false

################################################################
# kv store
################################################################
[etcd]
endpoint = "192.168.196.88:12379"
watch = true
prefix = "traefik"



  • 启动Traefik


    # 使用docker-compose 目的是方便起停批量的镜像
    docker-compose up -d


  • 验证Traefik启动成功,查看docker镜像和后面管理页面是否可用
    [root@centos7 traefik]# docker-compose ps
    Name Command State Ports
    ------------------------------------------------------------------------------------------------------------------------------
    traefik_traefik_1 /traefik --logLevel=DEBUG Up 0.0.0.0:32772->443/tcp, 0.0.0.0:32773->80/tcp, 0.0.0.0:32771->8080/tcp


Traefik后台页面


配置路由信息


前面说明了要使用分布式K-V来进行路由信息的配置,我们选择etcd-cluster。

Traefik的路由配置一共分为2大部分,FrontEnd和 BackEnd。


- Frontend

主要控制访问的路由规则,有三个主要控制方式:Header, Host, Path,都支持指定单个规则和按正则匹配。

匹配方式为某些规则的请求转发到某个Backend上。


- Backend

进行某个Backend匹配某一组服务,控制方式有:轮询控制,断路器控制(熔断),压力控制和健康检查。



  • 实战我们模拟的Frontend和Backend要求为。

  • Frontend: 分别根据Host和Url区分路由。

  • Backend: 三组服务分别是 mobile, web, pc, 轮询方式为wrr,加入健康检查,熔断控制使用最大数量限制。

  • 具体配置如下: 只需要定义frontend,backend不需要定义服务启动时会自动注册Backend.




































































































































Alias Path Value
1 /traefik_configurations/1/frontends/front_web/priority 3
1 /traefik_configurations/1/frontends/front_web/passHostHeader true
1 /traefik_configurations/1/frontends/front_web/backend backend_web
1 /traefik_configurations/1/frontends/front_web/routes/test_1/rule Host:web.eastmoney.com
1 /traefik_configurations/1/frontends/front_mobile/priority 3
1 /traefik_configurations/1/frontends/front_mobile/passHostHeader true
1 /traefik_configurations/1/frontends/front_mobile/backend backend_mobile
1 /traefik_configurations/1/frontends/front_mobile/routes/test_1/rule Host:mobile.eastmoney.com
1 /traefik_configurations/1/frontends/front_pc/priority 3
1 /traefik_configurations/1/frontends/front_pc/passHostHeader true
1 /traefik_configurations/1/frontends/front_pc/backend backend_pc
1 /traefik_configurations/1/frontends/front_pc/routes/test_1/rule Host:pc.eastmoney.com
2 /traefik_configurations/2/frontends/front_web/priority 3
2 /traefik_configurations/2/frontends/front_web/passHostHeader true
2 /traefik_configurations/2/frontends/front_web/backend backend_web
2 /traefik_configurations/2/frontends/front_web/routes/test_1/rule Path:/web_root/web/{subdomain:[a-z]+}
2 /traefik_configurations/2/frontends/front_mobile/priority 3
2 /traefik_configurations/2/frontends/front_mobile/passHostHeader true
2 /traefik_configurations/2/frontends/front_mobile/backend backend_mobile
2 /traefik_configurations/2/frontends/front_mobile/routes/test_1/rule Path:/web_root/web/{subdomain:[a-z]+}
2 /traefik_configurations/2/frontends/front_pc/priority 3
2 /traefik_configurations/2/frontends/front_pc/passHostHeader true
2 /traefik_configurations/2/frontends/front_pc/backend backend_pc
2 /traefik_configurations/2/frontends/front_pc/routes/test_1/rule Path:/web_root/web/{subdomain:[a-z]+}

启动后台服务


根据目前的需要后台服务的运行环境有两种:测试过程我们使用Docker的环境方便一些。






















宿主 启动方式 优缺点
Docker 使用docker-compose 再用labels 指定路由信息 方便动态调整服务数量,不需要修改路由配置。
实体机 直接启动直接读取K-V的路由信息 需要服务启动时到K-V中进行注册之后路由才会生效,一个服务使用一台服务器产生资源浪费。


  • 启动后台服务
    业务说明了有三条主要业务线:mobile, pc, web,为了方便那我们分别为每个业务线创建一个docker-compose要用的配置文件。

    web:
    image: wangxingge/simple-web:latest
    command: /opt/simple-web --kvaddr="http://192.168.196.88:12379" --kv=true --backend="backend_web" -watch="/traefik/alias"
    ports:
    - "80"


mobile:
image: wangxingge/simple-web:latest
command: /opt/simple-web --kvaddr="http://192.168.196.88:12379" --kv=true --backend="backend_mobile" -watch="/traefik/alias"
ports:



  • "80"


pc:
image: wangxingge/simple-web:latest
command: /opt/simple-web --kvaddr="http://192.168.196.88:12379" --kv=true --backend="backend_pc" -watch="/traefik/alias"
ports:



  • "80"

    /opt/simple-web 启动程序


    kvaddr: K-V系统的地址


    kv: 是否使用K-V系统


    backend: 当前程序使用哪些backend, backend_web 表示当前服务为WEB业务提供服务。


    watch: 把traefik.toml中的K-V项的prefix再加上/alias就可以了,目的是为了配合traefik进行动态注册


    根据当前的线上压力情况,我们启动5个Mobile, 3个Web, 2个PC的后台服务。

    docker-compose up -d
    docker-compose scale web=5
    docker-compose scale mobile=3
    docker-compose scale pc=2



    启动和配置成功以后观查一下Traefik的Web页面
    ![image](http://ogmbad78f.bkt.clouddn.c ... _1.png)


测试路由设置是否可用,测试步骤如下



  1. 在使用1号配置的时候按照Host进行路由。

  2. 使用Postman并设置相应的Host值进行请求,并观察返回结果。

  3. 切换至2号配置。

  4. 使用Postman并根据想应的URL进行请求,并观察返回结果。

  5. 动态添加和缩减容器数量,docker-compose scale serviceName=serviceCount

  6. 观察Traefik的后台管理页面,是否已经更新相应的路由。

  7. 使用Postman请求,观查是否后端相应的服务器数量是否已更新。

怎样理解golang的异步?

回复

有问必答ddxx11223 发起了问题 • 1 人关注 • 0 个回复 • 252 次浏览 • 2018-02-06 10:30 • 来自相关话题

从零开始学golang之Bellman

回复

文章分享freedbg 发起了问题 • 1 人关注 • 0 个回复 • 267 次浏览 • 2018-02-05 23:59 • 来自相关话题

【区块链项目招聘】Golang 开发工程师

招聘应聘Gogola 发表了文章 • 0 个评论 • 317 次浏览 • 2018-02-05 16:18 • 来自相关话题

岗位职责:

  1. 负责公司区块链产品的研发;
  2. 负责区块链完全节点的搭建与P2P网络测试;
  3. 负责区块链共识算法研究与实现;
  4. 负责区块链代码的维护升级。

任... 查看全部

岗位职责:



  1. 负责公司区块链产品的研发;

  2. 负责区块链完全节点的搭建与P2P网络测试;

  3. 负责区块链共识算法研究与实现;

  4. 负责区块链代码的维护升级。


任职要求:



  1. 具有2年及以上的软件开发经验并对网络编程有了解和使用经验。

  2. 有阅读开放源码的能力,如HDFS源码,openssl源码,Linux源码等。

  3. 熟悉并熟练使用C/C++,go,熟悉Linux/Unix 操作系统及开发环境。

  4. 熟悉关系数据库原理,分布式存储及相关数据结构和算法优先。

  5. 熟悉Hadoop体系和P2P体系,精通HDFS内部运行原理,P2P网络原理,具有超过20个节点的数据分析优先。

  6. 具有较强的逻辑思维能力,沟通能力及良好的团队合作精神优先。

  7. 了解并愿意从事区块链工作优先。


坐标:西安高新区
福利待遇等私聊,有兴趣的伙伴们请联系我:
QQ:1066941209
企业邮箱:anna@ma.cn (可直接投递简历)

GoCN每日新闻(2018-02-05)

回复

每日新闻kevin 发起了问题 • 1 人关注 • 0 个回复 • 686 次浏览 • 2018-02-05 11:00 • 来自相关话题

GoCN每日新闻(2018-02-04)

回复

每日新闻罗发宣 发起了问题 • 2 人关注 • 0 个回复 • 588 次浏览 • 2018-02-04 10:49 • 来自相关话题