go使用consul实现服务发现及配置共享实现详解

目录
  • 使用consul四大特性
  • 通过docker安装consul
  • 实现代码
  • 运行结果

使用consul四大特性

1. 服务发现:利用服务注册,服务发现功能来实现服务治理。

2. 健康检查:利用consul注册的检查检查函数或脚本来判断服务是否健康,若服务不存在则从注册中心移除该服务,减少故障服务请求。

3. k/v数据存储:存储kv数据,可以作为服务配置中心来使用。

4. 多数据中心:可以建立多个consul集群通过inter网络进行互联,进一步保证数据可用性。

通过docker安装consul

docker pull consul:latest
//运行单机
docker run -d --restart=always --name consul -d -p 8500:8500 consul
/*
8500 http 端口,用于 http 接口和 web ui
8300 server rpc 端口,同一数据中心 consul server 之间通过该端口通信
8301 serf lan 端口,同一数据中心 consul client 通过该端口通信
8302 serf wan 端口,不同数据中心 consul server 通过该端口通信
8600 dns 端口,用于服务发现
-bbostrap-expect 2: 集群至少两台服务器,才能选举集群leader
-ui:运行 web 控制台
-bind: 监听网口,0.0.0.0 表示所有网口,如果不指定默认未127.0.0.1,则无法和容器通信
-client : 限制某些网口可以访问
*/
//集群
docker run --name consul1 -d -p 8500:8500 -p 8300:8300 -p 8301:8301 -p 8302:8302 -p 8600:8600 consul:latest agent -server -bootstrap-expect 2 -ui -bind=0.0.0.0 -client=0.0.0.0
docker run --name consul2 -d -p 8501:8500 consul agent -server -ui -bind=0.0.0.0 -client=0.0.0.0 -join 172.17.0.2
docker run --name consul2 -d -p 8502:8500 consul agent -server -ui -bind=0.0.0.0 -client=0.0.0.0 -join 172.17.0.2

实现代码

以下代码实现一个服务注册,服务发现,配置共享的功能:

package main
import (
    "net"
    "github.com/gin-gonic/gin"
    "fmt"
    "log"
    "net/http"
    consulapi "github.com/hashicorp/consul/api"
)
const (
    consulAddress = "192.168.100.19:8500"
    serviceId     = "111"
)
func main() {
    r := gin.Default()
    // consul健康检查回调函数
    r.GET("/", func(c *gin.Context) {
        c.JSON(200, gin.H{
            "message": "ok",
        })
    })
    go http.ListenAndServe(":8081", r)
    // 注册服务到consul
    ConsulRegister()
    // 从consul中发现服务
    ConsulFindServer()
    ConsulCheckHeath()
    ConsulKVTest()
    // 取消consul注册的服务
    //ConsulDeRegister()
    var str string
    fmt.Scan(&str)
}
// 注册服务到consul
func ConsulRegister() {
    // 创建连接consul服务配置
    config := consulapi.DefaultConfig()
    config.Address = consulAddress
    client, err := consulapi.NewClient(config)
    if err != nil {
        log.Fatal("consul client error : ", err)
    }
    // 创建注册到consul的服务到
    registration := new(consulapi.AgentServiceRegistration)
    registration.ID = serviceId                    // 服务节点的名称
    registration.Name = "go-consul-test"           // 服务名称
    registration.Port = 8081                       // 服务端口
    registration.Tags = []string{"go-consul-test"} // tag,可以为空
    registration.Address = "192.168.3.42"          // 服务 IP 要确保consul可以访问这个ip
    // 增加consul健康检查回调函数
    check := new(consulapi.AgentServiceCheck)
    check.HTTP = fmt.Sprintf("http://%s:%d", registration.Address, registration.Port)
    check.Timeout = "5s"
    check.Interval = "5s"                        // 健康检查间隔
    check.DeregisterCriticalServiceAfter = "30s" // 故障检查失败30s后 consul自动将注册服务删除
    registration.Check = check
    // 注册服务到consul
    err = client.Agent().ServiceRegister(registration)
    if err == nil {
        fmt.Println("ConsulRegister done")
    }
}
// 取消consul注册的服务
func ConsulDeRegister() {
    // 创建连接consul服务配置
    config := consulapi.DefaultConfig()
    config.Address = consulAddress
    client, err := consulapi.NewClient(config)
    if err != nil {
        log.Fatal("consul client error : ", err)
    }
    client.Agent().ServiceDeregister(serviceId)
}
// 从consul中发现服务
func ConsulFindServer() {
    // 创建连接consul服务配置
    config := consulapi.DefaultConfig()
    config.Address = consulAddress
    client, err := consulapi.NewClient(config)
    if err != nil {
        log.Fatal("consul client error : ", err)
    }
    // 获取所有service
    services, _ := client.Agent().Services()
    for _, value := range services {
        fmt.Println("address:", value.Address)
        fmt.Println("port:", value.Port)
    }
    fmt.Println("=================================")
    // 获取指定service
    service, _, err := client.Agent().Service(serviceId, nil)
    if err == nil {
        fmt.Println("address:", service.Address)
        fmt.Println("port:", service.Port)
    }
    if err == nil {
        fmt.Println("ConsulFindServer done")
    }
}
func ConsulCheckHeath() {
    // 创建连接consul服务配置
    config := consulapi.DefaultConfig()
    config.Address = consulAddress
    client, err := consulapi.NewClient(config)
    if err != nil {
        log.Fatal("consul client error : ", err)
    }
    // 健康检查
    a, b, _ := client.Agent().AgentHealthServiceByID(serviceId)
    fmt.Println("val1:", a)
    fmt.Println("val2:", b)
    fmt.Println("ConsulCheckHeath done")
}
func ConsulKVTest() {
    // 创建连接consul服务配置
    config := consulapi.DefaultConfig()
    config.Address = consulAddress
    client, err := consulapi.NewClient(config)
    if err != nil {
        log.Fatal("consul client error : ", err)
    }
    // KV, put值
    values := "test"
    key := "go-consul-test"
    client.KV().Put(&consulapi.KVPair{Key: key, Flags: 0, Value: []byte(values)}, nil)
    // KV get值
    data, _, _ := client.KV().Get(key, nil)
    fmt.Println("data:", string(data.Value))
    // KV list
    datas, _, _ := client.KV().List("go", nil)
    for _, value := range datas {
        fmt.Println("val:", value)
    }
    keys, _, _ := client.KV().Keys("go", "", nil)
    fmt.Println("key:", keys)
    fmt.Println("ConsulKVTest done")
}
func localIP() string {
    addrs, err := net.InterfaceAddrs()
    if err != nil {
        return ""
    }
    for _, address := range addrs {
        if ipnet, ok := address.(*net.IPNet); ok && !ipnet.IP.IsLoopback() {
            if ipnet.IP.To4() != nil {
                return ipnet.IP.String()
            }
        }
    }
    return ""
}

运行结果

以上就是go使用consul实现服务发现及配置共享实现详解的详细内容,更多关于go consul服务发现配置共享的资料请关注我们其它相关文章!

(0)

相关推荐

  • go-micro使用Consul做服务发现的方法和原理解析

    目录 安装Consul 安装Consul插件 服务端使用Consul 服务注册 注册过程 健康检查 客户端使用Consul 调用服务 发现过程 效果展示 go-micro v4默认使用mdns做服务发现.不过也支持采用其它的服务发现中间件,因为多年来一直使用Consul做服务发现,为了方便和其它服务集成,所以还是选择了Consul.这篇文章将介绍go-micro使用Consul做服务发现的方法.关于Consul的使用方式请参考我的另一篇文章:搭建Consul服务发现与服务网格 . 安装Consu

  • go学习笔记读取consul配置文件详解

    目录 新建yaml文件 读取远程配置 新建yaml文件 在上文我们的 go学习笔记:使用 consul 做服务发现和配置共享 这里我们单独来用viper实现读取consul的配置, 我习惯与用yaml格式, 所以 首先 新建yaml文件 store: book: - author: john price: 10 - author: ken price: 12 bicycle: color: red price: 19.95 读取远程配置 可以直接调用viper.AddRemoteProvider

  • 详解golang consul-grpc 服务注册与发现

    在微服务架构里面,每个小服务都是由很多节点组成,节点的添加删除故障希望能对下游透明,因此有必要引入一种服务的自动注册和发现机制,而 consul 提供了完整的解决方案,并且内置了对 GRPC 以及 HTTP 服务的支持 总体架构 服务调用: client 直连 server 调用服务 服务注册: 服务端将服务的信息注册到 consul 里 服务发现: 客户端从 consul 里发现服务信息,主要是服务的地址 健康检查: consul 检查服务器的健康状态 服务注册 服务端将服务信息注册到 con

  • go使用consul实现服务发现及配置共享实现详解

    目录 使用consul四大特性 通过docker安装consul 实现代码 运行结果 使用consul四大特性 1. 服务发现:利用服务注册,服务发现功能来实现服务治理. 2. 健康检查:利用consul注册的检查检查函数或脚本来判断服务是否健康,若服务不存在则从注册中心移除该服务,减少故障服务请求. 3. k/v数据存储:存储kv数据,可以作为服务配置中心来使用. 4. 多数据中心:可以建立多个consul集群通过inter网络进行互联,进一步保证数据可用性. 通过docker安装consul

  • .Net Core服务治理Consul使用服务发现

    先思考一些问题:它是做什么的.以及怎么使用它.带着这些问题往下走. consul是做什么的 consul用于微服务下的服务治理.服务治理是什么?它包含但不限于:服务发现.服务配置.健康检查.键值存储.安全服务通信.多数据中心等. 为什么需要服务治理?举个例子:最开始的服务比较简单,各服务之间通过API就能访问.后面业务复杂了,服务也跟着复杂了,搞分布式了,而分布式又必然是多服务器部署,这就有一个问题:如果服务之间还是用API访问,那某个服务所在的服务器挂掉以后这个服务就不能用了,也不能自动转移,

  • Python 使用 consul 做服务发现示例详解

    前言 前面一章讲了微服务的一些优点和缺点,那如何做到 一.目标 二.使用步骤 1. 安装 consul 我们可以直接使用官方提供的二进制文件来进行安装部署,其官网地址为 https://www.consul.io/downloads 下载后为可执行文件,在我们开发试验过程中,可以直接使用 consul agent -dev 命令来启动一个单节点的 consul 在启动的打印日志中可以看到 agent: Started HTTP server on 127.0.0.1:8500 (tcp), 我们

  • Mysql 5.7.19 免安装版配置方法教程详解(64位)

    官方网站下载mysql-5.7.19-winx64,注意对应系统64位或者32位,这里使用的是64位. 解压放置到本地磁盘.发现文件很大,大概是1.6G左右.删除lib文件夹下的.lib文件和debug文件夹下所有文件. 在主目录下创建my.ini文件,文件内容如下:(这里是简洁版,对应本机修改basedir和datadir的目录,根据需要可以自己扩充配置) [client] port=3306 default-character-set=utf8 [mysqld] basedir=D:\Jav

  • CentOS6.5下Tomcat7 Nginx Redis配置步骤教程详解

    所有配置均在一台机器上完成,部署拓扑信息如下: 注意:由于Redis配置对jar包和tomcat版本比较严格,请务必使用tomcat7和本文中提供的jar包. 下载地址: http://pan.baidu.com/s/1bO67Ky tomcat: tomcat1 localhost:8080 tomcat2 localhost:9080 nginx: localhost:1210 redis: localhost:6379 1. tomcat的安装和配置 1. 在server.xml文件中,修

  • vue项目添加多页面配置的步骤详解

    公司使用 vue-cli 创建的 vue项目 在初始化时并没有做多页面配置,随着需求的不断增加,发现有必要使用多页面配置.看了很多 vue多页面配置 的文章,基本都是在初始化时就配置了多页面.而且如果使用这些实现,需要调整当前项目的目录结构,这点也是不能接受的. 最后,参考这些文章,在不调整当前项目目录结构实现了多页面的配置的添加.这里做下记录.总结,方便以后复用.如果还能有幸帮助到有同样需求的童鞋的话,那就更好了. 实现步骤 1.添加新增入口相关文件; 2.使用变量维护多入口: 3.开发环境读

  • spring security在分布式项目下的配置方法(案例详解)

    分布式项目和传统项目的区别就是,分布式项目有多个服务,每一个服务仅仅只实现一套系统中一个或几个功能,所有的服务组合在一起才能实现系统的完整功能.这会产生一个问题,多个服务之间session不能共享,你在其中一个服务中登录了,登录信息保存在这个服务的session中,别的服务不知道啊,所以你访问别的服务还得在重新登录一次,对用户十分不友好.为了解决这个问题,于是就产生了单点登录: **jwt单点登录:**就是用户在登录服务登录成功后,登录服务会产生向前端响应一个token(令牌),以后用户再访问系

  • Linux上搭载Nginx负载均衡配置使用案例详解

    目录 1,这里我们来说下很重要的负载均衡, 那么什么是负载均衡呢? 2, 负载均衡的种类 3, 这里我们只来说Nginx(其他的大家有兴趣可以自行查阅相关文档) 4, 创建两台Nginx服务器 5, 搭建Nginx 搭建Keepalived:(Keepalived需要依赖openssl) 1,这里我们来说下很重要的负载均衡, 那么什么是负载均衡呢? 由于目前现有网络的各个核心部分随着业务量的提高,访问量和数据流量的快速增长,其处理能力和计算强度也相应地增大,使得单一的服务器设备根本无法承担.在此

  • Java nacos动态配置实现流程详解

    目录 一.前言 二.在nacos上创建配置文件 创建配置文件 配置说明 发布并检查配置文件 三. 修改项目配置与动态读取配置文件 添加 nacos 动态配置依赖 在controller与service中使用动态配置 四. 动态配置网关的使用 一.前言 使用动态配置的原因: properties 和 yaml 是写到项目中的,好多时候有些配置需要修改,每次修改就要重新启动项目,不仅增加了系统的不稳定性,也大大提高了维护成本,非常麻烦,且耗费时间. 使用动态配置,则可以避免这些麻烦,可以动态的修改配

随机推荐