Go zk(zookeeper)服务发现

2019-02-26 14:58:42

简介

zk同etcd一样,存储数据格式均采用key-value类型,而我们在进行微服务开发时,这两者大部分的应用场景都是应用在服务发现以及服务配置上。

流程

基于zk的服务注册与发现大致流程如下:
zk_found
如:A、B两个服务均在内网环境,A需要向B发起接口调用,A需要从本地的缓存中获取出B对应的调用ip:port信息,然后向B发起调用。A中的缓存是A服务在启动时就开启了一个协成或线程用于从zk中拉取或监听服务数据,而zk的服务数据是通过B在启动时开启了一个TCP长连接向zk进行的服务注册。

实现

整个流程相对简单,以下为服务发现的监听测源码,该源码依赖

package main

import (
	"fmt"
	"time"

	"github.com/samuel/go-zookeeper/zk"
)

var (
	path = "/entry/test"
)

func main() {
	c, _, err := zk.Connect([]string{"172.16.1.49:8080"}, 1*time.Second)
	if err != nil {
		panic(err)
	}
	defer c.Close()

	for {
		_, _, event, err := c.ChildrenW(path)
		if err != nil {
			panic(err)
		}
		evt := <-event
		if evt.Err != nil {
			panic(evt.Err)
		}

		// 从新获取一遍目录下的节点
		children, _, err := c.Children(path)
		if err != nil {
			panic(err)
		}
		fmt.Println(children)
		// TODO
		// 针对一些拉取到的配置进行本地缓存等操作
		// bts, _, err = c.Get(path)
	}
}

其中,event的类型

type Event struct {
	Type   EventType
	State  State
	Path   string // For non-session events, the path of the watched node.
	Err    error
	Server string // For connection events
}
...
var (
	eventNames = map[EventType]string{
		EventNodeCreated:         "EventNodeCreated",
		EventNodeDeleted:         "EventNodeDeleted",
		EventNodeDataChanged:     "EventNodeDataChanged",
		EventNodeChildrenChanged: "EventNodeChildrenChanged",
		EventSession:             "EventSession",
		EventNotWatching:         "EventNotWatching",
	}
)

服务注册比较简单,同样使用上面的zk库,往指定路径调用Create方法,放进需要存放的数据即可,如有必要后续再更新注册代码吧

Docker之镜像创建及部署

上篇文章提到了一些简单的docker命令,这里主要展示一下我们如何将我们需要的服务利用docker一步一步把它跑起来,文章内容不够全面,仅供学习参考使用。 穿梭门:Docker之常用命令 尝鲜 我们可以从最简单的Hello World开始,感受一下Docker的运行效果,直接在命令行执行下面的命令,就能从官方仓库中拉取指定名字的镜像。如果拉取的是自己或其他渠道提供的镜像,pull后面带指定路径即可。 docker pull hello-world 拉取成功后执行docker images可以看到拉下来的镜像列表,然后我们直接跑起来 docker run hello-world 输出这段提示后,hello world就会停止运行,容器自动终止。有些容器不会自动终止,因为提供的是服务,比如我们常部署的服务等。 注: docker run命令具有自动抓取image文件的功能,如果发现本地没有指定的image,就会从仓库中自动抓取,也就是前面的docker pull并不是必须的。 正餐 上面的hello-world明显不能满足我们的欲望,我们的实际需求是将我们自己原本跑在VM或物理机上的服务能部署在Docker上面,那我们现在就开始吧。 Dockerfile 要达到我们的目的,不能离开的就是这个Dockerfile文件,Docker是根据该文件来生成二进制的image文件。我们直接使用一个实际的样例来进行讲解,新建一个文件并命名Dockerfile FROM centos RUN

罗辑思维-经典语录

简介 自己也算是罗胖的老粉丝了,业余时长听“得到”APP里面一些语音,觉得一些观点或例子比较不错,能让人产生一些启发,自己记性差,记录下来,也算日后的回味。 罗胖精选 | 政治家为什么要干预经济? 传送:政治家为什么要干预经济? 市场是一只“看不见的手”。而政府就好比是一只“闲不住的手”。打个比方,一个公司设置一个部门,本来就是为了解决问题,但只要这个部门一设置出来,这些职位上的人,就要“无中生有”地做很多事情。这个,你应该容易理解。其实,政府的逻辑,也差不多。 跟政府干预有关的决策,很可能不是经济逻辑决定的,而是政治逻辑决定的。 第684期 | 迷信有什么用? 任何一件在人类社会长期存在的事情,如果我们只看到了它的不合理性,那就意味着,也许我们的思考角度不对,没有看到它合理的地方。所以迷信为什么会长期存在,很奇怪。 迷信,还是一种策略,是人应对复杂状况的一种特殊手段和策略。 认知复杂性是一个不能纵容的坏东西。对付它的办法有两个:第一,升级认知,