# Nacos学习

1、Nacos是什么?

Nacos是一个应用,阿里巴巴开发并开源的一个项目, 主要用于微服务架构中的服务发现、配置管理和服务治理。

2、Nacos能够做什么,有什么功能?

Nacos 是一个用于构建云原生应用的动态服务发现、配置和服务管理平台。以下是 Nacos 的主要功能:

服务发现与管理:

  1. 服务注册:服务提供者可以在 Nacos 上注册自己的服务,包括服务的名称、地址、端口等信息。
  2. 服务发现:服务消费者可以通过 Nacos 发现可用的服务实例,支持基于 DNS 或者 RPC 的服务发现。
  3. 健康检查:Nacos 提供了对服务实例的健康检查机制,确保请求不会被路由到不健康的服务实例上。

动态配置管理:

  1. 集中化配置:允许应用的配置信息集中存储和管理,支持多种配置格式(如 Properties、YAML、JSON)。
  2. 配置热更新:配置变更可以实时推送到应用,无需重启服务即可生效。

动态 DNS 服务:

  1. 权重路由:支持根据服务实例的权重进行请求路由,实现负载均衡。
  2. 流量控制:通过配置不同的路由规则,可以实现灵活的流量控制策略。

服务及元数据管理:

  1. 元数据管理:除了基本的服务信息,还可以管理更详细的服务元数据,如标签、属性等。
  2. 服务分组与命名空间:支持服务的分组和命名空间管理,方便大型项目的组织和管理。

用户界面:

图形化管理界面:提供友好的图形化界面,方便用户进行服务和配置的管理。

多环境支持:

环境隔离:支持不同环境(如开发、测试、生产)的隔离,确保各环境之间的配置和服务互不影响。

3、Nacos能给我带来什么好处?

1. 简化服务发现

  1. 自动注册与发现:服务启动时自动注册到 Nacos,服务消费者可以轻松发现并调用这些服务,减少了手动配置的复杂性。
  2. 健康检查:Nacos 自动进行健康检查,确保请求只发送到健康的实例,提高了系统的稳定性和可靠性。

2. 动态配置管理

  1. 集中化配置:所有配置信息集中管理,方便维护和更新。
  2. 配置热更新:配置变更可以实时推送到应用,无需重启服务即可生效,提高了系统的灵活性和响应速度。

3. 提高系统稳定性

  1. 熔断与降级:通过熔断机制,当某个服务出现故障时,可以快速熔断对该服务的调用,防止故障扩散(结合Sentinel使用)。
  2. 限流:限制每个服务实例在单位时间内处理的请求数量,防止系统因突发流量而崩溃(结合Sentinel使用)。

4. 灵活的流量管理

  1. 权重路由:支持根据服务实例的权重进行请求路由,实现负载均衡(结合Ribbon使用)。
  2. 灰度发布:通过配置不同的路由规则,可以实现灰度发布,逐步推广新版本,降低风险。

5. 增强安全性

  1. 服务鉴权:确保只有经过授权的服务才能访问特定资源,提高系统的安全性。
  2. 环境隔离:支持不同环境(如开发、测试、生产)的隔离,确保各环境之间的配置和服务互不影响。

6. 提高开发效率

  1. 图形化管理界面:提供友好的图形化界面,方便用户进行服务和配置的管理,降低了操作难度。
  2. 丰富的文档和社区支持:Nacos 拥有详细的文档和活跃的社区,遇到问题时可以快速获得帮助和支持。

7. 易于集成

  1. 支持多种框架:Nacos 可以很容易地与现有的微服务框架集成,例如 Spring Cloud、Dubbo 等,降低了迁移成本。
  2. 多语言支持:Nacos 支持多种编程语言,可以满足不同技术栈的需求。

8. 多环境支持

  1. 环境隔离:支持不同环境(如开发、测试、生产)的隔离,确保各环境之间的配置和服务互不影响。
  2. 命名空间管理:通过命名空间管理,可以更好地组织和管理大型项目中的服务和配置。

通过使用 Nacos,你可以更高效地管理和维护微服务架构,提高系统的稳定性和可靠性,同时降低开发和运维的复杂性。

4、如何使用Nacos?

1.安装Nacos

1.1.下载Nacos

    # 克隆 Nacos 仓库
    git clone https://github.com/alibaba/nacos.git
    
    # 切换到 release 分支
    cd nacos
    git checkout tags/  # 替换  为你需要的版本号

1.2.启动Nacos(可单体/集群启动,集群需要另外配置)

    # 启动 Nacos 单机模式
    sh startup.sh -m standalone

2. 配置 Nacos

2.1.访问 Nacos 控制台
启动成功后,打开浏览器访问 http://localhost:8848/nacos,默认用户名和密码都是 nacos。
2.2. 配置数据库(可选Nacos自身带有一个H5的数据库)
如果你需要持久化数据,可以配置 Nacos 使用外部数据库。编辑 conf/application.properties 文件,添加数据库连接信息:

    spring.datasource.platform=mysql
    db.num=1
    db.url.0=jdbc:mysql://127.0.0.1:3306/nacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
    db.user=nacos
    db.password=nacos

3.集成 Nacos 到应用

3.1 添加依赖
在你的项目中添加 Nacos 的依赖。以下是以 Maven 为例:



    <dependency>
        <groupId>com.alibaba.cloudgroupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-discoveryartifactId>
        <version>2.2.5.RELEASEversion>
    dependency>
    
    
    <dependency>
        <groupId>com.alibaba.cloudgroupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-configartifactId>
        <version>2.2.5.RELEASEversion>
    dependency>
    
    
    <dependency>
        <groupId>org.springframework.cloudgroupId>
        <artifactId>spring-cloud-starter-loadbalancerartifactId>
        <version>2.2.5.RELEASEversion>
    dependency>
// 使用gradle
    // Spring Cloud Alibaba Nacos Discovery
    implementation 'com.alibaba.cloud:spring-cloud-starter-alibaba-nacos-discovery'

    // Spring Cloud Alibaba Nacos Config
    implementation 'com.alibaba.cloud:spring-cloud-starter-alibaba-nacos-config'

    // Spring Cloud LoadBalancer (替代Ribbon)
    implementation 'org.springframework.cloud:spring-cloud-starter-loadbalancer'

3.2 配置 Nacos
3.2.1 服务发现配置
在 application.yml 或 application.properties 中配置 Nacos 服务发现:

    spring:
      application:
        name: your-service-name
      cloud:
        nacos:
          discovery:
            server-addr: 127.0.0.1:8848

4.编写代码

4.1 服务提供者
在服务提供者中,使用 @EnableDiscoveryClient 注解启用服务发现功能:

    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
    
    @SpringBootApplication
    @EnableDiscoveryClient
    public class ProviderApplication {
        public static void main(String[] args) {
            SpringApplication.run(ProviderApplication.class, args);
        }
    }

4.2 服务消费者
在服务消费者中,使用 @LoadBalanced 注解配置 RestTemplate,以便使用 Nacos 的负载均衡功能:

    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.cloud.client.loadbalancer.LoadBalanced;
    import org.springframework.context.annotation.Bean;
    import org.springframework.web.client.RestTemplate;
    
    @SpringBootApplication
    @EnableDiscoveryClient
    public class ConsumerApplication {
        @Bean
        @LoadBalanced
        public RestTemplate restTemplate() {
            return new RestTemplate();
        }
    
        public static void main(String[] args) {
            SpringApplication.run(ConsumerApplication.class, args);
        }
    }

5. 测试

5.1 启动服务
分别启动服务提供者和服务消费者。
5.2 调用服务
在服务消费者中调用服务提供者提供的接口:
(your-Provider-service),消费者发现服务者提供者,通过服务提供者的应用名在Nacos会获取到服务器提供者的服务器地址和端口

    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RestController;
    import org.springframework.web.client.RestTemplate;
    
    @RestController
    public class ConsumerController {
    
        @Autowired
        private RestTemplate restTemplate;
    
        @GetMapping("/consume")
        public String consume() {
            return restTemplate.getForObject("http://your-Provider-service/your-endpoint", String.class);
        }
    }

5.3 服务间调用通常可以通过openfeign调用
5.3.1 引入依赖
在 application.yml 或 application.properties 文件中配置 Nacos 服务发现:

    <dependency>
        <groupId>org.springframework.cloudgroupId>
        <artifactId>spring-cloud-starter-openfeignartifactId>
    dependency>

5.3.2 启用服务发现和 Feign 客户端
在主类中使用 @EnableDiscoveryClient 和 @EnableFeignClients 注解启用服务发现和 Feign 客户端功能:

    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
    import org.springframework.cloud.openfeign.EnableFeignClients;
    
    @SpringBootApplication
    @EnableDiscoveryClient
    @EnableFeignClients
    public class ConsumerApplication {
        public static void main(String[] args) {
            SpringApplication.run(ConsumerApplication.class, args);
        }
    }

5.3.3 定义 Feign 客户端
创建一个 Feign 客户端接口,用于调用服务提供者提供的服务

    import org.springframework.cloud.openfeign.FeignClient;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RequestMapping;
    
    @FeignClient(name = "provider-service")
    @RequestMapping("/provider")
    public interface ProviderClient {
    
        @GetMapping("/hello")
        String hello();
    }

5.3.4 创建消费接口
创建一个 RESTful 接口,调用 Feign 客户端提供的方法

    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    @RestController
    @RequestMapping("/consumer")
    public class ConsumerController {
    
        @Autowired
        private ProviderClient providerClient;
    
        @GetMapping("/hello")
        public String hello() {
            return providerClient.hello();
        }
    }

6. 监控和管理

通过 Nacos 控制台,你可以查看服务列表、配置管理、健康检查等信息,方便进行监控和管理。

5、Nacos的实现原理是什么?

Nacos(Dynamic Naming and ConfigurationService)是一个用于动态服务发现、配置管理和服务管理的平台。它的设计目标是帮助构建云原生应用,提供高可用的服务发现和配置管理功能。以下是 Nacos 的主要实现原理:

1. 服务发现

1.1 服务注册
服务提供者:服务提供者在启动时向 Nacos 服务器注册自己的服务信息,包括服务名称、IP 地址和端口号等。
心跳机制:服务提供者定期向 Nacos 服务器发送心跳,以告知自己仍然在线。如果Nacos在一定时间内没有收到某个服务提供者的心跳,会将该服务标为不可用。
1.2 服务订阅
服务消费者:服务消费者向 Nacos 服务器订阅所需的服务。Nacos 会将服务提供者的列表推送给服务消费者。
事件驱动:当服务提供者的列表发生变化时(如新增或删除服务提供者),Nacos 会实时通知订阅了该服务的服务消费者。

2. 配置管理

2.1 配置发布
配置中心:Nacos 提供了一个配置中心,允许用户通过 Web 界面或 API 发布配置。
配置存储:配置信息可以存储在内存、文件系统或外部数据库中。Nacos 支持多种存储方式,包括 MySQL、PostgreSQL 等。
2.2 配置订阅
客户端监听:服务提供者和消费者可以订阅配置信息。Nacos 会在配置发生变化时,实时推送更新给订阅了该配置的客户端。
本地缓存:客户端会将配置信息缓存在本地,以减少对 Nacos 服务器的频繁请求。

3. 动态配置

3.1 动态刷新
自动刷新:Nacos 支持配置的动态刷新,即在配置发生变化时,客户端可以自动获取最新的配置并应用到应用中,无需重启应用。
Spring Cloud 集成:Nacos 与 Spring Cloud 集成后,可以通过 @RefreshScope 注解实现配置的动态刷新。

4. 命名空间和分组

4.1 命名空间
隔离作用:命名空间用于隔离不同的环境(如开发、测试、生产环境),避免配置和服务的冲突。
多租户支持:命名空间也支持多租户场景,不同租户可以使用不同的命名空间。
4.2 分组
分类管理:分组用于对配置和服务进行分类管理,方便管理和查找。
灵活配置:同一个服务可以在不同的分组中配置不同的参数。

5. 高可用和扩展性

5.1 集群模式
多节点部署:Nacos 支持多节点部署,形成集群,提高系统的可用性和性能。
数据同步:集群中的节点通过 Raft 协议或其他一致性算法进行数据同步,确保数据的一致性和可靠性。
5.2 负载均衡
客户端负载均衡:Nacos 支持客户端负载均衡,服务消费者可以从多个服务提供者中选择一个进行调用。
服务路由:Nacos 提供了服务路由功能,可以根据不同的条件(如权重、标签等)进行路由选择。

6. 安全性

6.1 认证和授权
用户管理:Nacos 提供了用户管理功能,可以创建和管理用户。
权限控制:Nacos 支持基于角色的访问控制(RBAC),可以为不同用户分配不同的权限。
6.2 数据加密
传输加密:Nacos 支持 HTTPS 协议,确保数据在传输过程中的安全性。
存储加密:配置数据可以存储在加密的数据库中,确保数据的安全性。

7. 监控和日志

7.1 监控
健康检查:Nacos 定期对服务提供者进行健康检查,确保服务的可用性。
性能监控:Nacos 提供了性能监控功能,可以监控系统的各项指标,如请求量、响应时间等。
7.2 日志
日志记录:Nacos 会记录各种操作日志,便于问题排查和审计。
日志分析:Nacos 支持日志分析功能,可以对日志进行统计和分析。

6、总结

Nacos主要是提供给微服务做注册发现、配置管理使用,支持单体和集群。可通过命名空间、分组等方式进行隔离控制。支持多种语言开发、多种协议对接。

你可能感兴趣的:(java,阿里云,后端)