iot_server/internal/tools/rpcclient/rpcdial.go

125 lines
3.6 KiB
Go

/*******************************************************************************
* Copyright 2017 Dell Inc.
* Copyright (c) 2019 Intel Corporation
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
* in compliance with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software distributed under the License
* is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
* or implied. See the License for the specific language governing permissions and limitations under
* the License.
*******************************************************************************/
package rpcclient
import (
"github.com/winc-link/hummingbird/internal/pkg/logger"
"google.golang.org/grpc"
"google.golang.org/grpc/backoff"
"google.golang.org/grpc/credentials"
"google.golang.org/grpc/keepalive"
"google.golang.org/protobuf/types/known/emptypb"
"os"
"path/filepath"
"runtime"
"time"
)
var Empty = &emptypb.Empty{}
// grpc内部对client的ping server的周期限制为最小10s
var kacp = keepalive.ClientParameters{
Time: 10 * time.Second, // send pings every 10 seconds if there is no activity
Timeout: 3 * time.Second, // wait 3 second for ping ack before considering the connection dead
PermitWithoutStream: true, // send pings even without active streams
}
var ConnParams = grpc.ConnectParams{
Backoff: backoff.Config{
BaseDelay: time.Second * 1.0,
Multiplier: 1.0,
Jitter: 0,
MaxDelay: 1.0 * time.Second,
},
MinConnectTimeout: time.Second * 1,
}
var basepath string
func init() {
_, currentFile, _, _ := runtime.Caller(0)
basepath = filepath.Dir(currentFile)
}
// Path returns the absolute path the given relative file or directory path,
// relative to the google.golang.org/grpc/examples/data directory in the
// user's GOPATH. If rel is already absolute, it is returned unmodified.
func path(rel string) string {
if filepath.IsAbs(rel) {
return rel
}
return filepath.Join(basepath, rel)
}
const (
CLIENT_RPC_LOG_ENABLE = "CLIENT_RPC_LOG_ENABLE"
)
func dialWithLog(address string, withTLS bool, certFile, serverName string, lc logger.LoggingClient) (*grpc.ClientConn, error) {
var (
err error
creds credentials.TransportCredentials
conn *grpc.ClientConn
)
var clientRpcLog = os.Getenv(CLIENT_RPC_LOG_ENABLE)
if withTLS {
if creds, err = credentials.NewClientTLSFromFile(path(certFile), serverName); err != nil {
return nil, err
}
if clientRpcLog != "" {
conn, err = grpc.Dial(address,
grpc.WithTransportCredentials(creds),
grpc.WithBlock(),
grpc.WithKeepaliveParams(kacp),
withClientLoggerInterceptor(lc),
grpc.WithConnectParams(ConnParams),
withEdgeErrorInterceptor(),
)
} else {
conn, err = grpc.Dial(address,
grpc.WithTransportCredentials(creds),
grpc.WithBlock(),
grpc.WithKeepaliveParams(kacp),
grpc.WithConnectParams(ConnParams),
withEdgeErrorInterceptor(),
)
}
if err != nil {
return nil, err
}
} else {
if clientRpcLog != "" {
conn, err = grpc.Dial(address,
grpc.WithInsecure(), /*grpc.WithBlock(),*/
grpc.WithKeepaliveParams(kacp),
withClientLoggerInterceptor(lc),
grpc.WithConnectParams(ConnParams),
withEdgeErrorInterceptor(),
)
} else {
conn, err = grpc.Dial(address,
grpc.WithInsecure(), /*grpc.WithBlock(),*/
grpc.WithKeepaliveParams(kacp),
grpc.WithConnectParams(ConnParams),
)
}
if err != nil {
return nil, err
}
}
return conn, nil
}