学习笔记--SpringCloudAlibaba-Nacos

简介

Spring Cloud Alibaba 致力于提供微服务开发的一站式解决方案。此项目包含开发分布式应用微服务的必需组件,方便开发者通过 Spring Cloud 编程模型轻松使用这些组件来开发分布式应用服务。

依托 Spring Cloud Alibaba,您只需要添加一些注解和少量配置,就可以将 Spring Cloud 应用接入阿里微服务解决方案,通过阿里中间件来迅速搭建分布式应用系统。

主要功能

  • 服务限流降级 :默认支持 WebServlet、WebFlux, OpenFeign、RestTemplate、Spring Cloud Gateway, Zuul, Dubbo 和 RocketMQ 限流降级功能的接入,可以在运行时通过控制台实时修改限流降级规则,还支持查看限流降级 Metrics 监控。
  • 服务注册与发现 :适配 Spring Cloud 服务注册与发现标准,默认集成了 Ribbon 的支持。
  • 分布式配置管理 :支持分布式系统中的外部化配置,配置更改时自动刷新。
  • 消息驱动能力 :基于 Spring Cloud Stream 为微服务应用构建消息驱动能力。
  • 分布式事务 :使用 @GlobalTransactional 注解, 高效并且对业务零侵入地解决分布式事务问题。
  • 阿里云对象存储 :阿里云提供的海量、安全、低成本、高可靠的云存储服务。支持在任何应用、任何时间、任何地点存储和访问任意类型的数据。
  • 分布式任务调度 :提供秒级、精准、高可靠、高可用的定时(基于 Cron 表达式)任务调度服务。同时提供分布式的任务执行模型,如网格任务。网格任务支持海量子任务均匀分配到所有 Worker(schedulerx-client)上执行。
  • 阿里云短信服务 :覆盖全球的短信服务,友好、高效、智能的互联化通讯能力,帮助企业迅速搭建客户触达通道。

组件

[Sentinel] :阿里巴巴源产品,把流量作为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。

[Nacos] :一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。

[RocketMQ] :一款开源的分布式消息系统,基于高可用分布式集群技术,提供低延时的、高可靠的消息发布与订阅服务。

[Dubbo] :Apache Dubbo™ 是一款高性能 Java RPC 框架。

[Seata] :阿里巴巴开源产品,一个易于使用的高性能微服务分布式事务解决方案。

[Alibaba Cloud OSS] : 阿里云对象存储服务(Object Storage Service,简称 OSS),是阿里云提供的海量、安全、低成本、高可靠的云存储服务。您可以在任何应用、任何时间、任何地点存储和访问任意类型的数据。

[Alibaba Cloud SchedulerX]: 阿里中间件团队开发的一款分布式任务调度产品,提供秒级、精准、高可靠、高可用的定时(基于 Cron 表达式)任务调度服务。

[Alibaba Cloud SMS] : 覆盖全球的短信服务,友好、高效、智能的互联化通讯能力,帮助企业迅速搭建客户触达通道。

Nacos介绍

​ Nacos(Naming Configuration Service) 是一个易于使用的动态服务发现、配置和服务管理平台,用于构建云原生应用程序

服务发现是微服务架构中的关键组件之一。Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理。

​ Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。 Nacos 是构建以“服务”为中心的现代应用架构 (例如微服务范式、云原生范式) 的服务基础设施。

​ 说白了就是注册中心+配置中心组合

Nacos安装使用

官网网址:https://nacos.io/zh-cn/index.html

官网文档网址:https://nacos.io/zh-cn/docs/quick-start.html

下载地址:https://github.com/alibaba/nacos/releases

window:

1.下载window版解压以后找到bin目录

  1. 执行指令:

    Linux/Unix/Mac:启动命令(standalone代表着单机模式运行,非集群模式):

    sh startup.sh -m standalone
    

    Windows:启动命令(standalone代表着单机模式运行,非集群模式):

    startup.cmd -m standalone
    
  2. 结果:

    学习笔记--SpringCloudAlibaba-Nacos_第1张图片

  3. 然后访问:http://localhost:8848/nacos

学习笔记--SpringCloudAlibaba-Nacos_第2张图片

  1. 出现此界面表示已经成功启动Nacos,默认的账号密码是:nacos/nacos

学习笔记--SpringCloudAlibaba-Nacos_第3张图片

linux:

  1. 在官网上下载NacosLinux版本:https://github.com/alibaba/nacos/releases

学习笔记--SpringCloudAlibaba-Nacos_第4张图片

  1. 在Linux系统中解压此文件,并且把其中nacos目录拷贝到nacos目录中
tar -zxvf nacos-server-2.0.3.tar.gz
  1. 打开nacos目录下的bin目录输入命令即可执行

学习笔记--SpringCloudAlibaba-Nacos_第5张图片

Nacos服务注册消费

  • 首先创建一个父子项目

父项目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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.4.10</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>gfk</groupId>
    <artifactId>SpringCloudAlibabaMSB</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>SpringCloudAlibabaMSB</name>
    <packaging>pom</packaging>
    <description>SpringCloudAlibabaMSB</description>
    <properties>
        <java.version>1.8</java.version>
        <spring-cloud-alibaba-version>2.2.5.RELEASE</spring-cloud-alibaba-version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>
    <dependencyManagement>
        <dependencies>
            <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>
        </dependencies>
    </dependencyManagement>

    <modules>
        <module>cloudAlibaba-Nacos-9001</module>
    </modules>

</project>

​ 子项目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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>gfk</groupId>
        <artifactId>SpringAlibabaMSB</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>gfk</groupId>
    <artifactId>cloudalibaba-nacos-9001</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>cloudalibaba-nacos-9001</name>
    <description>cloudalibaba-nacos-9001</description>

    <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>
        </dependency>
    </dependencies>
</project>
  • 配置子项目的YML文件
server:
  port: 9001
spring:
  application:
    name: nacos-provider
  cloud:
    discovery:
      server-addr: 127.0.0.1:8848

management:
  endpoint:
    web:
      exposure:
        include:'*'
  • 启动类加注解
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

@SpringBootApplication
@EnableDiscoveryClient//加此注解
public class CloudalibabaNacos9001Application {

    public static void main(String[] args) {
        SpringApplication.run(CloudalibabaNacos9001Application.class, args);
    }

}

  • 测试

    注意,在启动项目前一定要启动Nacos!!!

学习笔记--SpringCloudAlibaba-Nacos_第6张图片

  • 改变上述端口为9002,然后再启动服务,得到名为nacos-provider的俩个服务,一个端口为9001,一个端口为9002
  • 再按照上边的步骤创建个子项目,一个端口为8083,服务名为nacos-consumer的服务

完成上述步骤后再查看nocas

注意:要先启动Nacos,然后再来启动服务

学习笔记--SpringCloudAlibaba-Nacos_第7张图片

Nacos使用Ribbon

Ribbon是一个基于HTTP和TCP客户端负载均衡器。它虽然只是一个工具类库,它却是每一个微服务的基础设施。因为实际上,对于服务间调用、API网关请求转发都需要经过Ribbon负载均衡来实现。总体来说,Ribbon的主要作用是:从注册服务器端拿到对应服务列表后以负载均衡的方式访问对应服务。

​ 何时使用Ribbon呢?一般情况下当一个模块需要从另外一个模块获取数据时候就需要使用Ribbon的远程访问功能了。

​ 要注意的是Nacos已经整合了Ribbon,所以我们想要使用只需要导入Spring Cloud Alibaba Nacos的依赖就可以直接使用了。

  • 首先我们就需要通过服务消费8083者来访问9001或者9002,但是在这之前,我们先在consumer-nacos-8083模块中的yml文件里添加一句话
server:
  port: 8083
spring:
  application:
    name: nacos-consumer
  cloud:
    discovery:
      server-addr: localhost:8848

# 消费者将要去访问的微服务名称(注册成功的Nacos的微服务提供者)
service-url:
  nacos-user-service: http://nacos-provider
  • 因为我们要是使用Ribbon,所以我们还需要在启动类上配置restTemplate
@SpringBootApplication
@EnableDiscoveryClient
public class CloudalibabaConsumerNacos8083Application {

    public static void main(String[] args) {
        SpringApplication.run(CloudalibabaConsumerNacos8083Application.class, args);
    }

    //RestTemplate封装了Ribbon调用的过程,其中getForObject是最常用方法
    @Bean
    @LoadBalanced
    public RestTemplate restTemplate(){
        return new RestTemplate();
    }

}
  • 配置好之后,我们就可以在8083的消费者上来通过Ribbon来自动的负载均衡调用9001或者9002的服务提供者了

生产者(服务提供方):

@RestController
public class DemoController {

    @Value("${server.port}")
    private String serverPort;

    @GetMapping(value = "/gfk")
    public String getServerPort(){
        return "Hello Nacos Discovery"+serverPort;
    }

}

消费者(服务调用方):

@RestController
public class DemoController {

    @Resource
    private RestTemplate restTemplate;

    /**
     * 消费者去访问具体服务,这种写法可以实现
     * 配置文件和代码的分离
     */
    @Value("${service-url.nacos-user-service}")
    private String serverURL;


    @GetMapping(value = "consumer/nacos")
    public String getDiscovery(){
        System.err.println(serverURL);
        return restTemplate.getForObject(serverURL+"/gfk",String.class);
    }
}
  • 测试结果
访问:http://localhost:8083/consumer/nacos

结果:Hello Nacos Discovery9001/9002(负载均衡切换显示) //输出了服务提供者的gfk请求下的东西

Nacos–CAP模型

​ 计算机专家 埃里克·布鲁尔(Eric Brewer)于 2000 年在 ACM 分布式计算机原理专题讨论会(简称:PODC)中提出的分布式系统设计要考虑的三个核心要素:

​ 一致性(Consistency):同一时刻的同一请求的实例返回的结果相同,所有的数据要求具有强一致性(Strong Consistency)

​ 可用性(Availability):所有实例的读写请求在一定时间内可以得到正确的响应

​ 分区容错性(Partition tolerance):在网络异常(光缆断裂、设备故障、宕机)的情况下,系统仍能提供正常的服务

​ 以上三个特点就是CAP原则(又称CAP定理),但是三个特性不可能同时满足,所以分布式系统设计要考虑的是在满足P(分区容错性)的前提下选择C(一致性)还是A(可用性),即:CP或AP

  • CP原则:一致性 + 分区容错性原则

​ CP 原则属于强一致性原则,要求所有节点可以查询的数据随时都要保持一直(同步中的数据不可查询),即:若干个节点形成一个逻辑的共享区域,某一个节点更新的数据都会立即同步到其他数据节点之中,当数据同步完成后才能返回成功的结果,但是在实际的运行过程中网络故障在所难免,如果此时若干个服务节点之间无法通讯时就会出现错误,从而牺牲了以可用性原则(A),例如关系型数据库中的事务。

  • AP原则:可用性原则 + 分区容错性原则

​ AP原则属于弱一致性原则,在集群中只要有存活的节点那么所发送来的所有请求都可以得到正确的响应,在进行数据同步处理操作中即便某些节点没有成功的实现数据同步也返回成功,这样就牺牲一致性原则(C 原则)。

​ 使用场景:对于数据的同步一定会发出指令,但是最终的节点是否真的实现了同步,并不保证,可是却可以及时的得到数据更新成功的响应,可以应用在网络环境不是很好的场景中。

  • Nacos支持CP和AP,Zookeeper使用的是 CP、而 Eureka采用的是AP

  • Nacos 何时选择切换模式

    1. 一般来说,如果不需要储存服务界别的信息且服务实例通过nacos-client注册,并能够保持心跳上报,那么就可以选择AP模式。如Spring Cloud 和 Dubbo,都适用于AP模式,AP模式为了服务的可用性减弱了一致性,因此AP模式下只支持注册临时实例。
    2. 如果需要在服务级别编辑或者储存配置信息,那么CP是必须的,K8S服务和DNS服务则是用于CP模式。CP模式下则支持注册持久化实例,此时则是以Raft协议为集群运行模式,该模式下注册实例之前必须先注册服务,如果服务不存在,则会返回错误。

    切换命令(默认是AP):

curl -X PUT '$NACOS_SERVER:8848/nacos/v1/ns/operator/switches?entry=serverMode&value=CP'

注意:临时和持久化的区别主要在健康检查失败后的表现,持久化实例健康检查失败后会被标记成不健康,而临时实例会直接从列表中被删除。

Nacos服务配置中心

Nacos不仅仅可以作为注册中心来使用,同时它支持作为配置中心

学习笔记--SpringCloudAlibaba-Nacos_第8张图片

首先我们还是新建Model:cloudalibaba-config-3377

pom文件

​ 这里我们主要要引入的是此依赖,这个依赖依据在官网上可以找到:https://spring-cloud-alibaba-group.github.io/github-pages/greenwich/spring-cloud-alibaba.html#_an_example_of_using_nacos_discovery_for_service_registrationdiscovery_and_call

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

YML配置

​ 要注意的是这里我们要配置两个,因为Nacos同SpringCloud-config一样,在项目初始化时,要保证先从配置中心进行配置拉取,拉取配置之后,才能保证项目的正常启动。

​ springboot中配置文件的加载是存在优先级顺序的,bootstrap优先级高于application

​ 分别要配置的是,这里bootstrap.yml配置好了以后,作用是两个,第一个让3377这个服务注册到Nacos中,第二个作用就是去Nacos中去读取指定后缀为yaml的配置文件:

bootstrap.yml

# nacos配置
server:
  port: 3377

spring:
  application:
    name: nacos-config-client
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848 #Nacos服务注册中心地址
      config:
        server-addr: localhost:8848 #Nacos作为配置中心地址
        file-extension: yaml #指定yaml格式的配置

application.yml

spring:
  profiles:
    active: dev # 表示开发环境

主启动

@SpringBootApplication
@EnableDiscoveryClient
public class CloudalibabaConfig3377Application {

    public static void main(String[] args) {
        SpringApplication.run(CloudalibabaConfig3377Application.class, args);
    }

}

业务类

​ 这里的@RefreshScope实现配置自动更新,意思为如果想要使配置文件中的配置修改后不用重启项目即生效,可以使用@RefreshScope配置来实现

import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RefreshScope //支持Nacos的动态刷新功能
public class ConfigClientController {

    @Value("${config.info}")
    private String configInfo;

    @Value("${/config/info}")
    public String getConfigInfo(){
        return configInfo;
    }

}

Nacos配置规则

​ 在 Nacos Spring Cloud 中,dataId 的完整格式如下(详情可以参考官网 https://nacos.io/zh-cn/docs/quick-start-spring-cloud.html):

${prefix}-${spring.profiles.active}.${file-extension}
1. `prefix` 默认为 `spring.application.name` 的值,也可以通过配置项 `spring.cloud.nacos.config.prefix`来配置。
2. `spring.profiles.active` 即为当前环境对应的 profile,注意:**当 `spring.profiles.active` 为空时,对应的连接符 `-` 也将不存在,dataId 的拼接格式变成 `${prefix}.${file-extension}`**(不能删除)
3. `file-exetension` 为配置内容的数据格式,可以通过配置项 `spring.cloud.nacos.config.file-extension` 来配置。目前只支持 `properties` 和 `yaml` 类型。
4. 通过 Spring Cloud 原生注解 `@RefreshScope` 实现配置自动更新:
5. 所以根据官方给出的规则我们最终需要在Nacos配置中心添加的配置文件的名字规则和名字为:
//以此项目为例--------
# ${spring.application.name}-${spring.profiles.active}.${file-extension}
# nacos-config-client-dev.yaml
# 微服务名称-当前环境-文件格式

学习笔记--SpringCloudAlibaba-Nacos_第9张图片

Nacos平台创建配置操作

增加配置

学习笔记--SpringCloudAlibaba-Nacos_第10张图片

学习笔记--SpringCloudAlibaba-Nacos_第11张图片

config: 
    info: nacos config center,version = 1

然后在配置中心就会看到刚刚发布的配置

学习笔记--SpringCloudAlibaba-Nacos_第12张图片

修改Nacos配置,不需要重启项目即可自动刷新

学习笔记--SpringCloudAlibaba-Nacos_第13张图片

修改版本号为2,点击发布

学习笔记--SpringCloudAlibaba-Nacos_第14张图片

测试:启动服务访问服务来测试(没有修改之前是1,修改之后不需要重启项目既可以直接获取最新配置):http://localhost:3377/config/info

学习笔记--SpringCloudAlibaba-Nacos_第15张图片

Nacos命名空间分组和DataID三者关系

命名空间(Namespace)

​ 用于进行租户粒度的配置隔离。不同的命名空间下,可以存在相同的 Group 或 Data ID 的配置。Namespace 的常用场景之一是不同环境的配置的区分隔离,例如开发测试环境和生产环境的资源(如配置、服务)隔离等。

配置分组(Group)

​ Nacos 中的一组配置集,是组织配置的维度之一。通过一个有意义的字符串(如 Buy 或 Trade )对配置集进行分组,从而区分 Data ID 相同的配置集。当您在 Nacos 上创建一个配置时,如果未填写配置分组的名称,则配置分组的名称默认采用 DEFAULT_GROUP 。配置分组的常见场景:不同的应用或组件使用了相同的配置类型,如 database_url 配置和 MQ_topic 配置。

配置集 ID(Data ID)

​ Nacos 中的某个配置集的 ID。配置集 ID 是组织划分配置的维度之一。Data ID 通常用于组织划分系统的配置集。一个系统或者应用可以包含多个配置集,每个配置集都可以被一个有意义的名称标识。Data ID 通常采用类 Java 包(如 com.taobao.tc.refund.log.level)的命名规则保证全局唯一性。此命名规则非强制。

​ 配置集:一组相关或者不相关的配置项的集合称为配置集。在系统中,一个配置文件通常就是一个配置集,包含了系统各个方面的配置。例如,一个配置集可能包含了数据源、线程池、日志级别等配置项。

这三者的关系类似于Java里面的package名和类名,最外层的Namespace是可以用于区分部署环境的,Group和DataID逻辑上区分两个目标对象。

学习笔记--SpringCloudAlibaba-Nacos_第16张图片

默认情况

Namespace=public,Group=DEFAULT_GROUP,默认Cluster是DEFAULT

具体情况

​ Nacos默认的命名空间是public,我们就可以利用Namespace来实现隔离,比如我们现在有三个环境:开发、测试、生产环境,我们就可以创建三个Namespace,不同的N amespace之间是隔离的。

​ Group本身就是分组的意思,它可以把不同的微服务划分到同一个分组里面去。

​ 剩下的就是具体微服务,一个Service可以包含多个Cluster,Nacos默认Cluster是DEFAULT,Cluster是对指定微服务的一个虚拟划分。比如说,将一个Service部署在北京和和杭州的机房中,北京机房的Service就可以起名为(BJ),杭州机房中的Service就可以起名为(HZ),这样就可以尽量让同一个机房的微服务互相调用,提升性能。

Nacos切换不同环境

DataID方案

  1. 指定spring.profile.active和配置文件的DataID来使不同环境下读取不同的配置,配置规则:默认空间+新建dev和test两个DataId:

    1. 新建dev配置DataID(已经创建完成)
    2. 新建test配置DataID

    学习笔记--SpringCloudAlibaba-Nacos_第17张图片

  2. 通过spring.profile.active属性就能进行多环境下配置文件的读取

    学习笔记--SpringCloudAlibaba-Nacos_第18张图片

    学习笔记--SpringCloudAlibaba-Nacos_第19张图片

    spring:
      profiles:
        # active: dev #表示开发环境
        active: test #表示测试环境
    
  3. 测试

    最后再次访问:http://localhost:3377/localhost/config/info

    学习笔记--SpringCloudAlibaba-Nacos_第20张图片

    Group方案

​ 根据之前的讲解我们都知道Group为分组默认是:DEFAULT_GROUP,所以现在我们就需要分出两组,一组是“Dev开发组”,一组是“test测试组”

  1. 新建Group

    DEV_GROUP

学习笔记--SpringCloudAlibaba-Nacos_第21张图片

​ TEST_GROUP

学习笔记--SpringCloudAlibaba-Nacos_第22张图片

配置列表,两个DataID一致,但是分组不同的配置文件:

学习笔记--SpringCloudAlibaba-Nacos_第23张图片

  1. 完成以上配置以后,接下来就需要通过bootstrap+application来配合完成,具体方式:在config下增加一条Group的配置即可,可以配置为DEV_GROUP或TEST_GROUP

​ bootstrap:

# nacos配置
server:
  port: 3377

spring:
  application:
    name: nacos-config-client
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848 #Nacos服务注册中心地址
      config:
        server-addr: localhost:8848 #Nacos作为配置中心地址
        file-extension: yaml #指定yaml格式的配置
        group: TEST_GROUP #增加分组

​ application:

spring:
  profiles:
    # active: dev #表示开发环境
    # active: test #表示测试环境
    active: info
  1. 测试(可以测试不同分组):

    最后再次访问:http://localhost:3377/localhost/config/info

学习笔记--SpringCloudAlibaba-Nacos_第24张图片

Namespace空间方案

​ 我们已经把DataID方案和Group方案完成了,然后接下来我们来看一下Namespace(命名空间)方案,默认此方案为public,此方案不能删除,我们现在来新建两个命名空间方案

学习笔记--SpringCloudAlibaba-Nacos_第25张图片

  1. 新建dev/test的Namespace

学习笔记--SpringCloudAlibaba-Nacos_第26张图片

学习笔记--SpringCloudAlibaba-Nacos_第27张图片

  1. 服务管理-服务列表页面查看

    此时我们就可以切换对应的命名空间,然后再通过Group和DataID来进行切换,如果想要切换命名空间,我们就需要通过命名空间ID来进行切换

  2. 按照域名配置(Namespace+Group+DataId)编写

    ​ 先通过namespace命名空间ID来确认使用的命名空间

    学习笔记--SpringCloudAlibaba-Nacos_第28张图片

    # nacos配置
    server:
      port: 3377
    
    spring:
      application:
        name: nacos-config-client
      cloud:
        nacos:
          discovery:
            server-addr: localhost:8848 #Nacos服务注册中心地址
          config:
            server-addr: localhost:8848 #Nacos作为配置中心地址
            file-extension: yaml #指定yaml格式的配置
            group: TEST_GROUP # 指定分组
            namespace: 4ba4bf0e-210c-41ce-954c-23538de1dcbc #指定命名空间
    
    spring:
      profiles:
        active: dev #表示开发环境
        # active: test #表示测试环境
        # active: info
    

    然后再回到Nacos配置列表,添加Dev命名空间下的配置,添加3条

    学习笔记--SpringCloudAlibaba-Nacos_第29张图片

    image-20210926180120552

    学习笔记--SpringCloudAlibaba-Nacos_第30张图片

  3. 测试:访问http://localhost:3377/localhost/config/info来进行测试

Nacos集群架构

Nacos支持三种部署模式

  1. 单机模式 - 用于测试和单机试用
  2. 集群模式 - 用于生产环境,确保高可用
  3. 多集群模式 - 用于多数据中心场景

参考网站:https://nacos.io/zh-cn/docs/cluster-mode-quick-start.html

学习笔记--SpringCloudAlibaba-Nacos_第31张图片

​ 默认Nacos使用嵌入式数据库实现数据的存储,所以,如果启动多个默认配置下的Nacos节点,数据储存存在一致性问题,为了解决这个问题,Nacos采用了集中存储方式来支持集群化部署,目前仅支持MySql的存储。

  1. 推荐使用Linux
  2. 可以使用内部数据源或者外部数据源(推荐使用外部)MySql

Nacos持久化配置

​ Nacos默认自带嵌入式数据库derby,所以我们每次创建一个Nacos实例就会有一个derby,当有多个Nacos节点的时候,就会出现一致性问题,所以Nacos支持了外部数据库统一数据管理MySql。

Nacos默认derby切换MySql

具体配置方式可以参考官网:https://nacos.io/zh-cn/docs/deployment.html

  1. 我们需要找到Nacos安装目录下的conf目录中的Sql脚本,然后在数据库中进行执行

    注意:需要我们先创建好数据库并且使用:

    CREATE DATABASE nacos_config;
    USE nacos_config;
    

学习笔记--SpringCloudAlibaba-Nacos_第32张图片

  1. 修改conf/application.properties文件,增加支持mysql数据源配置(目前只支持mysql),添加mysql数据源的url、用户名和密码。
spring.datasource.platform=mysql

db.num=1
db.url.0=jdbc:mysql://127.0.0.1:3306/nacos_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&serverTimezone=UTC
db.user=root
db.password=root

​ 这里表示更改Nacos数据库为本机MySql数据库

注意:这里需要注意几个点,一个是url地址需要改,另外数据库的用户和密码也需要更改,同时还有一个是官网上在db.url.0=jdbc:mysql这个属性上少了一个属性为serverTimezone=UTC需要我们手动添加

  • 重启Nacos服务,此时之前所创建的Namespace+Group+DataID将全部消失,因为这些数据是保存在之前Nacos内嵌的derby数据库中,现在使用的是本地的MySql数据库,此时我们可以添加配置测试,在查看数据库nacos_config中的config_info表,此时就会有新添加的配置内容

Nacos集群配置

  • 更改Nacos启动命令配置原理

​ 我们现在知道,想要启动Naocs只需要启动startup.sh命令即可,但是如果启动3个Nacos那?所以如果我们需要启动多个Nacos,就需要自行修改startup命令。

学习笔记--SpringCloudAlibaba-Nacos_第33张图片

  • Linux服务器上MySql数据库配置
  1. 在Linux系统上执行SQL脚本,具体位置在nacos目录下的conf中,这里的操作和之前是一样的,我们可以直接打开这个文件然后拷贝到数据库中执行,当然也是要创建数据库使用数据库然后在复制脚本内容,执行即可
create database nacos_config;
use nacos_config;

学习笔记--SpringCloudAlibaba-Nacos_第34张图片

  1. 修改application.properties配置文件,但是修改之前我们最好做一个备份。
cp application.properties application.properties.init
  1. 这里的修改和我们之间的在win上的修改是完全一样的,所以我们只要打开这个文件,加上对应的内容即可
spring.datasource.platform=mysql

db.num=1
db.url.0=jdbc:mysql://127.0.0.1:3306/nacos_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&serverTimezone=UTC
db.user=root
db.password=123456
  • Linux服务器上Nacos的集群配置cluter.conf
  1. 这里开始正式配置集群,首先我们要更改cluter.conf这个配置文件,当然我们也需要备份,但是这里它的原始名称为:cluster.conf.example,我们需要把它保留同时复制出一个cluster.conf来进行更改
cp cluster.conf.example cluster.conf

学习笔记--SpringCloudAlibaba-Nacos_第35张图片

  1. 具体配置内容,这里我们在配置集群的时候不能直接写127.0.0.1这样,这样分不清楚,所以我们需要知道具体的IP地址,我们可以通过:
ifconfig -a #查看具体ip	

学习笔记--SpringCloudAlibaba-Nacos_第36张图片

具体需修改内容

# 格式: ip地址:端口号
#
# Copyright 1999-2018 Alibaba Group Holding Ltd.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#      http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#

#it is ip
#example
#192.168.16.101:8847
#192.168.16.102
#192.168.16.10
192.168.124.133:3333
192.168.124.133:4444
192.168.124.133:5555
  • 编辑Nacos的启动脚本startup.sh
  1. 编辑这个脚本的目的,是为了能够让我们在使用此命令启动的时候传入对应的端口号参数,这样携带着具体端口号参数的启动就能启动具体的Nacos节点了,此脚本的为止在/nacos/bin中

学习笔记--SpringCloudAlibaba-Nacos_第37张图片

  1. 核心点:传递不同的端口号启动不同的nacos实例,命令:./startup.sh -p 3333表示启动端口号为3333的nacos服务器实例,这里要和config保持一直。

  2. 具体修改,依旧要备份:

cp startup.sh starup.sh.bk

学习笔记--SpringCloudAlibaba-Nacos_第38张图片

学习笔记--SpringCloudAlibaba-Nacos_第39张图片

  • Nginx配置
  1. 我们需要找到Nginx的配置文件,然后做备份
cd /usr/local/nginx
cp nginx.conf nginx.conf.bk

学习笔记--SpringCloudAlibaba-Nacos_第40张图片

  1. 修改nginx.conf

学习笔记--SpringCloudAlibaba-Nacos_第41张图片

  • 启动Nacos
  1. 这里注意,我们在启动之前必须要保证JDK环境变量配置好,同时保证以上配置没有问题,具体启动命令:

    ./stratup.sh -o 3333/4444/5555

[root@localhost bin]# ./startup.sh -o 3333
[root@localhost bin]# ./startup.sh -o 4444
[root@localhost bin]# ./startup.sh -o 5555

学习笔记--SpringCloudAlibaba-Nacos_第42张图片

  1. 启动完成之后我们需要通过如下指令来测试Nacos集群是否正常启动,数量为3
ps -ef|grep nacos|grep -v grep |wc -l

学习笔记--SpringCloudAlibaba-Nacos_第43张图片

  • 启动Nginx
  1. 首先进入到Nginx目录下,启动Nginx,同时要带着我们设置过得配置文件启动
cd /usr/local/nginx/sbin
./nginx -c /usr/local/nginx/conf/nginx.conf
  1. 通过访问Nginx来测试是否能够访问到Nacos,在win系统浏览器网址上输入:
192.168.124.133:1111/nacos

学习笔记--SpringCloudAlibaba-Nacos_第44张图片

  1. 使用账号密码nacos,nacos成功登录就表示此时已经完成全部配置

学习笔记--SpringCloudAlibaba-Nacos_第45张图片

  • 添加配置
  1. 在Nacos平台上添加配置

学习笔记--SpringCloudAlibaba-Nacos_第46张图片

  1. 在数据库中检查是否有这一条配置,如果有表示成功添加

学习笔记--SpringCloudAlibaba-Nacos_第47张图片

  • 配置微服务为Linux版Nacos集群并注册进Nacos
  1. 我们以9002为例,此时我们要修改application.yaml文件,把之前的Nacos端口换成Nacos集群
server:
  port: 9002
spring:
  application:
    name: nacos-provider
  cloud:
    nacos:
      discovery:
        # server-addr: localhost:8848
        # 换成nginx的1111端口,做集群
        server-addr: http://192.168.124.133:1111


management:
  endpoint:
    web:
      exponsure:
        include: '*'

  1. 配置完成启动服务,我们就可以在Naocs平台上看见对应的微服务了,此时表示服务注册成功

学习笔记--SpringCloudAlibaba-Nacos_第48张图片

  • 总结

学习笔记--SpringCloudAlibaba-Nacos_第49张图片

你可能感兴趣的:(学习,java,微服务,springcloud)