赞
踩
趁着最近休息写一篇关于微服务
架构中特别重要一环服务注册与发现
示例来互相探讨学习。
商店
,这个商店
可以提供你基本日常所需。你可以在里面买牙膏、零食、饮料、袜子、充电器等。微服务
就类似于一个商场
,这个商场会有统一的入口,会有保安,导购台。商场
里面会按照不同的商品类型开不同的“店”,例如卖“牙膏”、“牙刷”的一个店,卖“袜子”、“拖鞋”的一个店,卖“手机”、“充电器”的一个店。假设你想买一部手机,进入商场时你问了下门口的保安“哪个店可以买手机”,这时保安会说“出示一下健康码”(ApiGateway鉴权),绿码通过后,保安问了下身后的导购员 (服务发现),得到答案时保安就会告诉你哪一层哪个店卖手机。然后你就可以按照他的指引进去购买了。华为手机
大卖,商场一个手机店不能承载用户消费了,可以在商场中再开一个手机店 (横向扩展)服务注册与发现就类似于上面
微服务
例子中的导购员
角色。她可以告诉访问者
指定服务
在微服务
系统中的哪个位置。
举个栗子:
最近放假,商场的咖啡店生意不错。于是我就拉着小明去商场开了两个咖啡店准备赚一笔。为什么开同时开两个呢,生意太好,如果小明那边客户比较多的话,就可以让部分客户到我这边来买 (负载均衡) 。还有如果哪天晚上我打游戏打晚了,早上起不来,小明就正常营业。或者是小明有事呢,我就正常营业 (熔断) 。
说干就干,两个咖啡店已经被我们如火如荼的置办起来了 (完成服务开发),我们给它起了个名字叫“三泡咖啡” (服务名称),小明的店在商场入口旁边门牌号是302,我的店在商场后面门牌号是609 (服务ID)。
开业以后呢,每天早上,我和小明都会分别到导购台那边和导购小姐姐说“今天我们店正常营业”(不是撩小姐姐),这时导购小姐姐就会在小本本上记上我们的店和门牌号 (服务注册),之后进入商场的客人如果想买“三泡咖啡”,小姐姐就会按照她登记的信息告诉客人 (服务发现) 咖啡店在哪一层哪一号。
导购小姐姐呢也会定时来看我们店有没有存在突发情况,影不影响正常营业 (健康检查)。例如我这家店的收银系统今天出现问题了,导致无法正常营业了,那么导购小姐姐就会拿出小本本备注一下,下次再有客人想喝“三泡咖啡”,导购小姐姐就会将客人指向小明那家店了。
本来我是想和小明分别购置一个自动咖啡机来为用户提供咖啡的,可是预算不足只能买一个。但没办法,我是老板,所以就给小明买了一个手磨咖啡机来做咖啡。不是说自动咖啡机一定比手磨咖啡机做的好,也不能说手磨咖啡机一定比自动咖啡机做出来的香。它们做出来的味道一样,只是结合了实际情况来定的。你说对吗? phper。
服务协调器就类似于上面例子中的导购员
,常用的服务协调器有:Consul
、Eureka
、Zookeeper
、Etcd
等。这个例子中我们就选用Consul
来实现我们的服务注册与发现。
consul
是google
开源的一个使用go语言
开发的服务发现、配置管理中心服务。内置了服务注册与发现框 架、分布一致性协议实现、健康检查、Key/Value存储、多数据中心方案,不再需要依赖其他工具(比如ZooKeeper等)。服务部署简单,只有一个可运行的二进制的包。每个节点都需要运行agent
,他有两种运行模式server
和client
。每个数据中心官方建议需要3或5个server
节点以保证数据安全,同时保证server-leader
的选举能够正确的进行。
安装部署方式就请参考官方文档或百度一下吧。
我这里是使用Docker部署的三个Consul实例
使用Golang创建一个
coffee-service
服务,ID为coffee-service1
打开IDE在src目录下创建一个文件夹coffee
,并添加coffeeServer.go
文件,输入如下代码
package main import ( "fmt" "github.com/hashicorp/consul/api" "net/http" ) func main() { consulConfig := api.DefaultConfig() consulConfig.Address = "consul.insipid.top" // consul 地址 consulClient, err := api.NewClient(consulConfig) if err != nil { fmt.Println("new consul client err:", err) return } // 服务注册配置 registerService := api.AgentServiceRegistration{ ID: "coffee-service1", // id唯一 Name: "coffee-service", // 服务名称,相同服务多实例注册下名称相同 Tags: []string{ "demo"}, // tag Port: 8082, // 当前服务端口 Address: "39.99.248.231", Check: &api.AgentServiceCheck{ // 健康检查相关配置 HTTP: "http://39.99.248.231:8082/health", // 健康检查接口,response code = 200表示检查通过 Timeout: "5s", // 超时时间 Interval: "5s", // 检查间隔 DeregisterCriticalServiceAfter: "10s", // 检查失败后指定时间自动踢出无效服务
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。