nacos2.x作为配置中心和服务注册和发现以及springcloud使用

news2024/11/15 4:55:17

目录

一、nacos是什么

二、windows下安装配置nacos

1、准备

2、安装nacos

3、配置nacos

4、启动并且访问nacos

三、springcloud使用nacos作为配置中心

四、springcloud使用nacos进行服务注册与发现

五、springcloud使用nacos进行服务消费

六、nacos的一些高级配置

1.临时实例和持久实例

2.保护阈值

3.NacosRule

4.Cluster就近访问

5.订阅者列表

七、nacos使用中遇到的一些报错以及解决方法

1.没有配置dataId

2.不可以使用进行服务使用


来都来了点个赞收藏一下再走呗~~~🌹🌹🌹🌹🌹

一、nacos是什么

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service的首字母简称,一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。

Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理。

Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。 Nacos 是构建以“服务”为中心的现代应用架构 (例如微服务范式、云原生范式) 的服务基础设施。

nacos主要功能:

  1. 服务发现:Nacos 支持服务的注册与发现,服务实例可以动态地加入或退出集群,服务消费者可以通过Nacos服务发现机制快速地获取到服务提供者的访问地址。
  2. 配置管理:Nacos 提供统一的配置管理平台,支持配置的统一管理、统一推送、统一生效等功能。
  3. 服务健康监测:Nacos 提供服务健康监测功能,可以实时监测服务实例的健康状况,及时发现并处理服务故障。
  4. 动态服务路由:Nacos 支持动态服务路由,可以根据服务实例的负载情况动态地调整服务路由策略,提高系统的可用性和扩展性。
  5. 高可用性:Nacos 支持集群模式部署,通过集群节点之间的数据同步和故障转移机制,保证服务的高可用性。

二、windows下安装配置nacos

1、准备

1.JDK环境

2.Mysql环境

3.Maven环境

2、安装nacos

nacos官网地址:https://github.com/alibaba/nacos/releases

当然nacos是在git上的可能会下载有点慢这个地方我也给出nacos的百度网盘下载链接: https://pan.baidu.com/s/1PYKdPX5P2E3WbOFYADl_gQ?pwd=t6uz 提取码: t6uz 

解压nacos-2.2.3.rar文件到你自己的环境目录下,如下所示:

3、配置nacos

1、配置数据库

①、创建数据库:create database nacos_config character set utf8mb4 collate utf8mb4_general_ci;

②、导入数据:参见nacos根目录\conf\mysql-schema.sql文件,在nacos_config数据库下执行此sql文件

2、配置nacos

编辑“nacos根目录\conf\application.properties”—>打开文件—>将下面配置放到application.properties文件末尾—>保存并关闭该文件

#***********************************MySql*************************************
spring.datasource.platform=mysql
db.num=1
db.url.0=jdbc:mysql://localhost:3306/nacos_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
db.user=root
db.password=root

4、启动并且访问nacos

启动Dos窗口,执行如下命令:

cd nacos根目录\bin
startup.cmd -m standalone

说明: Nacos 默认以集群模式启动。

访问nacos

启动浏览器—>访问http://localhost:8848/nacos/,如下所示:

三、springcloud使用nacos作为配置中心

首先在nacos中先新增一条配置:

新建配置,新建完点击发布:

一些概念的定义:

dataId

  • 定义dataId 是配置项的唯一标识符。

  • 作用:在 Nacos 中,每个配置项都有一个唯一的 dataId,它用于区分不同的配置项。dataId 通常由应用名、配置项名和配置的扩展名组成,例如:myapp.properties

  • 使用场景

    • 在服务发现中,dataId 可以用于唯一标识一个服务实例。

    • 在配置管理中,dataId 用于检索和更新配置项。

group

  • 定义group 是配置项的分组标识符。

  • 作用group 用于将相关的配置项组织在一起,方便管理和检索。不同的 group 可以包含不同的配置项,从而实现逻辑上的分组。

  • 使用场景

    • 在服务发现中,group 可以用于区分不同服务的实例,例如,可以将一个应用的不同服务实例放在不同的 group 中。

    • 在配置管理中,group 可以用于将相关的配置项组织在一起,便于管理和检索。

命名空间

  • 定义:命名空间是 Nacos 中的一个逻辑隔离环境,用于区分不同的环境或应用。

  • 作用:命名空间允许用户在同一个 Nacos 集群中管理多个不同的环境或应用的配置和服务发现信息,而不会相互干扰。

springcloud使用nacos配置,pom.xml文件引入依赖,引入spring-cloud-starter-bootstrap的原因是springboot项目启动不会默认加载bootstrap文件。

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
    <version>2.2.8.RELEASE</version>
</dependency>
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-bootstrap</artifactId>
    <version>3.0.3</version>
</dependency>
bootstrap.properties文件
#nacos服务器地址
spring.cloud.nacos.server-addr=127.0.0.1:8848
#对应去找那个nacos的dataId
spring.application.name=test

 controller层,获取配置并且显示

package com.example.demo.controller;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.ArrayList;
import java.util.List;

@RefreshScope
@RestController
public class testController {

    @Value("${spring.username}")
    private String username;

    @GetMapping("test")
    public String test(){
        return username;
    }

}

注解说明 :
@RefreshScope 此注解配置的目的是让nacos的配置可以自动刷新
@Value("${spring.username}") 此注解的目的,大家应该都知道就是做配置获取值的 

 测试:启动springboot项目---》在浏览器中访问localhost:8080/test ,我们可以得到结果如下图所示:

并且你可以在nacos中更新配置看看自动属性配置是否生效,这个地方我就不演示了,可以自己去尝试一下。

四、springcloud使用nacos进行服务注册与发现

第一步:需要在 pom.xml 文件中引入 group ID 为 com.alibaba.cloud 和 artifact ID 为 spring-cloud-starter-alibaba-nacos-discovery 的 starter:

<!--服务注册-->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    <version>2.2.8.RELEASE</version
</dependency>

 第二步:添加应用配置:在应用的 /src/main/resources/application.properties 配置文件中配置 Nacos Server 地址(当然如果你做了配置中心的话这个地方就可以不用在加了):

spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848

第三步:使用 @EnableDiscoveryClient 注解开启服务注册与发现功能:

@SpringBootApplication
@EnableDiscoveryClient
public class Demo4Application {

    public static void main(String[] args) {
        SpringApplication.run(Demo4Application.class, args);
    }

}

 第四步:启动服务并且在nacos可视化界面验证,服务是否注册成功,这个地方的服务名也就是在bootstrap.propertes中设置的spring.application.name=test。

至此我们就学会了最简单的服务注册功能了。 

五、springcloud使用nacos进行服务消费

第一步:新建一个springboot项目作为consumer消费者,并且引入pom.xml文件依赖如下:

        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
            <version>2.2.8.RELEASE</version>
        </dependency>
        <!--服务注册-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
            <version>2.2.8.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-bootstrap</artifactId>
            <version>3.0.3</version>
        </dependency>

第二步:编写bootstrap.properties文件,文件内容也就是把consumer注册到nacos服务端中,如下所示 :

# 应用服务 WEB 访问端口
server.port=7070

spring.cloud.nacos.server-addr=127.0.0.1:8848
spring.application.name=consumer
spring.cloud.loadbalancer.nacos.enabled=true

第三步:引入RestTemplate,并且注入到springboot的bean中,代码如下所示:

package com.ltx.nacosconsumer.demos.config;
 
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;
import org.springframework.web.client.RestTemplate;
 
 
@Component
public class RestTemplateConfig {

    @Bean
    @LoadBalanced   //负载均衡
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }
}

第四步:编写controller并且调用provider中的方法

package com.ltx.nacosconsumer.demos.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

@RestController
public class ConsumerController {
    @Autowired
    private RestTemplate restTemplate;

    @GetMapping(value = "/test")
    public String test() {
        return restTemplate.getForObject("http://provider/t", String.class);
    }
}

注意的是我们provider也就是我最先编写的那个test把spring.application.name=provider,改名得到的 ,改名了之后记得把配置中心里面的dataId也要改一下,并且在provider中的controller如下所示;

package com.example.demo.controller;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RefreshScope
@RestController
public class testController {

    @Value("${spring.username}")
    private String username;

    @GetMapping("/t")
    public String t(){
        return "恭喜您测试成功啦!";
    }
}

第五步:浏览器测试访问,localhost:7070/test ,结果如下所示:

六、nacos的一些高级配置

1.临时实例和持久实例

其实实际上的持久实例和临时实例就差了一个注解只需要实现下面的注解就可以变成持久实例了

spring.cloud.nacos.discovery.ephemeral=false

因为之前的provider是临时实例所以我们直接加上注解就会报错

解决此问题我们需要去删掉nacos中的文件,\nacos\data\protocol\raft\naming_instance_metadata 下的文件全部删掉就可以了(在执行删除文件的操作之前需要把nacos的服务停止)

重新启动nacos,并且把刚刚配置的持久实例启动起来。我们可以发现这个时候服务就变成持久实例了。如图所示:

当然这个时候我们也可以停掉刚刚的持久实例我们就可以知道为什么是叫做持久实例了

因为是持久实例所以不会在我们听到此服务的时候就直接的删除实例

临时实例和持久化实例的区别

临时实例与持久化实例的区别主要体现在服务器对该实例的处理上。

临时实例向Nacos注册,Nacos不会对其进行持久化存储,只能通过心跳方式保活。默认模式是:客户端心跳上报Nacos实例健康状态,默认间隔5秒,Nacos在15秒内未收到该实例的心跳,则会设置为不健康状态,超过30秒则将实例删除。

持久化实例向Nacos注册,Nacos会对其进行持久化处理。当该实例不存在时,Nacos只会将其健康状态设置为不健康,但并不会对将其从服务端删除。

2.保护阈值

保护阈值的主要作用是防止健康实例因负载过高而被压垮。通过设置保护阈值,即使部分实例不健康,也可以将流量分散到所有实例中,从而避免健康实例因负载过高而崩溃

我举一个例子来说就是,如果我本来我这个服务上注册了100个实例,而且我设置的保护阈值是0.2,当我机器挂掉80台的时候就会触发保护阈值,这个时候当用户访问的时候,也是会从这100个实例中去访问采用随机或者权重的方式访问这些实例,虽然有些访问到80个挂了的机器上的实例时,不会得到结果,但是可以保证20个实例不会因为过高的并发而导致挂掉整个系统完全不可以用的情况发生。

保护阈值配置如下所示:

3.NacosRule

在 Nacos 中,NacosRule 是一个用于定义服务路由规则的类。它主要用于实现服务的智能路由,包括流量控制、权重分配、服务保护等功能。

4.Cluster就近访问

在 Nacos 中,Cluster(集群)就近访问是一种服务发现和路由策略,旨在优化服务调用的性能和响应时间。通过将请求路由到距离客户端最近的服务实例,可以减少网络延迟,提高响应速度。

只需要在服务注册的时候加上配置就好了,但是在服务器要使用的时候也需要加上配置就可以指定近距离的先使用。

spring.cloud.nacos.config.cluster-name=bj

5.订阅者列表

通过订阅者列表查询我们可以简单的就知道有哪些ip地址的人访问过ip地址了

七、nacos使用中遇到的一些报错以及解决方法

1.没有配置dataId

报错如下所示

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'scopedTarget.testController': Injection of autowired dependencies failed; nested exception is java.lang.IllegalArgumentException: Could not resolve placeholder 'spring.username' in value "${spring.username}"
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessProperties(AutowiredAnnotationBeanPostProcessor.java:405) ~[spring-beans-5.2.15.RELEASE.jar:5.2.15.RELEASE]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1425) ~[spring-beans-5.2.15.RELEASE.jar:5.2.15.RELEASE]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:593) ~[spring-beans-5.2.15.RELEASE.jar:5.2.15.RELEASE]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:516) ~[spring-beans-5.2.15.RELEASE.jar:5.2.15.RELEASE]

此报错是因为找不到配置,因为没有正确的配置dataId就不知道去找哪个配置,所以就会出现找不到 spring.username,所以我们在需要使用到nacos作为配置中的时候一定要注意配置dataId

2.不可以使用进行服务使用

因为可能在高版本的nacos中springcloud并没有很好的兼容,就会出现一个情况你并不可以直接使用@LoadBalanced这个注解进负载均衡的配置,就会导致你可以使用RestTemplate中的方法,但是不可以使用服务名进行动态的帮你负载均衡,比如我之前使用到的2021.0.5版本的就用不了。

解决方法:降低或者重新选择版本进行尝试。

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

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

相关文章

IP地址申请HTTPS证书

申请IP地址的HTTPS证书是一个相对简单但需要仔细操作的过程。选择合适的CA机构&#xff0c;明确所需证书类型&#xff0c;按照规定步骤提交申请并验证信息&#xff0c;最后正确安装和部署&#xff0c;即可实现通过IP地址访问的安全HTTPS连接。 下面是具体的申请流程&#xff0…

云盘高速视觉检测机,如何提高螺丝件的检测效率?

螺纹螺丝钉是一种常见的螺纹结构紧固件&#xff0c;通常由金属制成&#xff0c;具有螺旋状的螺纹结构。这种螺丝钉旨在通过旋入螺纹孔或材料中&#xff0c;实现可靠的固定连接。 螺纹螺丝钉具有螺旋状的螺纹结构&#xff0c;使其能够轻松旋入金属或其他硬质材料。主要用于金属…

Spring Boot 引入 Guava Retry 实现重试机制

为什么要用重试机制 在如今的系统开发中&#xff0c;为了保证接口调用的稳定性和数据的一致性常常会引入许多第三方的库。就拿缓存和数据库一致性这个问题来说&#xff0c;就有很多的实现方案&#xff0c;如先更新数据库再删除缓存、先更新缓存再更新数据库&#xff0c;又或者…

江苏省发改委副主任钱海云一行莅临我司调研指导

近日&#xff0c;江苏省发改委副主任钱海云、支援合作处副处长卢桐、调研员鲁培和一行&#xff0c;在江宁开发区管委会及市、区发改委有关负责人陪同下&#xff0c;莅临南京天洑软件有限公司走访调研。天洑软件总工程师郭阳博士携管理层参与本次调研活动。 在参观过程中&#x…

【C++】选择结构- 嵌套if语句

嵌套if语句的语法格式&#xff1a; if(条件1) { if(条件1满足后判断是否满足此条件) {条件2满足后执行的操作} else {条件2不满足执行的操作} } 下面是一个实例 #include<iostream> using namespace std;int main4() {/*提示用户输入一个高考分数&#xff0c;根据分…

通过 Function-Call Input Events启用图表中的控制状态

在由function-call input event启用的图表中&#xff0c;可以通过设置启用图表时的状态属性来控制状态的行为。根据此属性的值&#xff0c;当输入事件重新启用图表时&#xff0c;状态要么保持其最新值&#xff0c;要么恢复为初始值。要修改属性&#xff0c;请执行以下操作&…

一文读懂《制造业数字化转型行动方案》

​在推动新型工业化与构建现代化产业体系的宏伟蓝图中&#xff0c;制造业的数字化转型无疑是至关重要的一环。随着国务院常务会议正式批准《制造业数字化转型行动方案》&#xff08;简称《方案》&#xff09;&#xff0c;标志着我国制造业正式迈入了一个全面拥抱数字化、智能化…

C++迈向精通:STL-iterator_traits迭代器类型萃取解析

STL-iterator_traits迭代器类型萃取解析 源码 在阅读STL源码的时候遇到了这样的一行代码&#xff1a; 通过ctags跳转到对应的定义区域&#xff1a; 下面还有两个特化版本&#xff1a; 根据英文释义&#xff0c;发现模板中需要传入的是一个迭代器类型&#xff0c;在上面找到源…

NAND Flash 的 SDR、ONFI、DDR 接口

NAND Flash 的 SDR、ONFI、DDR 接口 1. 省流导图 2. SDR、ONFI、DDR 概述 2.1 SDR (Single Data Rate) SDR&#xff08;Single Data Rate&#xff09;是指读写数据使用 单个时钟信号的边缘&#xff0c;即上升沿或下降沿 。在 SDR 模式下&#xff0c;数据的传输速率受限于时钟…

用友U8 Cloud MeasureQueryFrameAction接口处SQL注入漏洞复现 [附POC]

文章目录 用友U8 Cloud MeasureQueryFrameAction接口处SQL注入漏洞复现 [附POC]0x01 前言0x02 漏洞描述0x03 影响版本0x04 漏洞环境0x05 漏洞复现1.访问漏洞环境2.构造POC3.复现用友U8 Cloud MeasureQueryFrameAction接口处SQL注入漏洞复现 [附POC] 0x01 前言 免责声明:请勿…

【Gin】深度解析:在Gin框架中优化应用程序流程的责任链设计模式(上)

【Gin】深度解析&#xff1a;在Gin框架中优化应用程序流程的责任链设计模式(上) 大家好 我是寸铁&#x1f44a; 【Gin】深度解析&#xff1a;在Gin框架中优化应用程序流程的责任链设计模式(上)✨ 喜欢的小伙伴可以点点关注 &#x1f49d; 前言 本次文章分为上下两部分&#xf…

Jenkins的相关概述和安装

Jenkins 1.什么是jenkins Jenkins是一个开源软件项目&#xff0c;是基于Java开发的一种持续集成工具&#xff0c;用于监控持续重复的工作&#xff0c;旨在提供一个开放易用的软件平台&#xff0c;使软件项目可以进行持续集成。耗内存max 2. 为什么使用Jenkins 拉取、编译、打包…

AI绘画入门实践|Midjourney:使用 --no 去除不想要的物体

在 Midjourney 中&#xff0c;--no 作为反向提示词&#xff0c;告诉 MJ 在生成图像时&#xff0c;不要包含什么。 使用格式&#xff1a;--no 对应物体提示词&#xff08;多个物体之间使用","间隔&#xff09; 使用演示 a web banner, summer holiday --v 6.0 a web b…

变阻器在实际应用中需要注意哪些安全事项?

变阻器是广泛应用于电子设备中的电子元件&#xff0c;它可以改变电阻值以控制电流的大小。然而&#xff0c;在实际应用中&#xff0c;如果操作不当&#xff0c;可能会引发一些安全问题。因此&#xff0c;使用变阻器时&#xff0c;必须注意以下安全事项&#xff1a; 1. 选择合适…

windows wsl ubuntu系统安装桌面可视化

参考&#xff1a; https://www.bilibili.com/read/cv33557374/ 1&#xff09;首先先安装好wsl ubuntu系统 2&#xff09;安装 Ubuntu 桌面版 sudo apt purge -y acpid acpi-support modemmanagersudo apt-mark hold acpid acpi-support modemmanager sudo apt install ubunt…

UE4如何直接调试Game

某些功能在编辑器里不好调试&#xff0c;例如Pak&#xff0c;就需要直接调试 Game&#xff0c;做法是选择 Game&#xff0c;不要选择Client&#xff0c;加断点&#xff0c;然后点击 Debug 就好了。 断点调试成功&#xff1a; 同时看到界面&#xff1a;

中国森林地上和地下生物量碳变化数据集(2002-2021年)

中国森林地上和地下生物量碳变化数据集&#xff08;2002-2021年&#xff09; 数据介绍 为了量化中国近期全国性恢复工作的生态后果&#xff0c;过去20年森林生物量碳储量变化的空间显性信息至关重要。然而&#xff0c;在全国范围内进行长期生物量追踪仍然具有挑战性&#xff0c…

网络安全防御【IPsec VPN搭建】

目录 一、实验拓扑图 二、实验要求 三、实验思路 四、实验步骤&#xff1a; 修改双机热备的为主备模式&#xff1a; 2、配置交换机LSW6新增的配置&#xff1a; 3、防火墙&#xff08;FW4&#xff09;做相关的基础配置&#xff1a; 4、搭建IPsec VPN通道 &#xff08;1…

LINUX -exec函数族

1、功能&#xff1a; *让父子进程来执行不相干的操作 *能够替换进程地址空间的代码.text段 *执行另外的程序&#xff0c;不需要创建额外的的地址空间 *当前程序中调用另外一个应用程序 2、执行目录下的程序&#xff1a; *指定执行目录下的程序 int execl(const char *path,…

JavaSE从零开始到精通(九) - 双列集合

1.前言 Java 中的双列集合主要指的是可以存储键值对的集合类型&#xff0c;其中最常用的包括 Map 接口及其实现类。这些集合允许你以键值对的形式存储和管理数据&#xff0c;提供了便捷的按键访问值的方式。 2. HashMap HashMap 是基于哈希表实现的 Map 接口的类&#xff0c…