69xxx

核心内容摘要

《男生女生在一起愁愁愁》:青春烦恼的奇妙奏鸣曲
驭兽之道,征服雪域之巅的王者之爱

娜娜新作《老师2》的创作背景和历史背景

Go 微服务基于 Nacos 的服务发现 配置中心 服务治理 K8s 融合全链路实战目标打造一套生产可落地的 Go 微服务治理体系 关键词Nacos Go Config Center K8s 限流 熔断 负载均衡 优雅上下线这篇文章不是“怎么连上 Nacos”而是回答一个更高级的问题一个真正企业级的 Go 微服务系统Nacos 应该放在什么位置 它如何与配置中心、K8s、限流熔断、负载均衡形成闭环

整体架构设计┌──────────────────────┐ │ Nacos │ │ Naming Config │ └─────────┬────────────┘ │ ┌─────────────────────┼─────────────────────┐ │ │ │ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │ User Svc │ │ Order Svc │ │ Pay Svc │ │ │ │ │ │ │ │ 限流器 │ │ 限流器 │ │ 限流器 │ │ 熔断器 │ │ 熔断器 │ │ 熔断器 │ │ LB模块 │ │ LB模块 │ │ LB模块 │ └──────┬───────┘ └──────┬───────┘ └──────┬───────┘ │ │ │ ┌───▼────┐ ┌───▼────┐ ┌───▼────┐ │ Pod │ │ Pod │ │ Pod │ └────────┘ └────────┘ └────────┘ 全部运行在 Kubernetes 中Nacos 的定位能力作用Naming服务注册与发现Config动态配置中心联动治理限流、熔断、负载均衡参数动态调整

Nacos 环境准备Dockerdocker run -d \ --name nacos \ -p 8848:8848 \ -e MODEstandalone \ nacos/nacos-server访问http://localhost:8848/nacos 账号/密码nacos/nacos

Go 接入 Nacos Naming服务注册发现

初始化客户端sc : []constant.ServerConfig{ *constant.NewServerConfig(

127.

0.

1,

, } cc : *constant.NewClientConfig( constant.WithNamespaceId(prod), constant.WithTimeoutMs(

, ) namingClient, _ : clients.NewNamingClient( vo.NacosClientParam{ ClientConfig: cc, ServerConfigs: sc, }, )

服务注册namingClient.RegisterInstance(vo.RegisterInstanceParam{ ServiceName: user-service, Ip:

10.

1.

10, Port: 8080, Weight: 10, Enable: true, Healthy: true, })

服务发现instance, _ : namingClient.SelectOneHealthyInstance( vo.SelectOneHealthInstanceParam{ ServiceName: user-service, }, )

Nacos 作为配置中心Config Center配置设计维度含义Namespace环境隔离Group服务或系统DataId配置文件示例# user-service.yaml mysql: host:

10.

0.

10 rateLimit: qps: 200 circuitBreaker: failCount: 5获取配置configClient, _ : clients.NewConfigClient(vo.NacosClientParam{ ClientConfig: cc, ServerConfigs: sc, }) content, _ : configClient.GetConfig(vo.ConfigParam{ DataId: user-service.yaml, Group: USER_SERVICE_GROUP, })监听变化configClient.ListenConfig(vo.ConfigParam{ DataId: user-service.yaml, Group: USER_SERVICE_GROUP, OnChange: func(_, _, _, data string) { LoadConfig(data) }, })这一步让系统具备配置修改 → 服务实时生效 → 无需重启

K8s 与 Nacos 融合

使用 Pod IP 注册env: - name: POD_IP valueFrom: fieldRef: fieldPath: status.podIPip : os.Getenv(POD_IP)

优雅下线lifecycle: preStop: exec: command: [/app/graceful-shutdown] terminationGracePeriodSeconds: 30func gracefulShutdown() { namingClient.DeregisterInstance(vo.DeregisterInstanceParam{ ServiceName: user-service, Ip: ip, Port: 8080, }) }完整流程K8s 发送 SIGTERM ↓ preStop 触发 ↓ 从 Nacos 注销实例 ↓ 流量不再进入 ↓ Pod 退出

服务治理三件套

限流var limiter rate.NewLimiter(200,

func Limit(next http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { if !limiter.Allow() { w.WriteHeader(

return } next.ServeHTTP(w, r) }) }

熔断cb : gobreaker.NewCircuitBreaker(gobreaker.Settings{ Name: user-service, ReadyToTrip: func(c gobreaker.Counts) bool { return c.ConsecutiveFailures 5 }, })

负载均衡instances, _ : namingClient.SelectInstances(vo.SelectInstancesParam{ ServiceName: user-service, HealthyOnly: true, }) // 轮询 / 哈希 / 最小连接数 自己实现

配置即治理高级玩法把治理参数全部交给 NacosrateLimit: qps: 300 circuitBreaker: failCount: 10监听变化后实时生效limiter.SetLimit(rate.Limit(GlobalConfig.RateLimit.QPS)) cb NewCircuitBreaker(GlobalConfig)形成Nacos 配置中心 治理控制台

生产级完整调用链请求 ↓ 限流 ↓ 从 Nacos 获取实例 ↓ 负载均衡选择节点 ↓ 熔断器判断 ↓ 真实调用

第九章

总结定位这套体系解决了四件事维度能力服务发现Nacos Naming配置中心Nacos Config服务治理限流 熔断 LB容器调度Kubernetes

探索一家乱战-探索一家乱战应用

百度百家号客服电话人工服务

123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123