Nacos笔记

什么是Nacos

image-20221115202158063

Nacos 是一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台,具有配置管理服务发现两大功能

配置中心

  • 系统从一个单体应用,被拆分成分布式系统上一个个服务节点后,配置文件也必须跟着迁移

  • 这样配置就分散了,不仅如此,分散中还包含着冗余

为什么使用配置中心

  • 应用程序在启动和运行的时候往往需要读取一些配置信息

  • 配置基本上伴随着应用程序的整个生命周期

  • 配置中心将配置从应用中剥离出来,再通过加载配置文件的顺序不同,实现差异化配

image-20221115201942269

安装并启动 Nacos

github 下载 Nacos 压缩包,解压缩到本地即可,地址

image-20221115202412801

Nacos-1.1.4 为分界线,1.1.4 之上的版本,对应的 mysql 版本为 8.01.1.4 之下对应的是 mysql 5.7 ,与 mysql 版本不匹配,无法使用

下载解压缩之后

  1. 首先要创建一个名为 nacos-mysql 的数据库,创建数据库的 sql 文件位于 ${nacos_dir}/conf/nacos-mysql.sql

  2. 修改其中的配置文件 ${nacos_dir}/conf/application.properties ,在其中添加 mysql 相关信息

# 链接外部mysql数据库
spring.datasource.platform=mysql
db.num=1
db.url.0=jdbc:mysql://127.0.0.1/nacos-mysql?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
db.user=uour_username
db.password=your_password
  1. 双击 ${nacos-dir}/bin/startup.cmd 启动 nacos ,出现如下界面,启动成功

image-20221115203144360

  1. nacos 的默认启动端口为 8848 ,登录账户和密码均为 nacos ,登录之后,页面如下

image-20221115203318384

3 Nacos 应用于微服务

3.1 读取微服务的配置

  1. 在微服务项目中要使用 Nacos,首先要引入依赖
<!--SpringCloud Alibaba依赖-->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-alibaba-dependencies</artifactId>
    <version>2.2.0.RELEASE</version>
    <type>pom</type>
    <scope>import</scope>
</dependency>
<!--SpringCloud依赖-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-dependencies</artifactId>
    <version>Hoxton.RELEASE</version>
    <type>pom</type>
    <scope>import</scope>
</dependency>
<!--SpringBoot依赖-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-dependencies</artifactId>
    <version>2.2.2.RELEASE</version>
    <type>pom</type>
    <scope>import</scope>
</dependency>
<!--jsckson依赖需要引入,否则有概率项目无法启动-->
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-core</artifactId>
    <version>2.10.2</version>
</dependency>
<!--SpringCloud Alibaba Nacos 配置依赖-->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
    <version>2.2.0.RELEASE</version>
</dependency>
<!--SpringBoot Web依赖-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <version>2.2.2.RELEASE</version>
</dependency>
  1. 在微服务项目中,Nacos 依赖于 SpringCloud AlibabaSpringCloudSpringBoot 相互依赖,需要确定一直对应的版本号,否则项目启动会出错,具体的版本对应关系如下

SpringBoot、SpringCloud、SpringCloud Alibaba 毕业版本对照表:

image-20221115204124233

SpringCloud Alibaba 各组件版本对照表

image-20221115204219838

  1. 接下来是项目中配置文件的编写(文件命名必须是 bootstrap.yml,否则读取到的配置为空)
server:
  port: 8082
spring:
  application:
    name: service-two
  cloud:
    nacos:
      config:
        server-addr: 127.0.0.1:8848
        file-extension: yaml # dataId = name + file-extension(必须是yaml,不能是yml)
        namespace: 08714022-716d-438b-8d20-1c52a9b5a205
        group: SKG

注意点:

  • Nacos 配置文件的名称必须是:bootstrap.yml ,在项目中会变成一个带云朵的小绿叶

image-20221115204618385

  • Nacos 配置中心管理端,假如配置的 dataIdnacos-test.yaml ,那么在项目的配置文件中,name 必须为 nacos-testfile-extension 必须为 yaml ,项目启动后会根据 dataId = name + file-extension 的形式去匹配 dataId

  • 配置文件中的 namespace 必须是那一长串号码,直接写 namespace 的名称(devpublic 等)无效

image-20221115205029683

  1. 配置文件写好之后,在项目中想要读取配置中心的配置,直接使用 @Value 注解便可取到值
@Value("${spring.port}")
private String port;

image-20221115205251094

  1. 使用 @Value 注解拿到的值,不会根据远程配置的修改而变化,想要达到远程与项目配置同时更改的效果,需要使用环境上下文来实现
@Autowired
private ConfigurableApplicationContext applicationContext;

@GetMapping("/config1")
public String config(){
    return applicationContext.getEnvironment().getProperty("spring.port");
}

3.1 自定义 dataId

  • 扩展配置文件使用关键字 extension-configs 定义,优先级高于 shared-configs ,低于 name + file-extension

  • 共享配置文件使用关键字 shared-configs 定义,优先级最低

spring:
  application:
    name: service-one
  cloud:
    nacos:
      config:
        server-addr: 127.0.0.1:8848
        file-extension: yaml # dataId = name + file-extension(必须是yaml,不能是yml)
        namespace: 08714022-716d-438b-8d20-1c52a9b5a205
        group: SKG
        # 常规扩展配置文件,优先级大于 shared-configs,在 shared-configs 之后加载
        extension-configs:
          - data-id: nacos-config-extension-01.yml
            group: EXTENSION_GROUP
            refresh: true
          - data-id: nacos-config-extension-02.yml
            group: EXTENSION_GROUP
            refresh: true
        # 共享配置文件,优先级最低
        shared-configs:
          - data-id: shared-config-01.yml
            group: SHARED_GROUP
          - data-id: shared-config-02.yml
              group: SHARED_GROUP

4 集群部署

使用一个电脑模拟 Nacos 集群,需要将 nacos 安装目录拷贝多份

需改每一份的端口号均不一致(例如拷贝三份,端口号分别为:8848、8847、8846),然后需要将配置文件中的 ip 进行绑定

image-20221119201223955

# nacos01
server.port=8848
nacos.inetutils.ip-address=127.0.0.1

# nacos02
server.port=8847
nacos.inetutils.ip-address=127.0.0.1

# nacos03
server.port=8846
nacos.inetutils.ip-address=127.0.0.1

在安装目录 ${nacos_dir}/conf/ 下有一个名为 cluster.conf.example 文件,将其命名为 cluster.conf ,然后在里面配置所有集群的 ip 信息

127.0.0.1:8848
127.0.0.1:8847
127.0.0.1:8846

现在环境已经配置好,进入 ${$naocs_dir}/bin 路径之下(三个环境均要执行如下命令),使用如下命令启动 Nacos 集群服务

startup.cmd -m cluster

三个环境均启动成功之后,打开浏览器,随便进入一个 nacos 的控制台,点击侧边栏最后一项“节点列表”,里面出现如下信息说明集群配置成功

image-20221119202303411

随便关闭一个节点,任然可以使用别的集群来进行服务

至于想要使用多个数据库,可以进行如下配置:

spring.datasource.platform=mysql
db.num=3
db.url.0=jdbc:mysql://127.0.0.1/nacos-mysql?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
db.url.1=jdbc:mysql://127.0.0.1/nacos-mysql?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
db.url.2=jdbc:mysql://127.0.0.1/nacos-mysql?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
db.user=root
db.password=root

5 服务发现

5.1 服务协作流程

SprigCloud 常见的集成方式是使用 Feign + Ribbon 来实现服务间的远程调用及负载均衡的

  • 在微服务启动时,每个微服务都会向服务中心上报自身的实例信息(每个实例包括 IP 地址、端口号等)

  • 微服务会定期从 Nacos Server 获取服务实例列表

  • ServiceA 调用 ServiceB 时, Ribbon 组件会从本地服务实例列表中查找 ServiceB 实例

  • 如果有多个实例,Ribbon 会通过用户配置的负载均衡策略,从中选择一个实例

  • 最终,Feign 组件和通过 Ribbon 选取的实例发送 http 请求

image-20221123133332046

5.2 服务发现Demo

假设现在有两个微服务,一个为服务提供者,一个为服务消费者,服务名称分别为:nacos-providernacos-consumer

首先创建父子工程,两个模块(生产者、消费者),引入相关依赖

<dependencies>
    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-alibaba-dependencies</artifactId>
        <version>2.1.0.RELEASE</version>
        <type>pom</type>
        <scope>import</scope>
    </dependency>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-dependencies</artifactId>
        <version>Greenwich.RELEASE</version>
        <type>pom</type>
        <scope>import</scope>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-dependencies</artifactId>
        <version>2.1.3.RELEASE</version>
        <type>pom</type>
        <scope>import</scope>
    </dependency>
    <dependency>
        <groupId>org.apache.httpcomponents</groupId>
        <artifactId>httpclient</artifactId>
        <version>4.5.13</version>
    </dependency>
    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        <version>2.1.0.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
        <version>2.1.3.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-openfeign</artifactId>
        <version>2.2.1.RELEASE</version>
    </dependency>
</dependencies>
  1. 针对服务提供者:

在配置文件中配置服务名称以及 nacos 服务的地址

server:
  port: 56010

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

对外暴露提供服务的地址

@RestController
public class ProviderController {

    @GetMapping("/service")
    public String service(){
        return "invoke provider";
    }
}

主启动类需要开启 Nacos 服务发现和 Fegin 客户端,消费者也一样

@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
public class ProviderApplication {
    public static void main(String[] args) {
        SpringApplication.run(ProviderApplication.class, args);
    }
}
  1. 针对服务消费者:

配置文件与服务提供者几乎一模一样,只需修改端口号和服务名称即可

server:
  port: 56020

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

首先,消费者需要创建服务提供者的接口类,申明调用哪个服务、调用哪个地址

@FeignClient(value = "nacos-provider")
public interface ProviderClient {

    @GetMapping("/service")
    public String service();
}

然后,消费者就可以通过注入服务提供者客户端的方式,来远程调用服务提供者的方法

@RestController
public class ConsumerController {

    @Resource
    private ProviderClient providerClient;

    @GetMapping("/service")
    public String service(){
        String providerResult = providerClient.service();
        return "consumer invoke --> " + providerResult;
    }
}
  1. 启动两个微服务,进入 nacos 管理页面,发现两个微服务都已经进行了注册

image-20221123154237860

  1. 最后就可以模仿消费者访问服务提供者的方法,即访问 http://localhost:56020/service

image-20221123154351624

posted @   悟道九霄  阅读(125)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
历史上的今天:
2021-11-15 time头文件
点击右上角即可分享
微信分享提示