Spring Cloud集成Nacos作为注册中心

语言: CN / TW / HK

前言

前面我们已经介绍过如何准备MySQL 以及Nacos 环境了,接下来就让我们继续接着上一讲开始使用Spring Cloud Alibaba 集成Nacos 作为注册中心吧

Nacos功能介绍:注册中心(AP和CP)

服务发现是微服务架构体系中最关键的组件之一。如果尝试着用手动的方式来给每一个客户端来配置所有服务提供者的服务列表是一件非常困难的事,而且也不利于 服务的动态扩缩容。Nacos Discovery Starter 可以帮助您将服务自动注册到 Nacos 服务端并且能够动态感知和刷新某个服务实例的服务列表。除此之外,Nacos Discovery Starter 也将服务实例自身的一些元数据信息-例如 host,port,健康检查URL,主页等注册到 Nacos

Nacos 最为核心功能:服务治理,随着微服务概念的流行,越来越多的系统被拆分成了多个服务,每个服务进行分布式部署,又因为服务与服务之间可能会互相调用,为了更好的管理服务与服务之间的调用关系,那么就需要一个注册中心来注册这些服务,消费者只需要拉取对应的服务列表,然后选择对应的负载均衡策略,选择其中一个服务调用就是

常用的服务注册中心有:Zookeeper Consul Eureka Nacos ,今天我们主要介绍Nacos

Nacos 的功能非常强大,也比较容易使用,支持APCP 模型(相对于Eureka 只支持AP 模型、Zookeeper 只支持CP 模型、Consul 只支持CP 来说是一个优势),而且Nacos 性能也非常出色,未来注册中心大概率将是Nacos 的天下,因为Eureka 从2.X版本开始已经闭源了,并且Eureka 服务注册时延比Nacos 大得多,而ZookeeperCP 架构,虽然极大可能保证了数据的强一致性,但是很大程度上牺牲了可用性,对于注册中心来说,绝大部分场景下对可用性的需求要大于一致性(即使集群节点间数据暂时不一致,其实并不影响本次请求的调用,因为还有负载策略重试其它机器,而且最终集群节点间数据最终也会一致,对于Nacos 来说不一致的时间最多也就短暂的几秒,完全可以接受),所以未来Nacos 大概率会替代其它注册中心框架成为主流。

准备父工程

  1. 创建一个Maven项目,如下图所示,选好你的jdk版本,并为项目命名

image-20220825122410554

  1. 管理项目依赖

```xml

4.0.0

<parent>
    <artifactId>spring-boot-starter-parent</artifactId>
    <groupId>org.springframework.boot</groupId>
    <version>2.7.0</version>
</parent>

<groupId>cuit.epoch.pymjl</groupId>
<artifactId>cloud-learn</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>pom</packaging>

<properties>
    <maven.compiler.source>11</maven.compiler.source>
    <maven.compiler.target>11</maven.compiler.target>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    <skipTests>true</skipTests>
    <spring-boot.version>2.7.0</spring-boot.version>
    <spring-cloud.version>2021.0.3</spring-cloud.version>
    <spring-cloud-alibaba.version>2021.0.1.0</spring-cloud-alibaba.version>
    <spring-cloud-starter-oauth2.version>2.2.5.RELEASE</spring-cloud-starter-oauth2.version>
    <druid.version>1.2.9</druid.version>
    <hutool.version>5.8.0</hutool.version>
    <mysql-connector.version>8.0.29</mysql-connector.version>
    <spring-data-commons.version>2.7.0</spring-data-commons.version>
    <jjwt.version>0.9.1</jjwt.version>
    <aliyun-oss.version>2.5.0</aliyun-oss.version>
    <logstash-logback.version>5.3</logstash-logback.version>
    <admin-starter-server.version>2.7.0</admin-starter-server.version>
    <minio.version>8.4.1</minio.version>
    <knife4j.version>3.0.3</knife4j.version>
    <nimbus-jose-jwt.version>9.23</nimbus-jose-jwt.version>
    <mybatis-plus.version>3.5.1</mybatis-plus.version>
    <velocity-engine-core.version>2.3</velocity-engine-core.version>
    <guava.version>31.0.1-jre</guava.version>
</properties>

<dependencyManagement>
    <dependencies>
        <!--Spring Cloud 相关依赖-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>${spring-cloud.version}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
        <!--Spring Cloud Alibaba 相关依赖-->
        <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>
        <!--集成druid连接池-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>${druid.version}</version>
        </dependency>
        <!--Hutool Java工具包-->
        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>${hutool.version}</version>
        </dependency>
        <!--Knife4j API文档生产工具-->
        <dependency>
            <groupId>com.github.xiaoymin</groupId>
            <artifactId>knife4j-micro-spring-boot-starter</artifactId>
            <version>${knife4j.version}</version>
        </dependency>
        <dependency>
            <groupId>com.github.xiaoymin</groupId>
            <artifactId>knife4j-spring-boot-starter</artifactId>
            <version>${knife4j.version}</version>
        </dependency>
        <!--Mysql数据库驱动-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>${mysql-connector.version}</version>
        </dependency>
        <!--SpringData工具包-->
        <dependency>
            <groupId>org.springframework.data</groupId>
            <artifactId>spring-data-commons</artifactId>
            <version>${spring-data-commons.version}</version>
        </dependency>
        <!--JWT(Json Web Token)登录支持-->
        <dependency>
            <groupId>io.jsonwebtoken</groupId>
            <artifactId>jjwt</artifactId>
            <version>${jjwt.version}</version>
        </dependency>
        <!--JWT(Json Web Token)登录支持-->
        <dependency>
            <groupId>com.nimbusds</groupId>
            <artifactId>nimbus-jose-jwt</artifactId>
            <version>${nimbus-jose-jwt.version}</version>
        </dependency>
        <!-- 阿里云OSS -->
        <dependency>
            <groupId>com.aliyun.oss</groupId>
            <artifactId>aliyun-sdk-oss</artifactId>
            <version>${aliyun-oss.version}</version>
        </dependency>
        <!--集成logstash-->
        <dependency>
            <groupId>net.logstash.logback</groupId>
            <artifactId>logstash-logback-encoder</artifactId>
            <version>${logstash-logback.version}</version>
        </dependency>
        <!--集成SpringBoot Admin监控-->
        <dependency>
            <groupId>de.codecentric</groupId>
            <artifactId>spring-boot-admin-starter-server</artifactId>
            <version>${admin-starter-server.version}</version>
        </dependency>
        <!--MinIO JAVA SDK-->
        <dependency>
            <groupId>io.minio</groupId>
            <artifactId>minio</artifactId>
            <version>${minio.version}</version>
        </dependency>
        <!--mybatis-plus相关-->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>${mybatis-plus.version}</version>
        </dependency>
        <!--mybatis-plus代码生成器-->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-generator</artifactId>
            <version>${mybatis-plus.version}</version>
        </dependency>
        <!--mybatis-plus代码生成器引擎-->
        <dependency>
            <groupId>org.apache.velocity</groupId>
            <artifactId>velocity-engine-core</artifactId>
            <version>${velocity-engine-core.version}</version>
        </dependency>
        <!--google工具包,jwt工具类会用到-->
        <dependency>
            <groupId>com.google.guava</groupId>
            <artifactId>guava</artifactId>
            <version>${guava.version}</version>
        </dependency>
    </dependencies>
</dependencyManagement>

```

  • 这个pom因为父工程,所以需要设置<packaging>pom</packaging>
  • 注意使用dependencyManagement ,实际并没有导入依赖,只是控制子工程的依赖版本

准备项目的通用模块

  1. 创建一个其他服务用到的通用模块common-utils
  2. 导入对应的依赖

  3. 编写一些工具类,主要是一些返回类以及一些常量,具体代码请看项目源码

image-20220825122905233

创建一个UserService

  1. 通用模块创建好了之后我们再创建一个用户服务
  2. 导入依赖

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

  1. 编写yml

yml server: port: 8081 spring: application: name: user-service cloud: nacos: discovery: server-addr: 192.168.199.128

  1. 启动项目

image-20220825192905741

  1. 登录Nacos 后台查看服务注册情况

image-20220825193046818

如图所示,user-service 已经成功注册到Nacos 中啦

  1. Nacos 的一些配置选项:

| 配置项 | Key | 默认值 | 说明 | | :-------------------: | :----------------------------------------------: | :--------------------------: | :----------------------------------------------------------: | | 服务端地址 | spring.cloud.nacos.discovery.server-addr | | Nacos Server 启动监听的ip地址和端口 | | 服务名 | spring.cloud.nacos.discovery.service | ${spring.application.name} | 给当前的服务命名 | | 服务分组 | spring.cloud.nacos.discovery.group | DEFAULT_GROUP | 设置服务所处的分组 | | 权重 | spring.cloud.nacos.discovery.weight | 1 | 取值范围 1 到 100,数值越大,权重越大 | | 网卡名 | spring.cloud.nacos.discovery.network-interface | | 当IP未配置时,注册的IP为此网卡所对应的IP地址,如果此项也未配置,则默认取第一块网卡的地址 | | 注册的IP地址 | spring.cloud.nacos.discovery.ip | | 优先级最高 | | 注册的端口 | spring.cloud.nacos.discovery.port | -1 | 默认情况下不用配置,会自动探测 | | 命名空间 | spring.cloud.nacos.discovery.namespace | | 常用场景之一是不同环境的注册的区分隔离,例如开发测试环境和生产环境的资源(如配置、服务)隔离等。 | | AccessKey | spring.cloud.nacos.discovery.access-key | | 当要上阿里云时,阿里云上面的一个云账号名 | | SecretKey | spring.cloud.nacos.discovery.secret-key | | 当要上阿里云时,阿里云上面的一个云账号密码 | | Metadata | spring.cloud.nacos.discovery.metadata | | 使用Map格式配置,用户可以根据自己的需要自定义一些和服务相关的元数据信息 | | 日志文件名 | spring.cloud.nacos.discovery.log-name | | | | 集群 | spring.cloud.nacos.discovery.cluster-name | DEFAULT | 配置成Nacos集群名称 | | 接入点 | spring.cloud.nacos.discovery.enpoint | UTF-8 | 地域的某个服务的入口域名,通过此域名可以动态地拿到服务端地址 | | 是否集成Ribbon | ribbon.nacos.enabled | true | 一般都设置成true即可 | | 是否开启Nacos Watch | spring.cloud.nacos.discovery.watch.enabled | true | 可以设置成false来关闭 watch |

项目源码:gitee github