相关阅读

  1. 带你学习Spring Cloud 技术第一篇-总览
  2. 带你学习Spring Cloud 技术第二篇-技术介绍
  3. 带你学习Spring Cloud 技术第三篇-服务注册中心
  4. 学习Spring Cloud 技术第四篇-服务调用
  5. 学习Spring Cloud 技术第五篇-服务降级
  6. 学习Spring Cloud 技术第六篇-服务网关
  7. 学习Spring Cloud 技术第七篇-服务配置
  8. 学习Spring Cloud 技术第八篇-服务总线
  9. 学习Spring Cloud 技术第九篇-消息驱动(Spring Cloud Stream)

一、Spring Cloud Alibab Nacos

Nacos(官方网站:nacos.io) 是一个易于使用的动态服务发现、配置和服务管理平台。它可以帮助您轻松地构建云原生应用程序和微服务平台。

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service的首字母简称,一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。

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

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

二、Nacos 功能

  1. 服务发现与健康检查

Nacos简化了服务注册自身和通过DNS或HTTP接口发现其他服务的过程。Nacos还提供服务的实时健康检查,以防止向不健康的主机或服务实例发送请求。

  1. 动态配置管理

动态配置服务允许您以集中和动态的方式跨所有环境管理所有服务的配置。nacos 无需在更新配置时重新部署应用程序和服务,这使得配置更改更加高效和敏捷。

  1. 动态 DNS 服务

Nacos支持加权路由,使您更容易在数据中心的生产环境中实现中间层负载平衡、灵活的路由策略、流控制和简单的DNS解析服务。它帮助您轻松实现基于dns的服务发现,并防止应用程序耦合到特定于供应商的服务发现 API。

  1. 服务和元数据管理

Nacos提供了一个易于使用的服务仪表板,帮助您管理服务元数据、配置、kubernetes DNS、服务运行状况和度量统计信息。这里的元信息代表的是 Nacos 数据(如配置和服务)描述信息,如服务版本、权重、容灾策略、负载均衡策略、鉴权配置、各种自定义标签 (label),从作用范围来看,分为服务级别的元信息、集群的元信息及实例的元信息。

三、Nacos 生态

学习Spring Cloud 技术第十一篇-Nacos_后端

更多的 Nacos 的内容可以访问官网进行了解。

三、安装 Nacos

官网:nacos.io/zh-cn/

下载地址:github.com/alibaba/nac…

3.1 下载软件

github.com/alibaba/nac…

3.2 安装

非持久化模式

./startup.sh -m standalone

修改持久化模式

nacos的原本的数据存储的方案是存储在 derby 数据库上。这里可以将持久化的信息存储在mysql里面,方便于我们的查看。

  1. 如果你的数据库是 mysql8,如果不是,可以直接从第二步开始

在解压的目录,新建立文件夹:mkdir -p plugins/mysql, 将 mysql-connector-java-8.0.X.jar 复制到该文件下。

学习Spring Cloud 技术第十一篇-Nacos_后端_02

  1. 创建数据库

进入根据 nacos-mysql.sql 在本地的数据创建一个名字叫做nacos_config,并且执行给的脚本。

学习Spring Cloud 技术第十一篇-Nacos_spring_03

  1. 修改配置文件:application.properties

在文件的最后加上如下配置:

##################################### 
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&useSSl=false&useUnicode=true 
db.user=root 
db.password=XXXX
  1. 启动应用
./startup.sh -m standalone
  1. 访问测试:http://localhost:8848/nacos

学习Spring Cloud 技术第十一篇-Nacos_Spring Cloud_04

得到上面的界面,说明nacos安装成功啦。

用户名密码:nacos/nacos

学习Spring Cloud 技术第十一篇-Nacos_后端_05

四、Nacos核心功能

nacos = eureka+config+bus

可以替代 eureka 作为服务的注册中

可以替代 config 作为服务的配置中心

最后,Nacos是支持AP和CP的模式的。

五、服务注册中心的应用

Nacos是一个易于使用的动态服务发现、配置和服务管理平台,用于构建云原生应用程序。使用 Spring Cloud 阿里 Nacos Discovery,您可以基于 Spring Cloud 的编程模型快速访问Nacos服务注册功能。服务发现是微服务体系结构中的关键组件之一。在这样的体系结构中,为每个客户机手动配置服务列表可能是一项艰巨的任务,并且使动态伸缩极其困难。Nacos Discovery 帮助您自动将服务注册到Nacos服务器,Nacos服务器跟踪服务并动态刷新服务列表。此外,Nacos Discovery将服务实例的一些元数据(如主机、端口、健康检查URL、主页)注册到Nacos。Nacos的下载和启动方法请参见Nacos网站。 Nacos Website.

5.1 创建服务的生产者

新建立项目

spring-cloud-alibaba-provider8001

项目配置--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>spring-cloud-learn</artifactId>
        <groupId>com.breakpoint</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>
    <packaging>jar</packaging>

    <artifactId>spring-cloud-alibaba-provider8001</artifactId>

    <dependencies>
        <!--  nacos-discovery 服务发现    -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
        <!--  nacos-config 服务配置   -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
        </dependency>
        <!--   引入spring-boot支持的依赖  -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!--  注意一下 要引入 starter 的  -->
        <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>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

</project>

项目配置--application.yml

spring:
  profiles:
    active: dev # 当前的环境

项目配置--bootstrap.yml

server:
  port: 8001
spring:
  application:
    name: cloud-alibaba-prvider # 服务的名称
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848 # 服务的地址
        enabled: true # 是否惊醒服务注册与发现
      config:
        server-addr:  127.0.0.1:8848 # 服务的地址
        file-extension: yaml
management:
  endpoints:
    web:
      exposure:
        include: "*"
config:
  info: "这是从服务提供者nacos的配置的信息 ${spring.application.name}:${server.port}"

项目配置--启动类

/**
 * @author :breakpoint/赵立刚
 * @date : 2020/07/28
 */
@SpringBootApplication
@EnableDiscoveryClient
public class NacosProvider8001 {
    public static void main(String[] args) {
        SpringApplication.run(NacosProvider8001.class, args);
    }
}

项目配置--业务类

/**
 * @author :breakpoint/赵立刚
 * @date : 2020/07/28
 */
@Slf4j
@RefreshScope
@RestController
public class NacosController {

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

    @GetMapping("/getConfigInfo")
    public String getConfigInfo() {
        return configInfo;
    }

}

5.2 创建服务的消费者

spring-cloud-alibaba-consumer80

项目配置--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>spring-cloud-learn</artifactId>
        <groupId>com.breakpoint</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>
    <packaging>jar</packaging>
    <artifactId>spring-cloud-alibaba-consumer80</artifactId>

    <dependencies>
        <!--  nacos-discovery 服务发现    -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
        <!--  openfeign 依赖  -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>
        <!--   引入spring-boot支持的依赖  -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!--  注意一下 要引入 starter 的  -->
        <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>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>
</project>

项目配置--application.yml

server:
  port: 80 # 项目的端口号
spring:
  application:
    name: nacos-consumer-80
  cloud:
    nacos:
      discovery:
        enabled: true # 是否启用服务注册与发现
        server-addr: 127.0.0.1:8848 # 服务的注册地址
management:
  endpoints:
    web:
      exposure:
        include: "*"

项目配置--启动类

/**
 * @author :breakpoint/赵立刚
 * @date : 2020/07/28
 */
@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
public class NacosConsumer80 {
    public static void main(String[] args) {
        SpringApplication.run(NacosConsumer80.class, args);
    }
}

项目配置--feign

/**
 * @author :breakpoint/赵立刚
 * @date : 2020/07/28
 */
@FeignClient(value = "cloud-alibaba-prvider")
public interface NacosService {

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

}

项目配置--service

/**
 * @author :breakpoint/赵立刚
 * @date : 2020/07/28
 */
@RestController
public class NacosConsumerController {

    @Autowired
    private NacosService nacosService;

    @GetMapping("/consumer/getConfigInfo")
    public String getConfigInfo() {
        return nacosService.getConfigInfo();
    }


}

5.3 运行测试

分别启动服务的提供者以及服务的消费者。登陆nacos查看结果。

学习Spring Cloud 技术第十一篇-Nacos_后端_06

创建的服务已经可以进行服务的注册以及发现了。

5.4 调用测试

学习Spring Cloud 技术第十一篇-Nacos_Cloud_07

成功调用并且返回结果。

更多的配置:

github.com/alibaba/spr…

六、服务配置中心

文档地址:github.com/alibaba/spr…

配置的文件名的要求: 当配置被 Nacos Config 加载时,基本配置的DataId为 ${spring.application.name}.${file-extension:properties}${spring.application.name}-${profile}.${file-extension:properties}的DataId配置也会被加载。如果您需要使用来自不同环境的不同配置,您可以使用${spring.profiles.active}配置。

根据上面的要求,需要配置的文件名是cloud-alibaba-prvider-dev.yaml

学习Spring Cloud 技术第十一篇-Nacos_后端_08

学习Spring Cloud 技术第十一篇-Nacos_spring_09

修改本地的配置:

server:
  port: 8001
spring:
  application:
    name: cloud-alibaba-prvider # 服务的名称
  cloud:
    nacos:
      # 服务注册与发现的配置信息
      discovery:
        server-addr: 127.0.0.1:8848 # 服务的地址
        enabled: true # 是否惊醒服务注册与发现
        service: ${spring.application.name} # 服务的名字 默认  ${spring.application.name}
      # 服务配置的配置信息
      config:
        server-addr:  127.0.0.1:8848 # 服务的地址
        file-extension: yaml
        prefix: ${spring.application.name} # 默认 ${spring.application.name}
        # cloud-alibaba-prvider-dev.yaml
management:
  endpoints:
    web:
      exposure:
        include: "*"
        
# 这个地方已经被注释掉了 配置的信息 从 nacos里面取
#config:
#  info: "这是从服务提供者nacos的配置的信息 ${spring.application.name}:${server.port}"

测试:

curl http://localhost:80/consumer/getConfigInfo

学习Spring Cloud 技术第十一篇-Nacos_spring_10

七、消息总线

Nacos也是具有消息总线的功能,我们在配置的变化的时候,会自动的更新我们服务中的配置。

7.1 如何配置

在需要更新的组件上加上@RefreshScope

@Slf4j
@RefreshScope // 支持这个组件进行更新他自己的属性
@RestController
public class NacosController {

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

    @GetMapping("/getConfigInfo")
    public String getConfigInfo() {
        return configInfo;
    }

}

7.2 测试

修改一下:

学习Spring Cloud 技术第十一篇-Nacos_Cloud_11

测试:

学习Spring Cloud 技术第十一篇-Nacos_后端_12

修改的配置正确的更新了!

代码小结:github.com/zhaoligang5…

八、相关阅读

  1. 带你学习Spring Cloud 技术第一篇-总览
  2. 带你学习Spring Cloud 技术第二篇-技术介绍
  3. 带你学习Spring Cloud 技术第三篇-服务注册中心
  4. 学习Spring Cloud 技术第四篇-服务调用
  5. 学习Spring Cloud 技术第五篇-服务降级
  6. 学习Spring Cloud 技术第六篇-服务网关
  7. 学习Spring Cloud 技术第七篇-服务配置
  8. 学习Spring Cloud 技术第八篇-服务总线
  9. 学习Spring Cloud 技术第九篇-消息驱动(Spring Cloud Stream)
  10. zhaoligang.gitee.io/spring-clou…