Alibaba微服务组件Nacos注册中心学习笔记

爱被打了一巴掌 2024-03-30 17:53 193阅读 0赞

目录

  1. 什么是 Nacos

  2. Nacos注册中心

3.主流的注册中心

4.Nacos Server部署

  1. Spring Cloud Alibaba Nacos快速开始

6.编写代码

7.运行结果


1. 什么是 Nacos

什么是 Nacos官方网站:什么是 Nacos

官方:一个更易于构建云原生应用的动态服务发现(Nacos Discovery )服务配置(Nacos Config)和服务管理平台。 集 注册中心+配置中心+服务管理 平台

Nacos 的关键特性包括:

服务发现和服务健康监测

动态配置服务

动态 DNS 服务

服务及其元数据管理

2. Nacos**注册中心**

管理所有微服务、解决微服务之间调用关系错综复杂、难以维护的问题;

2.3 核心功能

Nacos Discovery

服务注册 : Nacos Client 会通过发送 REST 请求的方式向 Nacos Server 注册自己的服务,提供自身的元数据,比如 ip 地

址、端口等信息。 Nacos Server 接收到注册请求后,就会把这些元数据信息存储在一个双层的内存 Map 中。

服务心跳 :在服务注册后, Nacos Client 会维护一个定时心跳来持续通知 Nacos Server ,说明服务一直处于可用状态,防

止被剔除。默认 5s 发送一次心跳。

服务同步 : Nacos Server 集群之间会互相同步服务实例,用来保证服务信息的一致性。 leader raft

服务发现 :服务消费者( Nacos Client )在调用服务提供者的服务时,会发送一个 REST 请求给 Nacos Server ,获取上面

注册的服务清单,并且缓存在 Nacos Client 本地,同时会在 Nacos Client 本地开启一个定时任务定时拉取服务端最新的注

册表信息更新到本地缓存

服务健康检查 : Nacos Server 会开启一个定时任务用来检查注册服务实例的健康情况,对于超过 15s 没有收到客户端心跳

的实例会将它的 healthy 属性置为 false( 客户端服务发现时不会发现 ) ,如果某个实例超过 30 秒没有收到心跳,直接剔除该

实例 ( 被剔除的实例如果恢复发送心跳则会重新注册 )

3.主流的注册中心

CAP C 一致性 A可用性 P 分区容错性

fcb8299ff4674531bf2dc012d13f94c7.png

雪崩保护:

保护阈值: 设置0-1之间的值 0.6

临时实例: spring.cloud.nacos.discovery.ephemeral =false, 当服务宕机了也不会从服务列表中剔除

下图代表永久实例:

62b07745925b4849825e0abea480392c.png

健康实例、 不健康实例;

健康实例数/总实例数 < 保护阈值`

1/2<0.6

0e500e4d617f4cc7833953a3d31a392a.png

结合负载均衡器 权重的机制, 设置的越大

90ba0316ca9a4053baac230a2b88682b.png

4.Nacos Server**部署**

下载源码编译

源码下载地址: https://github.com/alibaba/nacos/

可以用迅雷下载 下载安装包, 下载地址: https://github.com/alibaba/Nacos/releases

4.1 单机模式

官方文档: https://nacos.io/zhcn/docs/deployment.html

解压,进入 nacos 目录

单机启动 nacos ,执行命令

bin / startup . sh ‐ m standalone

也可以修改默认启动方式

访问 nocas 的管理端: http://localhost:8848/nacos ,默认的用户名密码是 nocas/nocas

4.2 集群模式

官网文档: https://nacos.io/zhcn/docs/clustermodequickstart.html

听句劝! Nacos集群搭建可以看看这篇教程 - 腾讯云开发者社区-腾讯云 (tencent.com)

5. Spring Cloud Alibaba Nacos快速开始

5.1 Spring Cloud Alibaba版本选型

地址: 版本说明 · alibaba/spring-cloud-alibaba Wiki · GitHub

a511cdb4cc9645919a8715822586b96b.png

5.2 搭建Nacos-client服务

1 )引入依赖

新建项目目录如图:

6d552a2b602c43fc81cb689ba0360c09.png

在父项目引入依赖:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
  4. <modelVersion>4.0.0</modelVersion>
  5. <modules>
  6. <module>stock-nacos</module>
  7. <module>order-nacos</module>
  8. </modules>
  9. <groupId>com.wang</groupId>
  10. <artifactId>SpringCloudAlibabaLearn</artifactId>
  11. <version>0.0.1-SNAPSHOT</version>
  12. <name>SpringCloudAlibabaLearn</name>
  13. <packaging>pom</packaging>
  14. <description>SpringCloudAlibabaLearn</description>
  15. <properties>
  16. <java.version>1.8</java.version>
  17. <spring.cloud.alibaba.version>2.2.6.RELEASE</spring.cloud.alibaba.version>
  18. <spring.cloud.version>Hoxton.RELEASE</spring.cloud.version>
  19. <spring.boot.version>2.3.12.RELEASE</spring.boot.version>
  20. </properties>
  21. <dependencies>
  22. <!-- SpringBoot场景启动器-->
  23. <dependency>
  24. <groupId>org.springframework.boot</groupId>
  25. <artifactId>spring-boot-starter</artifactId>
  26. </dependency>
  27. <!--测试-->
  28. <dependency>
  29. <groupId>org.springframework.boot</groupId>
  30. <artifactId>spring-boot-starter-test</artifactId>
  31. <scope>test</scope>
  32. <exclusions>
  33. <exclusion>
  34. <groupId>org.junit.vintage</groupId>
  35. <artifactId>junit-vintage-engine</artifactId>
  36. </exclusion>
  37. </exclusions>
  38. </dependency>
  39. </dependencies>
  40. <dependencyManagement>
  41. <dependencies>
  42. <!-- Spring-cloudyAlibaba-->
  43. <dependency>
  44. <groupId>com.alibaba.cloud</groupId>
  45. <artifactId>spring-cloud-alibaba-dependencies</artifactId>
  46. <version>${spring.cloud.alibaba.version}</version>
  47. <type>pom</type>
  48. <scope>import</scope>
  49. </dependency>
  50. <!--springboot的版本管理-->
  51. <dependency>
  52. <groupId>org.springframework.boot</groupId>
  53. <artifactId>spring-boot-starter-parent</artifactId>
  54. <version>${spring.boot.version}</version>
  55. <type>pom</type>
  56. <scope>import</scope>
  57. </dependency>
  58. <!-- spring-cloud的版本管理-->
  59. <dependency>
  60. <groupId>org.springframework.cloud</groupId>
  61. <artifactId>spring-cloud-dependencies</artifactId>
  62. <version>${spring.cloud.version}</version>
  63. <type>pom</type>
  64. <scope>import</scope>
  65. </dependency>
  66. </dependencies>
  67. </dependencyManagement>
  68. <build>
  69. <!-- 打包-->
  70. <plugins>
  71. <plugin>
  72. <groupId>org.apache.maven.plugins</groupId>
  73. <artifactId>maven-compiler-plugin</artifactId>
  74. <version>3.8.1</version>
  75. <configuration>
  76. <source>1.8</source>
  77. <target>1.8</target>
  78. <encoding>UTF-8</encoding>
  79. </configuration>
  80. </plugin>
  81. <plugin>
  82. <groupId>org.springframework.boot</groupId>
  83. <artifactId>spring-boot-maven-plugin</artifactId>
  84. <version>2.3.12.RELEASE</version>
  85. </plugin>
  86. </plugins>
  87. </build>
  88. </project>

在子模块引入 依赖:

  1. <dependencies>
  2. <dependency>
  3. <groupId>org.springframework.boot</groupId>
  4. <artifactId>spring-boot-starter-web</artifactId>
  5. </dependency>
  6. <!--nacos注册发现依赖-->
  7. <dependency>
  8. <groupId>com.alibaba.cloud</groupId>
  9. <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
  10. </dependency>
  11. </dependencies>

两个子模块application.yml

  1. server:
  2. port: 8022
  3. #应用名称nacos会当做服务名称
  4. spring:
  5. application:
  6. name: order-nacos
  7. cloud:
  8. nacos:
  9. server-addr: localhost:8848
  10. discovery:
  11. username: nacos
  12. password: nacos
  13. namespace: public

cf8db924b0554fea947e53953bf3e72d.png

更多配置: https://github.com/alibaba/springcloudalibaba/wiki/Nacosdiscovery

6.编写代码

6.1order-nacos模块:

  1. controllter
  2. package com.wang.controller;
  3. import org.springframework.beans.factory.annotation.Autowired;
  4. import org.springframework.web.bind.annotation.GetMapping;
  5. import org.springframework.web.bind.annotation.RequestMapping;
  6. import org.springframework.web.bind.annotation.RestController;
  7. import org.springframework.web.client.RestTemplate;
  8. /**
  9. * @BelongsProject: SpringCloudAlibabaLearn
  10. * @BelongsPackage: com.wang.controllter
  11. * @Author: wang fei
  12. * @CreateTime: 2023-01-16 16:48
  13. * @Description: TODO
  14. * @Version: 1.0
  15. */
  16. @RestController
  17. @RequestMapping("/order")
  18. public class OrderController {
  19. @Autowired
  20. private RestTemplate restTemplate;
  21. @GetMapping("/pay")
  22. public String pay(){
  23. String msg = restTemplate.getForObject("http://localhost:8023/stock/reduce", String.class);
  24. return "success" + " " + System.currentTimeMillis();
  25. }
  26. }
  27. OrderApplication
  28. package com.wang;
  29. import org.springframework.boot.SpringApplication;
  30. import org.springframework.boot.autoconfigure.SpringBootApplication;
  31. import org.springframework.boot.web.client.RestTemplateBuilder;
  32. import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
  33. import org.springframework.cloud.client.loadbalancer.LoadBalanced;
  34. import org.springframework.context.annotation.Bean;
  35. import org.springframework.web.client.RestTemplate;
  36. /**
  37. * @BelongsProject: SpringCloudAlibabaLearn
  38. * @BelongsPackage: com.wang.controller
  39. * @Author: wang fei
  40. * @CreateTime: 2023-01-16 16:54
  41. * @Description: TODO
  42. * @Version: 1.0
  43. */
  44. @EnableDiscoveryClient
  45. @SpringBootApplication
  46. public class OrderApplication {
  47. public static void main(String[] args) {
  48. SpringApplication.run(OrderApplication.class, args);
  49. }
  50. @Bean
  51. // @LoadBalanced //负载均衡
  52. public RestTemplate restTemplate(RestTemplateBuilder builder){
  53. RestTemplate restTemplate = builder.build();
  54. return restTemplate;
  55. }
  56. }

6.2stock-nacos模块:

  1. controllter
  2. package com.wang.controller;
  3. import org.springframework.web.bind.annotation.GetMapping;
  4. import org.springframework.web.bind.annotation.RequestMapping;
  5. import org.springframework.web.bind.annotation.RestController;
  6. /**
  7. * @BelongsProject: SpringCloudAlibabaLearn
  8. * @BelongsPackage: com.wang.controller
  9. * @Author: wang fei
  10. * @CreateTime: 2023-01-16 16:51
  11. * @Description: TODO
  12. * @Version: 1.0
  13. */
  14. @RestController
  15. @RequestMapping("/stock")
  16. public class StockController {
  17. @GetMapping("/reduce")
  18. public String reduce() {
  19. System.out.println("库存减少");
  20. return "reduce";
  21. }
  22. }
  23. StockApplication
  24. package com.wang;
  25. import org.springframework.boot.SpringApplication;
  26. import org.springframework.boot.autoconfigure.SpringBootApplication;
  27. /**
  28. * @BelongsProject: SpringCloudAlibabaLearn
  29. * @BelongsPackage: com.wang.controller
  30. * @Author: wang fei
  31. * @CreateTime: 2023-01-16 16:54
  32. * @Description: TODO
  33. * @Version: 1.0
  34. */
  35. @SpringBootApplication
  36. public class StockApplication {
  37. public static void main(String[] args) {
  38. SpringApplication.run(StockApplication.class, args);
  39. }
  40. }

7.运行结果

启动ancos

bed786604973413881fc752e0abf643b.png

启动SpringBoot

60ca40393b434eb9b7c92db6c8d65ae3.png

访问: http://2.0.0.1:8848/nacos/index.html

a0a91d67c3224a008283284ccbb68bd7.png

发表评论

表情:
评论列表 (有 0 条评论,193人围观)

还没有评论,来说两句吧...

相关阅读