stack-labs / questions

任何关于Micro的问题都可以在Issue中创建
27 stars 6 forks source link

有关微服务的部署的几个问题 #17

Closed bluedragonflyliu closed 4 years ago

bluedragonflyliu commented 5 years ago

我看了多次micro的官方文档但是部署的问题还是未能找到解决答案

  1. 微服务能在不同的机器上协作运行吗? 2.如果能协作运行,API Gateway 的机器必须要和consul 注册发现放在一个机器上吗? 3.每个机器上都要有一个 micro API Gateway吗?如果不需要怎么配置?
  2. 部署必须要用docker吗?
printfcoder commented 5 years ago

Hi.

  1. 微服务可以在不同机器上运行,取决于发布环境,一般使用consul当注册中心即可,默认的mdns要看网络是否支持
  2. api gateway本质也是go-micro应用,不需要与注册中心在一台服务上,只需告诉gateway注册中心的位置
  3. micro api 是~micro api --handler=api~ micro api --handler=rpc的别名服务,意思是它可以把内部rpc服务暴露给外界,使其支持外界通过http方式请求,如果rpc服务都是同一个api的命名空间下,那就使用一台即可,如果要均衡,再加一层Nginx均衡网关,可参考L4-L7分布式服务架构部署,具体几层取决于体量,适当弹性部署,选择时间、人力、财力成本最均衡的即可
  4. 可以不要docker,docker只是适合编排,大型应用集群才用,体量不大就使用go build打的包加上nohub等类似的进程托管工具即可。
bluedragonflyliu commented 5 years ago

非常感谢你的回复 我在与api gateway 相同的机器上启动 ./user-srv --registry=consul --registry_address=192.168.1.34(consul 也在这个机器上) http://192.168.1.34:8080/user/User/Call {"name":"aaa"}正确返回 但是复制到例外一个机器上./user-srv --registry=consul --registry_address=192.168.1.34 却报错{"id":"go.micro.client","code":500,"detail":"connection error: dial tcp 192.168.1.33:36464: connect: no route to host","status":"Internal Server Error"} 在33上 netstat查看 这个服务是有的consul 上也有 我是否缺什么参数 另外我发现micro api 运行时 必须是MICRO_REGISTRY=consul MICRO_REGISTRY_ADDRESS=192.168.1.34 形式不可以用--registry 的形式我试了很多次之后才弄清楚注册到consul

printfcoder commented 5 years ago

micro api 使用consul这里面有两层应用

这也是我在教程里为什么要用consul的原因,如果不用就是默认的mdns,大家入门时就不会注意到可以使用--registry来指定注册机制。

网关与具体服务是不需要在一台的,针对您说的情况,麻烦使用以下步骤重试:

  1. 关掉所有micro服务,确保consul服务列表是空的
  2. 启动micro --registry=consul --registry_address=ip:port api
  3. 在另一台机器上启动服务./srv --registry=consul --registry_address=ip:port
  4. 任意机器上curl http://gatewayIP:8080/srv-path?params
bluedragonflyliu commented 5 years ago

好像是防火墙引起的 还是有个问题我创建时用的是micro new micro_test/user --type=srv 运行api网关 --handler=rpc 可以得到正常结果,而用 --handler=api 就不可以获得参数正常返回, 是不是 srv 用--handler=rpc 而 api用--handler=api 才能正常,(GET 方式http://192.168.1.34:8080/user/User/Call?name=sansu POST 方式 http://192.168.1.34:8080/user/User/Call { "name": "John" }} Curl rpc curl -H 'Content-Type: application/json' -d '{"service": "com.aa.srv.user", "method": "User.Call", "request": {"name": "John"}}' http://192.168.1.34:8080/rpc {"id":"go.micro.api","code":500,"detail":"service not found","status":"Internal Server Error"}

实际使用时是不是 要用时 api 网关用 handler=api 的方式,然后user-api 程序调用user-srv

printfcoder commented 5 years ago

是的, --handler=rpc 负责暴露srv的接口,目前是默认的 --handler=api 负责暴露api类型的 --handler=web|proxy|http 负责暴露web类型的

有时候一直不通可能是网络代理或防火墙问题,不少朋友有这个现象

bluedragonflyliu commented 5 years ago

非常感谢你的耐心解答