springcloud(十五Ⅰ)--SpringCloud Alibaba Nacos服务注册和配置中心

本文详细介绍了Nacos作为服务注册和配置中心的使用,包括Nacos的简介、安装运行、作为服务注册中心的演示以及作为服务配置中心的演示。文中提到了Nacos在阿里巴巴内部的大规模应用,并与其他服务注册中心进行了对比,强调了其在AP和CP模式间的切换能力。此外,还展示了如何通过DataID、Group和Namespace方案实现多环境配置管理。
摘要由CSDN通过智能技术生成

一、Nacos简介

Nacos:
前四个字母分别是 Naming和Configuration的前两个字母,最后的s是Service。

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

Nacos:Dynamic Naming and Configuration Service

Nacos就是注册中心 + 配置中心的组合
等价于: Nacos = Eureka + Config + Bus

官网: https://github.com/alibaba/Nacos

在这里插入图片描述
各注册中心比较:

服务注册与发现框架CPA 模型控制台管理社区活跃度
EurekaAP支持底(2.X 版本闭源)
ZookeeperCP不支持
ConsulCP支持
NacosAP(同时也支持CP)支持
  • C:Consistency(强一致性)
  • A:Available(可用性)
  • P:Partition tolerance(分区容错性)

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

二、安装并运行Nacos

本地有 java8+ Maven环境
官网下载网址: https://github.com/alibaba/nacos/tags
下载本地并解压文件
在这里插入图片描述
目录结构
在这里插入图片描述
进入bin目录,启动startup.sh
在这里插入图片描述
在这里插入图片描述
浏览器访问: http://localhost:8848/nacos
在这里插入图片描述
进入页面
在这里插入图片描述

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

父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>

1、基于Nacos的服务提供者

新建Module: cloudalibaba-provider-payment-9001作为服务提供方微服务
pom文件添加nacos依赖:

 <!--SpringCloud ailibaba nacos -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>

application.yml文件配置:

server:
  port: 9001

spring:
  application:
    name: nacos-payment-provider # 微服务名称
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848 # 配置Nacos地址

# 暴露监控端点  ‘*’ 全部打开
management:
  endpoints:
    web:
      exposure:
        include: '*'

启动类:添加@EnableDiscoveryClient 使微服务能够被注册中心发现

@SpringBootApplication
@EnableDiscoveryClient
public class PaymentMain9001 {

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

控制层:

@RestController
public class PaymentController {

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

    @GetMapping("/payment/nacos/{id}")
    public String getPayment(@PathVariable("id") Integer id) {
        return "alibaba nacos, serverPort:" + serverPort + ", id:" + id;
    }
}

先启动nacos,启动9001
在nacos控制面板的服务列表可以发现nacos-payment-provider已被注册进去了
在这里插入图片描述
请求: http://localhost:9001/payment/nacos/2
在这里插入图片描述
怎么创建虚拟端口映射
在PaymentMain9001启动后拷贝
在这里插入图片描述

name: PaymentMain9011 CopyOf 9001 (命名启动类)
VM options: -DServer.port=9011 (设置端口号)

在这里插入图片描述
服务出现映射启动类
在这里插入图片描述
启动:PaymentMain9011 CopyOf 9001
在这里插入图片描述
查看nacos面板:
在这里插入图片描述
在这里插入图片描述
请求: http://localhost:9011/payment/nacos/2

在这里插入图片描述

参考 cloudalibaba-provider-payment-9001创建Module:cloudalibaba-provider-payment-9002作为服务提供方微服务
启动9002:
在这里插入图片描述
在这里插入图片描述

2、基于Nacos的服务消费者

新建Module:cloudalibaba-consumer-nacos-order-83作为服务消费方微服务
pom文件添加nacos依赖:

        <!--SpringCloud ailibaba nacos -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>

application.yml文件配置:

server:
  port: 83

spring:
  application:
    name: nacos-order-cosumer # 微服务名称
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848 # 配置Nacos地址

# 消费者将要去访问的微服务名称(注册成功进的nacos的微服务提供者)
service-url:
  nacos-user-service: http://nacos-payment-provider

启动类:

@SpringBootApplication
@EnableDiscoveryClient
public class OrderNacosMain83 {

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

RestTemplate配置类:添加@LoadBalanced注解实现负载均衡

package com.zzp.springcloud.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;

/**
 * @author zzp
 * @create
 */
@Configuration
public class RestTemplateConfig {

    @Bean
    @LoadBalanced
    public RestTemplate getRestTemplate(){
        return new RestTemplate();
    }

}

控制类:

@RestController
@Slf4j
public class OrderNacosController {

    @Resource
    private RestTemplate restTemplate;

    @Value("${service-url.nacos-user-service}")
    private String serverUrl;

    @GetMapping("/consumer/payment/nacos/{id}")
    public String paymentInfo(@PathVariable("id") Integer id) {
        return restTemplate.getForObject(serverUrl + "/payment/nacos/" + id,String.class);
    }

}

@Value("${service-url.nacos-user-service}")
private String serverUrl;
读取yml配置文件的地址

启动83服务:
在这里插入图片描述
请求测试:http://localhost:83/consumer/payment/nacos/2
在这里插入图片描述
83访问9001/9002,实现负载均衡ok
nacos依赖包自带ribbbon负载均衡
在这里插入图片描述

3、服务注册中心对比

Nacos全景图

在这里插入图片描述

Nacos和CAP
事实上,Nacos可以AP模式和CP模式中进行切换,也就是说Nacos不仅仅支持AP(可用性和分区容错性),它同样支持CP(一致性和分区容错性)。

在这里插入图片描述

在这里插入图片描述

切换
Nacos支持AP和PC模式切换
C是所有节点在同一时间看到的数据是一致的,而A是所有的请求都会受到响应(A可以理解为高可用)。

一般来说,
如果不需要存储服务级别的信息且服务实例是通过nacos-client注册的,并且能保持心跳上报,那么就可以选择AP模式。当前主流的服务如 Spring Cloud 和 Dubbo 服务,都适用于AP模式,AP模式为了服务的可能性而减弱了一致性,因此AP模式下只支持注册临时实例。

如果需要在服务级别编辑或者存储配置信息,那么 CP 是必须的,K8s服务和DNS服务则适用于CP模式。
CP模式下则支持注册持久化实例,此时则是以 Raft 协议为集群运行模式,该模式下注册实例之前必须先注册服务,如果服务不存在,则会返回错误。

如果需要让Nacos服务从AP模式切换到CP模式的话,只需要向服务注册中心发送POST请求即可

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

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

1、基础配置

新建Module:cloudalibaba-config-nacos-client-3377作为服务配置中心的微服务
pom文件添加nacos-config依赖

        <!--nacos-config-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
        </dependency>
        <!--SpringCloud ailibaba nacos -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>

添加两个配置文件:bootstrap.yml (从配置中心拉取配置) 和 application.yml (写自己的配置)

Nacos同springcloud-config一样,在项目初始化时,要保证先从配置中心进行拉取,来取配置之后,才能保证项目的正常启动。
springboot中配置文件的加载是存在优先级顺序的,bootstrap优先级高于application
我们配置 bootstrap.yml 以使3377服务从Nacos上拉取配置信息:
bootstrap.yml

# Nacos配置
server:
  port: 3377

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

#  ${spring.application.name}-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}
# nacos配置文件名: nacos-config-client-dev.yaml

application.yml

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

表示在注册nacos注册中心并拉取开发环境的配置文件信息

启动类:

@SpringBootApplication
@EnableDiscoveryClient
public class NacosConfigClinetMain3377 {

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

控制类,添加注解@RefreshScope(通过 spring cloud 原生注解 @RefreshScope 实现配置自动更新)

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

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

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

}

在Nacos控制面板添加配置信息:

Nacos中的匹配规则

Nacos中的dataId的组成格式及与SpringBoot配置文件中的匹配规则
查看官网文档配置信息: https://nacos.io/zh-cn/docs/quick-start-spring-cloud.html

在这里插入图片描述

${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.profiles.active}.${spring.cloud.nacos.config.file-extension}

在nacos界面配置对应的文件

nacos-config-client-dev.yaml
在这里插入图片描述

在这里插入图片描述
配置内容:

config:
    info: nacos config center, version = 1

查找
在这里插入图片描述

配置文件图形说明:
在这里插入图片描述

启动3377服务
访问: http://localhost:3377/config/info

在这里插入图片描述

自带的动态刷新:

修改Nacos中yaml配置文件,再次调用接口查看配置信息,就会发现配置已经更新
在这里插入图片描述
请求:
在这里插入图片描述

2、分类配置

多环境项目管理
问题1:
实际开发中,通常一个系统会准备
dev开发环境
test测试环境
prod生成环境
如何保证指定环境启动时服务能够正确读取到Nacos上相对应环境的配置文件?

问题2:
一个大型分布式微服务系统会有很多微服务子项目,
每个微服务项目又都会有相对应的开发环境、测试环境、预发环境、正式环境…
那怎么对这些微服务配置进行管理?

Nacos的图形化管理界面
在这里插入图片描述

在这里插入图片描述

命名空间设计是: Namespace + Group + Data ID
1、是什么
类似Java里面的package名和类名
最外层的Namespace 是可以用于区分部署环境的,Group 和 Data ID逻辑上区分两个目标对象。

2、三者情况
在这里插入图片描述

默认情况是:
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微服务起一个集群名称(SZ),
给广州机房的Service微服务也起一个名称(GZ),还可以尽量让同一个机房的微服务相互调用,以提升性能。

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

三种方案加载配置:

①、DataID方案

指定 spring.profile.active 配置属性和配置文件的 dataId 来使不同环境下读取不同的配置,
也就是说我们现在用默认的命名空间 namespace (即 public),默认的分组 Group (即 DEFAULT_GROUP),然后在Nacos配置中心中建立两个 分别为 dev 环境和 test 环境 的 DataID
新建dev/test的DataID:

在这里插入图片描述
在这里插入图片描述
然后通过application.yml配置文件的 spring.profile.active属性就能进行多环境下配置文件的读取
在这里插入图片描述
启动,测试访问:

在这里插入图片描述

再切换到开发模式
在这里插入图片描述
启动,测试访问:
在这里插入图片描述

②、Group方案

通过 Group实现环境区分
在这里插入图片描述

在Nacos图形界面控制台上面新建配置文件DataID
新建Group
DEV_GROUP(开发环境组)
在这里插入图片描述
TEST_GROUP(测试环境组)
在这里插入图片描述
在这里插入图片描述
修改3377微服务的 bootstrap.yml + application.yml 配置文件进行操作

在bootstrap.yml 配置文件添加 spring.cloud.nacos.config.group 属性,设置为响应的组名即可,比如我们现在的 DEV_GROUP(开发环境组)/TEST_GROUP(测试环境组)

在这里插入图片描述

重启访问:
在这里插入图片描述
修改bootstrap.yml 配置文件group 为DEV_GROUP
在这里插入图片描述

重启访问:

在这里插入图片描述

③、Namespace方案

新建 dev/test 的Namespace空间
在这里插入图片描述

在这里插入图片描述
创建成功
在这里插入图片描述
在配置列界面点dev,添加配置:
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

查看dev配置列表:
在这里插入图片描述
在添加 dev Group分组
DEV_GROUP组
在这里插入图片描述

TEST_GROUP 组
在这里插入图片描述
在这里插入图片描述

在bootstrap.yml 配置文件添加 spring.cloud.nacos.config.namespace属性,设置为我们新建的命名空间id
在这里插入图片描述

重启访问:

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值