SpringCloud组件——Nacos

前面已经介绍了一种注册中心组件Eureka了,现在再介绍一个新的。

一.准备

Nacos(Dynamic Namingand Configuration Service)是由阿里巴巴提供的开源一款云原生应用配套工具,其不仅仅是一个注册中心组件。

1.下载

大家可以去Nacos官网去下载:Nacos官网| Nacos 配置中心 | Nacos 下载| Nacos 官方社区 | Nacos 官网

下载后解压,我们就能得到下面的文件了:

下面介绍文件中的内容是什么:

1)bin:Nacos启停脚本

其中startup.sh是Linux的启动脚本,shutdown.sh是Linux的停止脚本。

2)conf:Nacos的配置文件

3)target:存放Nacos应用的jar包

2.修改模式

Nacos默认启动方式是集群模式,我们可以将其改成单机模式。

1)打开startup.cmd,找到下面圈出的哪一行

2)将cluster改成standalone

 保存就修改成功了。

通过 127.0.0.1:8848/nacos 就可以访问了:

3.端口号冲突

默认的端口号是8848,如果这个端口号被其他应用占用了,就会发生报错。我们可以使用下面的方法来去解决这个问题。

1)关闭占用8848端口的进程

通过在cmd上输入:

netstat -ano|findstr "8848"

 我们就可以得到PID(30680):

通过PID我们就可以将这个进程杀死:

taskkill /pid 4968 -f

 2)修改端口号

在conf文件下,找到下面圈出的文件:

在文件中找到端口号修改即可:

二.服务注册和服务发现

1.引入spring-cloud-alibaba的依赖

在父项目中引入下列依赖:

<properties>
    <spring-cloud-alibaba.version>2022.0.0.0-RC2</spring-cloud-alibaba.version>
</properties>

<!--注意是放在<dependencyManagement>下-->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-alibaba-dependencies</artifactId>
    <version>${spring-cloud-alibaba.version}</version>
    <type>pom</type>
    <scope>import</scope>
</dependency>

2.引入Nacos相关依赖

在服务提供者和服务消费者中引入下列依赖:

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

3.修改配置文件

服务提供者和服务消费者都要加入下面的内容:

spring:
    application:
        name: product-service
    cloud:
        nacos:
            discovery: 
                server-addr: 127.0.0.1:8848

4.修改远程调用的代码

这个代码在服务消费者中:

@Resource
RestTemplate restTemplate;

@RequestMapping("/{orderId}")
public OrderInfo getOrderById(@PathVariable("orderId") Integer orderId){
    OrderInfo orderInfo = orderMapper.selectByOrderId(orderId);
    String url="http://product-service/product/"+orderInfo.getProductId();
    ProductInfo productInfo = restTemplate.getForObject(url, ProductInfo.class);
    orderInfo.setProductInfo(productInfo);
    return orderInfo;
}

启动服务后可以在Nacos上查看:

 三.负载均衡

Nacos支持多种负载均衡策略,包括权重,同机房,同地域,同环境等。

1.权重

在Nacos服务列表点击下面内容就可设置权重了:

 开启Nacos负载均衡策略,下面的配置加在服务消费者处:

spring:
    cloud:
        loadbalancer:
            nacos:
                enabled: true

2.同集群优先访问

同集群优先访问就是优先让同集群的服务提供者提供服务。

这一要使用同集群优先访问也要开启Nacos负载均衡。

为集群设置名称,这个服务消费者和提供者可以写:

spring:
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
        cluster-name: Canton

四.健康检查

1.检查机制

Nacos提供了两种健康检查机制:

1)客户端主动上报机制:

客户端通过心跳上报方式告知服务端(nacos注册中心)健康状态,默认心跳间隔5秒。nacos会在超过15秒未收到心跳后将实例设置为不健康状态,超过30秒将实例删除。

2)服务端反向探测机制:

nacos主动探知客户端健康状态,默认间隔为20秒。健康检查失败后实例会被标记为不健康,不会被立即删除。

注意:Nacos中的健康检查机制不能主动设置,健康检查机制是和Nacos的服务实例类型强相关的。

2.服务实例类型

Nacos的服务实例分为两种类型:

1)临时实例:如果实例宕机超过⼀定时间,会从服务列表剔除,采取的是客户端主动上报机制,默认类型。

2)非临时实例(永久实例):如果实例宕机,不会从服务列表剔除,采取服务器端反向探测机制。

通过修改配置文件可以设置非临时实例,加在服务消费者处:

spring:
    cloud:
        nacos:
            discovery:
                ephemeral: false 

当我们修改后,重启服务,发现会报错,启动失败了。

报错信息:

Current service DEFAULT_GROUP@@order-service is persistent service, can't register ephemeral instance.

原因:Nacos会记录每个服务实例的IP和端口号,当发现IP和端口都没有发生变化时,Nacos不允许⼀个服务实例类型发生变化,比如从临时实例,变为非临时实例就不行。

解决办法:

1)关闭Nacos;2)删除Nacos下的/data/protocol/raft

五.环境隔离

Nacos提供了namespace(命名空间)来实现环境的隔离,不同的namaspace的服务不可见。

1.创建namespace

2.配置namespace

写在配置文件中,服务消费者和提供者都可以写:

spring:
    cloud:
        nacos:
            discovery:
                namespace: 命名空间ID

六.配置中心

配置中心就是对这些配置项进行统⼀管理,通过配置中心,可以集中查看,修改和删除配置,无需再逐个修改配置文件。

(更新!)今天在写项目的时候我要用云服务器上的Redis,这个时候就要配置IP地址,但是我不想让别人知道我的IP地址(因为我要提交到Gitee上)。所以可以使用配置中心配置这些敏感信息,这样别人就不知道我的IP地址了。

1.添加配置

在Nacos官网配置:

2.引入依赖

在服务提供者中引入NacosConfig依赖:

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
    <version>2022.0.0.0</version>
</dependency>
<!-- SpringCloud 2020.*之后版本需要引⼊bootstrap-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-bootstrap</artifactId>
</dependency>

3.配置bootstrap.yml 

该配置文件放在服务提供者的resources中。

Nacos要求必须使用bootstrap.yml或bootstrap.properties配置文件来配置NacosServer地址。

spring:
  application:
    name: product-service
  cloud:
    nacos:
      config:
        server-addr: 127.0.0.1:8848

其实spring.application.name要与Nacos配置管理的DataID(上图中有)一致;spring.cloud.nacos.config.server-addr为NacosServer地址。

此外还可以设置命名空间:

spring:
    cloud:
        nacos:
            config:
                namespace: 命名空间ID

4.编写程序获取配置

@RefreshScope
@RestController
public class NacosController {
    @Value("${nacos.config}")
    private String nacosConfig;

    @RequestMapping("/getConfig")
    public String getConfig(){
        return "从Nacos获取配置项nacos.config:"+nacosConfig;
    }
}

七.Nacos与Eureka的区别

EurekaNacos
功能服务发现和注册服务发现和注册、配置中心、流量管理、DNS服务
CAP理论AP原则可以切换AP和CP模式,默认AP
服务发现基于拉模式。EurekaClient会定期从Server拉取服务信息,有缓存,默认每30秒拉取⼀次基于推送模式。服务列表有变化时实时推送给订阅者,服务端和客户端保持心跳连接

八.Nacos配置MySQL数据库 

我们前面在配置中心配置的信息在Nacos重启后就没了,如果我们需要这个配置信息,我们可以配置数据库,将配置信息存在数据库中,这样就是实现了数据的持久化。

具体的操作方法大家可以看官网写的,官网写的很详细:nacos配置mysql数据库 | Nacos 官网

### 配置 Spring Cloud 使用 Nacos #### 服务发现配置 为了使应用程序能够利用 Nacos 进行服务注册与发现,在项目的依赖管理文件 `pom.xml` 或者 `build.gradle` 中需加入特定的依赖库[^1]。 对于 Maven 构建工具而言,应添加如下依赖: ```xml <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency> ``` 接着,在主程序类上标注 `@EnableDiscoveryClient` 注解来激活服务发现特性。这一步骤确保了应用实例能够在启动时自动向 Nacos Server 注册自己,并能感知其他已注册的服务实例的存在[^3]。 最后,编辑 `application.yml` 文件以指定连接到哪个具体的 Nacos 实例及其相关参数设置: ```yaml spring: cloud: nacos: discovery: server-addr: localhost:8848 # Nacos服务器地址 ``` 以上配置使得该微服务成为 Nacos 客户端的一员,参与到了整个集群内的服务治理流程之中。 #### 配置管理集成 为了让 Spring Cloud 应用可以从 Nacos 获取外部化配置数据,同样需要引入额外的支持包——即针对配置中心设计的 starter 组件[^2]: ```xml <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> </dependency> ``` 随后调整 `bootstrap.yml` (注意不是 application.yml),用于定义获取远程配置所需的基础信息,比如 Nacos Config Server 的位置等重要细节: ```yaml spring: application: name: example-service # 应用名称 cloud: nacos: config: server-addr: localhost:8848 # Nacos配置中心地址 file-extension: yaml # 指定配置文件格式,默认为properties ``` 完成上述步骤之后,当本地资源加载期间未能找到相应属性键值对时,便会尝试从远端拉取最新的配置版本并覆盖默认设定;反之如果存在同名条目,则优先采用内联方式声明的内容。 通过这种方式,不仅简化了跨环境部署过程中频繁修改静态文件的工作量,而且增强了运行期灵活性,允许管理员随时在线调整业务逻辑而不必重启任何进程即可生效变更。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值