【微服务】- SpringCloudAlibaba的Nacos

1.简介

为什么叫Nacos

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

是什么

Nacos= Eureka +Config + Bus

功能

替代Eureka做服务注册中心
替代Config做服务配置中心

官网

https://nacos.io/zh-cn/docs/what-is-nacos.html
下载地址:https://github.com/alibaba/nacos/releases

注册中心对比

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

安装及运行

在这里插入图片描述

2.nacos作为服务注册中心

和eureka和zookeeper类似如果要使用nacos注册中心只需要在yml配置文件中进行配置即可。

1.nacos作为服务提供者

建立9001项目

  • 建项目
    项目名称:cloudalibaba-provider-payment9001
  • 写pom
  • 写yml
server:
  port: 9001
spring:
  application:
    name: nacos-payment-provider
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848

# 暴露端口,方便监控服务
management:
  endpoints:
    web:
      exposure:
        include: "*"
  • 主启动
  • 业务类
    controller
@RestController
public class PaymentController {

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

    @GetMapping(value = "/payment/nacos/{id}")
    public String getPayment(@PathVariable("id") Integer id) {
        return "nacos registry, serverPort: " + serverPort + "\t id" + id;
    }

}

简单的程序只输出其端口

测试

启动nacos和83项目,访问http://localhost:8848/nacos

在这里插入图片描述
已经注册入nacos
访问http://localhost:9001/payment/nacos/3
在这里插入图片描述
可以正常访问服务提供者搭建成功。

为了演示nacos的负载均衡功能参照9001,新建9002

2.nacos作为服务消费者替代Eureka

下面开始nacos作为服务中心项目的建立

建项目

若部分代码没有给出,请在远程仓库https://gitee.com/gyhdx/cloud2020查找

  • 新建项目
    项目名称:cloudalibaba-consumer-nacos-Order83

  • 写pom

  • 写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
  • 主启动
    NacosConsumerMain83.class类
  • 业务类
    config
package wf.springcloudalibaba.config;

/**
 * @Description TODO
 * @Author gyhdx
 * @Date 2020/4/25 21:46
 */
@Configuration
public class ApplicationContextConfig {

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

controller


package wf.springcloudalibaba.controller;

/**
 * @Description TODO
 * @Author gyhdx
 * @Date 2020/4/25 21:48
 */
@RestController
@Slf4j
public class NacosController {

    @Resource
    private RestTemplate restTemplate;

	//获取yml中的相关配置值
    @Value("${service-url.nacos-user-service}")
    private String path;

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

测试

启动nacos和83项目,访问http://localhost:8848/nacos

在这里插入图片描述

访问http://localhost:83/consumer/payment/nacos/3
第一次访问在这里插入图片描述
刷新页面在这里插入图片描述
实现了轮询访问服务提供者,证明Nacos负载均衡起作用

nacos中的负载均衡

在这里插入图片描述
可以看到nacos依赖中已经自带了负载均衡Ribbon。

3.nacos作为配置中心替代Config

nacos的cap

在这里插入图片描述

在这里插入图片描述

Nacos支持AP和CP模式的切换

C是所有节点在同一时间看到的数据是一致的; 而A的定义是所有的请求都会收到响应。

何时选择使用何种模式?

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

如果需要在服务级别编辑或者存储配置信息,那么CP是必须,K8S服务和DNS服务则适用于CP模式。

CP模式下则支持注册持久化实例,此时则是以Raft协议为集群运行模式,该模式下注册实例之前必须先注册服务,如果服务不存在,则会返回错误。

可以通过cmd执行
curl -XPUT ‘$NACOS_ SERVER:8848/nacos/v1/ns/operator/switches?ntry=serverMode&value=CP’
来实现nacos的CP模式切换

1.代码演示nacos配置中心功能

新建项目

  • 建项目
    项目名称:cloudalibaba-config-nacos-client3377
  • 写pom
  • 写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
 

application.yml
该yml是为了支持DataId方案的开发

spring:
  profiles:
#    active: test
    active: dev
  • 主启动
  • 业务类
    controller
@RestController
@RefreshScope
public class NacosController {

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

    @GetMapping(value = "/config/nacos/info")
    public String info(){
        return value;
    }
}

注意在controller中@RefreshScope注解必须配置,为了实现动态刷新功能(Nacos的配置中心,配置发生改变,服务能感知到这种变化)

在nacos中添加配置信息

nacos中的匹配规则理论

Nacos中的dataid的组成格式及与SpringBoot配置文件中的匹配规则
在这里插入图片描述
简单来说就是
在这里插入图片描述
故按照我们在项目中yml的配置,改目标Data Id为nacos-config-client-dev.yaml

在nacos中添加配置

在这里插入图片描述
配置完成下拉,点击发布即可
在这里插入图片描述
配置成功后:
在这里插入图片描述

测试

启动3377项目,访问http://localhost:3377/config/nacos/info

在这里插入图片描述

配置成功。
点击编辑修改配置
在这里插入图片描述
刷新http://localhost:3377/config/nacos/info
在这里插入图片描述
可以看到改变了,这就是上面yml的端口开放实现监控和@RefreshScope共同起作用。

2.Nacos的分类配置

多环境多项目的问题

  • 问题1:
    实际开发中,通常一个系统会准备
    dev开发环境
    test测试环境
    prod生产环境。
    如何保证指定环境启动时服务能正确读取到Nacos.上相应环境的配置文件呢?
  • 问题2:
    一个大型分布式微服务系统会有很多微服务子项目,
    每个微服务项目又都会有相应的开发环境、测试环境、预发环境、正式环境…
    那怎么对这些微服务配置进行管理呢?

nacos的图形化管理界面

  • 配置管理
    在这里插入图片描述
  • 命名空间
    在这里插入图片描述

Namespace+ Group+Data ID3者关系?为什么这么设计?

  • 是什么
    类似Java里面的package名和类名
    最外层的namespace是可以用于区分部署环境的,Group和DatalD逻辑 上区分两个目标对象。
  • 三者关系
    在这里插入图片描述
    默认情况:
    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,就是微服务的实例。

3.三种方案加载配置

DataId方案

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

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

  • 新建dev配置DatalD
    nacos-config-client-dev.yaml
  • 新建test配置DatalD
    nacos-config-client-test.yaml
    在这里插入图片描述
    我们开始配置的application.yml中为dev,此时修改为test
    在这里插入图片描述
    访问http://localhost:3377/config/nacos/info
    在这里插入图片描述
    可以看到,该方案起作用了。

Group方案

通过group实现环境区分
在这里插入图片描述
在新建时直接修改Group即可
在这里插入图片描述
想让项目成功访问,需要在bootstrap.yml中修改一下配置
在这里插入图片描述
重启项目,成功访问http://localhost:3377/config/nacos/info
在这里插入图片描述
注意此处浏览器显示的内容为nacos中配置的
在这里插入图片描述
是通过controller获取
在这里插入图片描述
具体规则
在这里插入图片描述

namespace方案

在这里插入图片描述
可以自定义命名空间的名称、描述和ID,新建dev(开发)、test(测试)两个命名空间。
回到配置列表查看
在这里插入图片描述

在dev命名空间新建配置

在这里插入图片描述
然后,对项目的bootstrap.yml文件进行修改
在这里插入图片描述
在这里插入图片描述

此处我的命名空间为dev,group为DEV_GROUP,active环境为dev,说明访问的是
在这里插入图片描述
重启项目,成功访问http://localhost:3377/config/nacos/info
在这里插入图片描述
namespace方案使用成功。

3.nacos集群架构说明

1.集群模式部署

这个快速开始手册是帮忙您快速在你的电脑上,下载安装并使用Nacos,部署生产使用的集群模式。

集群部署架构图

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

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

http://VIP:port/openAPI 挂载VIP模式,直连vip即可,下面挂server真实ip,可读性不好。

http://nacos.com:port/openAPI 域名 + VIP模式,可读性好,而且换ip方便,推荐模式
在这里插入图片描述
注意:VIP=virtue ip(虚拟ip,用来在集群环境映射Nacos的真实ip)
在这里插入图片描述
在这里插入图片描述
实现上述架构的一种方案
在这里插入图片描述

Nacos支持三种部署模式

单机模式 - 用于测试和单机试用。
集群模式 - 用于生产环境,确保高可用。
多集群模式 - 用于多数据中心场景。

2.nacos持久化

因为nacos具备注册中心的功能,以及支持cp故nacos需要数据的持久化。

默认Nacos使用嵌入式数据库实现数据的存储。所以,如果启动多个默认配置下的Nacos节点,数据存储是存在一致性问题的。
为了解决这个问题,Nacos采用了集中式存储的方式来支持集群化部署,目前只支持MySQL的存储。

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

实现derby数据库到mysql数据库的切换

官网https://nacos.io/zh-cn/docs/deployment.html
在这里插入图片描述

posted @ 2020-05-06 12:02  紫月冰凌  阅读(711)  评论(0编辑  收藏  举报