Files
apiServer-service/utils/nacos/service.go
T
shiran 6050d11f27 feat: 添加微服务模板基础架构
- 创建基于 CloudWego Hertz 的 Go 微服务脚手架
- 集成 Nacos 服务注册/发现功能
- 添加 gRPC 客户端支持
- 实现环境变量配置管理 (.env.example)
- 添加 HTTP 中间件 (Recovery, AccessLog, CORS)
- 配置 Gitea CI/CD 构建部署流程

BREAKING CHANGE: 项目结构调整,从简单的 API 服务升级为完整的微服务架构
2026-04-15 11:13:38 +08:00

126 lines
2.7 KiB
Go

package nacos
import (
"errors"
"os"
"strconv"
"sync"
"github.com/nacos-group/nacos-sdk-go/v2/clients"
"github.com/nacos-group/nacos-sdk-go/v2/clients/naming_client"
"github.com/nacos-group/nacos-sdk-go/v2/model"
"github.com/nacos-group/nacos-sdk-go/v2/vo"
)
var (
namingClient naming_client.INamingClient
namingMu sync.Mutex
groupName string
serviceCache sync.Map
)
func NewNacosRegistry() (naming_client.INamingClient, error) {
namingMu.Lock()
defer namingMu.Unlock()
if namingClient != nil {
return namingClient, nil
}
if err := InitNacosRegistryConfig(); err != nil {
return nil, err
}
groupName = os.Getenv("NACOS_GROUP_NAME")
var err error
namingClient, err = clients.NewNamingClient(
vo.NacosClientParam{
ClientConfig: cc,
ServerConfigs: sc,
},
)
if err != nil {
return nil, err
}
return namingClient, nil
}
func RegisterService() error {
client, err := NewNacosRegistry()
if err != nil {
return err
}
serviceName := os.Getenv("NACOS_SERVICE_NAME")
host := os.Getenv("NACOS_SERVICE_HOST")
if serviceName == "" || host == "" {
return errors.New("NACOS_SERVICE_NAME 和 NACOS_SERVICE_HOST 必须配置")
}
port, err := strconv.Atoi(os.Getenv("NACOS_SERVICE_PORT"))
if err != nil {
port = 8848
}
weight, err := strconv.Atoi(os.Getenv("NACOS_SERVICE_WEIGHT"))
if err != nil {
weight = 10
}
_, err = client.RegisterInstance(vo.RegisterInstanceParam{
Ip: host,
Port: uint64(port),
ServiceName: serviceName,
Weight: float64(weight),
Enable: true,
Healthy: true,
Ephemeral: false,
GroupName: groupName,
})
return err
}
func DiscoverServiceList(serviceName string) ([]model.Instance, error) {
client, err := NewNacosRegistry()
if err != nil {
return nil, err
}
return client.SelectInstances(vo.SelectInstancesParam{
ServiceName: serviceName,
HealthyOnly: false,
GroupName: groupName,
})
}
func DiscoverService(serviceName string) (model.Instance, error) {
if cached, ok := serviceCache.Load(serviceName); ok {
cachedInstance := cached.(model.Instance)
client, err := NewNacosRegistry()
if err != nil {
return cachedInstance, err
}
instance, err := client.SelectOneHealthyInstance(vo.SelectOneHealthInstanceParam{
ServiceName: serviceName,
GroupName: groupName,
})
if err != nil {
return cachedInstance, err
}
serviceCache.Store(serviceName, *instance)
return *instance, nil
}
client, err := NewNacosRegistry()
if err != nil {
return model.Instance{}, err
}
instance, err := client.SelectOneHealthyInstance(vo.SelectOneHealthInstanceParam{
ServiceName: serviceName,
GroupName: groupName,
})
if err != nil {
return model.Instance{}, err
}
serviceCache.Store(serviceName, *instance)
return *instance, nil
}