前语

前面咱们已经介绍过如何预备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版别,并为项目命名

Spring Cloud集成Nacos作为注册中心

  1. 办理项目依靠
<?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>
    <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>
</project>
  • 这个pom由于父工程,所以需求设置<packaging>pom</packaging>
  • 注意运用dependencyManagement ,实践并没有导入依靠,仅仅控制子工程的依靠版别

预备项目的通用模块

  1. 创立一个其他服务用到的通用模块common-utils

  2. 导入对应的依靠

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

Spring Cloud集成Nacos作为注册中心

创立一个UserService

  1. 通用模块创立好了之后咱们再创立一个用户服务
  2. 导入依靠
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
  1. 编写yml
server:
  port: 8081
spring:
  application:
    name: user-service
  cloud:
    nacos:
      discovery:
        server-addr: 192.168.199.128
  1. 发动项目

Spring Cloud集成Nacos作为注册中心

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

Spring Cloud集成Nacos作为注册中心

如图所示,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