三.Nacos

本文详细介绍了Nacos在SpringBoot项目中的集成,包括服务注册与发现、统一配置管理、配置文件的切换以及数据库配置。还涵盖了如何实现实时热更新和集群模式部署以提高系统的健壮性。
摘要由CSDN通过智能技术生成

本文档中的Nacos为Alibaba Nacos

目录

1.Nacos基本概念

2.Nacos安装

3.Nacos集成SpringBoot实现服务注册与发现

3.1 在pom中添加依赖

3.2 在application.yml中配置如下信息

3.3 将RestTemplate注册到Ioc容器中

3.4 配置服务提供者和消费者

领域模型:

4.Nacos实现统一配置管理

4.1基础概念及配置

4.1.1⬇️ 在项目中添加依赖

4.1.2⬇️ 在配置文件中添加config相关属性

application.yml和bootstrap.yml的区别

4.1.3⬇️ 在Nacos配置中心添加配置文件

4.1.4▶️ 在Nacos中的配置文件中添加属性

4.1.5 热更新

4.2.6 配置文件的切换

4.2.7 配置数据库

4.2.7.1⬇️ 添加Mysql数据库

4.2.7.2⬇️ 转储sql文件

4.2.7.3▶️ 修改配置文件

4.2 Nacos集群模式

4.2.1⬇️ 模拟集群环境

4.2.2⬇️修改配置文件

4.2.3▶️运行即可


1.Nacos基本概念

Nacos是阿里巴巴推出来的一个新开源项目,致力于帮助发现,配置和管理微服务.Nacos提供了一组简单易用的特性集,帮助快速实现动态服务发现,服务配置,服务元数据,及流量管理

Nacos是以服务为主要服务对象的中间件,Nacos支持所有主流的服务发现,配置和管理,Nacos主要提供以下四个功能:

  • 服务发现和服务健康检测
  • 动态配置服务
  • 动态DNS服务
  • 服务及其元数据管理

nacos服务客户端(要注册到nacos的服务)启动时会每隔一段时间(默认5秒)向nacos发生心跳包,nacos注册中心15秒内没有检测到心跳包会默认认为nacos处于一种不健康的状态,30秒还没收到则认为这个服务已不可用。

2.Nacos安装

下载链接

将文件夹直接拷贝到指定盘(路径不能有中文),随后修改bin目录下的startup.cmd文件,集群模式改为单机模式

set MODE="cluster"修改为set MODE="standalone"

保存后单击此文件运行即可

启动后,直接在浏览器访问 localhost:8848/nacos,账号密码都是nacos

3.Nacos集成SpringBoot实现服务注册与发现

3.1 在pom中添加依赖

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

3.2 在application.yml中配置如下信息

spring:
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848
        # 因部分本机可能安装了VMware虚拟机,因此可能不止一个网卡,所以需指定ip,如果没有则不需指定
        ip: 127.0.0.1

3.3 将RestTemplate注册到Ioc容器中

 @Bean
    @LoadBalanced
    RestTemplate restTemplate() {
        return new RestTemplate();
    }

3.4 配置服务提供者和消费者

服务提供者:

package com.bdqn.qianmo.user.controller;

import com.bdqn.beans.User;
import com.bdqn.qianmo.user.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/user")
public class UserController {
    @Autowired
    UserService userService;
    @Value("${server.port}")
    int port;
    @GetMapping("/{id}")
    public User getUserById(@PathVariable Long id) {
        System.out.println("port: "+port);
        return userService.getById(id);
    }
}

服务消费者:

package com.bdqn.qianmo.order.service.impl;

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.bdqn.beans.Order;
import com.bdqn.beans.User;
import com.bdqn.qianmo.order.service.OrderService;
import com.bdqn.qianmo.order.mapper.OrderMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.client.RestTemplate;

/**
 *
 */
@Service
@Transactional(rollbackFor = Exception.class)
public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order>
        implements OrderService {
    @Autowired
    RestTemplate restTemplate;

    @Override
    public Order selectById(Long id) {
        Order order = this.getBaseMapper().selectById(id);
        User forObject = restTemplate.getForObject("http://user-service/user/" + order.getUserId(), User.class);
        order.setUser(forObject);
        return order;
    }
}




注:服务提供者和服务消费者为两个分开运行的SpringBoot项目中,项目启动后效果如图

领域模型:

4.Nacos实现统一配置管理

4.1基础概念及配置

当微服务部署的实例越来越多,达到数十、数百时,逐个修改微服务配置就会让人抓狂,而且很容易出错。我们需要一种统一配置管理方案,可以集中管理所有实例的配置。而Nacos一方面可以将配置集中配置,另一方面可以在配置变更时,及时通知微服务,实现配置的热更新

那么,如何在Nacos中配置管理呢,步骤如下

4.1.1⬇️ 在项目中添加依赖

在pom文件中添加nacos-config依赖

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

4.1.2⬇️ 在配置文件中添加config相关属性

需要注意的是,此处的文件名应该为bootstrap.yml文件

spring:
  cloud:
    nacos:
      config:
        #nacos配置中心的地址
        server-addr: localhost:8848
        #文件后缀
        file-extension: yml
        #共享的配置文件列表
        shared-configs:
          - application-common.yml
    #微服务名称
  application:
    name: user-service
application.yml和bootstrap.yml的区别

在SpringCloud的官方文档中有描述两个文件的区别

官网链接

原文经过翻译后,大致意思如下:

Spring Cloud 构建于 Spring Boot 之上,在 Spring Boot 中有两种上下文,一种是 bootstrap, 另外一种是 application, bootstrap 是应用程序的父上下文,也就是说 bootstrap 加载优先于 applicaton。bootstrap 主要用于从额外的资源来加载配置信息,还可以在本地外部配置文件中解密属性。这两个上下文共用一个环境,它是任何Spring应用程序的外部属性的来源。bootstrap 里面的属性会优先加载,它们默认也不能被本地相同配置覆盖。

因此,对比application文件,bootstrap配置文件有以下几个特性

  • bootstrap由父ApplicationContext记载,优先级比application高
  • bootstrap中的属性不能被application中的相同属性覆盖

bootstrap/application的应用场景:

application主要用于SpringBoot项目的自动配置

bootstrap配置文件则有以下几个应用场景:

  • 使用SpringCloud Config配置中心时,需要在bootstrap中添加连接到配置中心的配置属性来加载外部配置中心的配置信息;
  • 一些固定的不能被覆盖的属性
  • 一些加密/解密的场景

总结:

优先级为:bootstrap.properties>bootstrap.yml>application.properties>application.yml

bootstrap为系统级别,application为应用级别

4.1.3⬇️ 在Nacos配置中心添加配置文件

需要注意的是,此处的Data ID必须要和项目中配置的微服务名称和文件后缀一样,比如在4.2中配置的是user-service的微服务名称,后缀为yml,那么此处的Data ID就必须为"user-service.yml"

4.1.4▶️ 在Nacos中的配置文件中添加属性

添加完后,即可正常启动项目了

启动流程如下:

4.1.5 热更新

Nacos中的配置文件更新时,如何在项目不重新启动的情况下也能做到热更新呢,其实很简单,只需要在Controller中添加@RefreshScope注解修饰类即可

@RestController
@RequestMapping("/user")
@RefreshScope
public class UserController {
    @Autowired
    UserService userService;

    @Value("${server.port}")
    int port;

    @Value("${activeTest}")
    String activeTest;



    @GetMapping("/{id}")
    public User getUserById(@PathVariable Long id) {
        System.out.println("port: "+port);
        return userService.getById(id);
    }

    @GetMapping("/getTest")
    public String get() {
        return activeTest;
    }
}

这样,当配置文件中的属性被修改时,则可以在不重启项目的情况下进行属性值的更新

@RefreshScope: 经过@RefreshScope注解修饰的Bean,将被RefreshScope进行代理,当配置变更时可以在不重启jvm的前提下刷新Bean中相关的属性值和Bean的热更新。

4.2.6 配置文件的切换

在实际应用场景中,运行的环境可能分为测试环境和dev环境或本地环境,预发布环境,线上环境,那如何在不修改微服务名称的情况下,进行配置文件的切换呢?只需要在bootstrap中添加一个属性即可

profiles.active的规则:

active的值,直接影响项目在nacos中寻找配置文件:微服务名称+"-"+"."+文件类型,例如:

  • 此处的active值若为test,则项目在Nacos配置列表中查找的就是user-service-test.yml的配置文件
  • 此处的active值若为dev,则项目在Nacos配置列表中查找的就是user-service-dev.yml的配置文件

4.2.7 配置数据库

在Nacos单机模式中,nacos使用嵌入式数据库实现数据的存储,不方便观察数据存储的基本情况,因此需要配置mysql数据库,可视化的查看数据的存储情况,步骤如下:

4.2.7.1⬇️ 添加Mysql数据库

先创建一个空的数据库

4.2.7.2⬇️ 转储sql文件

在nacos的安装路径下,找到conf文件夹下的nacos-mysql.sql文件

转储此文件,效果如下:

4.2.7.3▶️ 修改配置文件

在nacos的安装路径下,找到conf文件夹下的application.properties文件

修改后如下:

4.2 Nacos集群模式

为了避免在实际项目中会产生的单点故障,Nacos的运行模式要从单机转为集群

以下操作,所有nacos都需要进行,有一个没有修改则无法运行集群模式

4.2.1⬇️ 模拟集群环境

安装三个nacos来模拟集群环境

然后检查启动器(安装路径下bin目录的startup.cmd文件)的运行模式:

4.2.2⬇️修改配置文件

a. 修改nacos安装路径下config文件夹中的application.properties文件,修改端口号

注意的是,三个nacos的端口号都应该避免重复,以避免端口号占用

b. 同样的文件,修改ip号(如果本机没有安装虚拟机,且只有一个网卡则无需配置)

c. 复制一个安装路径下conf文件夹下的cluster.conf.example文件,并删除.example后缀

d.修改cluster.conf文件,将三个修改后的nacos端口号添加进去

4.2.3▶️运行即可

依次启动三个nacos,效果如图:

微服务项目中的配置如图:

  • 9
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值