实用指南:k8s 跟 nacos 关于服务注册以及服务发现

news/2025/9/25 20:35:23/文章来源:https://www.cnblogs.com/yxysuanfa/p/19111960

它们在代码层面的实现有着本质的不同。一个可以称之为“无感知/环境驱动”(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
com.alibaba.cloud
spring-cloud-starter-alibaba-nacos-discovery

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.mzph.cn/news/917490.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

9-25

今天满课。。。 最近在忙大创,电控这方面需要合作完成,重拾了单片机的知识 驱动电机使用的是TB6612,驱动130直流电机 使用pwm控制转速 PWM 是 脉冲宽度调制(Pulse Width Modulation)的缩写,是一种通过调节脉冲信…

电子商务网站推广的方法有哪些成都网站设计网站制作公司

关于三次样条插值&#xff0c;计算方法比较复杂&#xff0c;但是静下心来仔细研究也是可以理解的。 本文借鉴文章来源&#xff1a;http://www.cnki.com.cn/Article/CJFDTotal-BGZD200611035.htm 定义&#xff1a; 简单来说就是给定了一些在区间[a,b]的数据点{x1,x2,x3.....xn…

西安网站制作工商上海公司注册名字查询

自诞生以来&#xff0c;OpenStack 似乎一直被质疑&#xff0c;其背后最重要的两大推手 NASA 和 Rackspace 都弃它而去&#xff0c;惠普、思科接连宣布关闭基于 OpenStack 的公有云服务&#xff0c;但是,OpenStack 依旧坚挺。1Q&#xff1a;OpenStack发展历史A:2Q&#xff1a;op…

郑州行业网站建设最适合穷人的四种保险

1.数据类型和变量 Python使用缩进来组织代码块,一般使用4个空格的缩进.使用#来注释一行,其他每一行都是一个语句,当语句以冒号:结尾时,缩进的语句视为代码块.Python对大小写敏感. 1.1 整数 Python可以处理任意大小的整数,包括负整数,写法与数学上写法一致,例如:-100.如果用十六…

AT_agc021_d [AGC021D] Reversed LCS

首先需要注意到一个性质,如果两个序列的最长公共子序列不是一个回文串,一定可以左右扩展成一个回文串,原因显然(但其实并不容易观察到这一性质)。 然后区间 DP 简单求一下区间更改之后的最长回文串即可。

常用注解汇总

常用注解汇总常用注解汇总 原文链接:https://www.cnblogs.com/tqlin/p/11687811.html 常用注解汇总 原文链接:https://www.cnblogs.com/tqlin/p/11687811.htmlSpring Boot 常用注解汇总 一、启动注解 @SpringBootApp…

adb shell 常用文件命令

自动生成 10 个 1m 文件 adb shell for i in $(seq 1 10); do dd if=/dev/zero of=/sdcard/file_$i.bin bs=1048576 count=1; done生成多个不同大小的文件(1MB 到 5MB) adb shell for i in $(seq 1 10); do dd if=/d…

你所不知道的Spring的@Autowired实现细节

你所不知道的Spring的@Autowired实现细节你所不知道的Spring的@Autowired实现细节 原文链接:https://cloud.tencent.com/developer/article/1692933 前言相信很多Java开发都遇到过一个面试题:Resource和Autowired的区…

Java文件编程

目录Java文件编程传统IONIONIO.2总结 Java文件编程 传统IO 传统IO (java.io包)的主要类:FileInputStream/FileOutputStream - 字节流 FileReader/FileWriter - 字符流 BufferedReader/BufferedWriter - 缓冲流 File -…

opencart做外贸网站怎样新乡手机网站建设官网

不需要选中整行&#xff0c;执行光标所在行&#xff0c;按F8就可直接执行&#xff1b; 工具—>首选项—>SQL窗口—>自动选择&#xff0c;勾选自动选择即可。 这样光标放在此行&#xff0c;按F8就可以执行&#xff0c;需要注意的是sql语句必须以分号结束。下期更新

免费个人博客网站模板下载新县住房和城乡规划建设局网站

24年重庆三支一扶报名照不通过怎么处理&#xff1f;

自我介绍与规划

关于我自己: 目前就读于中南林业科技大学涉外学院大数据专业大三,在过往的学习生活里,我更像 “安静的追赶者”—— 成绩稳定在班级中上游,上课认真记笔记、作业按时完成,却很少主动在课堂上发言或参与小组牵头工…

软件工程学习日志2025.9.25

今天我完成了软件设计课程的作业,这是一个非常有用的多语言翻译服务。以下是我的实践总结: 技术实现要点API调用流程 • 注册百度AI开放平台账号并创建应用• 获取API Key和Secret Key • 使用官方SDK进行接口调用核…

从50ms到30ms:YOLOv10部署中图像预处理的性能优化实践 - 实践

从50ms到30ms:YOLOv10部署中图像预处理的性能优化实践 - 实践pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Con…

申请域名流程后怎样做网站装潢设计软件免费

转自&#xff1a;http://www.ruanyifeng.com/blog/2012/09/linus_torvalds.html作者&#xff1a; 阮一峰日期&#xff1a; 2012年9月 3日除了程序员&#xff0c;大概很少人知道Linux操作系统。它的发明者Linus Torvalds&#xff0c;知道的人就更少了。他本人也很低调&#xff0…

大兴做网站公司wordpress首页布局修改

来源&#xff1a;新华社第17届亚洲-太平洋通讯社组织&#xff08;亚通组织&#xff09;全体大会8日在韩国首尔闭幕。大会颁发了亚通组织卓越通讯社品质奖&#xff0c;中国新华通讯社与越南通讯社分别获奖。这是亚通组织主席、阿塞拜疆国家新闻社社长阿斯兰阿斯兰诺夫&#xff0…

苏联的经典数学教材

苏联的经典数学教材苏联的数学教材以其体系严谨、逻辑缜密、内容深刻而享誉世界,形成了独具特色的“苏联学派”风格。这些教材通常不满足于简单地呈现知识,而是致力于培养学生严格的数学思维和独立的解题能力。其典型…

java课基础问题整理与解答

java课基础问题整理与解答常量与变量定义示例 public class cyj { // 1. 定义全局常量,全局变量在项目中通用 public static final int MAX_VALUE = 512; // 2. 定义局部常量,局部变量在本类中使用 private static f…

redis实现分布式锁1

在集群下的并发问题:业务流程:具体实现: ILock点击查看代码package com.hmdp.utils;public interface ILock {// 获取锁boolean tryLock(long timeoutSec);// 释放锁void unlock(); }SimpleRedisLock点击查看代码pa…

网页设计基础知识总结如何优化网站推广

原文地址&#xff1a;http://www.cnblogs.com/yinzixin/archive/2012/11/30/entity-framework-dynamic-query.html Dynamic Query是一个支持动态Entity Framework查询的库。它的设计初衷是为了减少在管理系统中大量出现的对一个数据集进行查找、排序、分页的这类场景的开发工作…