Skip to content

微服务组件介绍

1. [[2.注册中心]]

注册中心

  • 原理:Nacos 作为注册中心,服务提供者在启动时会将自身的服务信息(如服务名、IP 地址、端口等)注册到 Nacos 服务器。服务消费者通过 Nacos 服务器获取服务提供者的信息,然后根据这些信息调用服务。Nacos 支持基于 DNS 和基于 RPC 的服务发现,能够实现服务的动态注册和发现。
  • 作用:实现服务的自动注册与发现,使得服务之间可以相互调用,提高系统的可扩展性和灵活性。当服务提供者的实例发生变化(如新增、下线)时,Nacos 能够及时通知服务消费者。
  • 使用示例
    • 服务提供者注册
java
// 在 Spring Boot 项目中添加 Nacos 依赖
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
// 配置 application.properties
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
- **服务消费者获取服务**
java
@RestController
public class ConsumerController {
    @Autowired
    private DiscoveryClient discoveryClient;

    @GetMapping("/getServices")
    public List<ServiceInstance> getServices() {
        return discoveryClient.getInstances("service-provider");
    }
}

配置中心

  • 原理:Nacos 作为配置中心,将应用的配置信息集中存储在 Nacos 服务器中。应用在启动时会从 Nacos 服务器获取配置信息,并在运行过程中监听配置的变化。当配置发生变化时,Nacos 会实时通知应用,应用可以动态更新配置。
  • 作用:实现配置的集中管理和动态更新,避免了在每个应用实例中手动修改配置的麻烦,提高了配置管理的效率和可靠性。
  • 使用示例
    • 添加依赖
xml
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
- **配置 bootstrap.properties**
properties
spring.cloud.nacos.config.server-addr=127.0.0.1:8848
spring.application.name=service-consumer
- **动态获取配置**
java
@RefreshScope
@RestController
public class ConfigController {
    @Value("${config.info:default}")
    private String configInfo;

    @GetMapping("/getConfig")
    public String getConfig() {
        return configInfo;
    }
}

2. OpenFeign 分布式调用

  • 原理:OpenFeign 是一个声明式的 HTTP 客户端,它基于接口和注解的方式来定义服务调用。在使用 OpenFeign 时,只需创建一个接口并使用注解来描述要调用的服务,Spring Cloud 会自动为该接口生成代理实现类,该代理实现类会根据注解的配置信息发起 HTTP 请求。
  • 作用:简化了服务之间的调用,开发者只需关注业务逻辑,无需手动编写复杂的 HTTP 请求代码。同时,OpenFeign 还支持负载均衡和熔断等功能。
  • 使用示例
    • 添加依赖
xml
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
- **定义 Feign 接口**
java
@FeignClient(name = "service-provider")
public interface ProviderFeignClient {
    @GetMapping("/hello")
    String hello();
}
- **使用 Feign 接口调用服务**
java
@RestController
public class ConsumerController {
    @Autowired
    private ProviderFeignClient providerFeignClient;

    @GetMapping("/callProvider")
    public String callProvider() {
        return providerFeignClient.hello();
    }
}

3. Sentinel 流量保护

  • 原理:Sentinel 基于流量控制规则、熔断降级规则和系统保护规则对应用的流量进行监控和控制。当流量超过预设的阈值时,Sentinel 会根据规则采取相应的措施,如限流、熔断等,以保护系统的稳定性。
  • 作用:防止系统因流量过大而崩溃,提高系统的容错能力和稳定性。可以对不同的资源(如接口、方法等)设置不同的规则,实现细粒度的流量控制。
  • 使用示例
    • 添加依赖
xml
<dependency>
    <groupId>com.alibaba.csp</groupId>
    <artifactId>sentinel-core</artifactId>
</dependency>
- **定义资源和规则**
java
public class SentinelExample {
    public static void main(String[] args) {
        // 定义资源
        Entry entry = null;
        try {
            // 定义规则
            initFlowRules();
            entry = SphU.entry("HelloWorld");
            // 业务逻辑
            System.out.println("Hello World");
        } catch (BlockException e) {
            // 处理限流或熔断
            System.out.println("Blocked!");
        } finally {
            if (entry != null) {
                entry.exit();
            }
        }
    }

    private static void initFlowRules() {
        List<FlowRule> rules = new ArrayList<>();
        FlowRule rule = new FlowRule();
        rule.setResource("HelloWorld");
        rule.setGrade(RuleConstant.FLOW_GRADE_QPS);
        rule.setCount(20);
        rules.add(rule);
        FlowRuleManager.loadRules(rules);
    }
}

4. Gateway 服务网关

  • 原理:Spring Cloud Gateway 是基于 Spring 5、Spring Boot 2 和 Project Reactor 构建的 API 网关。它通过一系列的过滤器和路由规则对请求进行处理。当请求到达网关时,网关会根据路由规则将请求转发到相应的服务,并可以在转发前后执行过滤器逻辑,如请求参数处理、响应结果处理等。
  • 作用:作为系统的统一入口,对外提供统一的 API 接口,隐藏后端服务的实现细节。同时,还可以实现请求路由、负载均衡、权限验证、限流等功能。
  • 使用示例
    • 添加依赖
xml
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
- **配置路由规则**
yaml
spring:
  cloud:
    gateway:
      routes:
        - id: service_provider_route
          uri: lb://service-provider
          predicates:
            - Path=/provider/**
          filters:
            - StripPrefix=1

5. Seata 分布式事务

  • 原理:Seata 提供了 AT、TCC、Saga 和 XA 等多种分布式事务模式。以 AT 模式为例,Seata 通过对数据库的 SQL 语句进行解析和拦截,在业务执行前后自动生成回滚日志。当事务出现异常时,Seata 会根据回滚日志进行数据回滚,保证数据的一致性。
  • 作用:解决微服务架构下的分布式事务问题,确保在多个服务之间的操作要么全部成功,要么全部失败,提高系统的数据一致性和可靠性。
  • 使用示例
    • 添加依赖
xml
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-seata</artifactId>
</dependency>
- **配置 Seata**
properties
seata.tx-service-group=my_test_tx_group
seata.service.vgroup-mapping.my_test_tx_group=default
seata.service.grouplist.default=127.0.0.1:8091
- **使用分布式事务注解**
java
@Service
public class BusinessService {
    @Autowired
    private StorageService storageService;
    @Autowired
    private OrderService orderService;

    @GlobalTransactional
    public void purchase(String userId, String commodityCode, int orderCount) {
        storageService.deduct(commodityCode, orderCount);
        orderService.create(userId, commodityCode, orderCount);
    }
}

这些组件在微服务架构中各自发挥着重要的作用,通过合理组合使用,可以构建出高可用、高性能、可扩展的分布式系统。

6.链路追踪

**Spring Cloud Sleuth

Spring Cloud Sleuth 是 Spring Cloud 提供的分布式链路追踪解决方案。当请求到达分布式系统的入口端点时,Sleuth 会为该请求创建一个唯一的标识(Trace Id),同时在分布式系统内部流转时,始终保持传递该唯一值,直到整个请求返回,这样就可以使用 Trace Id 将所有的请求串联起来,形成一条完整的请求链路。此外,当请求到达各个服务时,还会生成一个 Span Id 来标记开始、过程、结束,通过 Span Id 的时间戳能统计 Span 的调用时间。

集成分布式跟踪系统

  • Zipkin6:Zipkin 是 Twitter 开源的分布式跟踪系统,可收集、存储、查找和展现服务的定时数据,用于解决微服务架构中的延迟问题。与 Spring Cloud Sleuth 集成简单,只需在微服务中添加其依赖和配置。Zipkin 支持将追踪数据持久化到 MySQL 数据库或 Elasticsearch 中,还提供了 REST API 接口和 UI 组件,方便查询跟踪数据、直观搜索跟踪信息和分析请求链路明细。
  • SkyWalking:SkyWalking 是本土开源的基于字节码注入的调用链分析及应用监控分析工具,支持多种插件,UI 功能较强,接入端无代码侵入。它是分布式系统的应用性能监控工具,为微服务、云原生架构和基于容器(Docker、K8s、Mesos)的架构提供分布式追踪、服务网格遥测分析、指标聚合和可视化的一站式解决方案。在与 Spring Cloud 结合时,需先构建 SkyWalking 环境,然后将 Spring Cloud 应用进行相应改造,如将 Docker 包推送到仓库,编写 K8s 的 YAML 版本部署脚本等。
  • Jaeger2:由 Uber 开源,提供了详细的链路追踪、性能监控、服务依赖分析等功能,支持多种语言和框架。它的工作原理与 Zipkin 类似,在 Spring Cloud 项目中集成 Jaeger,也需要添加相关依赖和进行配置,将追踪数据发送到 Jaeger 服务器进行存储和分析,通过 Jaeger UI 可以查看完整的请求追踪信息和详细的 Span 数据。

7.监控与日志

全系监控

监控指标:

Prometheus和Grafana是常用的监控和可视化工具,以下是使用它们监控微服务日志的一般步骤: ### 1. 收集日志 - 选择日志收集工具:可以使用Filebeat、Logstash等工具来收集微服务日志。以Filebeat为例,它是一个轻量级的日志收集器,能够监控指定的日志文件或目录,并将日志数据发送到指定的目的地。 - 配置日志收集:在Filebeat的配置文件中,指定要收集的微服务日志文件路径,以及日志的格式和编码等信息。同时,配置将日志发送到Prometheus的Endpoint。例如,可以使用Prometheus的Remote Write接口来接收日志数据。

2. 存储日志数据

Prometheus配置: 在Prometheus的配置文件中,添加对日志收集器发送过来的数据的接收配置。配置Remote Write的Endpoint和认证信息等,确保Prometheus能够正确接收并存储日志数据。 - 数据存储:Prometheus会将接收到的日志数据存储在其本地的时间序列数据库中。可以根据实际需求,调整存储路径、数据保留时间等参数。

3. 数据处理与分析 -

定义指标: 根据微服务日志的内容和监控需求,定义相应的指标。例如,可以根据日志中的错误信息、访问频率、响应时间等字段,创建自定义的指标。通过Prometheus的查询语言(PromQL),对日志数据进行分析和计算,生成相应的指标数据。

  • 告警规则
  • 基于定义的指标,设置告警规则。例如,当错误率超过一定阈值、响应时间过长或特定的错误信息出现时,触发告警通知。可以通过Prometheus的Alertmanager来管理告警通知,配置通知渠道,如邮件、短信、Slack等。 ### 4. 可视化展示 - Grafana配置:将Grafana与Prometheus进行集成。在Grafana中添加Prometheus数据源,配置数据源的地址、访问权限等信息。 - 创建仪表盘:在Grafana中创建仪表盘,选择相应的Prometheus数据源,并根据定义的指标和分析需求,添加各种可视化组件,如折线图、柱状图、表格、告警面板等。可以对仪表盘进行布局调整、样式设置,以便直观地展示微服务日志的监控信息。 通过以上步骤,就可以使用Prometheus和Grafana实现对微服务日志的监控、分析和可视化展示,帮助运维人员及时发现问题、定位故障,并对微服务的运行状况进行评估和优化。

日志管理

ElasticSearch + Logstash + Kibana ElasticSearch + Fluentd + Kibana 集中收集、存储、分析日志。方便排查问题

8.容器化与编排

8.1容器化

Docker 是目前最流行的容器化技术之一,它提供了一套简单易用的工具和命令,用于创建、管理和运行容器。通过编写 Dockerfile,可以定义容器的配置和构建过程,然后使用 Docker 命令将其构建成镜像,并在需要时运行容器。

8.2容器编排

Kubernetes 是目前最受欢迎的容器编排平台,它提供了丰富的功能和强大的扩展性。Kubernetes 使用 YAML 或 JSON 格式的配置文件来定义应用程序的部署、服务、存储等资源,通过命令行工具或 API 进行管理。它支持自动装箱、自动伸缩、滚动升级、服务发现、负载均衡等功能,能够帮助用户轻松地管理大规模的容器化应用程序。

9.灾备与恢复

多可用区部署

如2地三中心

备份与恢复

© 2025 zhiliaoz.top 保留所有权利。