Nacos

一、概述

  • 为什么叫Nacos?

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

  • Nacos是什么?

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

    • Nacos:Dynamic Naming and Configuration Service

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

      Nacos = Eureka + Config + Bus

  • 能干嘛?

    • 替代Eureka做服务注册中心
    • 替代Config做服务配置中心
  • 各种注册中心比较


二、Nacos作为服务注册中心演示

基于Nacos的服务提供者

  1. POM

    • 父POM
<!--spring cloud alibaba 2.1.0.RELEASE-->
<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>

  1. YML

    • YML
server:
  port: 9001

spring:
  application:
    name: nacos-payment-provider
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848 #配置Nacos地址

management:
  endpoints:
    web:
      exposure:
        include: '*'

  1. 主启动

    • 主启动类
package com.atguigu.springcloud.alibaba;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

@EnableDiscoveryClient
@SpringBootApplication
public class PaymentMain9001 {
    public static void main(String[] args) {
        SpringApplication.run(PaymentMain9001.class,args);
    }
}

  1. 测试

基于Nacos的服务消费者

  1. POM

    • POM
<dependencies>
    <!--SpringCloud ailibaba nacos -->
    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    </dependency>
        <dependency>
        <groupId>com.atguigu.springcloud</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>

由于spring-cloud-starter-alibaba-nacos-discovery中引入了ribbon,所以nacos也支持负载均衡。
  1. YML

    • YML
server:
  port: 83


spring:
  application:
    name: nacos-order-consumer
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848


service-url:
  nacos-user-service: http://nacos-payment-provider

  1. 主启动

    • 主启动
package com.atguigu.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);
    }
}

  1. 业务类

    • ApplicationContextBean
@Configuration
public class ApplicationContextConfig
{
    @Bean
    @LoadBalanced
    public RestTemplate getRestTemplate()
    {
        return new RestTemplate();
    }
}

- OrderNacosController
@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);
    }
}
  1. 测试

服务注册中心对比


三、Nacos作为服务配置中心演示

Nacos作为配置中心-基础配置

  1. POM

    • POM
<!--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>
  1. YML

    Nacos同Spring Cloud Config一样,在项目初始化时,要保证先从配置中心进行配置拉取,拉取配置之后,才能保证项目的正常启动。
    Spring Boot 中配置文件的加载是存在优先级顺序的,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格式的配置

- application.yml
spring:
  profiles:
    active: dev

  1. 主启动

  2. 业务类

    • ConfigClientController
@RestController
@RefreshScope
public class ConfigClientController
{
    @Value("${config.info}")
    private String configInfo;

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

> 通过Spring Cloud原生注解**`@RefreshScope`**实现配置自动更新。
  1. 在Nacos中添加配置信息

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

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

    • prefix默认为spring.application.name的值
    • spring.profile.active即为当前环境对应的profile,可以通过配置项spring.profile.active来配置
    • file-exetension为配置内容的数据格式,可以通过配置项spring.cloud.nacos.config.file-extension配置

  2. 测试

    自带动态刷新:

    修改下Nacos中的yaml配置文件,再次调用查看配置的接口,就会发现配置已经刷新。

Nacos作为配置中心-分类配置

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

    • 是什么?

      类似Java里面的package名和类名

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

    • 三者情况

      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,就是微服务的实例。

  • Case


四、Nacos集群和持久化配置(重要)

官网说明


高可用小总结

posted @ 2022-01-26 14:29  ArosyCat  阅读(187)  评论(0编辑  收藏  举报