服务注册与配置Nacos

news2024/12/23 13:08:30

服务注册与配置Nacos

  • nacos 介绍
  • nacos 特性
  • nacos 的安装
  • nacos 注册中心
    • 注册中心案例
    • 注册中心原理
    • nacos服务分级存储模型
  • nacos 配置中心
    • nacos 配置数据模型
    • nacos 配置管理
    • 配置文件优先级
    • nacos 配置持久化
  • nacos 集群部署

nacos 介绍

nacos 英文全称 Dynamic Naming and Configuration Service,Na为naming/nameServer即注册中心。co为configuration 即注册中心,service是指该注册/配置中心都是以服务为核心。
Nacos 是阿里巴巴推出来的一个开源项目。Nacos 提供了一组简单易用的特性集,帮助快速实现动态服务发现服务配置服务元数据及流量管理
Nacos 支持几乎所有主流类型的服务的发现、配置和服务管理平台,提供注册中心配置中心动态DNS服务三大功能。能够无缝对接Springcloud、Spring、Dubbo等流行框架。

nacos 特性

服务发现和服务健康监测
支持 DNS 与 RPC 服务发现,也提供原生 SDK、OpenAPI 等多种服务注册方式和 DNS、HTTP 与 API 等多种服务发现方式。
Nacos 提供对服务的实时的健康检查,阻止向不健康的主机或服务实例发送请求。Nacos 支持传输层 (PING 或 TCP)和应用层 (如 HTTP、MySQL、用户自定义)的健康检查。 对于复杂的云环境和网络拓扑环境中(如 VPC、边缘网络等)服务的健康检查,Nacos 提供了 agent 上报模式和服务端主动检测2种健康检查模式。Nacos 还提供了统一的健康检查仪表盘,帮助您根据健康状态管理服务的可用性及流量。

动态配置服务
动态配置服务允许您在所有环境中以集中和动态的方式管理所有服务的配置。 Nacos 消除了在更新配置时重新部署应用程序,这使配置的更改更加高效和灵活。
Nacos 还提供了一个简洁易用的 UI 帮助您管理所有的服务和应用的配置。Nacos 还提供包括配置版本跟踪、金丝雀发布、一键回滚配置以及客户端配置更新状态跟踪在内的一系列开箱即用的配置管理特性,帮助您更安全地在生产环境中管理配置变更和降低配置变更带来的风险。

动态 DNS 服务
Nacos 支持动态 DNS 服务权重路由,能够让我们很容易地实现中间层负载均衡、更灵活的路由策略、流量控制以及数据中心内网的简单 DNS 解析服务。

服务及其元数据管理
Nacos 能让您从微服务平台建设的视角管理数据中心的所有服务及元数据,包括管理服务的描述、生命周期、服务的静态依赖分析、服务的健康状态、服务的流量管理、路由及安全策略。

nacos 的安装

下载地址:https://github.com/alibaba/nacos/releases/download/1.4.1/nacos-server-1.4.1.zip
解压软件:请解压到路径中不包含中文以及空格的目录,Java运行环境为JDK1.8+。
解压完成后,使用命令启动startup.cmd -m standalone

在这里插入图片描述
启动完成,进行访问:http://localhost:8848/nacos/,登录账号:nacos,登录密码:nacos
在这里插入图片描述
在这里插入图片描述

nacos 注册中心

nacos 注册中心分为 server 与 client,server 采用 Java 编写,为 client 提供注册发现服务与配置服务。而client可以用多语言实现,client与微服务嵌套在一起,nacos提供 sdk和 openApi,如果没有sdk也可以根据 openApi手动写服务注册与发现和配置拉取的逻辑。

注册中心结构图
请添加图片描述

注册中心案例

服务提供者,将自身注册到注册中心。
pom文件中引入 nacos 依赖。此依赖的作用是服务发现

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

修改配置文件

server:
  port: 8001
spring:
  application:
    name: service-goods
  cloud:
    nacos:
      discovery:
        server-addr: http://localhost:8848 # nacos server 的地址

在主启动类上添加 @EnableDiscoveryClient 注解,启动项目,就可以将当前服务注册到nacos中。
服务名:每个服务在服务注册中心的标识。
服务实例:网络中提供服务的实例,具有IP和端口,一个实例即为运行在服务器上的一个进程。

服务消费者
在pom 文件中引入服务发现依赖。

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

修改配置文件

server:
  port: 8002
spring:
  application:
    name: service-order
  cloud:
    nacos:
      discovery:
        server-addr: http://localhost:8848 # nacos server 的地址

需要在启动类上添加 @EnableDiscoveryClient 注解。
远程调用,通过服务名去进行远程调用。

@RestController
public class OrderController {
    @Value("${server.port}")
    private Integer port;
    @Autowired
    private RestTemplate restTemplate;
    @RequestMapping("/order/findByOid")
    public String findByOid(@RequestParam("oid") String oid) {
        String goods = restTemplate.getForObject("http://service-goods/goods/findByGid?gid=1", String.class);
        return goods;
    }
}

远程调用执行流程:

  • 服务提供方将自己注册到服务注册中心
  • 服务消费方从注册中心获取服务地址
  • 通过获取的服务进行远程调用

注册中心原理

在这里插入图片描述
nacos 将服务实例划分为临时实例和永久实例。默认情况下服务为临时实例。

当服务为临时实例,采用心跳检测的方式,来对服务实例进行健康检查,心跳带上了服务名,服务ip,服务端口等信息。当服务宕机,nacos 则会直接将服务实例从服务列表中剔除。

当服务为永久实例,nacos采用主动问询的方式,来对服务实例进行健康检查。当服务宕机,nacos 不会将服务实例从服务列表中剔除,而仅做标记。

服务消费者获取服务列表的方式有两种,一种为定时拉取,一种为nacos主动推送,当nacos检测到服务提供者宕机,会主动向服务消费者进行推送。

通过配置文件设置临时实例和永久实例

spring:
  cloud:
    nacos:
      discovery:
        ephemeral: false # 设置为永久实例,默认为临时实例

nacos服务分级存储模型

在这里插入图片描述
命名空间 namespace
不同的命名空间逻辑上是隔离的,不特殊设置的情况下,服务不会跨命名空间请求,不同命名空间中的服务实例互不可见,命名空间主要的作用是区分服务使用的范围,比如开发、测试、生产、灰度可以分别设置四个命名空间来互相隔离。nacos中默认的命名空间为 public。
集群
多个服务实例组成一个集群,在进行远程调用的时候,优先访问集群内的服务实例。nacos中默认的集群为 DEFAULT。
实例
服务注册到注册中心的具体实例。一个服务可以注册多个服务实例,在访问的时候根据负载均衡算法,选择其中一个进行调用。

总结:
命名空间的作用是不同环境之间进行隔离,集群是对服务实例的进一步划分,集群中由多个不同的服务实例组成。

在nacos中创建新的命名空间,记录命名空间的 id,在配置文件中进行服务注册时指定命名空间和集群。

spring:
  application:
    name: service
  cloud:
    nacos:
      discovery:
        server‐addr: http://localhost:8848 # nacos server 的地址
        namespace: a1f8e863‐3117‐48c4‐9dd3‐e9ddc2af90a8 #命名空间 id
        cluster‐name: DEFAULT #默认集群,可不填

设置 nacos 负载均衡规则,优先调用集群内的服务实例。

userservice: # 服务名
  ribbon:
    NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule # 负载均衡规则

nacos 配置中心

配置:应用程序在启动和运行的时候往往需要读取一些配置信息,配置基本上伴随着应用程序的整个生命周期,如数据库连接参数、启动参数等。

配置的特点:

  • 配置是独立于程序的只读变量
  • 配置贯穿于应用的整个生命周期,应用在启动时通过读取配置来初始化,在运行时根据配置调整行为。
  • 配置可以有多种加载方式,常见的有程序内部硬编码,配置文件,环境变量,启动参数,基于数据库等。
  • 配置需要治理,同一份程序在不同的环境(开发,测试,生产)、不同的集群(如不同的数据中心)经常需要有不同的配置,所以需要有完善的环境、集群配置管理。

在微服务架构中为了统一管理各个微服务的配置信息专门设置配置中心,配置中心就是一种统一管理各种应用配置的基础服务组件。配置中心将配置从各应用中剥离出来,对配置进行统一管理,应用自身不需要自己去管理配置。

配置中心的服务流程:

  1. 用户在配置中心更新配置信息。
  2. 服务A和服务B及时得到配置更新通知,从配置中心获取配置。
    在这里插入图片描述

nacos 配置数据模型

对于 nacos 配置管理,通过 namespace、group、Data ID 能够定位到一个配置集。

命名空间 (namespace):
命名空间可用于进行不同环境的配置隔离。例如可以隔离开发环境、测试环境和生产环境,因为它们的配置可能各不相同,或者是隔离不同的用户,不同的开发人员使用同一个nacos管理各自的配置,可通过 namespace 隔离。不同的命名空间下,可以存在相同名称的配置分组(Group) 或 配置集。

group:
nacos中的一组配置集合,是组织配置的维度之一,通过一个有意义的字符串(如 Buy 或 Trade)对一组配置集合进行分组,从而区分Data ID相同的配置集合,当在 Nacos 上创建一个配置时,如果未填写配置分组的名称,则配置分组的名称默认采用 DEFAULT_GROUP。

Data Id:
nacos 中的某个配置集合的 ID,配置集合ID是组织划分配置的维度之一,Data ID 通常用于组织划分系统的配置集合,一个系统或者应用可以包含多个配置集合,每个配置集都可以被一个有意义的名称标识。

通常把 namespace看作环境的区分,不同的namespace 代表不同环境,如开发、测试、生产环境。
通常把group看作项目的区分,不同的group 代表某项目,如XX医疗项目、XX电商项目。
通常把 data Id 看作不同的工程的区分,每个项目下往往有若干个工程,每个配置集(DataId) 就是一个工程的主配置文件。
在这里插入图片描述

nacos 配置管理

发布配置,在nacos中新建配置。
在这里插入图片描述
在这里插入图片描述

获取配置。从配置中心获取配置
获取nacos中的步骤:
在这里插入图片描述
bootstrap.yml 优先级最高,项目启动后,优先读取。
在项目启动后,读取 bootstrap.yml 中的配置信息,在 bootstrap.yml 中配置nacos 的配置地址信息,读取nacos配置信息,然后再读取本地配置文件,最后创建spring容器,创建bean。

在项目中添加依赖

<dependency>
    <groupId>com.alibaba.cloud</groupId>      
    <artifactId>spring‐cloud‐starter‐alibaba‐nacos‐config</artifactId>
</dependency>

在resource目录添加 bootstrap.yml 文件。在文件中配置nacos信息。
需要指定nacos的地址,配置文件的信息,包括data Id,group,namespace,用来确定一个唯一的配置文件。
data Id 必须指定,group 如不指定默认 DEFAULT_GROUP,namespace,如不指定默认public。

data Id 的组成格式

${prefix}-${spring.profile.active}.${file-extension}

prefix 默认为所属工程配置 spring.application.name 的值,也可以用spring.cloud.nacos.config.prefix来配置。

spring.profile.active 即为当前环境对应的profile,当spring.profile.active为空的时候,对应的连接符-也不存在,
data Id的拼接格式变成prefix.{file-extension}

file-extension 为配置内容的数据格式,可以通过配置项 spring.cloud.nacos.config.file-extension 来配置。

下面的data Id 为 :userservice-dev.yaml

spring:
  application:
    name: userservice
  profiles:
    active: dev #激活开发环境配置
  cloud:
    nacos:
      discovery:
        server-addr: http://localhost:8848
      config:
        server-addr: http://localhost:8848
        # prefix 指定配置文件的前缀
        file-extension: yaml #指定配置文件的拓展名
        group: DEFAULT_GROUP #指定配置文件所在组
        namespace: public #指定配置文件所在命名空间

测试获取配置中心的配置信息:

@RestController
@RequestMapping("/user")
@RefreshScope
public class UserController {
	// 注入nacos.中的配置属性
	@Value("${pattern.dateformat}")
	private String dateformat;
	// 编写controller,通过日期格式化器来格式化现在时间并返回
	@GetMapping("now")
	public String now(){
		return LocalDate.now().format(DateTimeFormatter.ofPattern(dateformat, Locale.CHINA));
	}
}

在@Value注入的变量所在类上添加注解@RefreshScope,当nacos 配置中心的配置发生更改,无需重启微服务,即可完成配置的热更新。
也可以使用 @ConfigurationProperties 注解加载配置文件,实现配置的热更新。

@Component
@Data
@ConfigurationProperties(prefix = "pattern")
public class PatternProperties {
	private String dateformat;
}

配置文件优先级

微服务在启动的时候,会从配置中心读取多个配置文件的配置信息。
一种是读取带环境的配置文件 prefix-spring.profile.active.file-extension
一种是读取不带环境的配置文件 prefix.file-extension
prefix.file-extension 的配置文件,用作配置多环境共享的配置信息。
如下:
在这里插入图片描述
在 userservice 的dev环境中,会同时加载以上两个配置文件。
如果一个配置信息在 本地 和 配置中心中都进行了配置。则配置信息的优先级如下:
在这里插入图片描述

nacos 配置持久化

使用 mysql 数据库做配置的持久化。
在mysql 中 初始化数据库:CREATE DATABASE nacos_config; USE nacos_config;
导入配置文件。配置文件在 nacos 的 conf 目录下。请添加图片描述
导入后,在数据库中生成如下表。
请添加图片描述
修改nacos 配置文件,在配置文件中进行mysql 的配置。
请添加图片描述

#*************** Config Module Related Configurations ***************#
### If use MySQL as datasource:
spring.datasource.platform=mysql

### Count of DB:
db.num=1

### Connect URL of DB:
db.url.0=jdbc:mysql://127.0.0.1:3306/nacos_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC
db.user.0=root
db.password.0=123456

重启 nacos ,新建配置文件。
请添加图片描述
然后打开数据库,查询 config_info 表的信息,就会发现新建的配置已经存储在数据库中。请添加图片描述

nacos 集群部署

整体架构图
在这里插入图片描述
集群中有3个nacos节点,使用 nginx做反向代理和负载均衡 。同时使用 mysql 做配置的持久化。

步骤1:
配置mysql数据库,详见 nacos 配置持久化中的部分。

步骤2:
将cluster.conf.example 拷贝一份为 cluster.conf,在cluster.conf进行配置。
请添加图片描述
配置集群中 nacos节点的ip地址,这里使用本机启动三个不同的nacos节点。

#it is ip
127.0.0.1:8845
127.0.0.1:8846
127.0.0.1:8847

步骤3:
复制三份 nacos 目录,命名为 nacos1,nacos2,nacos3。
在这里插入图片描述
分别修改配置文件中nacos的端口。

### Default web server port:
server.port=8845

### Default web server port:
server.port=8846

### Default web server port:
server.port=8847

分别启动 3 个nacos节点。点击 bin 目录下的 startup.cmd。

步骤4:
配置 nginx,在nginx 的配置文件 nginx.conf 中做如下配置

upstream nacos-cluster {
	server 127.0.0.1:8845;
	server 127.0.0.1:8846;
	server 127.0.0.1:8847;
}
server {
	listen 80;
	server_name localhost;
	
	location /nacos {
		proxy_pass http: //nacos-cluster;
	}
}

然后启动 nginx ,访问 localhost/nacos,通过 nginx 反向代理,自动会在nacos集群中做负载均衡,访问其中一个nacos 节点。

步骤5:
修改项目配置文件,将nacos的地址 指定为 nginx 反向代理的地址 localhost:80。

spring:
  application:
    name : userservice
  profiles:
    active: dev #坏境
  cloud :
    nacos:
      server-addr: localhost:80 # nacos地址
      config:
        file-extension: yaml #文件后缀名

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/698952.html

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

相关文章

wsl子系统Ubuntu18.04,cuDNN安装

如果觉得本篇文章对您的学习起到帮助作用&#xff0c;请 点赞 关注 评论 &#xff0c;留下您的足迹&#x1f4aa;&#x1f4aa;&#x1f4aa; 本文主要wls子系统Ubuntu18.04安装cuDNN&#xff0c;安装cudnn坑巨多&#xff0c;因此记录以备日后查看&#xff0c;同时&#xff0…

【云原生 | 56】Docker三剑客之Docker Swarm高效使用

&#x1f341;博主简介&#xff1a; &#x1f3c5;云计算领域优质创作者 &#x1f3c5;2022年CSDN新星计划python赛道第一名 &#x1f3c5;2022年CSDN原力计划优质作者 &#x1f3c5;阿里云ACE认证高级工程师 &#x1f3c5;阿里云开发者社区专…

PPT怎么插入视频?3个视频插入方法分享!

Anna是个初入职场的新人&#xff0c;最近要进行工作汇报&#xff0c;需要制作PPT并插入相关的讲解视频。但她对PPT的运用不熟悉&#xff0c;不知道应该如何操作&#xff01;特此来询问应该如何在PPT中插入视频&#xff1f; 在演示文稿中插入视频可以使PPT更加生动有趣。无论是展…

如何克服自动化测试中的壁垒和问题?

随着自动化测试技术的快速发展和普及&#xff0c;自动化测试已经成为各个行业广泛应用的重要测试手段。然而&#xff0c;自动化测试中仍然存在壁垒和问题&#xff0c;这些问题可能对测试效果产生影响&#xff0c;甚至会影响整个项目的进程。在本文中&#xff0c;我们将探讨如何…

JavaScript进阶----《getter 和 setter 是什么》

前言&#xff1a; 这两个属性在学习前端的时候看到过&#xff0c;但是由于项目中没有用到过&#xff0c;所以一直没有细致的了解。今天 review 同事代码的时候&#xff0c;遇到了这个写法&#xff0c;看了半天也不知道如何处理。再不学习真的以后连别人的代码都不知道什么意思了…

报名 | AI驱动下的流程挖掘如何提升企业决策和运营效率?

随着人工智能&#xff08;AI&#xff09;技术的不断发展和普及&#xff0c;其在各个领域的应用也越来越广泛。其中&#xff0c;一项重要的应用就是利用AI技术驱动流程挖掘&#xff0c;以提升企业决策和运营效率。 流程挖掘是一种从事件日志中发现、监控和优化实际业务流程的技…

Elasticsearch 安装

下载安装 elasticsearch下载链接 运行&#xff1a;bin\elasticsearch.bat 设置密码&#xff1a;.\bin\elasticsearch-setup-passwords interactive 这边设置密码遇到一个坑 PS G:\elasticsearch-8.8.1> .\bin\elasticsearch-setup-passwords interactiveFailed to authe…

0基础学习VR全景平台篇 第52篇:高级功能-开场加载!

大家好&#xff0c;欢迎观看蛙色VR官方系列——后台使用课程&#xff01; 本期为大家带来蛙色VR平台&#xff0c;高级功能-开场加载&#xff01; 功能位置示意 一、本功能将用在哪里&#xff1f; 开场加载&#xff0c;指作品制作上线&#xff0c;观看者打开VR漫游作品首先看到…

机器学习技术(一)——python基础超详解

机器学习技术&#xff08;一&#xff09;——python基础超详解 文章目录 机器学习技术&#xff08;一&#xff09;——python基础超详解0、引言1、基础概念**:snake:变量****:snake:注释****:snake:输入 输出** 2、数据类型**:snake:数值类型****:snake:运算符****:snake:字符串…

直播预约 | 邀您共同探讨“云XR技术如何改变元宇宙的虚拟体验”

随着数字化时代的到来&#xff0c;元宇宙成为了人们关注的焦点。它是一个虚拟的世界&#xff0c;融合了现实与虚拟的元素&#xff0c;让人们可以以全新的方式进行交互、创作和体验。 云XR技术是元宇宙建设的重要支撑技术之一&#xff0c;元宇宙需要具备高度真实感、高度交互性…

7DGroup性能实施项目日记6

九月廿三 壬寅年 虎 庚戌月 甲辰日 全国在降温之际 不管如何&#xff0c;今天总算是执行起来了脚本。在配置了性能工具之Jmeter 后置监听器可视化数据逻辑的界面中&#xff0c;看到下图&#xff1a; 显然 TPS 在这个接口中能达到 1500 以上&#xff0c;这对第一次执行来说&am…

最优化--最大似然估计--最优化理论介绍

目录 最大似然估计 概念 最大似然估计原理 应用 最优化理论介绍 最优化问题 迭代求解 最大似然估计 概念 最大似然估计&#xff08;Maximum Likelihood Estimation&#xff0c;MLE&#xff09;是统计学中一种常用的参数估计方法。它基于观测数据&#xff0c;通过寻找…

win11禁止运行脚本的解除方法

win11使用Windows PowerShell执行脚本时&#xff0c;提示本系统上禁止运行脚本 解决办法&#xff08;按照步骤进行&#xff09;&#xff1a; 先以管理员身份运行PowerShell。 命令行输入set-ExecutionPolicy RemoteSigned回车&#xff0c;然后输入Y回车即可。至此问题解决。若…

向量的傅里叶变换

note 若要求矩阵的傅里叶变换&#xff0c;则对每个行或列向量求对应的傅里叶变换。 比如matlab中对矩阵求fft傅里叶变换就是对每个列向量分别求傅里叶变换。 code /*\brief:离散傅里叶变换\param dir:变换方向&#xff0c;-1为傅里叶正变换&#xff0c;1为傅里叶反变换\param…

LLM - 第2版 ChatGLM2-6B (General Language Model) 的工程配置

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://blog.csdn.net/caroline_wendy/article/details/131445696 ChatGLM2-6B 是开源中英双语对话模型 ChatGLM-6B 的第二代版本&#xff0c;在保留了初代模型对话流畅、部署门槛较低等众多优…

逍遥自在学C语言 | 函数初级到高级解析

前言 函数是C语言中的基本构建块之一&#xff0c;它允许我们将代码组织成可重用、模块化的单元。 本文将逐步介绍C语言函数的基础概念、参数传递、返回值、递归以及内联函数和匿名函数。 一、人物简介 第一位闪亮登场&#xff0c;有请今后会一直教我们C语言的老师 —— 自在…

python用flask将视频显示在网页上

注意我们的return返回值必须是以下之一&#xff0c;否则会报错 from flask import Flask, render_template, Response import cv2app Flask(__name__)app.route(/) def index():return render_template(index.html)def gen(camera):while True:success, image camera.read(…

组装电脑U盘重装Win10系统教程图解

当您需要对组装电脑进行重新安装Win10操作系统时&#xff0c;使用U盘是一种方便而有效的方法&#xff0c;U盘重装系统不仅可以帮助您解决各种系统问题&#xff0c;还能提供一个干净、稳定的系统环境。无论您是初学者还是有一定经验的用户&#xff0c;本教程将提供清晰的组装电脑…

人机环境系统智能能够解决以巴冲突吗?

巴以冲突的由来可以追溯到19世纪末和20世纪初&#xff0c;当时巴勒斯坦是奥斯曼帝国的一部分&#xff0c;但随着第一次世界大战的爆发&#xff0c;奥斯曼帝国在1917年被英国占领。在此后的几十年里&#xff0c;巴勒斯坦地区成为了犹太人和阿拉伯人之间争夺的焦点。在20世纪初&a…

K8s部署 Redis 主从集群

目录 ​编辑 一、环境准备 1.1 环境说明 1.2 安装说明 1.3 Redis集群说明 1&#xff09;单实例模式 2&#xff09;哨兵模式 3&#xff09;集群模式 二、安装NFS 2.1 安装NFS 2.2 创建NFS共享文件夹 2.3 配置共享文件夹 2.4 使配置生效 2.5 查看所有共享目录 ​编…