Go实现轻量级服务注册中心,基于内存存储+定时任务,支持注册、心跳续约、自动剔除和查询;定义ServiceInstance结构体,用map按服务名索引实例,HTTP提供/register和/heartbeat/{id}接口,每10秒扫描剔除超时30秒未心跳的实例。
用 Go 实现一个轻量级服务注册中心,核心是维护服务实例的注册、心跳续约、过期剔除和查询能力。不需要依赖外部存储,用内存 + 定时任务就能支撑中小规模场景。
每个服务实例需要唯一标识(如 service-name#ip:port),并记录地址、健康状态、最后心跳时间等字段:
```go
type ServiceInstance struct {
ID string `json:"id"`
ServiceName string `json:"service_name"`
Addr string `json:"addr"`
Status string `json:"status"` // "UP", "DOWN"
LastHeartAt time.Time `json:"last_heart_at"`
}
// 用 map 做服务名到实例列表的索引,支持快速按服务名查所有实例
var registry = make(map[string][]*ServiceInstance)
var mu sync.RWMutex
```
用 net/http 暴露两个基础接口:
LastHeartAt,标记为 UP;ID 可设计为 service-name#ip:port
示例处理逻辑:
```go
http.HandleFunc("/register", func(w http.ResponseWriter, r *http.Request) {
if r.Method != "POST" {
http.Error(w, "Method not allowed", http.StatusMethodNotAllowed)
return
}
var ins ServiceInstance
if err := json.NewDecoder(r.Body).Decode(&ins); err != nil {
http.Error(w, "Invalid JSON", http.StatusBadRequest)
return
}
if ins.ServiceName == "" || ins.Addr == "" {
http.Error(w, "Missing required fields", http.StatusBadRequest)
return
}
ins.ID = fmt.Sprintf("%s#%s", ins.ServiceName, ins.Addr)
ins.Status = "UP"
ins.LastHeartAt = time.Now()
mu.Lock()
defer mu.Unlock()
registry[ins.ServiceName] = append(registry[ins.ServiceName], &ins)
w.WriteHeader(http.StatusOK)
})
```
心跳超时(如 30 秒没更新)的实例应被自动设为 DOWN 或移除。启动一个 goroutine 每 10 秒扫描一次:
```go
go func() {
ticker := time.NewTicker(10 * time.Second)
defer ticker.Stop()
for range ticker.C {
mu.Lock()
now := time.Now()
for svcName, instances := range registry {
filtered := make([]*ServiceInstance, 0, len(instances))
for _, ins := range instances {
if now.Sub(ins.LastHeartAt) filtered = append(filtered, ins)
} else {
ins.Status = "DOWN"
}
}
registry[svcName] = filtered
}
mu.Unlock()
}
}()
```
供客户端拉取可用实例列表,支持按服务名过滤,并只返回 Status == "UP" 的实例:
```go
http.HandleFunc("/services/", func(w http.ResponseWriter, r *http.Request) {
svcName := strings.TrimPrefix(r.URL.Path, "/services/")
if svcName == "" {
http.Error(w, "Service name required", http.StatusBadRequest)
return
}
mu.RLock()
instances := registry[svcName]
mu.RUnlock()
upInstances := make([]*ServiceInstance, 0)
for _, ins := range instances {
if ins.Status == "UP" {
upInstances = append(upInstances, ins)
}
}
json.NewEncoder(w).Encode(upInstances)
})
```
不复杂但容易忽略的是并发安全和超时判断粒度——读多写少场景推荐 sync.RWMutex,心跳超时值需与客户端上报频率对齐。后续可扩展 etcd 存储、TLS 支持或健康检查探针。
# js
# json
# go
# golang
# app
# usb
# red
# String
# if
# for
# Error
# register
# 结构体
# 数据结构
# 接口
# Struct
# var
# len
# nil
# append
# map
# 并发
# etcd
# http
# 的是
# 客户端
# 更新时间
# 就能
# 不需要
# 设为
# 必填
# 移除
# 多写
相关文章:
如何高效利用200m空间完成建站?
javascript基本数据类型及类型检测常用方法小结
如何快速选择适合个人网站的云服务器配置?
广州建站公司哪家好?十大优质服务商推荐
如何在西部数码注册域名并快速搭建网站?
手机怎么制作网站教程步骤,手机怎么做自己的网页链接?
教程网站设计制作软件,怎么创建自己的一个网站?
长沙企业网站制作哪家好,长沙水业集团官方网站?
建站之星×万网:智能建站系统+自助建站平台一键生成
高防服务器租用指南:配置选择与快速部署攻略
,sp开头的版面叫什么?
制作假网页,招聘网的薪资待遇,会有靠谱的吗?一面试又各种折扣?
制作销售网站教学视频,销售网站有哪些?
贸易公司网站制作流程,出口贸易网站设计怎么做?
小视频制作网站有哪些,有什么看国内小视频的网站,求推荐?
重庆网站制作公司哪家好,重庆中考招生办官方网站?
制作网站哪家好,cc、.co、.cm哪个域名更适合做网站?
网站建设制作需要多少钱费用,自己做一个网站要多少钱,模板一般多少钱?
成都响应式网站开发,dw怎么把手机适应页面变成网页?
制作ppt免费网站有哪些,有哪些比较好的ppt模板下载网站?
如何在阿里云虚拟机上搭建网站?步骤解析与避坑指南
如何快速配置高效服务器建站软件?
平台云上自助建站如何快速打造专业网站?
如何获取免费开源的自助建站系统源码?
零基础网站服务器架设实战:轻量应用与域名解析配置指南
公众号网站制作网页,微信公众号怎么制作?
建站之星IIS配置教程:代码生成技巧与站点搭建指南
如何高效搭建专业期货交易平台网站?
网站按钮制作软件,如何实现网页中按钮的自动点击?
如何设置并定期更换建站之星安全管理员密码?
建站DNS解析失败?如何正确配置域名服务器?
建站之星3.0如何解决常见操作问题?
如何选择靠谱的建站公司加盟品牌?
已有域名如何快速搭建专属网站?
如何使用Golang安装API文档生成工具_快速生成接口文档
如何通过WDCP绑定主域名及创建子域名站点?
网站制作员失业,怎样查看自己网站的注册者?
枣阳网站制作,阳新火车站打的到仙岛湖多少钱?
免费网站制作appp,免费制作app哪个平台好?
公司网站设计制作厂家,怎么创建自己的一个网站?
制作网站建设的公司有哪些,网站建设比较好的公司都有哪些?
Android使用GridView实现日历的简单功能
网站专业制作公司有哪些,做一个公司网站要多少钱?
宝塔建站助手安装配置与建站模板使用全流程解析
非常酷的网站设计制作软件,酷培ai教育官方网站?
建站主机选哪种环境更利于SEO优化?
制作企业网站建设方案,怎样建设一个公司网站?
简历在线制作网站免费版,如何创建个人简历?
教育培训网站制作流程,请问edu教育网站的域名怎么申请?
长沙做网站要多少钱,长沙国安网络怎么样?
*请认真填写需求信息,我们会在24小时内与您取得联系。