博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Go实践微服务 -- 服务发现
阅读量:6433 次
发布时间:2019-06-23

本文共 4516 字,大约阅读时间需要 15 分钟。

服务的注册发现对于微服务来说是一个非常重要的环节,在单一架构应用中,service之间的互相调用,通过一个固定的host和port来发起REST或者RPC来调用,但是在微服务架构中,各个服务往往是动态变化的,所以需要一个服务发现机制来发送客户端的请求到动态的service实例中去。

在利用go micro来实现服务发现便利很多,micro中默认支持使用 来做服务发现,当然它使用插件机制()还支持 Etcd, Gossip, NATS等其他的第三方服务注册发现工具。在每个服务启动的时候,都将自己注册到registry上,退出时也自动解注册,具体实现我们可以来看一下go-micro/service.go的相关代码片段:

......func (s *service) run(exit chan bool) {    if s.opts.RegisterInterval <= time.Duration(0) {        return    }    //定时注册自己    t := time.NewTicker(s.opts.RegisterInterval)    for {        select {        case <-t.C:            err := s.opts.Server.Register()            if err != nil {                log.Log("service run Server.Register error: ", err)            }        case <-exit:            t.Stop()            return        }    }}......func (s *service) Start() error {    for _, fn := range s.opts.BeforeStart {        if err := fn(); err != nil {            return err        }    }    if err := s.opts.Server.Start(); err != nil {        return err    }    // Run() 调用中也会结果run来调到这里来注册    if err := s.opts.Server.Register(); err != nil {        return err    }    for _, fn := range s.opts.AfterStart {        if err := fn(); err != nil {            return err        }    }    return nil}func (s *service) Stop() error {    var gerr error    for _, fn := range s.opts.BeforeStop {        if err := fn(); err != nil {            gerr = err        }    }   // 退出时自动解除注册    if err := s.opts.Server.Deregister(); err != nil {        return err    }    if err := s.opts.Server.Stop(); err != nil {        return err    }    for _, fn := range s.opts.AfterStop {        if err := fn(); err != nil {            gerr = err        }    }    return gerr}......

关于Consul的相关使用可以参考 ,下面主要来利用一个酒店预订的示例来看下Go Micro如何使用Consul的集群来做服务发现。

示例中会使用到一个 Micro API,它是Micro组件中的一个微服务API网关的实现,API网关模式可以为服务提供一个入口,该HTTP入口动态路由到合适的后端service,利用它进行服务发现,负载平衡,编码和基于RPC的通信。

api

Micro API提供的HTTP API 如下 :

- /[service]/[method]    # HTTP路径动态映射到services- /rpc # 通过名称和方法显示调用后端service

在示例中使用 Micro API 的 RPC Handler,它是go-micro客户端将请求主体转发为RPC请求的默认处理程序的替代方案,具体Micro API的使用和REST映射规则可以查看文档

该酒店预定服务利用了官方 中的booking示例改写, 具体代码 =>

.├── README.md├── api│   └── hotel   # booking service├── data    # data│   ├── bindata.go│   ├── customers.json│   ├── locations.json│   ├── profiles.json│   └── rates.json├── docker-compose.yml # docker compose file└── srv # services    ├── auth    # auth token servce    ├── geo     # geo service    ├── profile # profile service    └── rate    # rate service

docker-compose.yml

version: '3'services:  consul-agent-1: &consul-agent    image: consul:latest    networks:      - consul-cluster    command: "agent -retry-join consul-server-bootstrap -client 0.0.0.0"  consul-agent-2:    <<: *consul-agent  consul-agent-3:    <<: *consul-agent  consul-server-1: &consul-server    <<: *consul-agent    command: "agent -server -retry-join consul-server-bootstrap -client 0.0.0.0"  consul-server-2:    <<: *consul-server  consul-server-bootstrap:    <<: *consul-agent    ports:      - "8400:8400"      - "8500:8500"      - "8600:8600"      - "8600:8600/udp"    command: "agent -server -bootstrap-expect 3 -ui -client 0.0.0.0"  auth:    build: ./srv/auth    networks:      - consul-cluster    command: --registry_address=consul-server-bootstrap:8500    links:      - consul-server-bootstrap  geo:    build: ./srv/geo    networks:      - consul-cluster    command: --registry_address=consul-server-bootstrap:8500    links:      - consul-server-bootstrap  profile:    build: ./srv/profile    networks:      - consul-cluster    command: --registry_address=consul-server-bootstrap:8500    links:      - consul-server-bootstrap  rate:    build: ./srv/rate    networks:      - consul-cluster    command: --registry_address=consul-server-bootstrap:8500    links:      - consul-server-bootstrap  api:    build: ./api/hotel    networks:      - consul-cluster    command: --registry_address=consul-server-bootstrap:8500    links:      - consul-server-bootstrap      - auth      - geo      - profile      - rate  micro:    networks:      - consul-cluster    command: --registry_address=consul-server-bootstrap:8500  api --handler=rpc    image: microhq/micro:latest    links:      - consul-server-bootstrap      - api    ports:      - "8080:8080"networks:  consul-cluster:

consul每个数据中心至少必须拥有一台server,建议在一个集群中有3或者5个server.部署单一的server,在出现失败时会不可避免的造成数据丢失.-bootstrap-expect 选项提示Consul我们期待加入的server节点的数量。每一个服务的--registry_address就是设置注册到的服务发现注册表地址。

docker-compose up 后可以通过consul 的web ui来查看Service的状态。

1531203571067

转载请注明: 转载自

如果觉得本篇文章对您十分有益,何不 一下

谢谢打赏

本文链接地址:

你可能感兴趣的文章
结合i节点和数据块分析linux中软链接和硬链接的区别
查看>>
Heartbeat crm的配置
查看>>
Stream
查看>>
我的友情链接
查看>>
Windows Server 2012_Install_Guide
查看>>
ISA Server搭建站点对站点×××
查看>>
我的友情链接
查看>>
超大规模数据中心:给我一个用整机柜的理由先
查看>>
执行命令取出linux中eth0的IP地址
查看>>
CRUD全栈式编程架构之控制器的设计
查看>>
python常用内建模块(五)
查看>>
你为什么有那么多时间写博客?
查看>>
Excel 中使用VBA
查看>>
$.ajax同步请求会阻塞js进程
查看>>
Postman 网络调试工具
查看>>
Python教程6
查看>>
zabbix实现自动发现功能添加磁盘监控
查看>>
mysql8.0.14 安装
查看>>
1039. 到底买不买(20)
查看>>
android笔试题一
查看>>