github.com/erda-project/erda-infra@v1.0.10-0.20240327085753-f3a249292aeb/providers/serviceregister/provider.go (about) 1 // Copyright (c) 2021 Terminus, Inc. 2 // 3 // Licensed under the Apache License, Version 2.0 (the "License"); 4 // you may not use this file except in compliance with the License. 5 // You may obtain a copy of the License at 6 // 7 // http://www.apache.org/licenses/LICENSE-2.0 8 // 9 // Unless required by applicable law or agreed to in writing, software 10 // distributed under the License is distributed on an "AS IS" BASIS, 11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 // See the License for the specific language governing permissions and 13 // limitations under the License. 14 15 package register 16 17 import ( 18 "fmt" 19 "reflect" 20 21 "github.com/erda-project/erda-infra/base/logs" 22 "github.com/erda-project/erda-infra/base/servicehub" 23 "github.com/erda-project/erda-infra/pkg/transport" 24 transgrpc "github.com/erda-project/erda-infra/pkg/transport/grpc" 25 transhttp "github.com/erda-project/erda-infra/pkg/transport/http" 26 "github.com/erda-project/erda-infra/providers/grpcserver" 27 "github.com/erda-project/erda-infra/providers/httpserver" 28 "google.golang.org/grpc" 29 ) 30 31 // Interface . 32 type Interface = transport.Register 33 34 type provider struct { 35 Log logs.Logger 36 router httpserver.Router 37 grpc grpcserver.Interface 38 } 39 40 func (p *provider) Init(ctx servicehub.Context) error { 41 p.router, _ = ctx.Service("http-server").(httpserver.Router) 42 p.grpc, _ = ctx.Service("grpc-server").(grpcserver.Interface) 43 if p.router == nil && p.grpc == nil { 44 return fmt.Errorf("not found http-server or grpc-server") 45 } 46 return nil 47 } 48 49 func (p *provider) Provide(ctx servicehub.DependencyContext, args ...interface{}) interface{} { 50 return &service{ 51 name: ctx.Caller(), 52 router: p.router, 53 grpc: p.grpc, 54 } 55 } 56 57 var _ Interface = (*service)(nil) 58 59 type service struct { 60 name string 61 router httpserver.Router 62 grpc grpcserver.Interface 63 } 64 65 func (s *service) Add(method, path string, handler transhttp.HandlerFunc) { 66 if s.router != nil { 67 s.router.Add(method, path, handler, httpserver.WithPathFormat(httpserver.PathFormatGoogleAPIs)) 68 } 69 } 70 71 func (s *service) RegisterService(sd *grpc.ServiceDesc, impl interface{}) { 72 if s.grpc != nil { 73 s.grpc.RegisterService(sd, impl) 74 } 75 } 76 77 func init() { 78 servicehub.Register("service-register", &servicehub.Spec{ 79 Services: []string{"service-register"}, 80 Types: []reflect.Type{ 81 reflect.TypeOf((*Interface)(nil)).Elem(), 82 reflect.TypeOf((*transgrpc.ServiceRegistrar)(nil)).Elem(), 83 reflect.TypeOf((*transhttp.Router)(nil)).Elem(), 84 }, 85 OptionalDependencies: []string{"grpc-server", "http-server"}, 86 Description: "provide grpc and http server", 87 Creator: func() servicehub.Provider { 88 return &provider{} 89 }, 90 }) 91 }