cool-admin(midway版)后端服务注册:Nacos与K8s服务发现集成指南

张开发
2026/4/4 21:52:18 15 分钟阅读
cool-admin(midway版)后端服务注册:Nacos与K8s服务发现集成指南
cool-admin(midway版)后端服务注册Nacos与K8s服务发现集成指南【免费下载链接】cool-admin-midway cool-admin(midway版)一个很酷的后台权限管理框架模块化、插件化、CRUD极速开发永久开源免费基于midway.js 3.x、typescript、typeorm、mysql、jwt、vue3、vite、element-ui等构建项目地址: https://gitcode.com/gh_mirrors/co/cool-admin-midway在现代化的微服务架构中cool-admin(midway版)作为一款功能强大的后台权限管理框架支持与主流服务发现组件如Nacos和Kubernetes(K8s)的无缝集成。本文将详细介绍如何在cool-admin项目中实现服务注册与发现确保您的微服务架构更加健壮和可扩展。 为什么需要服务发现在微服务架构中服务发现是至关重要的组件。当您的cool-admin后端服务部署在多个实例或容器中时服务发现机制能够自动注册新服务实例动态发现可用服务节点实现负载均衡提高系统弹性和可用性cool-admin(midway版)基于midway.js 3.x构建天生支持微服务架构可以轻松集成Nacos和K8s服务发现。 cool-admin微服务架构概览cool-admin采用模块化设计内置了完整的RPC远程过程调用支持。在src/modules/demo/service/rpc.ts中您可以看到cool-admin的微服务调用示例CoolRpcService({ entity: DemoGoodsEntity, method: [info, add, page], }) export class DemoRpcService extends BaseRpcService { async call() { return await this.rpc.call(goods, demoGoodsService, test, { a: 1, }); } } 集成Nacos服务发现1. 安装Nacos客户端依赖首先您需要在cool-admin项目中添加Nacos客户端依赖npm install nacos --save2. 配置Nacos连接在src/config/config.default.ts中添加Nacos配置// Nacos配置 nacos: { serverAddr: 127.0.0.1:8848, // Nacos服务器地址 namespace: public, // 命名空间 group: DEFAULT_GROUP, // 分组 serviceName: cool-admin-service, // 服务名称 clusterName: DEFAULT, // 集群名称 ephemeral: true, // 是否为临时实例 }3. 实现服务注册中间件创建服务注册中间件文件src/middleware/nacos.tsimport { Provide, App, Config, Init } from midwayjs/core; import { IMidwayApplication } from midwayjs/core; import { NacosNamingClient } from nacos; Provide() export class NacosServiceDiscovery { App() app: IMidwayApplication; Config(nacos) nacosConfig; private namingClient: NacosNamingClient; Init() async init() { this.namingClient new NacosNamingClient({ serverList: this.nacosConfig.serverAddr, namespace: this.nacosConfig.namespace, }); } async registerService() { const serviceInfo { serviceName: this.nacosConfig.serviceName, groupName: this.nacosConfig.group, clusterName: this.nacosConfig.clusterName, ip: this.app.getConfig(koa.host) || 127.0.0.1, port: this.app.getConfig(koa.port) || 8001, ephemeral: this.nacosConfig.ephemeral, metadata: { version: 1.0.0, env: process.env.NODE_ENV || development, }, }; await this.namingClient.registerInstance( serviceInfo.serviceName, serviceInfo ); console.log(服务注册成功:, serviceInfo); } async deregisterService() { await this.namingClient.deregisterInstance( this.nacosConfig.serviceName, { ip: this.app.getConfig(koa.host) || 127.0.0.1, port: this.app.getConfig(koa.port) || 8001, } ); } }4. 在应用启动时注册服务修改src/configuration.ts在应用启动时自动注册服务import { Configuration, App } from midwayjs/core; import * as koa from midwayjs/koa; import { NacosServiceDiscovery } from ./middleware/nacos; Configuration({ imports: [koa], importConfigs: [./config/config.default.ts], }) export class MainConfiguration { App() app: koa.Application; async onReady() { // 获取Nacos服务发现实例 const nacosService await this.app .getApplicationContext() .getAsync(NacosServiceDiscovery); // 注册服务到Nacos await nacosService.registerService(); } async onStop() { // 应用停止时注销服务 const nacosService await this.app .getApplicationContext() .getAsync(NacosServiceDiscovery); await nacosService.deregisterService(); } } Kubernetes(K8s)服务发现集成1. 创建Kubernetes部署文件在项目根目录创建k8s-deployment.yamlapiVersion: apps/v1 kind: Deployment metadata: name: cool-admin-deployment labels: app: cool-admin spec: replicas: 3 selector: matchLabels: app: cool-admin template: metadata: labels: app: cool-admin spec: containers: - name: cool-admin image: cool-admin:latest ports: - containerPort: 8001 env: - name: NODE_ENV value: production - name: KOA_PORT value: 8001 resources: requests: memory: 256Mi cpu: 250m limits: memory: 512Mi cpu: 500m2. 创建Kubernetes服务文件创建k8s-service.yamlapiVersion: v1 kind: Service metadata: name: cool-admin-service spec: selector: app: cool-admin ports: - protocol: TCP port: 8001 targetPort: 8001 type: ClusterIP3. 配置K8s服务发现cool-admin可以通过环境变量自动发现K8s服务。在src/config/config.prod.ts中添加K8s配置export default { koa: { port: parseInt(process.env.KOA_PORT) || 8001, host: process.env.POD_IP || 0.0.0.0, }, cool: { // K8s服务发现配置 k8s: { enabled: process.env.KUBERNETES_SERVICE_HOST ? true : false, namespace: process.env.NAMESPACE || default, serviceAccountPath: /var/run/secrets/kubernetes.io/serviceaccount, }, }, };4. 实现K8s服务发现客户端创建src/service/k8s-discovery.tsimport { Provide, Config } from midwayjs/core; import * as k8s from kubernetes/client-node; Provide() export class K8sServiceDiscovery { Config(cool.k8s) k8sConfig; private k8sApi: k8s.CoreV1Api; async init() { if (this.k8sConfig.enabled) { const kc new k8s.KubeConfig(); if (process.env.KUBERNETES_SERVICE_HOST) { // 在K8s集群内部 kc.loadFromCluster(); } else { // 外部访问 kc.loadFromDefault(); } this.k8sApi kc.makeApiClient(k8s.CoreV1Api); } } async discoverServices(serviceName: string) { if (!this.k8sConfig.enabled) { return []; } try { const response await this.k8sApi.listNamespacedEndpoints( this.k8sConfig.namespace ); const services response.body.items.filter(item item.metadata.name.includes(serviceName) ); return services.map(service ({ name: service.metadata.name, endpoints: service.subsets?.flatMap(subset subset.addresses?.map(addr ({ ip: addr.ip, nodeName: addr.nodeName, })) || [] ) || [], })); } catch (error) { console.error(K8s服务发现失败:, error); return []; } } } 动态服务发现与负载均衡1. 创建服务发现管理器在src/service/service-discovery.ts中创建统一的服务发现管理器import { Provide, Inject, Config } from midwayjs/core; import { NacosServiceDiscovery } from ../middleware/nacos; import { K8sServiceDiscovery } from ./k8s-discovery; Provide() export class ServiceDiscoveryManager { Inject() nacosService: NacosServiceDiscovery; Inject() k8sService: K8sServiceDiscovery; Config(service.discovery) discoveryConfig; private services new Map(); async discover(serviceName: string) { const discoveryType this.discoveryConfig.type || nacos; switch (discoveryType) { case nacos: return await this.discoverFromNacos(serviceName); case k8s: return await this.discoverFromK8s(serviceName); default: throw new Error(不支持的发现类型: ${discoveryType}); } } private async discoverFromNacos(serviceName: string) { // 实现Nacos服务发现逻辑 const instances await this.nacosService.getHealthyInstances(serviceName); return this.loadBalance(instances); } private async discoverFromK8s(serviceName: string) { // 实现K8s服务发现逻辑 const services await this.k8sService.discoverServices(serviceName); return this.loadBalance(services); } private loadBalance(instances) { // 简单的轮询负载均衡 if (!this.services.has(serviceName)) { this.services.set(serviceName, 0); } const index this.services.get(serviceName); const instance instances[index % instances.length]; this.services.set(serviceName, index 1); return instance; } }2. 集成到RPC调用修改RPC服务调用使用服务发现import { Provide, Inject } from midwayjs/core; import { ServiceDiscoveryManager } from ../service/service-discovery; Provide() export class EnhancedRpcService { Inject() serviceDiscovery: ServiceDiscoveryManager; async callWithDiscovery(serviceName: string, method: string, params: any) { // 发现服务实例 const instance await this.serviceDiscovery.discover(serviceName); // 构建服务地址 const serviceUrl http://${instance.ip}:${instance.port}; // 调用远程服务 return await this.callRemoteService(serviceUrl, method, params); } } 测试服务发现功能1. 本地测试Nacos集成首先启动Nacos服务器# 下载并启动Nacos wget https://github.com/alibaba/nacos/releases/download/2.2.0/nacos-server-2.2.0.tar.gz tar -zxvf nacos-server-2.2.0.tar.gz cd nacos/bin sh startup.sh -m standalone然后启动cool-admin服务npm run dev访问Nacos控制台http://localhost:8848/nacos您应该能看到cool-admin服务已经成功注册。2. K8s环境测试部署到Kubernetes集群# 构建Docker镜像 docker build -t cool-admin:latest . # 部署到K8s kubectl apply -f k8s-deployment.yaml kubectl apply -f k8s-service.yaml # 查看服务状态 kubectl get pods kubectl get services 监控与健康检查1. 添加健康检查端点在src/controller/admin/comm.ts中添加健康检查import { Controller, Get, Provide } from midwayjs/core; Provide() Controller(/health) export class HealthController { Get(/) async healthCheck() { return { status: UP, timestamp: new Date().toISOString(), service: cool-admin, version: 1.0.0, }; } Get(/readiness) async readiness() { // 检查数据库连接 // 检查Redis连接 // 检查外部依赖 return { status: READY, dependencies: { database: UP, redis: UP, nacos: UP, }, }; } Get(/liveness) async liveness() { return { status: ALIVE, memory: process.memoryUsage(), uptime: process.uptime(), }; } }2. 配置K8s探针在k8s-deployment.yaml中添加健康检查livenessProbe: httpGet: path: /health/liveness port: 8001 initialDelaySeconds: 30 periodSeconds: 10 readinessProbe: httpGet: path: /health/readiness port: 8001 initialDelaySeconds: 5 periodSeconds: 5 最佳实践与优化建议1. 多环境配置为不同环境创建不同的配置文件config.local.ts- 本地开发环境config.test.ts- 测试环境config.prod.ts- 生产环境2. 服务熔断与降级集成熔断器防止级联故障import { CircuitBreaker } from circuit-breaker-js; const circuitBreaker new CircuitBreaker({ timeout: 3000, errorThreshold: 50, volumeThreshold: 10, }); async callWithCircuitBreaker(serviceName, method, params) { return await circuitBreaker.run(async () { return await this.callWithDiscovery(serviceName, method, params); }); }3. 服务网格集成考虑使用Istio等服务网格增强服务发现# istio-virtual-service.yaml apiVersion: networking.istio.io/v1beta1 kind: VirtualService metadata: name: cool-admin-vs spec: hosts: - cool-admin-service http: - route: - destination: host: cool-admin-service subset: v1 retries: attempts: 3 perTryTimeout: 2s 性能优化技巧连接池管理为Nacos和K8s API客户端配置合适的连接池缓存服务实例避免每次调用都查询服务注册中心异步健康检查定期异步检查服务实例健康状态本地服务缓存在网络分区时使用本地缓存的服务实例 故障排查指南常见问题及解决方案服务注册失败检查Nacos/K8s服务是否正常运行验证网络连接和防火墙规则检查配置参数是否正确服务发现超时调整超时设置增加重试机制启用本地缓存负载均衡不均检查服务实例健康状态调整负载均衡算法监控各实例负载 总结通过本文的详细指南您已经学会了如何在cool-admin(midway版)中集成Nacos和Kubernetes服务发现。cool-admin的模块化架构和强大的扩展能力使其成为构建现代化微服务系统的理想选择。关键要点cool-admin天生支持微服务架构可以轻松集成Nacos和K8s服务发现提供完整的健康检查和监控支持支持多种负载均衡策略具备良好的故障恢复能力无论是小型创业公司还是大型企业级应用cool-admin都能提供稳定可靠的后台服务注册与发现解决方案。开始使用cool-admin构建您的下一代微服务应用吧【免费下载链接】cool-admin-midway cool-admin(midway版)一个很酷的后台权限管理框架模块化、插件化、CRUD极速开发永久开源免费基于midway.js 3.x、typescript、typeorm、mysql、jwt、vue3、vite、element-ui等构建项目地址: https://gitcode.com/gh_mirrors/co/cool-admin-midway创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

更多文章