stack-labs / questions Goto Github PK
View Code? Open in Web Editor NEW任何关于Micro的问题都可以在Issue中创建
任何关于Micro的问题都可以在Issue中创建
我看了多次micro的官方文档但是部署的问题还是未能找到解决答案
micro升级v2后cors的跨域问题如何处理
问题一:对于同一个微服务我可以共用一个client吗,并发安全吗?
问题二:client内部有实现连接池吗?
下载最新版本的go-micro默认启用mdns进行服务发现,但是windows系统并不直接支持,有什么办法能改变这个问题呢
我有一个需求就是在应用内发起http请求。但是尝试使用了一下plugin httpClient,发现只有post的请求方式 。 请问Micro默认的client没办法支持发起http的访问吗?
向网关发送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 吗,还是有更好的方法
我想问的怎么实现网关的功能 包括里面的逻辑处理 官网只给了一个网关的例子 看得不是特别明白
web.NewService 和 micro.NewService有啥区别
micro web 默认情况下访问对应IP的8082端口会有一个管理页面,怎么才能不要这个管理界面,web 应用又能正常使用,因为这个界面暴漏太多东西,没有证书。
os: windows 10
go-micro: 1.18.0
go: 1.13
steps:
- micro.exe proxy
- go run rpc_server.go proxy.go
- 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官方问过这个问题,暂时无回应,也麻烦大大们指点一下
如果不是教程文档存在的问题,请到questions项目提问
https://github.com/micro-in-cn/questions
这么做是为了大家能从一个地方检索到所有问题,方便大家找到解决方案,非常感谢大家支持!
安装V2版本的会提示:
“Unknown type srv”
重现步骤:
不会。Micro不会默认选择,这是因为版本号是自定义的,没有可比较的默认方案。不过Go-micro支持客户端自行选择需要服务端,可以通过client.WithSelectOption自定义,参考:version-filter。
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
很疑惑,那我在代码中还有必要设置使用什么作为注册中心吗,求教?
Hi.
谢谢你写的的教程。
我跟着你 part1 写了 user。
我 namespace
是 go.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
期待你的解答。谢谢
API网关对于整个系统来说也应该是一个微服务,也是要注册到注册中心,这样才能发现其他的服务,那API网关怎么配置注册中心的地址啦,文档中只看到了通过环境变量或者启动参数去更改注册中心的类型,没有看到配置地址和端口的示例,请解答
举个例子:A服务用php实现,b服务使用python实现。
然后,现在把他们接入micor中,原来它们的所有请求,现在不直接处理,而是通过micro 转发给A,B。
根据官方的例子项目 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"}
怎么解决呢
答:不可以均衡互调,只能直连互调,micro是micro,gRPC是gRPC。micro可以直连调用gRPC,与其它语言一致,需要自行配置彼此服务地址。gRPC可以直连调用grpc.Newservice
服务。Micro有自己的风格与协议,与gRPC是不同的,Micro通过Client组件均衡调用其它服务(Server)的Transport组件完成rpc请求,gRPC中是没有这两个组件的,也就无法均衡与直接接收请求。
更多示例,请参考:gRPC示例
V2 对比 V1主要的改动有:
根据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,不知道是什么原因导致的。
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"]
非常感谢大佬提供的教程,现在准备将go-micro用到自己的新项目,
我用nats streaming 实现CQRS,但感觉方式比较笨。
不知道可不可以像这样优雅的实现
err = micro.RegisterSubscriber(common.TopicPaymentDone, service.Server(), subscriber.PayOrder)
if err != nil {
log.Log(err)
}
并且可以完成发布和订阅,大佬可否提供一个案例。万分感谢
服务与服务之间等待时间好像默认为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)
如题所示,例如我使用 https://github.com/micro/go-plugins/blob/master/broker/kafka/kafka.go 插件,然后我该怎么配置手动ack,调用ack和Unsubscribe等函数呢?
我找了下官网英文文档,和micro-in-cn里的找不到相关的demo。
thx。
教程中用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生成的目录结构到我指定的目录下吗?
代码如下:
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"}
很疑惑,是我哪里写的不对吗?
本仓库用于管理和搜集Micro/Go-Micro相关的各类问题以及FAQ,来帮助大家准确和全方位理解Go-Micro。
管理问题,是一项挑战,因为这意味着你要对Micro/Go-Micro有足够的了解或者有足够的了解兴趣,成为Micro China 的一份子,在帮助自己进步的同时,也帮助整个Micro China进步。
愿意接受挑战的小伙伴,请举手(回复到下方),我们会及时联系你,如果你在我们的各种交流群里,可以直接呼叫Micro China的成员。
使用micro api网关--handler=api,在micro new -type=api test/test-api之后产生的文件,并且main中注册consul。handler/test中call方法打印req.body没有任何东西.浏览器执行http://127.0.0.1:8080/test/call?name=zty
使用https://github.com/micro-in-cn/tutorials/tree/master/examples/basic-practices/micro-registry/etcdv3
etcd
go build -o mainWithEtcdv3 main.go plugins.go 报错如下
router/router.go:52:4: cannot use int(event.Route.Metric) (type int) as type int64 in field value
假设web接口调用svr,而且svr有多个节点。那么这里web调用的哪个节点的svr呢?micro是有默认的选择策略?能否自己对这个选择策略进行定制?
如果我的srv服务使用的是consol做服务发现。那么在启动micro网关的时候如何使用consol呢?
例如:
micro --registry=consul api
直接就提示错误了。
现在默认使用mdns做服务发现,consul挪到plugins里面去了。
那如何在启动网关的时候还使用consul作为服务发现呢?
在这个地方看到了类似问题。
micro/micro#405
说是去写插件。例子在go-plugins 里面。
能具体说一下是哪个例子吗?
和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
不知道什么原因,请大佬帮忙看看
自己写了一个serveHttp的中间件插件(输出了post field),重写了access log. 想关闭原有的默认输出.
也可以自己直接写入到header透传下去,但是感觉通过context更优雅. 如果没有这个机制,建议加上
错误{"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
跨域问题,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"
micro web 多个相同的web应用存在时,session 是同步的吗还是没有相关的功能,如果不是同步的那么怎么保证用户每次请求都路由到存在对应session的web应用。我们在micro中的这样问题是怎么解决的?
可以使用-server_address=ip:port
选项启动服务,如:go run main.go -server_address=127.0.0.1:8876
,这样就可以指定服务的IP地址。
请按照以下思路检测:
a) 注册中心是否有未卸载干净的同名幽灵服务
b) 确认两个网络能彼此通信,未禁ping的,使用ping命令即可
c) 服务是否有多个网卡,比如虚拟网卡,go-micro会使用它拿到的第一个网卡的ip地址,此时可能会拿到其它机器无法访问的虚拟网卡的ip,如果有多个,请使用能通信上的ip地址,并使用server_address指令启动,如go run main.go --server_address=192.168.3.5:8080
操作目录:
/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"
遇到这样的错误,要确认服务的go-micro和micro api网关的micro版本一致。如都是v1.18.0。
在go.mod文件里可以查看各包版本号,在go.mod里把版本号改为一致
使用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中也没有了,此时各个微服务仍在运行,这些微服务无法自动再注册回去吗?
你好,我又来提问了。
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实现一个完整的功能。不知我这样理解是否正确?
虽然 Building a global services network using Go, QUIC and Micro中有讲,但是在看源码时,仍然感觉云山雾罩,烦请大大们指导一下
使用
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
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.