GithubHelp home page GithubHelp logo

questions's People

Contributors

crazybber avatar ioridy avatar kjcx avatar printfcoder avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar

questions's Issues

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

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

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

跨域

micro升级v2后cors的跨域问题如何处理

关于微服务client客户端

问题一:对于同一个微服务我可以共用一个client吗,并发安全吗?
问题二:client内部有实现连接池吗?

服务无法被发现

下载最新版本的go-micro默认启用mdns进行服务发现,但是windows系统并不直接支持,有什么办法能改变这个问题呢

使用micro new --type=api 的模板,没有自带consul包

new出来后,在go mod tidy获取各种包后,查看go.mod文件github.com/micro/go-micro v1.4.0,但是这个github.com/micro/go-micro/registry/包中没有consul包,我改为v1.9.1版本后再执行go mod tidy命令拉取包,提示
深度截图_选择区域_20191101160932
请问如何解决

micro的httpClient只能做Post请求吗?

我有一个需求就是在应用内发起http请求。但是尝试使用了一下plugin httpClient,发现只有post的请求方式 。 请问Micro默认的client没办法支持发起http的访问吗?

无法通过micro --registry=etcd api --handler=web/api访问handlerFunc

向网关发送http请求会得到如下错误,并发现没有调到相应的HandlerFunc:
http: proxy error: dial tcp 10.198.75.60:9999: connectex: A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond.
其中,9999是我web指定端口,10.198.75.60这个不知道是micro api自建子网还是解析错误(ipconfig没有类似的interface),但micro call和直接http访问localhost:9999没问题。

启动网关时尝试指定各种--x_address=127.0.0.1也无效

环境为Windows,无奇怪环境变量,没开代理/防火墙。然而在ubuntu server上,版本完全相同的etcd/golang/go-micro/其它dep就没有该问题。


反复改变网络环境后发现,更常见的问题是:
127.0.0.1 - - [30/Mar/2020:15:08:09 +0800] "POST /rules/get HTTP/1.1" 500 0 "" "PostmanRuntime/7.24.0"
只开了etcd和micro api,在几ms内就返回500,无调试信息。

服务崩溃有什么办法恢复

有时候程序中有一些小bug造成整个服务崩溃有什么办法将服务恢复吗,是每个api 都要recover 吗,还是有更好的方法

有关micro web的问题

micro web 默认情况下访问对应IP的8082端口会有一个管理页面,怎么才能不要这个管理界面,web 应用又能正常使用,因为这个界面暴漏太多东西,没有证书。

examples/proxy failed with: "service name is blank

os: windows 10
go-micro: 1.18.0
go: 1.13

steps:

  1. micro.exe proxy
  2. go run rpc_server.go proxy.go
  3. go run rpc_client.go proxy.go

output:

{"id":"","result":null,"error":"{"id":"go.micro.proxy","code":400,"detail":"service name is blank","status":"Bad Request"}"}
在 micro官方问过这个问题,暂时无回应,也麻烦大大们指点一下

Unknown type srv

如果不是教程文档存在的问题,请到questions项目提问

https://github.com/micro-in-cn/questions

这么做是为了大家能从一个地方检索到所有问题,方便大家找到解决方案,非常感谢大家支持!

安装V2版本的会提示:

“Unknown type srv”

重现步骤:

  1. go get github.com/micro/micro/v2
  2. micro new --namespace=go.micro.lgm --type=srv --alias=user github.com/Demoliang/go-micro/user-srv

代码中已经指定了etcd作为注册最新,为何还需要在运行的时候指明

etcd := etcdv3.NewRegistry(func(options *registry.Options) {
        options.Addrs = "127.0.0.1:2379"
	options.Timeout = 5 * time.Second
})

// create new web service
service := web.NewService(
	web.Name("kh.micro.api.khlog"),
	web.Version("latest"),
	web.RegisterTTL(time.Second*30),
	web.RegisterInterval(time.Second*20),
	web.Registry(etcd),
)

上面代码中,我已经指定了使用etcd作为注册中心,但是当我将程序编译出来并运行的时候:

./main

发现上面这样执行,并没有使用etcd作为注册中心,必须改成下面这样才有效:

./main --registry=etcd --registry_address=127.0.0.1:2379

很疑惑,那我在代码中还有必要设置使用什么作为注册中心吗,求教?

micro --registry=etcd call 报错

Hi.
谢谢你写的的教程。

我跟着你 part1 写了 user。

namespacego.micro.demo

然后运行测试 Service.QueryUserByName
$ micro --registry=etcd call go.micro.demo.srv.user User.QueryUserByName '{"userName":"micro"}'

返回结果
error calling go.micro.demo.srv.user.User.QueryUserByName: {"id":"go.micro.client","code":500,"detail":"connection error: dial tcp [fe80::1]:64053: connect: no route to host","status":"Internal Server Error"}

我 etcd 环境是 Docker 并且在运行的时候与你教程上的结果一致。

但是就是在测试的时候,报这个500的错误。

服务运行output
image

服务测试 output

image

期待你的解答。谢谢

API网关 怎么配置注册中心地址?

API网关对于整个系统来说也应该是一个微服务,也是要注册到注册中心,这样才能发现其他的服务,那API网关怎么配置注册中心的地址啦,文档中只看到了通过环境变量或者启动参数去更改注册中心的类型,没有看到配置地址和端口的示例,请解答

启动client找不到服务

根据官方的例子项目 https://github.com/micro/examples/tree/master/greeter

go run main.go --registry=mdns启动server,日志如下:

2019-11-11 09:30:00.912112 I | Server [grpc] Listening on [::]:53358
2019-11-11 09:30:00.912338 I | Broker [http] Connected to [::]:53359
2019-11-11 09:30:00.913182 I | Registering node: go.micro.srv.greeter-2dc6ce3d-d7b3-4e36-a2a2-1373546b12a9

再启动clientgo run main.go --registry=mdns,出现如下错误

{"id":"go.micro.client","code":500,"detail":"service go.micro.srv.greeter: not found","status":"Internal Server Error"}

怎么解决呢

纯gRPC服务能与micro应用互调吗?

答:不可以均衡互调,只能直连互调,micro是micro,gRPC是gRPC。micro可以直连调用gRPC,与其它语言一致,需要自行配置彼此服务地址。gRPC可以直连调用grpc.Newservice服务。Micro有自己的风格与协议,与gRPC是不同的,Micro通过Client组件均衡调用其它服务(Server)的Transport组件完成rpc请求,gRPC中是没有这两个组件的,也就无法均衡与直接接收请求。
更多示例,请参考:gRPC示例

Go-Micro V1 迁移到 V2 的问题

V2 对比 V1主要的改动有:

  1. 增加Logger
  2. 将Consul移动到Plugins中,并将Etcd替换Consul
  3. HTTP Broker 替换为Embbed Nats
    ...

根据github.com/micro/examples/greeter/api中的项目创建了一个与之相同的api服务,运行curl后报错:{"id":"go.micro.api","code":500,"detail":"service not found","status":"Internal Server Error"}

根据github.com/micro/examples/greeter/api中的项目创建了一个与之相同的api服务,运行curl后报错:{"id":"go.micro.api","code":500,"detail":"service not found","status":"Internal Server Error"}。
运行main.go的启动日志如下:2020-03-24 14:36:27 level=info Starting [service] go.micro.srv.greeter
2020-03-24 14:36:27 level=info Server [grpc] Listening on [::]:14584
2020-03-24 14:36:27 level=info Registry [mdns] Registering node: go.micro.srv.greeter-f8bd85c1-315a-4459-bbf4-e70ae425cfe2。
运行api.go的启动日志如下:2020-03-24 14:37:13 level=info Starting [service] go.micro.api.greeter
2020-03-24 14:37:13 level=info Server [grpc] Listening on [::]:14640
2020-03-24 14:37:13 level=info Registry [mdns] Registering node: go.micro.api.greeter-0421a1d6-f13b-4907-8019-218605f3e2d1。
这两个启动日志与github.com/micro/examples/greeter中的程序的启动日志也不相同,似乎是没有启动transport和broker,不知道是什么原因导致的。

注册中心consul开启了权限控制(ACL),如何注册micro服务

  • 解决办法: 设置环境变量CONSUL_HTTP_TOKEN
    (以下为k8s配置文件的sample)
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: utils-srvtest
  name: utils-srvtest-deployment
  namespace: micro
spec:
  replicas: 2
  revisionHistoryLimit: 3
  selector:
    matchLabels:
      app: utils-srvtest
  template:
    metadata:
      labels:
        app: utils-srvtest
    spec:
      containers:
        - image: xxx/k12-utils-srv
          imagePullPolicy: Always
          name: utils-srvtest
          env:
            - name: CONSUL_HTTP_TOKEN
              value: 7b8560ce-6eed-3aa9-7c9e-488cc36xxxxx
          workingDir: /log/utils-srvtest/
          command: ["/bin/bash"]
          args: ["-c","utils-api --registry=consul --registry_address=consultest:8500 --register_ttl=30 --register_interval=20 1>>/log/utils-srvtest/$(POD_NAME).log 2>&1"]

在srv中如何使用基于nats streaming 的Broker

非常感谢大佬提供的教程,现在准备将go-micro用到自己的新项目,
我用nats streaming 实现CQRS,但感觉方式比较笨。
不知道可不可以像这样优雅的实现

	err = micro.RegisterSubscriber(common.TopicPaymentDone, service.Server(), subscriber.PayOrder)
	if err != nil {
		log.Log(err)
	}

并且可以完成发布和订阅,大佬可否提供一个案例。万分感谢

服务之间超时call timeout: context deadline exceeded","status":"Request Timeout"

服务与服务之间等待时间好像默认为5秒。如果业务繁忙,这时候就会出现请求超时。
{"id":"go.micro.client","code":408,"detail":"call timeout: context deadline exceeded","status":"Request Timeout"}

解决,更改链接等待时间,也就是超时时间
opt := client.CallOption(func(opt *client.CallOptions) {
opt.DialTimeout = time.Second * 15
opt.RequestTimeout = time.Second * 15
})
rspSrv,err := cli.PcAdd(context.TODO(),reqSrv,opt)

关于micro new 和 go mod

教程中用micro new 生成 微服务的基本目录结构,例如:
micro new --namespace=mu.micro.book --type=srv --alias=user github.com/micro-in-cn/tutorials/microservice-in-micro/part1/user-srv

这里的

github.com/micro-in-cn/tutorials/microservice-in-micro/part1/user-srv

实际目录应该是

$GOPATH/src/github.com/micro-in-cn/tutorials/microservice-in-micro/part1/user-srv

我个人不习惯将项目在放在GOPATH下开发,我因为有go mod,我可以将项目放在GOPATH外的任意目录下,但是用micro new方式生成的目录结构貌似只能在GOPATH下,所以我只能去$GOPATH/src/github.com/micro-in-cn/tutorials/microservice-in-micro/part1/user-srv将生成的目录结构再复制出来,请问这里还有别的方法,直接将micro new生成的目录结构到我指定的目录下吗?

使用etcd作为配置中心,取不到配置项

代码如下:

func main() {
	etcdSource := etcdConf.NewSource(
		etcdConf.WithAddress("127.0.0.1:2379"),
		etcdConf.WithPrefix("/micro/app1"),
		etcdConf.StripPrefix(false),
	)
	conf := config.NewConfig()
	err := conf.Load(etcdSource)
	if err != nil {
		fmt.Println(err.Error())
	}

	type cf struct {
		Name	string	`json:"name"`
	}
	var items cf
	er := conf.Get("micro", "app1", "test2").Scan(&items)
	fmt.Println("error", er)
	fmt.Println("test", items.Name)

}

输出结果:

error <nil>
test 

并没有从etcd中取到值。

直接使用etcd客户端是可以取到值的:

gcc@gcc-PC:~/Desktop$ etcdctl put /micro/app1/test2 '{"name":"yeaze"}'
OK
gcc@gcc-PC:~/Desktop$ etcdctl get /micro/app1/test2
/micro/app1/test2
{"name":"yeaze"}

很疑惑,是我哪里写的不对吗?

[We Need You]我们需要一位善于管理问题的Leaders或者Owner

本仓库用于管理和搜集Micro/Go-Micro相关的各类问题以及FAQ,来帮助大家准确和全方位理解Go-Micro。
管理问题,是一项挑战,因为这意味着你要对Micro/Go-Micro有足够的了解或者有足够的了解兴趣,成为Micro China 的一份子,在帮助自己进步的同时,也帮助整个Micro China进步。

愿意接受挑战的小伙伴,请举手(回复到下方),我们会及时联系你,如果你在我们的各种交流群里,可以直接呼叫Micro China的成员。

关于web调用svr的问题。

假设web接口调用svr,而且svr有多个节点。那么这里web调用的哪个节点的svr呢?micro是有默认的选择策略?能否自己对这个选择策略进行定制?

api 网关如何使用consol

如果我的srv服务使用的是consol做服务发现。那么在启动micro网关的时候如何使用consol呢?

例如:
micro --registry=consul api

直接就提示错误了。

现在默认使用mdns做服务发现,consul挪到plugins里面去了。
那如何在启动网关的时候还使用consul作为服务发现呢?

在这个地方看到了类似问题。
micro/micro#405

说是去写插件。例子在go-plugins 里面。
能具体说一下是哪个例子吗?

go-micro 和nats-streaming

和nats没有问题,但跟nats-streaming跑有问题

package main

import (
	"fmt"
	"log"

	"github.com/micro/go-micro/broker"
	"github.com/micro/go-plugins/broker/stan"
	stancf "github.com/nats-io/stan.go"

)

var (
	topic = "go.micro.topic.foo"
)

// Example of a shared subscription which receives a subset of messages
func sharedSub() {
	_, err := broker.Subscribe(topic, func(p broker.Event) error {
		fmt.Println("[sub] received message:", string(p.Message().Body), "header", p.Message().Header)
		return nil
	}, broker.Queue("consumer"))
	if err != nil {
		fmt.Printf("test=%v", err)
	}
}

// Example of a subscription which receives all the messages
func sub() {
	_, err := broker.Subscribe(topic, func(p broker.Event) error {
		fmt.Println("[sub] received message:", string(p.Message().Body), "header", p.Message().Header)
		return nil
	})
	if err != nil {
		fmt.Println(err)
	}
}

func main() {

	opts := stancf.GetDefaultOptions()
	opts.NatsURL = "xxx:XXX@XXXXXX:4222"
	na := stan.NewBroker(stan.ClusterID("test-cluster"), stan.Options(opts))

	if err := na.Init(); err != nil {
		log.Fatalf("Broker Init error: %v", err)
	}

	if err := na.Connect(); err != nil {
		log.Fatalf("Broker Connect error: %v", err)
	}
	sub()
	select {}
}

错误提示:
missing service port
不知道什么原因,请大佬帮忙看看

{"id":"go.micro.client","code":500,"detail":"Bad Request: HTTP status code 400; transport: received the unexpected content-type \"text/plain; charset=utf-8\"","status":"Internal Server Error"}

错误{"id":"go.micro.client","code":500,"detail":"Bad Request: HTTP status code 400; transport: received the unexpected content-type "text/plain; charset=utf-8"","status":"Internal Server Error"}

这或许是每个srv的go-micro版本不一样或者srv与网关micro api的go-micro版本不一样,在go mod中设置为同一版本如:
github.com/micro/go-micro v1.18.1-0.20200106174432-be6e8a7c7827

后端无法接收到前端上传文件Content-Type isn't multipart/form-data

跨域问题,micro api网关编译时加入插件
import (
_ "github.com/micro/go-plugins/registry/consul" //consul
"github.com/micro/micro/plugin"
"github.com/micro/go-plugins/micro/cors" //跨域
)

func init() {
plugin.Register(cors.NewPlugin())
}

micro api网关启动时命令加入
micro --cors-allowed-headers=X-Custom-Header --cors-allowed-origins=* --cors-allowed-methods=POST api
或以下
--cors-allowed-headers="Origin,Content-Type,Accept,Authorization" --cors-allowed-origins="*" --cors-allowed-methods="HEAD,GET,POST,OPTIONS,PUT"

有关web 的问题

micro web 多个相同的web应用存在时,session 是同步的吗还是没有相关的功能,如果不是同步的那么怎么保证用户每次请求都路由到存在对应session的web应用。我们在micro中的这样问题是怎么解决的?

客户端调用服务端出现408错误问题?

请按照以下思路检测:
a) 注册中心是否有未卸载干净的同名幽灵服务

b) 确认两个网络能彼此通信,未禁ping的,使用ping命令即可

c) 服务是否有多个网卡,比如虚拟网卡,go-micro会使用它拿到的第一个网卡的ip地址,此时可能会拿到其它机器无法访问的虚拟网卡的ip,如果有多个,请使用能通信上的ip地址,并使用server_address指令启动,如go run main.go --server_address=192.168.3.5:8080

用protoc新生成的文件不正确。

操作目录:

/Users/mike/Downloads/tutorials-master/examples/basic-practices/micro-api/api

执行的命令

protoc --proto_path=/Users/mike/golang/src/github.com/micro/go-micro/api/ --go_out=. --micro_out=. proto/api.proto

目录结构与教程上面一致。

生成的文件

api.pb.micro.go

api.pb.go

api.pb.micro.go的具体内容:

// Code generated by protoc-gen-micro. DO NOT EDIT.
// source: proto/api.proto

package go_api

import (
	fmt "fmt"
	proto "github.com/golang/protobuf/proto"
	math "math"
)

// Reference imports to suppress errors if they are not otherwise used.
var _ = proto.Marshal
var _ = fmt.Errorf
var _ = math.Inf

// This is a compile-time assertion to ensure that this generated file
// is compatible with the proto package it is being compiled against.
// A compilation error at this line likely means your copy of the
// proto package needs to be updated.
const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package


没有了register***,***handle等的方法

proton等版本3.10.1

"id":"go.micro.client.transport","code":500,"detail":"malformed HTTP response \"\\x00\\x00\\x06\\x04\\x00\\x00\\x00\\x00\\x00\\x00\\x05\\x00\\x00@\\x00\"","status":"Internal Server Error"

"id":"go.micro.client.transport","code":500,"detail":"malformed HTTP response "\x00\x00\x06\x04\x00\x00\x00\x00\x00\x00\x05\x00\x00@\x00"","status":"Internal Server Error"

遇到这样的错误,要确认服务的go-micro和micro api网关的micro版本一致。如都是v1.18.0。
在go.mod文件里可以查看各包版本号,在go.mod里把版本号改为一致

关于etcd注册中心的一点疑问

使用etcd(v3版本)作为注册中心,服务成功注册到etcd,假设这个key的name为test
然后我通过etcdctl 把test这个key直接删除了。

我期望看到的结果是:过会儿etcd中会重新注册一个新的key
实际实践之后的结果:key被删除后并不会生成新的key

疑问:
1、我在代码中写了:

micro.RegisterTTL(time.Second*30)
micro.RegisterInterval(time.Second*20)

理应会间隔20秒重新注册回etcd才对。

2、倘若某个时刻整个etcd集群都挂了(不考虑etcd数据持久化),然后短暂故障后etcd集群重新启动,那之前注册的服务在etcd中也没有了,此时各个微服务仍在运行,这些微服务无法自动再注册回去吗?

关于web,api,srv这三种服务的疑问

你好,我又来提问了。
1、micro new 命令支持新建多种类型的服务,比如 web,api,srv,但是我比较疑惑的是这三类服务根本的区别是什么?或者换句话说,什么东西应该放在web服务里,什么东西要放在api服务里,什么东西又该放在srv服务里?

2、比如目前有服务order-api、order-srv、inventory-srv,现在模拟一个下单的过程,
order-api调用order-srv生成订单,同时要相应的操作库存,减去一定数量的库存,这个时候应该是order-api去调用inventory-srv呢还是应该是由order-srv去调用inventory-srv呢?那种方式比较合理呢?

目前我自己的理解是srv和srv之间应该尽可能不要相互调用,减少依赖,成为独立的个体(服务),而在api和web层内可以任意组合调用srv实现一个完整的功能。不知我这样理解是否正确?

问题“proto/meta/meta.pb.go:10:2: package proto is not in GOROOT”

使用
github.com/micro/go-micro/v2
github.com/micro/protoc-gen-micro/v2

micro new --type=api xxx

在xxx目录下执行 make proto 生成的 xxx.pb.micro.go
`import (
fmt "fmt"
proto "github.com/golang/protobuf/proto"
math "math"
proto1 "proto"
)

import (
context "context"
client "github.com/micro/go-micro/v2/client"
server "github.com/micro/go-micro/v2/server"
)`

再执行 go run main.go, 报错
proto/xxx/xxx.pb.go:10:2: package proto is not in GOROOT

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.