默认端口:8848

1. 简述

为什么叫Nacos:前四个字母分别为naming和Configuration的前两个字母,最后的s为service。

1.2 是什么

  • 一个更易于构建云原生应用的动态服务发现,配置管理和服务管理平台。
  • Nacos:Dynamic Naming and Configuration Service
  • Nacos就是 **注册中心+配置中心** 的组合,等价于===**eureka + config + ribbon + bus**
  • 替代eureka做服务注册中心
  • 替代config做服务配置中心
  • 兼顾Bus动态刷新

1.3 官网、下载及API

https://nacos.io/zh-cn/

  • 先从官网下载Nacos
  • 解压安装包,直接运行bin目录下的 startup.cmd/start.sh
  • 命令运行成功后直接访问 http://localhost:8848/nacos
  • 用户名/密码 nacos/nacos
  • image.png

    2. 注册中心

    2.1 依赖

    ```xml com.alibaba.cloud spring-cloud-alibaba-dependencies 2.1.0.RELEASE pom import
com.alibaba.cloud spring-cloud-starter-alibaba-nacos-discovery <a name="gOQx5"></a> ## 2.2 服务提供者 <a name="2APf4"></a> ### 2.2.1 YAML配置yaml server: port: 9001 spring: application: name: nacos-payment-provider cloud: nacos: discovery: server-addr: localhost:8848 #配置Nacos地址 management: endpoints: web: exposure: include: ‘<a name="pupEX"></a> ### 2.2.2 主启动类java /** @author JShawn 2021/3/28 22:44 / @SpringBootApplication @EnableDiscoveryClient // 此处就只使用@EnableDiscoveryClient即可 public class AlibabaPaymentMain9001 { public static void main(String[] args) { SpringApplication.run(AlibabaPaymentMain9001.class, args); } } <a name="tEPpW"></a> ### 2.2.3 业务类java /** @author JShawn 2021/3/28 22:45 / @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; } } <a name="NTlML"></a> ## 2.3 服务消费者 > 案例采用Ribbon+RestTemplate,如果需要使用Feign版参考:[feign整合nacos](https://www.cnblogs.com/gstszbc/p/14814291.html) <a name="WaNkV"></a> ### 2.3.1 自带负载均衡 ![image.png](https://cdn.nlark.com/yuque/0/2021/png/668367/1616943842232-65c52b84-5c42-4b33-be9b-92fb207b1be2.png#crop=0&crop=0&crop=1&crop=1&height=95&id=JgHgZ&margin=%5Bobject%20Object%5D&name=image.png&originHeight=190&originWidth=838&originalType=binary&ratio=1&rotation=0&showTitle=false&size=25895&status=done&style=none&title=&width=419) <a name="eBISF"></a> ### 2.3.2 YAML配置yaml server: port: 83 spring: application: name: nacos-order-consumer cloud: nacos: discovery: server-addr: localhost:8848 #消费者将要去访问的微服务名称(注册成功进nacos的微服务提供者) service-url: nacos-user-service: http://nacos-payment-provider <a name="vbKW5"></a> ### 2.3.3 主启动类java /** @author JShawn 2021/3/28 22:45 / @EnableDiscoveryClient @SpringBootApplication public class OrderNacosMain83 { public static void main(String[] args) { SpringApplication.run(OrderNacosMain83.class,args); } } <a name="Z0GmZ"></a> ### 2.3.4 配置类java /** @author JShawn 2021/3/28 22:45 / @Configuration public class ApplicationContextConfig { @Bean @LoadBalanced public RestTemplate getRestTemplate() { return new RestTemplate(); } } <a name="P51lu"></a> ### 2.3.5 业务类java /** @author JShawn 2021/3/28 22:45 / @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); } } `` <a name="072Gu"></a> ## 2.4 启动测试 ![image.png](https://cdn.nlark.com/yuque/0/2021/png/668367/1616943498146-59db7dda-d132-4557-9f7d-09dbf94812c9.png#crop=0&crop=0&crop=1&crop=1&height=437&id=l37j3&margin=%5Bobject%20Object%5D&name=image.png&originHeight=873&originWidth=1918&originalType=binary&ratio=1&rotation=0&showTitle=false&size=126364&status=done&style=none&title=&width=959) <a name="zBCBc"></a> ## 2.5 服务注册中心对比 参考:[七、四个注册中心的异同点](https://www.yuque.com/shawn-ssup1/tf21fz/neh8q0) <a name="rH7Rz"></a> ### 2.5.1 Nacos全景图示 ![image.png](https://cdn.nlark.com/yuque/0/2021/png/668367/1616943551038-a08ff250-426a-4d1b-ae21-b0590d2984f6.png#crop=0&crop=0&crop=1&crop=1&height=413&id=ZZP8N&margin=%5Bobject%20Object%5D&name=image.png&originHeight=826&originWidth=1281&originalType=binary&ratio=1&rotation=0&showTitle=false&size=563006&status=done&style=none&title=&width=640.5) <a name="mWxni"></a> ### 2.5.2 Nacos和CAP ![image.png](https://cdn.nlark.com/yuque/0/2021/png/668367/1616943547087-8424c6be-6457-4272-80bc-fcd9a7911079.png#crop=0&crop=0&crop=1&crop=1&height=364&id=sukeN&margin=%5Bobject%20Object%5D&name=image.png&originHeight=728&originWidth=1324&originalType=binary&ratio=1&rotation=0&showTitle=false&size=753936&status=done&style=none&title=&width=662)<br />![image.png](https://cdn.nlark.com/yuque/0/2021/png/668367/1616943541364-e083e6ea-b163-4913-87bc-eca1f62cd49d.png#crop=0&crop=0&crop=1&crop=1&height=260&id=vP5hA&margin=%5Bobject%20Object%5D&name=image.png&originHeight=520&originWidth=1001&originalType=binary&ratio=1&rotation=0&showTitle=false&size=682755&status=done&style=none&title=&width=500.5) <a name="AmyEl"></a> ### 2.5.3 Nacos的CP/AP切换 > 最后一句话 > C是所有节点在同一时间看到的数据是一致的;而A的定义是所有的请求都会收到响应。 > > > 何时选择使用何种模式? > 一般来说, > 如果不需要存储服务级别的信息且服务实例是通过nacos-client注册,并能够保持心跳上报,那么就可以选择AP模式。当前主流的服务如 Spring cloud 和 Dubbo 服务,都适用于AP模式,AP模式为了服务的可能性而减弱了一致性,因此AP模式下只支持注册临时实例。 > > 如果需要在服务级别编辑或者存储配置信息,那么 CP 是必须,K8S服务和DNS服务则适用于CP模式。 > CP模式下则支持注册持久化实例,此时则是以Raft 协议为集群运行模式,该模式下注册实例之前必须先注册服务,如果服务不存在,则会返回错误。 > > 如何切换CP和AP? > 默认AP > **全局:服务端设置**curl -X PUT ‘$NACOS_SERVER:8848/nacos/v1/ns/operator/switches?entry=serverMode&value=CP’**表示启用CP模式** > **或** > **针对某一服务:客户端设置**spring.cloud.nacos.discovery.ephemeral=false (默认为true)`* ,表示是启用AP模式 # 3. 配置中心 ## 3.1 基础配置 ### 3.1.1 依赖 ```xml com.alibaba.cloud spring-cloud-starter-alibaba-nacos-config

com.alibaba.cloud spring-cloud-starter-alibaba-nacos-discovery

  1. <a name="B4rkV"></a>
  2. ### 3.1.2 YAML配置
  3. > Nacos作为配置中心,和Config一样,同样具有两个配置文件, `bootstrap.yml` 和 `application.yml` ,全局的放在bootstrap.yml,私有的放在application.yml
  4. > ![image.png](https://cdn.nlark.com/yuque/0/2021/png/668367/1616944196495-dc492c95-a09e-4239-b9f7-9a8e749d8828.png#crop=0&crop=0&crop=1&crop=1&height=98&id=Sz4Zb&margin=%5Bobject%20Object%5D&name=image.png&originHeight=130&originWidth=652&originalType=binary&ratio=1&rotation=0&showTitle=false&size=75134&status=done&style=none&title=&width=489)
  5. > ![image.png](https://cdn.nlark.com/yuque/0/2021/png/668367/1616944695188-ae0fc1dd-fa67-4945-b03a-d175efc73698.png#crop=0&crop=0&crop=1&crop=1&height=143&id=gxNfQ&margin=%5Bobject%20Object%5D&name=image.png&originHeight=191&originWidth=816&originalType=binary&ratio=1&rotation=0&showTitle=false&size=75808&status=done&style=none&title=&width=612)
  6. > ![image.png](https://cdn.nlark.com/yuque/0/2021/png/668367/1616944703648-d4c668f1-5059-4c9f-a51e-ab19235ff69c.png#crop=0&crop=0&crop=1&crop=1&height=256&id=Zqnse&margin=%5Bobject%20Object%5D&name=image.png&originHeight=341&originWidth=795&originalType=binary&ratio=1&rotation=0&showTitle=false&size=124024&status=done&style=none&title=&width=596)
  7. <a name="okUHV"></a>
  8. #### 3.1.2.1 bootstrap.yml
  9. > 核心:动态修改文件后,读取哪个文件依靠的是如下公式去读取:
  10. > `${spring.application.name}-${spring.profile.active}.${spring.cloud.nacos.config.file-extension}`
  11. > 或
  12. > `${spring.cloud.nacos.config.prefix}-${spring.profile.active}.${spring.cloud.nacos.config.file-extension}`,
  13. > 如果不指定`sping.profile.active`,公式为`${spring.application.name}.${spring.cloud.nacos.config.file-extension}`
  14. > 或`${spring.cloud.nacos.config.prefix}.${spring.cloud.nacos.config.file-extension}`
  15. ```yaml
  16. server:
  17. port: 3377
  18. spring:
  19. application:
  20. name: nacos-config-client
  21. cloud:
  22. nacos:
  23. discovery:
  24. server-addr: localhost:8848 #Nacos服务注册中心地址
  25. config:
  26. server-addr: localhost:8848 #Nacos作为配置中心地址
  27. file-extension: yaml #指定yaml格式的配置
  28. # namespace: 指定nacos的配置命名空间ID,默认是public
  29. # group: 指定nacos的配置分组,默认是DEFAULT_GROUP
  30. # 公式:
  31. # ${spring.application.name}-${spring.profile.active}.${spring.cloud.nacos.config.file-extension}
  32. # ex:
  33. #nacos-config-client-dev.yaml

3.1.2.2 application.yml

spring:
  profiles:
    active: dev # 表示开发环境
    #active: test # 表示测试环境
    #active: prod # 表示生产环境
    #active: info

3.1.3 主启动类

@SpringBootApplication
@EnableDiscoveryClient
public class ConfigNacosMain3377 {

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

3.1.4 业务类

核心:@RefreshScope注解,使该服务支持nacos的动态刷新功能

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

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

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

3.1.5 Nacos中增加配置信息

理论:Nacos中的dataid的组成格式及与SpringBoot配置文件中的配置规则。 image.png

3.1.5.1 新增配置

DataId必须符合命名规则

image.png
image.png

3.1.6 测试

  • 测试拉取成功
  • 修改nacos上的配置
  • 再次拉取最新配置成功,自带动态刷新

image.png
image.png

3.2 分类配置

问题:多环境多项目管理? image.png

3.2.1 Nacos的图形化管理界面

3.2.1.1 配置管理

image.png

3.2.1.2 命名空间

image.png

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

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

3.2.3 Case:三种方案配置

3.2.3.1 DataID方案

  • 指定 spring.profile.active 和配置文件的DataID来使不同环境下读取不同的配置
  • 默认空间+默认分组+新建dev和test两个DataID
    • 新建dev配置dataID
      • image.png
    • 新建test配置DataID
      • image.png
  • 通过 spring.profile.active 属性就能进行多环境下的配置文件的读取。
  • 测试

    3.2.3.2 Group方案

  • 通过Group实现环境区分

  • 在nacos图形界面控制台上面新建配置文件DataID
    • image.png
  • bootstrap和application

    • image.png

      3.2.3.3 Namespace方案

  • 新建dev/test的namespace

  • 回到服务管理-服务列表查看
  • 按照域名配置填写
    • YML
      • bootstrap.yaml
        • 图像.jpeg
      • application.yaml(略,参考:3.1.2.2 application.yaml

        4. Nacos集群和持久化配置(重要)

        4.1 架构说明

        image.png
        image.png
        image.png
        image.png

        4.2 Nacos持久化

        Nacos默认自带的嵌入式数据库Derby,数据默认是存放在Derby中,若要搭建Nacos集群,使用默认数据库存储就会出现数据不一致情况,因此Nacos支持将数据存储在MySQL中,集群环境下使用统一数据源

4.2.1 Derby到mysql的切换配置步骤

  • nacos-server-1.1.4\nacos\conf 目录下找到sql脚本
    • 执行脚本 nacos-mysql.sql
  • nacos-server-1.1.4\nacos\conf 目录下找到 application.properties ,增加MySQL信息
    • Inked图像_LI.jpg
  • 启动nacos,可以看到一个全新的空记录界面,以前是记录进Derby

    4.2.2 Linux版nacos+mysql生产环境配置

    4.2.2.1 前提

    预计需要,1个Nginx+3nacos注册中心+1个mysql

image.png

4.2.2.2 集群配置步骤(重点)

  • Linux服务器上mysql数据库配置
    • SQL脚本在哪里
      • image.png
    • 自己Linux机器上的mysql数据库粘贴
  • application.properties 配置
    • 位置
      • image.png
    • 添加如下内容
      • image.png
  • Linux服务器上nacos的集群配置 cluster.conf
    • 梳理3台nacos机器的不同服务端口号
    • 复制出cluster.conf
      • image.png
    • 内容,这个IP不能写127.0.0.1,必须是Linux命令hostname -i能够识别的IP
      • image.png
  • 编辑nacos的启动脚本 startup.sh ,使它能够接受不同的启动端口
    • /mynacos/nacos/bin目录下有startup.sh
    • 思考
      • image.png
    • 修改内容
      • image.png

image.png
image.png

  • 执行方式
    • image.png
      • Nginx的配置,由它作为负载均衡器
  • 修改Nginx的配置文件
    • image.png
  • nginx.conf
    • image.png

image.png

  • 按照指定启动
    • image.png
      • 截止到此处,1个Nginx+3个nacos注册中心+1个mysql
  • 测试通过Nginx访问nacos:http://192.168.111.144:1111/nacos/#/login
  • 新建一个配置测试
  • Linux服务器的mysql插入一条记录
  • 消费方启动注册进nacos集群
    • YML
      • image.png

        4.3 高可用小结

        image.png