当前位置: 首页 > news >正文

k8s 跟 nacos 关于服务注册以及服务发现

它们在代码层面的实现有着本质的不同。一个可以称之为“无感知/环境驱动”(Kubernetes),另一个则是“有感知/SDK驱动”(Nacos)。

Kubernetes: 无感知/环境驱动 (Transparent / Environment-Driven)

在 Kubernetes 的世界里,作为一名应用开发者,你几乎不需要在代码层面为服务注册和发现做任何特殊的事情。这一切都由平台环境透明地处理了。

1. 服务注册 (Code Level: 无操作)
  • 开发者做什么?
    • 开发者不写任何注册代码
  • 实际如何发生?
    • 服务注册是一个声明式的、运维层面的操作。开发者或运维人员会编写 YAML 文件(如 Deployment.yamlService.yaml)。
    • 当你用 kubectl apply -f deployment.yaml 部署应用时,Kubernetes 会创建 Pod(你的应用实例)。
    • 当你用 kubectl apply -f service.yaml 创建一个 Service 时,Kubernetes 会自动找到符合标签选择器(Label Selector)的 Pod,并将它们的内部 IP 地址注册到这个 Service 的端点(Endpoints)列表中。
    • 整个过程,你的应用程序代码完全不知道“注册”这件事的发生。它只需要正常启动、监听端口即可。
2. 服务发现 (Code Level: 像调用普通 DNS 一样)
  • 开发者做什么?
    • 在代码里,你就像访问一个普通的外部网站一样,直接使用目标服务的服务名(Service Name)作为主机名 (Hostname) 来发起网络请求。

代码示例 (Java - Spring RestTemplate): 假设你要调用一个名为 inventory-service 的库存服务,它暴露了 8080 端口。

  • Java
// 在你的订单服务 (order-service) 的代码中
import org.springframework.web.client.RestTemplate;@Autowired
private RestTemplate restTemplate;public String getStockStatus(String productId) {// 直接使用 K8s 的 Service 名作为主机名// Kubernetes 内部的 DNS 会自动把它解析到正确的 IP 地址String url = "http://inventory-service:8080/stock/" + productId;return restTemplate.getForObject(url, String.class);
}
  • 实际如何工作?
    • 你的应用代码发起一个到 http://inventory-service:8080 的请求。
    • 这个 DNS 请求会被 Pod 内部的 DNS 解析器拦截,并转发到 Kubernetes 集群的内部 DNS 服务(通常是 CoreDNS)。
    • CoreDNS 解析 inventory-service 这个名字,将其指向该 Service 的稳定虚拟 IP (ClusterIP)。
    • Kubernetes 的网络组件(kube-proxy)会拦截到这个虚拟 IP 的流量,并通过负载均衡将其转发到背后一个健康的、实际提供服务的 Pod 上。
  • 开发者体感: 非常简单,几乎是零成本。不需要引入任何额外的客户端库,代码非常干净。

Nacos: 有感知/SDK驱动 (Aware / SDK-Driven)

在 Nacos 的世界里,你的应用程序必须主动参与到服务注册和发现的流程中。这通常通过引入 Nacos Client SDK 来实现。

1. 服务注册 (Code Level: 主动注册)
  • 开发者做什么?
  1. 在项目中添加 Nacos Discovery Client 的依赖(比如 spring-cloud-starter-alibaba-nacos-discovery)。
    1. 在启动类上使用注解来显式地开启服务发现功能
    2. 在配置文件中指定 Nacos 服务器的地址。

代码示例 (Java - Spring Boot):

pom.xml 中添加依赖:

  • XML
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

application.yml 中配置:

YAML

spring:application:name: order-service # 服务名cloud:nacos:discovery:server-addr: 127.0.0.1:8848 # Nacos 服务器地址

启动类 OrderServiceApplication.java

Java

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;@SpringBootApplication
@EnableDiscoveryClient // <--- 关键注解!告诉 Spring Boot 我要注册到 Nacos
public class OrderServiceApplication {public static void main(String[] args) {SpringApplication.run(OrderServiceApplication.class, args);}
}
  • 实际如何工作?
    • 应用启动时,@EnableDiscoveryClient 注解会激活 Nacos 注册逻辑。
    • Nacos 客户端 SDK 会读取应用的配置(服务名、IP、端口),然后调用 Nacos Server 的 API 将这些信息注册上去。
    • SDK 会在后台启动一个定时心跳,持续向 Nacos Server “报活”,如果心跳中断,Nacos 会认为该实例已下线。
2. 服务发现 (Code Level: 通过客户端负载均衡)
  • 开发者做什么?
    • 你不能再像 K8s 那样直接把服务名当作主机名。因为操作系统不知道 inventory-service 是什么。
    • 你需要使用一个支持客户端负载均衡的 HTTP 客户端(比如被 Spring Cloud 增强过的 RestTemplateWebClient)。

代码示例 (Java - Spring Cloud):

首先,在创建 RestTemplate Bean 的地方,添加 @LoadBalanced 注解。

  • Java
// Config class
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;@Configuration
public class RestTemplateConfig {@Bean@LoadBalanced // <--- 关键注解!赋予 RestTemplate 负载均衡和解析服务名的能力public RestTemplate restTemplate() {return new RestTemplate();}
}

然后,在业务代码中调用。

Java

public String getStockStatus(String productId) {// URL 中的主机名部分就是 Nacos 中的服务名// 注意,这里不需要写端口号String url = "http://inventory-service/stock/" + productId;return restTemplate.getForObject(url, String.class);
}
  • 实际如何工作?
    • @LoadBalanced 注解会创建一个代理,拦截 RestTemplate 发出的请求。
    • 当它看到主机名是 inventory-service 而不是一个标准的 IP 或域名时,它知道这不是一个普通的 HTTP 请求。
    • 它会向 Nacos Server 查询:“请给我 inventory-service 所有健康实例的列表”。
    • Nacos 返回 [{"ip":"10.0.0.5", "port":8080}, {"ip":"10.0.0.6", "port":8080}]
    • 负载均衡器(如 Ribbon 或 Spring Cloud LoadBalancer)从列表中选择一个实例(比如 10.0.0.5:8080),然后将 http://inventory-service/stock/productId 替换为 http://10.0.0.5:8080/stock/productId,最后才真正发起 HTTP 请求。

总结对比

对比维度

Kubernetes

Nacos

核心区别

环境驱动,对应用透明

SDK 驱动,应用需主动参与

服务注册

应用代码无操作,通过 YAML

声明。

应用代码需主动注册,通过 SDK

或注解 (@EnableDiscoveryClient

)。

服务发现

直接使用服务名作为主机名 (http://service-name

)。

使用客户端负载均衡器 (@LoadBalanced

) 来解析服务名。

依赖

无需额外应用层依赖。

需要引入 Nacos Client 等特定 SDK

开发者体感

简单直接,与传统开发无异。

需要理解服务治理概念,并进行相应配置和编码。

http://www.dtcms.com/a/398638.html

相关文章:

  • 专业的家居网站建设深圳高端网站建设公司
  • Ubuntu vscode软件的安装和使用
  • [Maven 基础课程]10_Maven 私服
  • Python11-集成学习
  • 代做网站灰色关键词青州网站搭建
  • Spring-MVC响应
  • 正确看待和使用TDD测试驱动开发
  • 红外热成像与数字图像相关(DIC)技术耦合在金属热变形分析中的应用
  • 做拍卖网站有哪些教做宝宝辅食的网站
  • 第一章:Go语言的起源-云原生时代的C位语言​​
  • Auto_CVE - 自动化漏洞挖掘系统
  • python+springboot+vue的旅游门票信息系统web
  • 上网行为安全(3)
  • 晨控CK-FR08-E00与三菱QJ71E71-100模块配置MODBUSTCP通讯连接手册
  • 免费网站建站平台网络服务器配置与管理学习报告
  • 利用 Odoo 18 安全交付周期优化交付计划
  • 受欢迎的企业网站建设做网页要钱吗
  • 软考系统架构设计师知识点-系统架构设计
  • 可以用tomcat.做网站吗张家界简单的网站建设
  • 中国古建筑网站网站访问量大
  • OC-初识NSArray的底层逻辑
  • AI技术:变革未来社会的关键驱动力,第878章
  • Kubernetes 证书监控--x509-certificate-exporter
  • MMD动画(六)Ray渲染--打光
  • 检察院网站建设方案erp系统是什么系统
  • a做爰网站o2o
  • 非关系型数据库-Redis
  • 从不确定性到确定性,“动态安全+AI”成网络安全破题密码
  • python+django/flask二手物品交易系统 二手商品发布 分类浏览 在线沟通与订单管理系统java+nodejs
  • 找事做的网站网站开发需要什么步骤