1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950 |
- package utils
- import (
- "google.golang.org/grpc"
- "google.golang.org/grpc/connectivity"
- "sync"
- )
- type ClientPool interface {
- Get() *grpc.ClientConn
- Put(conn *grpc.ClientConn)
- }
- type clientPool struct {
- pool sync.Pool
- }
- func GetPoolInstance(target string, opts ...grpc.DialOption) (ClientPool, error) {
- return &clientPool{
- pool: sync.Pool{
- New: func() any {
- conn, err := grpc.NewClient(target, opts...)
- if err != nil {
- FileLog.Error("连接sso登录服务失败:%v", err)
- }
- return conn
- },
- },
- }, nil
- }
- func (c *clientPool) Get() *grpc.ClientConn {
- conn := c.pool.Get().(*grpc.ClientConn)
- // 当连接不可用时,关闭当前连接,并新建一个连接
- if conn.GetState() == connectivity.Shutdown || conn.GetState() == connectivity.TransientFailure {
- conn.Close()
- conn = c.pool.New().(*grpc.ClientConn)
- }
- return conn
- }
- func (c *clientPool) Put(conn *grpc.ClientConn) {
- // 当连接不可用时,关闭当前连接,并不再放回池中
- if conn.GetState() == connectivity.Shutdown || conn.GetState() == connectivity.TransientFailure {
- conn.Close()
- return
- }
- c.pool.Put(conn)
- }
|