请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

consule的server和client的问题

问题一:不需要启动client

老师启动了三个consule服务节点分别是

docker run --name consul1 -d -p 8500:8500 -p 8300:8300 -p 8301:8301 -p 8302:8302 -p 8600:8600 consul 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 consul3 -d -p 8502:8500 consul agent -server -ui -bind=0.0.0.0 -client=0.0.0.0 -join 172.17.0.2

这三个节点都是server,不需要启动client吗

问题二

consule运行的机器,是否最好只运行consule,为了保证consule的稳定吗?

问题三

这句话没太理解

-client 指定consul绑定在哪个client地址上,这个地址可提供HTTP、DNS、RPC等服务,默认是127.0.0.1

“指定consul绑定在哪个client地址上”,什么是client地址,是本机?网卡?,还是其他运行了consule的机器

问题四

运行go程序,使用的是

go run xxx.go --registry=consule

那里可以查到参数的文档说明

–registry=consule

中,consule是固定的吗。
这样的服务注册消息是如何发出的

{
  "ID": "userServiceId", //服务id
  "Name": "userService", //服务名
  "Tags": [              //服务的tag,自定义,可以根据这个tag来区分同一个服务名的服务
    "primary",
    "v1"
  ],
  "Address": "127.0.0.1",//服务注册到consul的IP,服务发现,发现的就是这个IP
  "Port": 8000,          //服务注册consul的PORT,发现的就是这个PORT
  "EnableTagOverride": false,
  "Check": {             //健康检查部分
    "DeregisterCriticalServiceAfter": "90m",
    "HTTP": "http://www.baidu.com", //指定健康检查的URL,调用后只要返回20X,consul都认为是健康的
    "Interval": "10s"   //健康检查间隔时间,每隔10s,调用一次上面的URL
  }
}

怎么指定里面字段的值呢

问题五

我在两台机器上,部署了相同的用户注册的接口,用户注册接口分别注册到了两个consule上,就会有两个consule的ip地址。
那这样的话,对外的单点是谁呢?是否要引入新的负载均衡软件。
还是说一种业务服务(比如用户注册),只注册到统同一个consule上?
其他的业务继续细分拆解部署到不同的机器上,就会出现很多的ip。
比如

用户注册业务 在 consule为127.x.x.1 和 consule为127.x.x.2的机器上
文件上传业务 在 consule为127.x.x.2 和 consule为127.x.x.3 的机器上
文件下载业务 在 consule为127.x.x.3 和 consule为127.x.x.4 的机器上

这样前端开发和后端管理岂不是要疯了。


我的开发方向在 pc客户端,web前端,后端java,php,node,go等语言,开发方式比较传统。为了给自己充电,购买了您的课程,微服务也是初次尝试,思维有所局限,还望老师指点迷津??。

正在回答

1回答

1. consul集群可以不用启动client.client节点主要的作用是将外部所有的rpc请求转发到server节点,
另外也做一些分摊server节点压力的工作,比如定期对已注册的server做健康检测, 或者合并相同请求后再转发到server节点等.
2. 机器资源充裕的话当然最好是最好独立部署consul集群了,保证consul有充足的资源正常提供服务.而consul部署在docker容器中的话,很多时候就避免不了相同的机器节点也会部署其他的服务.一般来说这样也不会有太大影响,毕竟consul是一个集群,超过半数节点能正常工作的话,集群也就能正常提供服务.
3. -client可以理解为对外开放的一个地址,我们外部服务要注册到上面时会用到的一个地址.比如你consul所在的机器除了127.0.0.1,还有个内网地址192.168.1.100;如果-client=127.0.0.1的话,那么外部就没办法通过192.168.1.100来访问consul.所以一般我们会设置为-client=0.0.0.0, 这样无论是通过127.0.0.1还是192.168.1.100都能够访问consul了.
4. --registry这个参数是go-micro框架提供的配置参数, --registry可以是etcd, mdns, consul, kubernetes等等,这些值是固定(预置)好的.可以参考下这里:https://github.com/micro/go-micro/tree/master/registry 以及 https://github.com/micro/go-plugins/tree/master/registry (具体详细的文档我也没找到);服务注册的逻辑都是在这里面实现的.
5. consul本身是一个集群,通过不同ip来进行服务注册之后,其实注册的数据都是在集群内部共享的.所以不存在你说的这个问题,简单来说,用户注册/上传/下载这些服务,只需要随机或者固定往consul集群的其中一个ip注册即可,不需要根据业务进行啥ip区分.consul集群只有一个,简单点,所有业务只用同一个consul ip来注册也行.

0 回复 有任何疑惑可以回复我~
  • 提问者 成龙哥哥 #1
    多谢老师解答
    回复 有任何疑惑可以回复我~ 2019-05-28 09:39:27
  • 提问者 成龙哥哥 #2
    还有一点不太明白,集群总会涉及到单点问题,架设nginx,nginx就会变成新的单点。那么consul集群,也会有这个问题。对外提供ip的仅有一台机器,那么这台机器宕机,即便集群再稳定,对外也是不可访问状态吧。
    回复 有任何疑惑可以回复我~ 2019-05-28 09:43:37
  • xiaomo 回复 提问者 成龙哥哥 #3
    可以了解下公有云的NAT网关呢.另外一般来说,一个域名可以解析到多台机器,每个机器上可以装nginx.
    回复 有任何疑惑可以回复我~ 2019-05-29 14:37:40
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信