SpringCloud 微服务注册中心(二) - Nacos


文章目录

  • SpringCloud 微服务注册中心(二) - Nacos
  • 前言
  • 一、Nacos是什么?
  • 二、安装Nacos
  • 三、Nacos 注册中心
  • 工作流程
  • 客户端配置
  • Nacos 注册中心一致性模式
  • 四、Nacos配置中心
  • 配置规则
  • 配置加载顺序
  • 动态加载配置
  • 总结


前言

在上一章,讲过了Eureka作为Springcloud配置中心的使用及配置。这一章讲之前提到的Springcloud alibaba的注册中心产品- Nacos。Nacos作为alibaba推荐的注册中心,在alibaba生态中被广泛运用,比如 官方推荐作为dubbo的注册中心。

一、Nacos是什么?

Nacos是Springcloud-alibaba全家桶中的一个产品组件,它是一个更易于构建云原生应用的动态服务发现配置管理服务管理中心。

在Springcloud中,我们一般使用 eureka (注册中心) + Springcloud config (配置管理) + Springcloud bus(配置广播) ,而Nacos出现后,

Nacos = Eureka+Config+Bus,替代Eureka做服务注册中心,替代Config做服务配置中心。

二、安装Nacos

tar -xzf nacos-server-1.0.0.tar.gz
cd nacos/bin
sh startup.sh &
  • 进入管理后台
    如果启动成功,Nacos在8848端口绑定管理端Web应用程序,例如在本机运行则入口是http://localhost:8848/nacos/,默认用户名和密码都是nacos。

springcloud 注册中心 springcloud注册中心nacos_spring

三、Nacos 注册中心

做为注册中心,Nacos一样由两个部分组成,服务端+ 客户端。但是他与Eureka不同的事,服务端并不需要我们去引入server,而是直接部署一键启动,同时还拥有控制台页面。所以我们只需要配置客户就可以了。

工作流程

在微服务架构中一般会有三个角色:Consumer、Provider 和 Registry,在今天注册中心的主题中,Registry 是 nacos-server,而 Consumer 和 Provider 都是 nacos-client。

当客户端服务启动时,nacos-client会向Registry发送自己的实例元数据信息,并且注册一个监听,当server端出现变动的时候,会根据监听推送最新的注册列表信息。

同时,client会从server端拉取注册服务列表,并在本地保存一份缓存,并开启一个线程定时任务,每10S查询一次服务列表。

springcloud 注册中心 springcloud注册中心nacos_ci_02

客户端配置

POM配置

<dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
       
        <!-- 以nacos作为注册中心-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
      
    </dependencies>
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>${alibaba-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

注:

  1. bootstrap.yml 的加载需要在Springcloud项目下才可以被加载。
  2. 加载Springcloud项目需要引入 spring-cloud-dependencies
  3. 加载Springcloud alibaba项目需要引入spring-cloud-alibaba-dependencies
  4. 实用nacos作为注册中心,需要引入spring-cloud-starter-alibaba-nacos-discovery

yml配置

在使用配置中心是,一般将连接配置中心的配置配置在bootstrap.yml/bootstrap.properties中,启动时优先加载

bootstrap.yml 配置

server:
  port: 9102

spring:
  application:
    name: Nacos-client-consumer-9002
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848

启动类

增加EnableDiscoveryClient注解

@SpringBootApplication
@EnableDiscoveryClient  
public class NacosApplication {

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

}

Nacos 注册中心一致性模式

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

在我们上一章内容中讲到的Eureka作为注册中心,它支持的是AP模式,主要是保证高可用,让我们的请求不会得不到响应。 还有一些注册中心,比如zookeeper支持的就是CP模式,保证数据的一致性。

而Nacos可以同时支持AP或者CP的模式,当然不能同时满足CAP。主流的Nacos使用的是AP模式,如果切换为CP模式,命令如下:

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

同时微服务的bootstrap.properties 需配置如下选项指明注册为临时/永久实例
AP模式不支持数据一致性,所以只支持服务注册的临时实例,CP模式支持服务注册的永久实例,满足配置文件的一致性

#false为永久实例,true表示临时实例开启,注册为临时实例
spring.cloud.nacos.discovery.ephemeral=false

四、Nacos配置中心

配置规则

dataId = springcloud 注册中心 springcloud注册中心nacos_ci_03{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 类型。

配置加载顺序

  • file:./config/ - 优先级最高(项目根路径下的config
  • file:./ - 优先级第二 -(项目根路径下)
  • classpath:/config/ - 优先级第三(项目resources/config下)
  • classpath:/ - 优先级第四(项目resources根目录)
  • 带spring.profiles.active 优先级大于不带spring.profiles.active的配置
  • nacos远程配置 (优先级最低) — 同样的配置,如果配置在本地的配置文件中,本地配置会覆盖远程配置

动态加载配置

使用@RefreshScope 注解

@RestController
@RequestMapping("/provider/order")
@RefreshScope
public class OrderProviderController {

    @Value("${provider.info}")
    private String providerInfo;

    @Value("${nacos.info}")
    private String nacosInfo;


    @GetMapping("/getOrder/{id}")
    public ResultBean getOrder(@PathVariable("id") String id){
        return ResultBean.of().success("getOrder form Nacos provider 7003, order id =" + id
                + "=====" + providerInfo + "======" + nacosInfo);
    }

}

总结

  • Nacos的 namespace 和 group 可以很好的处理多环境配置的情况。不同的环境下进行配置隔离
  • Namespace+Group+Data ID三者关系
  • 类型java中的包命名。 Namespace 区分环境,group和dataId区分目标对象