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  }