Nacos开发实战

本文编写一个程序来说下Nacos开发实战部分,nacos可以作为注册中心和配置中心来使用,在本文中都会说到,会编写对应的程序实例来说明。


环境准备

nacos启动

本文不会说Nacos相关的概念与理论知识,以及如何安装nacos服务,如有需要,请自行查看博主的其他文章。启动nacos服务

在这里插入图片描述

进入nacos的控制面板

在这里插入图片描述


mysql数据库配置

当nacos作为配置中心的时候,需要将配置信息保存在数据库中进行持久化。我这里使用的nacos版本是1.4.3,mysql数据库的版本是8.0.13。

在这里插入图片描述

注意:nacos1.3.1版本以下与mysql8.0+会产生冲突。nacos1.4.3版本中默认是集群的形式来启动,如果是单机版本,请修改startup.cmd中的mode。

在这里插入图片描述

最后需要在配置文件中修改mysql数据库的连接信息,注意:nacos官方给的db.url可能启动不了

在这里插入图片描述
在这里插入图片描述

根据nacos-mysql.sql数据库脚本建立对应的脚本信息

在这里插入图片描述
在这里插入图片描述


配置中心测试

启动nacos以后,打开nacos的控制面板,新建一个如下配置

在这里插入图片描述

查看数据库中对应的配置信息

在这里插入图片描述


项目管理规范

springboot,netflix和cloud alibaba之间有版本之间的对应关系,本文选择的版本如下

在这里插入图片描述

为了后续方便使用SpringCloud Alibaba进行开发, 首先创建一个pom类型的父项目, 主要用于项目技术栈版本管理, 创建一个maven项目,名称为spring-cloud-alibaba-example, 去除src文件, 修改pom文件

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>ah.wideth</groupId>
    <artifactId>spring-cloud-alibaba-example</artifactId>
    <version>1.0-SNAPSHOT</version>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.3.12.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <packaging>pom</packaging>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <java.version>1.8</java.version>
        <spring-cloud.version>Hoxton.SR12</spring-cloud.version>
        <com-alibaba-cloud.version>2.2.7.RELEASE</com-alibaba-cloud.version>
    </properties>

    <!--对项目版本进行管理-->
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>

            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>${com-alibaba-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

</project>

后续创建的项目都放到此目录下, 只需要声明groupId和artifactId, 会自动引用父项目spring-cloud-alibaba-example的版本。与其说是父项目, 不如说是根项目: 因为下面每学习一个新的技术, 就会新建一个真正的父项目, 而在对应的父项目下面又会创建许多的子项目

在这里插入图片描述


Nacos服务发现与注册案例

项目结构层次图

在这里插入图片描述

创建一个父项目nacos-example, 修改pom文件

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>spring-cloud-alibaba-example</artifactId>
        <groupId>ah.wideth</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>

    <packaging>pom</packaging>

    <modules>
        <module>provider</module>
        <module>consumer</module>
    </modules>

    <modelVersion>4.0.0</modelVersion>

    <artifactId>nacos-example</artifactId>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
            <!--解决nacos-client2.0报错的问题-->
            <exclusions>
                <exclusion>
                    <artifactId>nacos-client</artifactId>
                    <groupId>com.alibaba.nacos</groupId>
                </exclusion>
            </exclusions>
        </dependency>

        <dependency>
            <groupId>com.alibaba.nacos</groupId>
            <artifactId>nacos-client</artifactId>
            <version>1.4.1</version>
        </dependency>
    </dependencies>
    
</project>

服务提供者provider

创建服务提供者项目provider, 修改其pom文件, 创建配置文件application.yml, 启动类, 创建相关的controller

pom文件

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>nacos-example</artifactId>
        <groupId>ah.wideth</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>provider</artifactId>
</project>

配置文件application.yml

server:
  port: 8081

spring:
  application:
    name: nacos-provider
  cloud:  #nacos注册中心地址的配置法
    nacos:
      discovery:
        server-addr: localhost:8848  # nacos 注册中心的地址

启动类

package ah.wideth;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

/***
 * 服务提供
 * 者启动类
 */
@SpringBootApplication
@EnableDiscoveryClient  //开启服务的注册与发现
public class ProviderApplication {

    public static void main(String[] args) {

        SpringApplication.run(ProviderApplication.class, args);
        System.out.println("服务提供者8081启动了!!");
    }

}

controller

package ah.wideth.controller;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

/***
 * 服务提供
 * 者测试接口
 */
@RestController
public class ProviderController {

    @GetMapping("/hello")
    public String hello(){

        return "hello nacos-provider-8081";
    }
}


服务消费者consumer

创建服务提供者项目consumer, 修改其pom文件, 创建配置文件application.yml, 启动类, 创建相关的controller

pom文件

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>nacos-example</artifactId>
        <groupId>ah.wideth</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>consumer</artifactId>
</project>

配置文件application.yml

server:
  port: 8082
  
spring:
  application:
    name: nacos-consumer
  cloud:  #nacos注册中心地址的配置
    nacos:
      discovery:
        server-addr: localhost:8848  # nacos 注册中心的地址

启动类

package ah.wideth;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

@SpringBootApplication
@EnableDiscoveryClient
public class ConsumerApplication {

    public static void main(String[] args) {

        SpringApplication.run(ConsumerApplication.class, args);
        System.out.println("服务消费者8082启动了!!");
    }

}

config

package ah.wideth.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;

@Configuration
public class ConsumerConfig {

    // 定义 RestTemplate Bean
    @Bean
    public RestTemplate restTemplate(){
        return new RestTemplate();
    }
}

controller

package ah.wideth.controller;


import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.loadbalancer.LoadBalancerClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

@RestController
public class ConsumerController {

    // 引入 RestTemplate 和 LoadBalancerClient
    @Autowired
    private RestTemplate restTemplate;

    @Autowired
    private LoadBalancerClient loadBalancerClient;

    @GetMapping("/hello")
    public String hello() {

        // 根据服务名获取服务实例
        ServiceInstance serviceInstance = loadBalancerClient.choose("nacos-provider");

        // 发起调用,返回调用结果
        return restTemplate.getForObject(serviceInstance.getUri() + "/hello" , String.class);
    }
    
}

Nacos远程调用测试

本文简单使用RestTemplate来进行服务之间的调用,后续会继续使用nacos整合openFegin,和nacos整合dubbo来进行服务之间的调用

登录nacos的图形化界面 http://localhost:8848/nacos

在这里插入图片描述

服务提供者调用测试

在这里插入图片描述

服务消费者调用测试

在这里插入图片描述


Nacos_EndPoint_配置项

Nacos Discovery 内部提供了一个 Endpoint, 对应的 endpoint id 为 nacosdiscovery。我们通过该 Endpoint,能获取到:

  • 当前服务有哪些服务订阅者
  • 当前应用 Nacos 的基础配置信息

endpoint 的设计背景

当 nacos server 集群需要扩缩容时,客户端需要有一种能力能够及时感知到集群发生变化。及时感知到集群的变化是通过 endpoint 来实现的。也即客户端会定时的向endpoint 发送请求来更新客户端内存中的集群列表。

在这里插入图片描述
下面将修改 Provider 子模块,实现 Nacos Discovery 对外暴露 EndPoint

修改 pom.xml ,添加依赖

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>nacos-example</artifactId>
        <groupId>ah.wideth</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>provider</artifactId>

    <dependencies>
        <!--服务监控  用于查看服务订阅者信息 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
    </dependencies>

</project>

修改 application.yml


server:
  port: 8081

spring:
  application:
    name: nacos-provider
  cloud:  #nacos注册中心地址的配置法
    nacos:
      discovery:
        server-addr: localhost:8848  # nacos 注册中心的地址

# Endpoint 本身对外界隐藏显示,我们需要在配置里面开启对 Endponit 的显示支持。
# exposure.include:对外界保留哪些 Endpoint,若是所有则使用* ;
management:
  endpoints:
    web:
      exposure:
        include: "*"

重启项目后访问:http://localhost:8081/actuator/

在这里插入图片描述

查看服务相关的信息:http://localhost:8081/actuator/nacosdiscovery

在这里插入图片描述

附上Nacos Discovery Stater 配置项(在application.yml配置)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


Nacos配置中心案例

nacos中的几个概念

命名空间(Namespace)

命名空间可用于进行不同环境的配置隔离。一般一个环境划分到一个命名空间

配置分组(Group)

配置分组用于将不同的服务可以归类到同一分组。一般将一个项目的配置分到一组

配置集(Data ID)

在系统中,一个配置文件通常就是一个配置集。一般微服务的配置就是一个配置集

在这里插入图片描述


项目搭建架构

在 nacos-example 的基础上,搭建一个 config-client,用来搭建nacos 配置中心的案例测试,如下图

在这里插入图片描述

建 config-client 模块,并修改 pom.xml 文件

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>nacos-example</artifactId>
        <groupId>ah.wideth</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>config-client</artifactId>

    <dependencies>

        <!-- 加依赖 nacos-config -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
        </dependency>

    </dependencies>

    <!--Spring Boot Maven 打包插件, 用于 java -jar jarPath -->
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>

本地配置信息输出

在说配置中心之前,先写个小例子来输出yaml文件中的配置信息。添加配置(application.yaml):

test:
  name: local-config

添加一个测试接口,用于输出配置值:

package ah.wideth.controller;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

/***
 * 配置中心
 * 测试接口
 */
@RestController
public class ConfigClientController {

    @Value("${test.name}")
    private String test_name;

    @GetMapping("/getConfigInfo")
    public String getConfigInfo(){

        return test_name;
    }
}

测试结果

在这里插入图片描述
成功输出了本地配置。


Nacos中新建配置

进入 Nacos 控制的配置列表页面:

在这里插入图片描述

Data ID 项填写服务名 config-client.yaml,配置格式选择 YAML,配置内容中填写:

test:
  name: nacos-config

这里把配置的值改为了 “nacos-config”,用于与之前的 “local-config” 作为区分,然后点击页面底部的发布按钮。


服务整合Nacos配置

Nacos 配置的依赖在第一步已经添加好了,下面主要是修改配置。

首先,把之前的 application.yaml 文件名改为 bootstrap.yaml,这是因为 bootstrap.yaml 的优先级是最高的。

然后,在 bootstrap.yaml 中添加配置:

server:
  port: 8888

spring:
  application:
    name: config-client
  cloud:
    nacos:
      config: # nacos作为配置中心
        server-addr: localhost:8848
        file-extension: yaml

注意,现在服务本地配置文件中已经没有 “test.name” 这个配置项了

重新启动服务,再次刷新页面

在这里插入图片描述
此次输出的值为 Nacos 中配置的 “nacos-config”,说明已经成功读取了 Nacos 中的配置信息。

现在需要说明一下服务为什么可以自动找到 Nacos 中的配置文件

服务启动时,会读取 bootstrap.yaml 中指定的 nacos config 服务器地址,然后根据 spring.application.name 配置项的值与 spring.cloud.nacos.config.file-extension 的值构造出 Data ID,由此就可以读取到 Nacos 中的配置文件了。


配置信息动态刷新

如果希望在 Nacos 修改配置之后,实例可以动态获取最新值,则需要添加一个注解 @RefreshScope

代码如下:

package ah.wideth.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 ConfigClientController {

    @Value("${test.name}")
    private String test_name;

    @GetMapping("/getConfigInfo")
    public String getConfigInfo(){

        return test_name;
    }
}

重新启动服务。下面在 Nacos 控制台修改配置:

在这里插入图片描述

在现有值的后面添加了字符串 “-new”,以作为区分:

在这里插入图片描述

确认无误后,点击确认发布按钮。这样配置就修改完成了,下面刷新页面:

在这里插入图片描述
可以看到,已经变成了刚刚修改后的值。注意,修改配置后可没有重启服务,说明已经成功实现了配置的动态刷新


访问指定环境下的配置文件

创建两个命名空间, 用于管理一个项目不同环境下的配置文件。分别为dev和pro。

在这里插入图片描述

命名空间创建后, 在配置列表中就可以选择对应命名空间,然后创建不同环境下的配置文件。在开发环境dev中新建配置。

在这里插入图片描述
在这里插入图片描述

修改bootstrap.yml

server:
  port: 8888

spring:
  application:
    name: config-client
  cloud:
    nacos:
      config: # nacos作为配置中心
        server-addr: localhost:8848
        namespace: 46ff6296-10dd-4cfb-86e0-b85b72b42198 #命名空间的ID
        group: DEFAULT_GROUP
        file-extension: yaml

  profiles:
    active: dev   # 使用开发环境配置文件

测试访问结果

在这里插入图片描述


本文小结

本文详细介绍了nacos作为注册中心和配置中心是如何使用的,对掌握nacos有极大的帮助。

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值