分布式学习路线指导

一.概念

微服务是一种软件架构风格,将一个单体应用程序拆分为一组独立的、松耦合的小型服务。每个服务都专注于实现特定的业务功能,并通过轻量级的通信机制(如HTTP或消息传递)相互协作。

微服务具有以下特点:

  1. 单一职责:每个微服务负责一个特定的业务功能,具有独立的代码库和数据库。

  2. 松耦合:微服务之间通过明确定义的接口进行通信,彼此独立,可以独立开发、测试、部署和扩展。

  3. 分布式部署:每个微服务可以独立部署在不同的计算资源上,可以使用不同的技术栈实现。

  4. 可独立扩展:由于微服务是独立部署的,可以根据需求独立地扩展某个特定的服务,而不需要扩展整个应用。

  5. 弹性和容错性:由于微服务是独立的,一个服务的故障不会影响整个系统的运行,提高了系统的容错性和弹性。

  6. 原子性:每个微服务都以自己的数据库为基础,处理业务逻辑,并确保数据的一致性和完整性。

使用微服务架构可以带来以下好处:

  1. 灵活性:可以独立开发和部署每个服务,使团队更加灵活和敏捷。

  2. 可扩展性:可以根据需求独立地扩展某个特定的服务,而不需要扩展整个应用。

  3. 可维护性:每个微服务都具有清晰的职责,便于维护和升级。

  4. 技术多样性:每个服务可以使用适合其需求的最佳技术栈。

  5. 高可用性和可恢复性:一个服务的故障不会影响整个系统的运行,提高了系统的可用性和可恢复性。

然而,微服务架构也带来了一些挑战,例如服务之间的通信、服务发现、负载均衡、数据一致性和分布式事务等问题,需要仔细考虑和解决

二.SpiringCloud

1.概念

Spring Cloud是基于Spring Boot的微服务开发框架,它提供了一系列开箱即用的工具和组件,用于简化微服务架构的开发和管理。

Spring Cloud的核心组件和功能包括:

  1. 服务注册和发现:Spring Cloud通过使用Eureka、Consul等服务注册中心,实现了微服务的服务注册、发现和负载均衡,使得服务可以自动地找到和调用其他服务。

  2. 配置中心:Spring Cloud Config提供了集中式的配置管理,可以将配置文件集中管理、动态刷新,并支持多环境、多实例的配置管理。

  3. 服务调用:Spring Cloud通过RestTemplate和Feign实现了服务之间的远程调用,使得微服务间的通信更加简单和便捷。

  4. 负载均衡:Spring Cloud通过Ribbon和Feign等组件,自动集成了负载均衡的能力,使得请求可以均匀地分布到多个实例上。

  5. 断路器:Spring Cloud通过Hystrix组件实现了服务的容错和熔断功能,可以防止故障在微服务系统中的蔓延,提高了系统的可用性。

  6. 网关:Spring Cloud Gateway提供了统一的路由和过滤器功能,用于对外网关的配置和管理,实现了请求的转发和控制。

  7. 分布式追踪:Spring Cloud Sleuth和Zipkin提供了分布式追踪和监控的能力,可以对微服务间的调用链进行跟踪和监控。

通过使用Spring Cloud,开发者可以更加方便地构建、部署和管理微服务架构,提高开发效率和系统可靠性。

2.服务发现注册

服务发现注册是指在分布式系统中,服务向服务注册中心注册自己的信息,以便其他服务可以发现和使用它。

服务注册是指将服务的元信息(如服务名称、IP地址、端口号等)注册到服务注册中心,在注册中心中保存这些信息,以便其他服务可以通过查询注册中心来获取服务的相关信息。

服务发现是指服务在运行时通过查询服务注册中心来获取其他服务的相关信息,如服务名称、IP地址、端口号等,以便调用这些服务。服务发现可以实现负载均衡和容错,以提高系统的可靠性和性能。

服务注册和发现可以帮助分布式系统中的不同服务互相发现和通信,减少了服务之间的硬编码和依赖关系,提高了系统的灵活性和扩展性。同时,服务注册和发现还能够实现服务的动态添加、删除和更新,使系统更具弹性和可管理性

3.Nacos

(1)概念

Nacos是一个开源的分布式服务注册、配置管理和服务发现平台,它可以帮助开发者构建和管理微服务架构。

Nacos的主要功能包括:

  1. 服务注册和发现:Nacos提供了服务注册和发现的能力,可以让微服务自动地注册到Nacos上,并且可以通过Nacos进行服务的发现和负载均衡。

  2. 配置管理:Nacos提供了配置管理的功能,可以将配置文件集中管理、动态刷新,并支持多环境、多实例的配置管理。开发者可以通过Nacos实现配置的动态更新,而不需要重启应用。

  3. 服务路由:Nacos提供了灵活的服务路由配置,可以根据需要进行流量的动态调度和灰度发布,帮助开发者更好地控制请求的流向。

  4. 服务健康监测:Nacos可以对微服务进行健康状态的监测,当服务不可用时,可以自动剔除不可用的服务,提高系统的可用性。

  5. 元数据管理:Nacos支持对服务的元数据进行管理,开发者可以通过元数据进行服务的标签化和分类,更好地组织和管理服务。

  6. 分布式配置共享:Nacos支持多团队、多项目之间的配置共享,可以将一些通用配置进行共享和复用,提高开发效率。

总之,Nacos提供了一整套的服务治理相关的功能,帮助开发者简化微服务架构的开发和管理,提高系统的可靠性和可扩展性。

(2)下载使用

Nacos是一个开源的动态服务发现、配置管理和服务管理平台,能够帮助开发人员更好地构建和管理云原生应用。下面是使用Nacos的一些步骤:

  1. 下载和安装Nacos:可以从Nacos的官方网站(https://nacos.io/zh-cn/)上下载最新版本的Nacos,并按照对应的操作系统进行安装。

  2. 启动Nacos服务器:解压缩下载的Nacos文件后,进入bin目录,并执行启动命令,如在Linux下执行命令./startup.sh -m standalone

  3. 访问Nacos控制台:在浏览器中输入http://localhost:8848/nacos/index.html,访问Nacos的控制台。

  4. 创建命名空间(可选):命名空间可以用来隔离不同的应用或环境,可以在控制台中创建并配置相应的命名空间。

  5. 创建配置:在控制台中,可以创建配置并填写相应的内容,如数据ID、Group、配置内容等。

  6. 获取配置:可以通过调用Nacos提供的API来获取配置,也可以使用Nacos提供的客户端SDK来简化配置的获取过程。

  7. 注册服务:可以通过调用Nacos提供的API来注册服务,也可以使用Nacos提供的客户端SDK来简化服务注册的过程。

  8. 发现服务:可以通过调用Nacos提供的API来发现其他服务,也可以使用Nacos提供的客户端SDK来简化服务发现的过程。

  9. 配置管理:可以在控制台中对配置进行管理,包括创建、修改和删除等操作。

(3)springboot中使用

在Spring Boot中整合Nacos,可以按照以下步骤进行操作:

  1. 添加Nacos依赖:在项目的pom.xml文件中,添加Nacos的依赖。可以使用以下依赖进行整合:


    com.alibaba.cloud
    spring-cloud-starter-alibaba-nacos-discovery
  1. 配置Nacos参数:在项目的application.propertiesapplication.yml文件中,配置Nacos的相关参数。可以配置Nacos的服务器地址和端口等信息,如下所示:

spring:
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848
  1. 启用Nacos服务发现:在Spring Boot的启动类上加上@EnableDiscoveryClient注解,启用Nacos的服务发现功能,如下所示:

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

4.OpenFeign远程调用

以下是一个使用OpenFeign的简单示例:

  1. 首先,您需要在项目的依赖中添加OpenFeign的库。如果您使用的是Maven项目,可以在pom.xml文件中添加以下依赖:


    org.springframework.cloud
    spring-cloud-starter-openfeign
  1. 接下来,在您的应用程序的配置类上使用@EnableFeignClients注解来启用OpenFeign的自动配置。例如:

@SpringBootApplication
@EnableFeignClients
public class YourApplication {
    public static void main(String[] args) {
        SpringApplication.run(YourApplication.class, args);
    }
}
  1. 创建一个使用OpenFeign进行远程调用的接口。这个接口应该使用@FeignClient注解,并定义被调用服务的名称和路径。例如:

@FeignClient(name = "example-service", url = "http://localhost:8080")
public interface ExampleClient {
​
    @GetMapping("/api/example")
    String getExampleData();
}
  1. 最后,在您的应用程序中使用这个接口来调用远程服务。直接将该接口作为一个bean注入,并调用定义的方法。例如:

@RestController
public class YourController {
​
    private final ExampleClient exampleClient;
​
    public YourController(ExampleClient exampleClient) {
        this.exampleClient = exampleClient;
    }
​
    @GetMapping("/example")
    public String getExample() {
        return exampleClient.getExampleData();
    }
}

在上述示例中,ExampleClient接口定义了一个GET方法,访问路径为/api/example,返回类型为String。在YourController中,将ExampleClient注入,并通过调用getExampleData()方法来获取远程服务的数据。

5.gateway网关

关于gateway的配置可以看这篇博客:https://blog.csdn.net/jjhnb123/article/details/132857027?spm=1001.2014.3001.5501

6.Sleuth链路追踪

关于Sleuth的配置可以看这篇博客:https://blog.csdn.net/jjhnb123/article/details/132860570?spm=1001.2014.3001.5501

7.服务监控Admin

关于Admin的配置可以看这篇博客:https://blog.csdn.net/jjhnb123/article/details/132885740?spm=1001.2014.3001.5501

8.服务熔断,降级和限流

关于服务熔断,降级和限流的配置可以看这篇博客:https://blog.csdn.net/jjhnb123/article/details/132868332?spm=1001.2014.3001.5501

三.消息队列

1.概念:

消息队列是一种用于在分布式系统中传递消息的通信模式。它基于发布-订阅的模式,其中消息生产者将消息发送到队列,而消息消费者从队列中接收消息。消息队列在解耦系统组件、提高可伸缩性和可靠性方面具有重要作用。

消息队列的工作原理如下:

  1. 消息生产者将消息发送到队列。消息可以是任何形式的数据,如文本、对象、事件等。

  2. 队列将消息存储在其中,直到消息消费者准备好接收它们。消息队列通常采用先进先出(FIFO)的方式处理消息。

  3. 消息消费者从队列中获取消息,并进行相应的处理。消费者可以按照自己的需要来接收消息,可以按照固定时间间隔、条件触发或实时处理消息。

消息队列有以下一些重要概念:

  • 消息代理(Message Broker):消息队列的中间层,负责接收和存储生产者发送的消息,并将其传递给消费者。

  • 队列(Queue):消息的存储空间,存储生产者发送的消息,供消费者来获取和处理。通常采用先进先出(FIFO)的顺序处理消息。

  • 生产者(Producer):将消息发送到队列的组件或系统。

  • 消费者(Consumer):从队列中获取并处理消息的组件或系统。

  • 发布-订阅模式(Publish-Subscribe):消息的生产者将消息发送到主题(Topic),而消息的消费者可以订阅感兴趣的主题,从而接收该主题下的所有消息。

消息队列的优点包括:解耦系统组件,提高系统可伸缩性,增强系统的可靠性和可恢复性,实现异步通信等。

常见的消息队列中间件有 RabbitMQ、Apache Kafka、ActiveMQ、IBM MQ 等。

关于消息队列的学习可以看这篇博客:https://yuanyou.blog.csdn.net/article/details/129731475

四.estaicsearch

概念:

Elasticsearch 是一个基于 Lucene 的开源搜索和分析引擎,专注于实时数据的存储和检索。它被广泛应用于各种用例,包括日志分析、全文搜索、实时数据分析和数据可视化等。

以下是一些与 Elasticsearch 相关的概念:

  1. 索引:Elasticsearch 使用索引来组织和存储数据。索引类似于关系数据库中的表,它包含了一组有相似结构的文档。每个文档都有一个唯一的 ID,并可进行增删改查操作。

  2. 文档:文档是 Elasticsearch 中的最小数据单元,它是一个可序列化的 JSON 对象。文档被存储在索引中,可以通过 ID 或特定的查询条件进行检索。

  3. 节点:Elasticsearch 是一个分布式系统,它由一个或多个节点组成。每个节点都是一个独立的服务器,可以存储索引的一部分数据,并执行搜索和分析操作。

  4. 集群:多个节点组成的 Elasticsearch 系统被称为集群。集群提供高可用性和可伸缩性,可以在节点之间自动分配和负载均衡数据。

  5. 分片:索引可以被分成多个分片,每个分片是一个独立的索引,可以存储部分数据。分片可以在不同的节点上分布,从而提高搜索和存储的吞吐量。

  6. 查询:Elasticsearch 提供了丰富的查询语言和 API,可以进行全文搜索、过滤、聚合等操作。查询可以根据文档的内容、结构和其他元数据进行匹配和筛选。

关于estaicsearch的学习可以看这篇(1):https://yuanyou.blog.csdn.net/article/details/129765631

(2)https://yuanyou.blog.csdn.net/article/details/129827947

(3)https://yuanyou.blog.csdn.net/article/details/129870103

五.分布式事务

概念:

分布式事务是指在分布式系统中,跨多个服务或者数据库进行的一系列操作,要么全部执行成功,要么全部回滚。它确保了在分布式环境下的数据一致性和可靠性。

在传统的单机事务中,可以使用ACID(原子性、一致性、隔离性和持久性)来保证事务的正确执行。然而,在分布式环境中,由于涉及多个服务或数据库,传统的ACID事务无法直接适用。因此,需要一些特殊的技术和协议来实现分布式事务的ACID属性。

常见的分布式事务模型包括:

  1. 两阶段提交(Two-Phase Commit,2PC):在这种模型中,有一个协调者(Coordinator)和多个参与者(Participant)。协调者负责协调多个参与者的操作,并决定是否提交或回滚事务。两阶段提交协议确保了在分布式系统中事务的一致性,但它存在单点故障和阻塞的问题。

  2. 三阶段提交(Three-Phase Commit,3PC):这是对两阶段提交的改进,引入了超时机制和参与者反馈的阶段。三阶段提交相对于两阶段提交可以减少故障点及阻塞的风险。

  3. 补偿事务(Compensating Transaction):补偿事务模型通过引入撤销操作来处理事务的回滚。当发生错误时,系统可以执行一系列的补偿操作来撤销事务已经执行的操作。这个模型相对来说更加灵活,但是需要开发人员编写和管理补偿逻辑。

  4. 最大努力通知(Best Effort Notification,BEN):它是一种轻量级的分布式事务模型,它通过异步通知的方式来保证最大程度的数据一致性。在该模型中,每个参与者在执行完事务后,异步通知其他参与者对事务的结果进行处理。这种方式牺牲了完全一致性,但是提高了系统的吞吐量和可伸缩性。

选取分布式事务模型时,需要根据具体的应用场景和需求权衡不同模型的优缺点。

同时,还有一些开源的分布式事务解决方案,如XA协议、TCC(Try-Confirm-Cancel)模式、Saga模式等,用于简化分布式事务的实现。

关于分布式事务学习可以看该博客:https://yuanyou.blog.csdn.net/article/details/130016441

六.docker

概念:

Docker 是一个开源的容器化平台,可以将应用程序及其依赖项封装在一个独立的容器中,从而实现快速部署、可移植性和可扩展性。

以下是一些与 Docker 相关的概念:

  1. 容器:Docker 使用容器来封装应用程序及其依赖项。容器是一个独立的、可执行的软件包,包含应用程序、运行时环境、系统工具和库等。容器可以在任何支持容器化的环境中运行,提供独立且一致的运行环境。

  2. 镜像:Docker 镜像是用于创建容器的构建模块。镜像是一个只读模板,包含了操作系统、应用程序、依赖项和配置等。通过将容器的内容写入镜像,可以方便地在不同的环境中部署和复制容器。

  3. 仓库:Docker 仓库是存储和共享 Docker 镜像的地方。有公共仓库如 Docker Hub,也可以搭建私有仓库。仓库可以用于获取镜像、上传镜像和分享镜像等。

  4. 容器编排:Docker 可以通过容器编排工具(如 Docker Compose 和 Kubernetes)来管理多个容器的组合和协调。容器编排可以简化复杂系统的部署和管理,实现容器之间的通信和负载均衡等。

  5. Dockerfile:Dockerfile 是一个文本文件,其中包含了一系列的指令和配置信息,用于构建 Docker 镜像。通过编写 Dockerfile,可以定义镜像的基础环境和依赖关系,并指定容器运行时的配置和命令。

关于docker的学习可以看该博客:https://yuanyou.blog.csdn.net/article/details/129700181

(完整版)https://yuanyou.blog.csdn.net/article/details/129708019

七.分布式锁

概念:

分布式锁是用于在分布式系统中提供同步访问共享资源的机制。由于分布式系统中的多个节点同时访问共享资源可能导致数据不一致或冲突,使用分布式锁可以确保在同一时间只有一个节点对共享资源进行操作,从而保证数据的一致性和正确性。

常用的分布式锁实现方式有以下几种:

  1. 基于数据库:使用关系数据库的事务隔离机制和唯一索引来实现分布式锁。通过在数据库中创建一个独占资源的行并加锁,其他节点在操作该资源前需要先获取锁,并在操作完成后释放锁。

  2. 基于缓存:利用分布式缓存系统(如Redis、Zookeeper)的原子操作来实现分布式锁。节点在对共享资源进行操作前先尝试获取锁,成功获取锁的节点可以对资源进行操作,操作完成后释放锁。

  3. 基于分布式协调服务:使用具备分布式协调能力的服务(如Zookeeper、Etcd)来实现分布式锁。节点在对共享资源进行操作前尝试创建一个临时顺序节点,通过比较节点的顺序来确定是否获取锁,获取锁的节点进行操作后删除节点释放锁。

  4. 基于乐观锁:基于版本或时间戳的机制,每次操作资源前先获取当前版本或时间戳,操作资源后比较版本或时间戳是否一致,以确定是否获取锁。如果版本或时间戳一致,则操作成功,否则需要重新尝试。

分布式锁的使用可以有效避免分布式系统中的数据冲突和竞争问题。然而,分布式锁的设计和实现需要考虑并发性、性能和可靠性等方面的因素,因此需要根据具体的业务需求和系统架构选择合适的分布式锁实现方式。

关于分布式锁的学习可以看这篇博客:https://blog.csdn.net/jjhnb123/article/details/132895338?spm=1001.2014.3001.5502

你可能感兴趣的:(微服务,分布式,学习)