作者:🍧dabing(王甜甜)

视频:尚硅谷 2020 周阳 SpringCloud(H 版 & alibaba)

官方文档:https://cloud.spring.io/spring-cloud-static/Hoxton.SR1/reference/htmlsingle/#features

github 上代码地址:https://github.com/dabing85/springcloud2020

gitee 上代码地址:https://gitee.com/hedabing/springcloud2020

笔记来自视频,只不过再加些自己练习过程的笔记。

# 十六、 SpringCloud Alibaba 入门简介

image-20221103092314499

# 1 - 为什么会出现 SpringCloud alibaba

Spring Cloud Netflix 项目进入维护模式

https://spring.io/blog/2018/12/12/spring-cloud-greenwich-rc1-available-now

img

说明:

Spring Cloud Netflix 项目进入维护模式

最近,Netflix 宣布 Hystrix 正在进入维护模式。自 2016 年以来,Ribbon 已处于类似状态。

虽然 Hystrix 和 Ribbon 现已处于维护模式,但它们仍然在 Netflix 大规模部署。

Hystrix Dashboard 和 Turbine 已被 Atlas 取代。这些项目的最后一次提交是 2 年和 4 年前。Zuul1 和 Archaius1 都被后来不兼容的版本所取代。

这不包括 Eureka 或并发限制模块。

什么是维护模式?

将模块置于维护模式,意味着 SpringCloud 团队将不会再向模块添加新功能。我们将修复 block 级别的 bug 以及安全问题,我们也会考虑并审查社区的小型 pull request。

我们打算继续支持这些模块,直到 Greenwich 版本被普遍采用至少一年。

进入维护模式意味着什么?

Spring Cloud Netflix 将不再开放新的组件

我们都知道 SpringCloud 版本迭代算是比较快的,因而出现了很多重大 ISSU 都还来不及 Fix 就又推出另一个 Release 了。

进入维护模式意思就是目前以致以后一段时间 SpringCloud netflix 提供的服务和功能就这么多了,不再开发新的组件和功能了。以后将以维护和 Merge 分支 Pull Request 为主。

新组件功能将以其他替代的方式实现

img

# 2 - SpringCloud alibaba 带来了什么?

# 2.1. 是什么

诞生:2018.10.31,Spring Cloud Alibaba 正式入驻了 Spring Cloud 官网孵化器,并在 Maven 中央库发布了第一个版本。

https://github.com/alibaba/spring-cloud-alibaba/blob/master/README-zh.md

img

# 2.2. 能干嘛

  • 服务限流降级:默认支持 WebServlet、WebFlux, OpenFeign、RestTemplate、Spring Cloud Gateway, Zuul, Dubbo 和 RocketMQ 限流降级功能的接入,可以在运行时通过控制台实时修改限流降级规则,还支持查看限流降级 Metrics 监控。

  • 服务注册与发现:适配 Spring Cloud 服务注册与发现标准,默认集成了 Ribbon 的支持。

  • 分布式配置管理:支持分布式系统中的外部化配置,配置更改时自动刷新。

  • 消息驱动能力:基于 Spring Cloud Stream 为微服务应用构建消息驱动能力。

  • 分布式事务:使用 @GlobalTransactional 注解, 高效并且对业务零侵入地解决分布式事务问题。。

  • 阿里云对象存储:阿里云提供的海量、安全、低成本、高可靠的云存储服务。支持在任何应用、任何时间、任何地点存储和访问任意类型的数据。

  • 分布式任务调度:提供秒级、精准、高可靠、高可用的定时(基于 Cron 表达式)任务调度服务。同时提供分布式的任务执行模型,如网格任务。网格任务支持海量子任务均匀分配到所有 Worker(schedulerx-client)上执行。

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

# 2.3. 去哪下

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-alibaba-dependencies</artifactId>
            <version>2.2.6.RELEASE</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

# 2.4. 怎么玩

一整套解决方案,简单理解就是替换 Netflix 那一套

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

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

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

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

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

Alibaba Cloud ACM:一款在分布式架构环境中对应用配置进行集中管理和推送的应用配置中心产品。

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

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

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

# 3 - SpringCloud alibaba 学习资料获取

官网:https://spring.io/projects/spring-cloud-alibaba#overview

img

img

英文

https://github.com/alibaba/spring-cloud-alibaba

中文

https://github.com/alibaba/spring-cloud-alibaba/blob/master/README-zh.md

# 十七、 SpringCloud Alibaba Nacos 服务注册和配置中心

# 1 - Nacos 简介

官网文档

https://nacos.io/zh-cn/index.html

# 1.1. 为什么叫 Nacos

前四个字母分别为 Naming 和 Configuration 的前两个字母,最后的 s 为 Service

# 1.2. 是什么

一个更易于构建云原生应用的动态服务发现,配置管理和服务管理中心

Nacos:Dynamic Naming and Configuration Service

Nacos 就是注册中心 + 配置中心的组合

等价于:Nacos = Eureka+Config+Bus

# 1.3. 能干嘛

替代 Eureka 做服务注册中心

替代 Config 做服务配置中心

# 1.4. 去哪下

https://github.com/alibaba/Nacos

img

官网文档

https://nacos.io/zh-cn/index.html

img

img

img

https://spring-cloud-alibaba-group.github.io/github-pages/hoxton/en-us/index.html#_spring_cloud_alibaba_nacos_discovery

img

# 1.5. 各种注册中心比较

img

据说 nacos 在阿里巴巴内部有超过 10 万的实例运行,已经过了类似双十一等各种大型流量的考验

CAP 原则又称 CAP 定理,指的是在一个分布式系统中,一致性(Consistency)、可用性(Availability)、分区容错性(Partition tolerance)。CAP 原则指的是,这三个要素最多只能同时实现两点,不可能三者兼顾。

# 2 - 安装并运行 Nacos

# 2.1. 本地 Java8+Maven 环境已经 OK

# 2.2. 先从官网下载 Nacos

https://github.com/alibaba/nacos/releases/tag/1.4.2

# 2.3. 解压安装包,直接运行 bin/startup.cmd -m standalone

image-20221108161738052

tar.gz 是 linux 版本的,zip 是 windows 版本的,这些在官网文档都能找到教程。

image-20221108203457668

我直接在 windows 运行,解压之后到 bin 路径下 cmd,运行命令:

startup.cmd -m standalone

默认:MODE="cluster" 集群方式启动,如果单机启动需要设置 - m standalone 参数,否则,启动失败。

image-20221108163210281

# 2.4. 命令运行成功后直接访问

http://localhost:8848/nacos

默认账号密码都是 nacos

# 2.5. 登录结果页面

img

# 3 - Nacos 作为服务注册中心演示

# 3.1. 官网文档

https://spring.io/projects/spring-cloud-alibaba#learn

img

# 3.2. 基于 Nacos 的服务提供者

  1. 建 module - cloudalibaba-provider-payment9001
  2. pom - spring-cloud-starter-alibaba-nacos-discovery
  3. yml - 配置注册中心 nacos 地址
  4. 主启动类 - @EnableDiscoveryClient
  5. 业务类 - 随便来一个方法

# 1. 新建 Module:cloudalibaba-provider-payment9001

# 2. POM

父POM :前面一开始练习 euraka 的时候就已经添加过的。

<!--spring cloud alibaba-->
      <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>

本模块POM

<dependencies>
    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-devtools</artifactId>
        <scope>runtime</scope>
        <optional>true</optional>
    </dependency>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <optional>true</optional>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
</dependencies>

# 3. YML

server:
  port: 9001
spring:
  application:
    name: nacos-payment-provider
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848 #配置 Nacos 地址
management:
  endpoints:
    web:
      exposure:
        include: '*'  #默认只公开了 /health 和 /info 端点,要想暴露所有端点只需设置成星号

# 4. 主启动

package com.dabing.springcloud.alibaba;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
@SpringBootApplication
@EnableDiscoveryClient
public class PaymentMain9001 {
    public static void main(String[] args) {
        SpringApplication.run(PaymentMain9001.class,args);
    }
}

# 5. 业务类

package com.dabing.springcloud.alibaba.controller;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class PaymentController{
    @Value("${server.port}")
    private String serverPort;
 
    @GetMapping(value = "/payment/nacos/{id}")
    public String getPayment(@PathVariable("id") Long id) {
        return "nacos registry, serverPort: "+ serverPort+"\t id"+id;
    }
}

# 6. 测试

启动测试,前面启动的 nacos 不要关,

http://localhost:9001/payment/nacos/1

nacos 控制台

image-20221108171516856

nacos 服务注册中心 + 服务提供者 9001 都 ok 了

# 7. 为了下一章节演示 nacos 的负载均衡,参照 9001 新建 9002

新建 cloudalibaba-provider-payment9002

9002 其他步骤你懂的

或者取巧不想新建重复体力劳动,直接拷贝虚拟端口映射

img

img

img

img

img

# 3.3. 基于 Nacos 的服务消费者

# 1. 新建 Module:cloudalibaba-consumer-nacos-order83

# 2. POM

<dependencies>
    <!--SpringCloud ailibaba nacos -->
    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    </dependency>
        <dependency>
        <groupId>com.dabing</groupId>
        <artifactId>cloud-api-commons</artifactId>
        <version>${project.version}</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-devtools</artifactId>
        <scope>runtime</scope>
        <optional>true</optional>
    </dependency>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <optional>true</optional>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
</dependencies>

为什么 nacos 支持负载均衡

img

# 3. YML

server:
  port: 83
spring:
  application:
    name: nacos-order-consumer
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848
#消费者将要去访问的微服务名称 (注册成功进 nacos 的微服务提供者【可选】,注意:nacos-payment-provider 含有 IP 和端口)
service-url:
  nacos-user-service: http://nacos-payment-provider

# 4. 主启动

package com.dabing.springcloud.alibaba;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
@EnableDiscoveryClient
@SpringBootApplication
public class OrderNacosMain83{
    public static void main(String[] args){
        SpringApplication.run(OrderNacosMain83.class,args);
    }
}

# 5. 业务类

ApplicationContextBean

package com.dabing.springcloud.alibaba.config;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;
@Configuration
public class ApplicationContextConfig{
    @Bean
    @LoadBalanced
    public RestTemplate getRestTemplate(){
        return new RestTemplate();
    }
}

# 6. OrderNacosController

package com.dabing.springcloud.alibaba.controller;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
import javax.annotation.Resource;
@RestController
@Slf4j
public class OrderNacosController{
    @Resource
    private RestTemplate restTemplate;
    @Value("${service-url.nacos-user-service}")
    private String serverURL;
    @GetMapping(value = "/consumer/payment/nacos/{id}")
    public String paymentInfo(@PathVariable("id") Long id){
        return restTemplate.getForObject(serverURL+"/payment/nacos/"+id,String.class);
    }
}

# 7. 测试

nacos 控制台

img

http://localhost:83/consumer/payment/nacos/1

83 访问 9001/9002,轮询负载 OK

# 3.4. 服务注册中心对比

# 1. Nacos 和 CAP

CAP 原则又称 CAP 定理,指的是在一个分布式系统中, Consistency(一致性)、 Availability(可用性)、Partition tolerance(分区容错性),三者不可得兼。

一致性(C):在分布式系统中的所有数据备份,在同一时刻是否同样的值。(等同于所有节点访问同一份最新的数据副本)

可用性(A):在集群中一部分节点故障后,集群整体是否还能响应客户端的读写请求。(对数据更新具备高可用性)

分区容忍性(P):以实际效果而言,分区相当于对通信的时限要求。系统如果不能在时限内达成数据一致性,就意味着发生了分区的情况,必须就当前操作在 C 和 A 之间做出选择。

CAP 原则的精髓就是要么 AP,要么 CP,要么 AC,但是不存在 CAP。

如果在某个分布式系统中数据无副本, 那么系统必然满足强一致性条件, 因为只有独一数据,不会出现数据不一致的情况,此时 C 和 P 两要素具备,但是如果系统发生了网络分区状况或者宕机,必然导致某些数据不可以访问,此时可用性条件就不能被满足,即在此情况下获得了 CP 系统,但是 CAP 不可同时满足。

因此在进行分布式架构设计时,必须做出取舍。当前一般是通过分布式缓存中各节点的最终一致性来提高系统的性能,通过使用多节点之间的数据异步复制技术来实现集群化的数据一致性。

img

# 2. Nacos 支持 AP 和 CP 模式的切换

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

# 4 - Nacos 作为服务配置中心演示

  1. module - cloudalibaba-config-nacos-client3377
  2. 依赖 - spring-cloud-starter-alibaba-nacos-config
  3. bootstrap.properties - 配置 Nacos server 的地址和应用名
  4. application.yml - 生效的环境配置文件
  5. 主启动类 - @EnableDiscoveryClient
  6. 业务类 - 控制层 @RefreshScope 实时更新配置信息

# 4.1. Nacos 作为配置中心 - 基础配置

# 1. 创建 Module:cloudalibaba-config-nacos-client3377

# 2. POM

<dependencies>
    <!--nacos-config-->
    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
    </dependency>
    <!--nacos-discovery-->
    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    </dependency>
    <!--web + actuator-->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>
    <!-- 一般基础配置 -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-devtools</artifactId>
        <scope>runtime</scope>
        <optional>true</optional>
    </dependency>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <optional>true</optional>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
</dependencies>

# 3. YML

Nacos 同 springcloud-config 一样,在项目初始化时,要保证先从配置中心进行配置拉取,拉取配置之后,才能保证项目的正常启动

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

bootstrap.yml

server:
  port: 3377
spring:
  application:
    name: nacos-config-client
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848 #服务注册中心地址
      config:
        server-addr: localhost:8848 #配置中心地址
        file-extension: yaml #指定 yaml 格式的配置(yml 和 yaml 都可以)
#${spring.application.name}-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}
#nacos-config-client-dev.yaml  (一定要与 file-extension 值保持一致)

application.yml

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

# 4. 主启动

package com.dabing.springcloud.alibaba;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
@EnableDiscoveryClient
@SpringBootApplication
public class NacosConfigClientMain3377{
    public static void main(String[] args) {
        SpringApplication.run(NacosConfigClientMain3377.class, args);
    }
}

# 5. 业务类:ConfigClientController

package com.dabing.springcloud.alibaba.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;
@RestController
@RefreshScope   // 通过 SpringCould 原生注解 @RefreshScope 实现配置自动更新
public class ConfigClientController{
    @Value("${config.info}") // 对应 nacos 配置:nacos-config-client-dev.yaml
    private String configInfo;
    @GetMapping("/config/info")
    public String getConfigInfo() {
        return configInfo;
    }
}

# 6. 在 Nacos 中添加配置信息

Nacos 中的匹配规则

Nacos 中的 dataid 的组成格式与 SpringBoot 配置文件中的匹配规则

官网 https://nacos.io/zh-cn/docs/quick-start-spring-cloud.html

说明:bootstrap.yml 之所以需要配置 spring.application.name ,是因为它是构成 Nacos 配置管理 dataId 字段的一部分。

在 Nacos Spring Cloud 中, dataId 的完整格式如下:

${prefix}-${spring.profiles.active}.${file-extension}
  • prefix 默认为 spring.application.name 的值,也可以通过配置项 spring.cloud.nacos.config.prefix 来配置。
  • spring.profiles.active 即为当前环境对应的 profile,详情可以参考 Spring Boot 文档注意:当 spring.profiles.active 为空时,对应的连接符 - 也将不存在,dataId 的拼接格式变成 ${prefix}.${file-extension}
  • file-exetension 为配置内容的数据格式,可以通过配置项 spring.cloud.nacos.config.file-extension 来配置。目前只支持 propertiesyaml 类型。

最后公式:

spring.application.name{spring.application.name}-{spring.profiles.active}.${spring.cloud.nacos.config.file-extension}

Data ID:nacos-config-client-dev.yaml

Group:默认分组

Nacos 界面配置对应

config:
  info: "config info for dev,from nacos config center."

img

小总结说明

img

** 历史配置:**Nacos 会记录配置文件的历史版本默认保留 30 天

# 7. 测试

启动前需要在 nacos 客户端 - 配置管理 - 配置管理栏目下有没有对应的 yaml 配置文件

运行 cloud-config-nacos-client3377 的主启动类

调用接口查看配置信息: http://localhost:3377/config/info

image-20221108221509761

# 8. 自带动态刷新

修改 Nacos 中的 yaml 配置文件,查看配置已经刷新

image-20221108221549627

# 4.2. Nacos 作为配置中心 - 分类配置

# 1. 问题

多环境多项目管理

问题 1

实际开发中,通常一个系统会准备

  • dev 开发环境

  • test 测试环境

  • prod 生产环境

如何保证指定环境启动时服务能正确读取到 Nacos 上相应环境的配置文件呢?

问题 2

一个大型分布式微服务系统会有很多微服务子项目

每一个微服务项目又会相应的开发环境、测试环境、预发环境、正式环境….

那怎么对这些微服务配置进行管理呢?

回答:可以多个配置文件,也可以分命名空间,也可以分组进行管理。需要生效哪个配置文件, 使用spring.profiles.active: dev #表示开发环境 进行指定

命名空间默认为 public ,组默认为 DEFAULT_GROUP

可用以下配置指定: groupnamespace

spring:
  cloud:
    nacos: 
      config:
        file-extension: yaml #指定 yaml 格式的配置
        group: DEV_GROUP
        namespace: 7d8f0f5a-6a53-4785-9686-dd460158e5d4

# 2. Nacos 的图形化管理界面

配置管理

img

命名空间

img

# 3. Namespace+Group+Data ID 三者关系?为什么这么设计?

最外层的 namespace 是可以用于区分部署环境的,Group 和 DataID 逻辑上区分两个目标对象。

img

默认情况:Namespace=public,Group=DEFAULT_GROUP,默认 Cluster 是 DEFAULT

  • Nacos 默认的命名空间是 public,Namespace 主要用来实现隔离。

比方说我们现在有三个环境:开发、测试、生产环境,我们就可以创建三个 Namespace,不同的 Namespace 之间是隔离的。

  • Group 默认是 DEFAULT_GROUP,Group 可以把不同的微服务划分到同一个分组里面去。Service 就是微服务;一个 Service 可以包含多个 Cluster (集群),Nacos 默认 Cluster 是 DEFAULT,Cluster 是对指定微服务的一个虚拟划分。

比方说为了容灾,将 Service 微服务分别部署在了杭州机房广州机房,这时就可以给杭州机房的 Service 微服务起一个集群名称 (HZ),给广州机房的 Service 微服务起一个集群名字 (GZ),还可以尽量让同一个机房的微服务互相调用,以提升性能。

  • 最后是 Instance,就是微服务的实例。

# 4. Case

# 1) DataID 方案

指定 spring.profiles.active 和配置文件的 DataID 来使不同环境下读取不同的配置

默认空间 + 默认分组 + 新建 dev 和 test 两个 DataID

新建 dev 配置 DataID

img

新建 test 配置 DataID

img

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

img

测试

http://localhost:3377/config/info

配置是什么就加载什么

img

# 2) Group 方案

通过 Group 实现环境区分

新建 Group

img

img

在 nacos 图形界面控制台上面新建配置文件 DataID

img

bootstrap+application

img

在 config 下增加一条 group 的配置即可。可配置为 DEV_GROUP 或 TEST_GROUP

# 3) Namespace 方案

新建 dev/test 的 Namespace

img

img

回到服务管理 - 服务列表查看

img

按照域名配置填写

nacos-config-client-dev.yaml

config: 
  info: 9f62d48c-ef2e-4d83-a9fb-c9db5833f93b DEFAULT_GROUP nacos-config-client-dev.yaml

img

YML

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 格式的配置
        group: DEV_GROUP
        namespace: 7d8f0f5a-6a53-4785-9686-dd460158e5d4
# ${spring.application.name}-${spring.profile.active}.${spring.cloud.nacos.config.file-extension}
# nacos-config-client-dev.yaml

application

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

图解:

img

测试结果:

img

# 5 - Nacos 集群和持久化配置(重要)

这个练习要练习 linux 的话,你得在 linux 上安装 mysql、jdk8、nginx、nacos

# 5.1. 官网说明

https://nacos.io/zh-cn/docs/cluster-mode-quick-start.html

是使用的内置数据库,[derby 数据库](Derby_百度百科 (baidu.com)) 百度百科看一哈。谐音念【嘚比】

所以将 nacos 服务关闭了再打开上面创建的配置文件还是在的。

但是如果集群的话,每台服务器都有他们自己的配置信息,那就出现数据不一致的问题了,我们可以将他们的信息统一保存到 mysql 数据库中实现持久化。是支持修改为 MySQL 的 nacos 也提供了方法。

# 1. 官网架构图

集群部署架构图

因此开源的时候推荐用户把所有服务列表放到一个 vip 下面,然后挂到一个域名下面

http://ip1:port/openAPI 直连 ip 模式,机器挂则需要修改 ip 才可以使用。

http://SLB:port/openAPI 挂载 SLB 模式 (内网 SLB,不可暴露到公网,以免带来安全风险),直连 SLB 即可,下面挂 server 真实 ip,可读性不好。

http://nacos.com:port/openAPI 域名 + SLB 模式 (内网 SLB,不可暴露到公网,以免带来安全风险),可读性好,而且换 ip 方便,推荐模式

img

# 2. 上图官网翻译,真实情况

img

# 3. 说明

默认 Nacos 使用嵌入式数据库实现数据的存储。所以,如果启动多个默认配置下的 Nacos 节点,数据存储是存在一致性问题的。

为了解决这个问题,Nacos 采用了集中式存储的方式来支持集群化部署,目前只支持 MySQL 的存储。

https://github.com/alibaba/nacos/blob/master/distribution/conf/application.properties

https://github.com/alibaba/nacos/blob/master/distribution/conf/nacos-mysql.sql

img

img

https://nacos.io/zh-cn/docs/deployment.html

# 5.2. Nacos 持久化配置解释

# 1. Nacos 默认自带的是嵌入式数据库 derby

https://github.com/alibaba/nacos/blob/develop/config/pom.xml

# 2. derby 到 mysql 切换配置步骤

  1. 可以直接在 windows 客户端远程连接虚拟机或服务器的 mysql,按照 nacos-server-1.4.2\nacos\conf 目录下找到 sql 脚本所说,创建一个数据库 nacos_config,再创建表,脚本里都有。

  2. nacos-server-1.4.2\nacos\conf 目录下找到 application.properties 下面所说的修改,之后后面集群会用使用到。可以直接再本地 windows 下修改好,然后再上传到 linux 上。(application.properties 可以先大概知道这个文件要修改下一步集群会用到这个文件)

nacos-server-1.4.2\nacos\conf 目录下找到 sql 脚本

nacos-mysql.sql

执行脚本

nacos-server-1.4.2\nacos\conf 目录下找到 application.properties

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

image-20221109225921322

# 3. 启动 nacos,可以看到是个全新的空记录界面,以前是记录进 derby

# 4. 测试:新建配置,发现配置信息写入了 MySQL 数据库

# 5.3. Linux 版 Nacos+MySQL 生产环境配置

# 1. 预计需要,1 个 nginx+3 个 nacos 注册中心 + 1 个 mysql

linux 安装 mysql 的教程可以参考本站:https://blog.dabing.cool/java/installMysql/

# 2. Nacos 下载 linux 版本

img

https://github.com/alibaba/nacos/releases/tag/1.4.2

nacos-server-1.4.2.tar.gz

# 3. 集群配置步骤(重点)

先简单总结一下,具体看下面的图文说明。

  1. 我把 nacos-server-1.4.2.tar.gz 上传到 /opt/software 目录下,这个目录我是专门用来上传安装包的

  2. 再新建一个 /opt/nacoscluster 目录,将上面的 nacos-server-1.4.2.tar.gz 解压到这个目录下,并改名为 nacos8848,

  3. 然后再这个 nacos8848 修改一下 conf 目录下的两个文件:application.properties、cluster.conf

  4. 前提是你前面的 mysql 数据库已经建好了

  5. 还要修改一个启动脚本 startup.sh 文件的内存大小

  6. 然后复制 8848 再复制两份 8849、8850 共三份分别修改 application.properties 里的端口号。cp -r nacos8848/nacos8849

  7. 启动三个 nacos 服务之后,可以分别登录看看有没有启动成功,ip: 端口

  8. 再配合 nginx

# 1. 创建 /opt/nacoscluster 目录,解压 3 个节点

解压:

#解压 nacos-server-1.4.2.tar.gz 到本目录下,即 /opt/nacoscluster 目录下
tar -zxvf ../software/nacos-server-1.4.2.tar.gz	
#修改名称
mv nacos nacos8848

img

# 2.Linux 服务器上 mysql 数据库配置
  • 其中一个节点 conf / 目录下,找到 nacos_mysql.sql 文件,创建数据库并导入表结构
# 3. 三个节点 conf/application.properties 配置

​ 修改每一个节点下 server.port,分别设置为:8848,8849,8850,并添加以下配置

spring.datasource.platform=mysql
db.num=1
db.url.0=jdbc:mysql://localhost:3306/nacos_config? characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC
db.user=root
db.password=root
# 4. 三个节点 /conf 下配置 cluster.conf
192.168.137.150:8848
192.168.137.150:8849
192.168.137.150:8850
# 5. 启动三个节点前,修改内存大小

启动时,需要修改 startup.sh 文件内存大小,否则,内存可能不够用。

将 2g 改成 256m,1g 改成 128m

image-20221109230940253

# 6. 启动三个节点

img

img

img

查看进程:ps -ef | grep nacos

img

登录任意节点查看集群:如果是用服务器记得去开放 8848、8849、8850 三个端口

img

# 7.Nginx 的配置,由它作为负载均衡器

修改 nginx 的配置文件:vim /usr/local/nginx/conf/nginx.conf

nginx.conf

upstream nacoscluster{ 
    server localhost:8848;
    server localhost:8849;
    server localhost:8850;
}

server{               
    listen 1111;
    server_name localhost;
    location / {
         proxy_pass http://nacoscluster;                        
    }
....省略  

启动 Nginx:

/usr/sbin/nginx -t 测试配置文件是否正确
/usr/sbin/nginx -c /etc/nginx/nginx.conf 启动 nginx

img

# 6. 截止到此处,1 个 Nginx+3 个 nacos 注册中心 + 1 个 mysql

测试通过 nginx 访问 nacos

http://192.168.6.100:1111/nacos

img

新建一个配置测试

img

linux 服务器的 mysql 插入一条记录

img

# 6. 测试微服务从配置中心获取配置

微服务 nacos-config-client 启动注册进 nacos 集群

Yml

img

访问 URL:

img

# 7. 高可用小总结

img

更新于 阅读次数

请我喝[茶]~( ̄▽ ̄)~*

Dabing-He 微信支付

微信支付