feat: add grpc
This commit is contained in:
@@ -163,45 +163,6 @@ func Parse(source string) []Provider {
|
|||||||
provider.ReturnType = "*" + provider.StructName
|
provider.ReturnType = "*" + provider.StructName
|
||||||
}
|
}
|
||||||
|
|
||||||
if providerDoc.Mode == "event" {
|
|
||||||
provider.Mode = "event"
|
|
||||||
|
|
||||||
modePkg := gomod.GetModuleName() + "/providers/events"
|
|
||||||
|
|
||||||
provider.Imports["git.ipao.vip/rogeecn/atom/contracts"] = ""
|
|
||||||
provider.Imports[modePkg] = ""
|
|
||||||
|
|
||||||
provider.ProviderGroup = "atom.GroupInitial"
|
|
||||||
provider.ReturnType = "contracts.Initial"
|
|
||||||
|
|
||||||
provider.InjectParams["__event"] = InjectParam{
|
|
||||||
Star: "*",
|
|
||||||
Type: "PubSub",
|
|
||||||
Package: modePkg,
|
|
||||||
PackageAlias: "events",
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if providerDoc.Mode == "job" {
|
|
||||||
provider.Mode = "job"
|
|
||||||
|
|
||||||
modePkg := gomod.GetModuleName() + "/providers/job"
|
|
||||||
|
|
||||||
provider.Imports["git.ipao.vip/rogeecn/atom/contracts"] = ""
|
|
||||||
provider.Imports["github.com/riverqueue/river"] = ""
|
|
||||||
provider.Imports[modePkg] = ""
|
|
||||||
|
|
||||||
provider.ProviderGroup = "atom.GroupInitial"
|
|
||||||
provider.ReturnType = "contracts.Initial"
|
|
||||||
|
|
||||||
provider.InjectParams["__job"] = InjectParam{
|
|
||||||
Star: "*",
|
|
||||||
Type: "Job",
|
|
||||||
Package: modePkg,
|
|
||||||
PackageAlias: "job",
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
for _, field := range structType.Fields.List {
|
for _, field := range structType.Fields.List {
|
||||||
if field.Names == nil {
|
if field.Names == nil {
|
||||||
continue
|
continue
|
||||||
@@ -289,6 +250,64 @@ func Parse(source string) []Provider {
|
|||||||
provider.PkgName = node.Name.Name
|
provider.PkgName = node.Name.Name
|
||||||
provider.ProviderFile = filepath.Join(filepath.Dir(source), "provider.gen.go")
|
provider.ProviderFile = filepath.Join(filepath.Dir(source), "provider.gen.go")
|
||||||
|
|
||||||
|
if providerDoc.Mode == "grpc" {
|
||||||
|
provider.Mode = "grpc"
|
||||||
|
|
||||||
|
modePkg := gomod.GetModuleName() + "/providers/grpc"
|
||||||
|
|
||||||
|
provider.Imports["git.ipao.vip/rogeecn/atom/contracts"] = ""
|
||||||
|
provider.Imports[modePkg] = ""
|
||||||
|
|
||||||
|
provider.ProviderGroup = "atom.GroupInitial"
|
||||||
|
provider.ReturnType = "contracts.Initial"
|
||||||
|
|
||||||
|
provider.InjectParams["__grpc"] = InjectParam{
|
||||||
|
Star: "*",
|
||||||
|
Type: "Grpc",
|
||||||
|
Package: modePkg,
|
||||||
|
PackageAlias: "grpc",
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if providerDoc.Mode == "event" {
|
||||||
|
provider.Mode = "event"
|
||||||
|
|
||||||
|
modePkg := gomod.GetModuleName() + "/providers/events"
|
||||||
|
|
||||||
|
provider.Imports["git.ipao.vip/rogeecn/atom/contracts"] = ""
|
||||||
|
provider.Imports[modePkg] = ""
|
||||||
|
|
||||||
|
provider.ProviderGroup = "atom.GroupInitial"
|
||||||
|
provider.ReturnType = "contracts.Initial"
|
||||||
|
|
||||||
|
provider.InjectParams["__event"] = InjectParam{
|
||||||
|
Star: "*",
|
||||||
|
Type: "PubSub",
|
||||||
|
Package: modePkg,
|
||||||
|
PackageAlias: "events",
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if providerDoc.Mode == "job" {
|
||||||
|
provider.Mode = "job"
|
||||||
|
|
||||||
|
modePkg := gomod.GetModuleName() + "/providers/job"
|
||||||
|
|
||||||
|
provider.Imports["git.ipao.vip/rogeecn/atom/contracts"] = ""
|
||||||
|
provider.Imports["github.com/riverqueue/river"] = ""
|
||||||
|
provider.Imports[modePkg] = ""
|
||||||
|
|
||||||
|
provider.ProviderGroup = "atom.GroupInitial"
|
||||||
|
provider.ReturnType = "contracts.Initial"
|
||||||
|
|
||||||
|
provider.InjectParams["__job"] = InjectParam{
|
||||||
|
Star: "*",
|
||||||
|
Type: "Job",
|
||||||
|
Package: modePkg,
|
||||||
|
PackageAlias: "job",
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
providers = append(providers, provider)
|
providers = append(providers, provider)
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -19,7 +19,7 @@ func Provide(opts ...opt.Option) error {
|
|||||||
) ({{.ReturnType}}, error) {
|
) ({{.ReturnType}}, error) {
|
||||||
obj := &{{.StructName}}{
|
obj := &{{.StructName}}{
|
||||||
{{- range $key, $param := .InjectParams }}
|
{{- range $key, $param := .InjectParams }}
|
||||||
{{- if and (ne $key "__job") (ne $key "__event")}}
|
{{- if and (ne $key "__job") (ne $key "__event") (ne $key "__grpc")}}
|
||||||
{{$key}}: {{$key}},
|
{{$key}}: {{$key}},
|
||||||
{{- end}}
|
{{- end}}
|
||||||
{{- end }}
|
{{- end }}
|
||||||
@@ -30,6 +30,10 @@ func Provide(opts ...opt.Option) error {
|
|||||||
}
|
}
|
||||||
{{- end }}
|
{{- end }}
|
||||||
|
|
||||||
|
{{- if eq .Mode "grpc"}}
|
||||||
|
userv1.RegisterUserServiceServer(__grpc.Server, obj)
|
||||||
|
{{- end }}
|
||||||
|
|
||||||
{{- if eq .Mode "event"}}
|
{{- if eq .Mode "event"}}
|
||||||
__event.Handle("handler:{{.StructName}}", obj.Topic(), obj.PublishToTopic(), obj.Handler)
|
__event.Handle("handler:{{.StructName}}", obj.Topic(), obj.PublishToTopic(), obj.Handler)
|
||||||
{{- end }}
|
{{- end }}
|
||||||
@@ -39,6 +43,7 @@ func Provide(opts ...opt.Option) error {
|
|||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
{{- end }}
|
{{- end }}
|
||||||
|
|
||||||
return obj, nil
|
return obj, nil
|
||||||
}{{if .ProviderGroup}}, {{.ProviderGroup}}{{end}}); err != nil {
|
}{{if .ProviderGroup}}, {{.ProviderGroup}}{{end}}); err != nil {
|
||||||
return err
|
return err
|
||||||
|
|||||||
@@ -22,3 +22,12 @@ test:
|
|||||||
.PHONY: lint
|
.PHONY: lint
|
||||||
lint:
|
lint:
|
||||||
@golangci-lint run
|
@golangci-lint run
|
||||||
|
|
||||||
|
.PHONY: init
|
||||||
|
init:
|
||||||
|
go install github.com/grpc-ecosystem/grpc-gateway/v2/protoc-gen-grpc-gateway
|
||||||
|
go install github.com/grpc-ecosystem/grpc-gateway/v2/protoc-gen-openapiv2
|
||||||
|
go install google.golang.org/protobuf/cmd/protoc-gen-go
|
||||||
|
go install google.golang.org/grpc/cmd/protoc-gen-go-grpc
|
||||||
|
go install github.com/bufbuild/buf/cmd/buf
|
||||||
|
go install github.com/golangci/golangci-lint/cmd/golangci-lint
|
||||||
|
|||||||
58
templates/project/app/service/grpc/grpc.go.tpl
Normal file
58
templates/project/app/service/grpc/grpc.go.tpl
Normal file
@@ -0,0 +1,58 @@
|
|||||||
|
package grpc
|
||||||
|
|
||||||
|
import (
|
||||||
|
"qq/app/grpc/users"
|
||||||
|
"qq/app/service"
|
||||||
|
_ "qq/docs"
|
||||||
|
"qq/providers/app"
|
||||||
|
"qq/providers/grpc"
|
||||||
|
"qq/providers/postgres"
|
||||||
|
|
||||||
|
"git.ipao.vip/rogeecn/atom"
|
||||||
|
"git.ipao.vip/rogeecn/atom/container"
|
||||||
|
"git.ipao.vip/rogeecn/atom/contracts"
|
||||||
|
log "github.com/sirupsen/logrus"
|
||||||
|
"github.com/spf13/cobra"
|
||||||
|
"go.uber.org/dig"
|
||||||
|
)
|
||||||
|
|
||||||
|
func defaultProviders() container.Providers {
|
||||||
|
return service.Default(container.Providers{
|
||||||
|
postgres.DefaultProvider(),
|
||||||
|
grpc.DefaultProvider(),
|
||||||
|
}...)
|
||||||
|
}
|
||||||
|
|
||||||
|
func Command() atom.Option {
|
||||||
|
return atom.Command(
|
||||||
|
atom.Name("grpc"),
|
||||||
|
atom.Short("run grpc server"),
|
||||||
|
atom.RunE(Serve),
|
||||||
|
atom.Providers(
|
||||||
|
defaultProviders().
|
||||||
|
With(
|
||||||
|
users.Provide,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
type Service struct {
|
||||||
|
dig.In
|
||||||
|
|
||||||
|
App *app.Config
|
||||||
|
Grpc *grpc.Grpc
|
||||||
|
Initials []contracts.Initial `group:"initials"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func Serve(cmd *cobra.Command, args []string) error {
|
||||||
|
return container.Container.Invoke(func(svc Service) error {
|
||||||
|
log.SetFormatter(&log.JSONFormatter{})
|
||||||
|
|
||||||
|
if svc.App.IsDevMode() {
|
||||||
|
log.SetLevel(log.DebugLevel)
|
||||||
|
}
|
||||||
|
|
||||||
|
return svc.Grpc.Serve()
|
||||||
|
})
|
||||||
|
}
|
||||||
@@ -1,4 +1,6 @@
|
|||||||
version: v2
|
version: v2
|
||||||
|
inputs:
|
||||||
|
- directory: proto
|
||||||
managed:
|
managed:
|
||||||
enabled: true
|
enabled: true
|
||||||
override:
|
override:
|
||||||
@@ -6,24 +8,16 @@ managed:
|
|||||||
value: {{.ModuleName}}/pkg/proto
|
value: {{.ModuleName}}/pkg/proto
|
||||||
|
|
||||||
plugins:
|
plugins:
|
||||||
- remote: buf.build/protocolbuffers/go
|
- local: protoc-gen-go
|
||||||
out: gen/go
|
out: pkg/proto
|
||||||
opt: paths=source_relative
|
opt: paths=source_relative
|
||||||
- remote: buf.build/grpc/go
|
- local: protoc-gen-grpc-gateway
|
||||||
out: gen/go
|
out: pkg/proto
|
||||||
opt: paths=source_relative,require_unimplemented_servers=false
|
opt:
|
||||||
- remote: buf.build/grpc-ecosystem/gateway
|
- paths=source_relative
|
||||||
out: gen/go
|
- generate_unbound_methods=true
|
||||||
|
- local: protoc-gen-go-grpc
|
||||||
|
out: pkg/proto
|
||||||
opt: paths=source_relative
|
opt: paths=source_relative
|
||||||
# languages
|
# - local: protoc-gen-openapiv2
|
||||||
- remote: buf.build/protocolbuffers/js
|
# out: docs/proto
|
||||||
out: gen/js
|
|
||||||
- remote: buf.build/protocolbuffers/php
|
|
||||||
out: gen/php
|
|
||||||
# generate openapi documentation for api
|
|
||||||
- remote: buf.build/grpc-ecosystem/openapiv2
|
|
||||||
out: gen/openapiv2
|
|
||||||
opt: allow_merge=true,merge_file_name=services
|
|
||||||
|
|
||||||
inputs:
|
|
||||||
- directory: proto
|
|
||||||
|
|||||||
@@ -8,3 +8,6 @@ lint:
|
|||||||
breaking:
|
breaking:
|
||||||
use:
|
use:
|
||||||
- FILE
|
- FILE
|
||||||
|
deps:
|
||||||
|
- buf.build/googleapis/googleapis
|
||||||
|
- buf.build/grpc-ecosystem/grpc-gateway
|
||||||
|
|||||||
48
templates/project/providers/grpc/config.go.tpl
Normal file
48
templates/project/providers/grpc/config.go.tpl
Normal file
@@ -0,0 +1,48 @@
|
|||||||
|
package grpc
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"net"
|
||||||
|
|
||||||
|
"git.ipao.vip/rogeecn/atom/container"
|
||||||
|
"git.ipao.vip/rogeecn/atom/utils/opt"
|
||||||
|
"google.golang.org/grpc"
|
||||||
|
)
|
||||||
|
|
||||||
|
const DefaultPrefix = "Grpc"
|
||||||
|
|
||||||
|
func DefaultProvider() container.ProviderContainer {
|
||||||
|
return container.ProviderContainer{
|
||||||
|
Provider: Provide,
|
||||||
|
Options: []opt.Option{
|
||||||
|
opt.Prefix(DefaultPrefix),
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
type Config struct {
|
||||||
|
Host *string
|
||||||
|
Port uint
|
||||||
|
}
|
||||||
|
|
||||||
|
func (h *Config) Address() string {
|
||||||
|
if h.Host == nil {
|
||||||
|
return fmt.Sprintf(":%d", h.Port)
|
||||||
|
}
|
||||||
|
return fmt.Sprintf("%s:%d", *h.Host, h.Port)
|
||||||
|
}
|
||||||
|
|
||||||
|
type Grpc struct {
|
||||||
|
Server *grpc.Server
|
||||||
|
config *Config
|
||||||
|
}
|
||||||
|
|
||||||
|
// Serve
|
||||||
|
func (g *Grpc) Serve() error {
|
||||||
|
l, err := net.Listen("tcp", g.config.Address())
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
return g.Server.Serve(l)
|
||||||
|
}
|
||||||
26
templates/project/providers/grpc/provider.go.tpl
Normal file
26
templates/project/providers/grpc/provider.go.tpl
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
package grpc
|
||||||
|
|
||||||
|
import (
|
||||||
|
"git.ipao.vip/rogeecn/atom/container"
|
||||||
|
"git.ipao.vip/rogeecn/atom/utils/opt"
|
||||||
|
"google.golang.org/grpc"
|
||||||
|
)
|
||||||
|
|
||||||
|
func Provide(opts ...opt.Option) error {
|
||||||
|
o := opt.New(opts...)
|
||||||
|
var config Config
|
||||||
|
if err := o.UnmarshalConfig(&config); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
return container.Container.Provide(func() (*Grpc, error) {
|
||||||
|
server := grpc.NewServer()
|
||||||
|
|
||||||
|
grpc := &Grpc{
|
||||||
|
Server: server,
|
||||||
|
config: &config,
|
||||||
|
}
|
||||||
|
container.AddCloseAble(grpc.Server.GracefulStop)
|
||||||
|
|
||||||
|
return grpc, nil
|
||||||
|
}, o.DiOptions()...)
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user