服务的注册发现对于微服务来讲是一个很是重要的环节,在单一架构应用中,service之间的互相调用,经过一个固定的host和port来发起REST或者RPC来调用,可是在微服务架构中,各个服务每每是动态变化的,因此须要一个服务发现机制来发送客户端的请求到动态的service实例中去。html
在利用go micro来实现服务发现便利不少,micro中默认支持使用 Consul 来作服务发现,固然它使用插件机制(go-plugins)还支持 Etcd, Gossip, NATS等其余的第三方服务注册发现工具。在每一个服务启动的时候,都将本身注册到registry上,退出时也自动解注册,具体实现咱们能够来看一下go-micro/service.go的相关代码片断:git
...... 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的相关使用能够参考 《Consul 简介和快速入门》,下面主要来利用一个酒店预订的示例来看下Go Micro如何使用Consul的集群来作服务发现。github
示例中会使用到一个 Micro API,它是Micro组件中的一个微服务API网关的实现,API网关模式能够为服务提供一个入口,该HTTP入口动态路由到合适的后端service,利用它进行服务发现,负载平衡,编码和基于RPC的通讯。web
Micro API提供的HTTP API 以下 :docker
- /[service]/[method] # HTTP路径动态映射到services - /rpc # 经过名称和方法显示调用后端service
在示例中使用 Micro API 的 RPC Handler,它是go-micro客户端将请求主体转发为RPC请求的默认处理程序的替代方案,具体Micro API的使用和REST映射规则能够查看文档https://micro.mu/docs/api.htmljson
该酒店预约服务利用了官方 micro/examples中的booking示例改写, 具体代码 => https://github.com/yuansir/go...bootstrap
. ├── 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
就是设置注册到的服务发现注册表地址。api
docker-compose up
后能够经过consul 的web ui来查看Service的状态。架构
转载请注明: 转载自Ryan是菜鸟 | LNMP技术栈笔记
若是以为本篇文章对您十分有益,何不 打赏一下
本文连接地址: Go实践微服务 -- 服务发现