微服务的使用

Java 微服务架构是将传统单体应用拆分为多个独立、可自治的小型服务,每个服务专注于特定业务能力。这些服务通过轻量级通信协议协作,共同完成整体业务。下面从核心组件的作用和配置两方面详细讲解:

一、服务注册与发现

作用:解决服务间 “如何找到彼此” 的问题。微服务实例会动态扩缩容(IP / 端口变化),无法通过硬编码地址通信。注册中心负责维护服务列表,服务启动时注册自己,下线时注销,其他服务通过注册中心获取目标服务地址。

常用技术:Eureka、Nacos、Consul、Zookeeper
配置示例(以 Nacos 为例)
Nacos 是主流的注册中心(兼具配置中心功能),分为服务端和客户端。

  1. 服务端部署
    下载 Nacos 服务器,启动后默认端口 8848,访问http://localhost:8848/nacos可进入控制台(默认账号密码 nacos/nacos)。

  2. 客户端配置(微服务接入)
    在微服务的pom.xml中引入依赖:

    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    </dependency>
    
     

    application.yml中配置 Nacos 地址和服务名:

    spring:
      application:
        name: user-service  # 服务名(核心,其他服务通过该名称调用)
      cloud:
        nacos:
          discovery:
            server-addr: localhost:8848  # Nacos服务端地址
    server:
      port: 8081  # 当前服务端口
    
     

    启动类添加@EnableDiscoveryClient注解开启服务发现:

    @SpringBootApplication
    @EnableDiscoveryClient
    public class UserServiceApplication {
        public static void main(String[] args) {
            SpringApplication.run(UserServiceApplication.class, args);
        }
    }
    

二、API 网关

作用:微服务的 “统一入口”,负责请求路由、认证授权、限流熔断、日志监控等横切功能。客户端无需记住每个服务的地址,只需调用网关地址。

常用技术:Spring Cloud Gateway(推荐,非阻塞)、Zuul(渐被淘汰)
配置示例(Spring Cloud Gateway)

  1. 引入依赖:

    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-gateway</artifactId>
    </dependency>
    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>  <!-- 结合注册中心 -->
    </dependency>
    
  2. 配置路由规则(application.yml):

    spring:
      cloud:
        gateway:
          routes:
            - id: user-service-route  # 路由唯一标识
              uri: lb://user-service  # 目标服务(lb表示负载均衡,user-service是服务名)
              predicates:  # 路由条件(当请求满足条件时转发)
                - Path=/users/**  # 当请求路径以/users/开头时,转发到user-service
              filters:  # 过滤器(可选,处理请求)
                - StripPrefix=1  # 去除路径中的第一个前缀(如请求/users/1 -> 转发到/user-service/1)
                - name: RequestRateLimiter  # 限流过滤器
                  args:
                    redis-rate-limiter.replenishRate: 10  # 每秒允许10个请求
                    redis-rate-limiter.burstCapacity: 20  # 突发允许20个请求
    

三、配置中心

作用:集中管理所有微服务的配置(如数据库连接、第三方 API 密钥),支持动态更新配置(无需重启服务),解决 “配置分散在各服务、修改需重启” 的问题。

常用技术:Nacos、Spring Cloud Config、Apollo
配置示例(Nacos 配置中心)

  1. 在 Nacos 控制台添加配置:

    • 命名空间:区分环境(如 dev/test/prod)
    • 配置集 ID:user-service-dev.yml(格式:服务名 - 环境.yml)
    • 配置内容:
      spring:
        datasource:
          url: jdbc:mysql://localhost:3306/user_db
          username: root
          password: 123456
      
  2. 微服务接入配置中心:
    引入依赖:

    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
    </dependency>
    
     

    创建bootstrap.yml(优先级高于 application.yml,用于加载配置中心信息):

    spring:
      application:
        name: user-service
      cloud:
        nacos:
          config:
            server-addr: localhost:8848  # Nacos地址
            file-extension: yml  # 配置文件格式
            namespace: dev  # 环境(对应Nacos的命名空间ID)
            group: DEFAULT_GROUP  # 配置分组
    
     

    在代码中使用配置:

    @RestController
    @RefreshScope  // 支持配置动态刷新
    public class UserController {
        @Value("${spring.datasource.url}")  // 注入配置中心的参数
        private String dbUrl;
        
        @GetMapping("/db/url")
        public String getDbUrl() {
            return dbUrl;
        }
    }
    

四、服务通信

微服务间需要协作完成业务(如 “下单” 需调用 “库存服务” 扣减库存),通信方式分为同步异步

1. 同步通信(实时响应)

作用:适用于需要即时结果的场景(如查询用户信息),常用 REST 或 RPC。
常用技术:Spring Cloud OpenFeign(REST)、Dubbo(RPC)

OpenFeign 配置示例
Feign 是声明式 REST 客户端,通过接口定义服务调用,简化 HTTP 请求代码。

  1. 引入依赖:

    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-openfeign</artifactId>
    </dependency>
    
  2. 定义 Feign 接口(调用 user-service):

    @FeignClient(name = "user-service")  // 目标服务名(从注册中心获取)
    public interface UserFeignClient {
        // 声明要调用的接口(与user-service的Controller方法一致)
        @GetMapping("/users/{id}")
        User getUserById(@PathVariable("id") Long id);
    }
    
  3. 启动类添加@EnableFeignClients

    @SpringBootApplication
    @EnableFeignClients
    public class OrderServiceApplication { ... }
    
  4. 使用 Feign 调用:

    @Service
    public class OrderService {
        @Autowired
        private UserFeignClient userFeignClient;
        
        public Order createOrder(Long userId) {
            User user = userFeignClient.getUserById(userId);  // 调用user-service
            // 业务逻辑...
        }
    }
    
2. 异步通信(解耦削峰)

作用:适用于非实时场景(如订单创建后发送通知),通过消息队列传递消息,降低服务耦合,应对流量峰值。
常用技术:RabbitMQ、Kafka、RocketMQ

RabbitMQ 配置示例

  1. 引入依赖:

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-amqp</artifactId>
    </dependency>
    
  2. 配置 RabbitMQ 连接(application.yml):

    spring:
      rabbitmq:
        host: localhost
        port: 5672
        username: guest
        password: guest
    
  3. 生产者(发送消息):

    @Service
    public class OrderService {
        @Autowired
        private RabbitTemplate rabbitTemplate;
        
        public void createOrder(Order order) {
            // 保存订单...
            // 发送消息到队列(通知服务消费)
            rabbitTemplate.convertAndSend("order-exchange", "order.created", order.getId());
        }
    }
    
  4. 消费者(接收消息):

    @Component
    public class NotificationConsumer {
        @RabbitListener(queues = "order-notify-queue")  // 监听指定队列
        public void handleOrderCreated(Long orderId) {
            // 处理消息:发送短信/邮件通知
            System.out.println("订单" + orderId + "已创建,准备发送通知");
        }
    }
    

五、熔断与降级

作用:防止 “服务雪崩”。当某个服务故障(如响应慢、超时),调用方如果持续请求会耗尽资源,进而影响其他服务。熔断会在故障时 “断开” 调用,降级则返回默认结果(如 “系统繁忙,请稍后再试”)。

常用技术:Resilience4j(推荐)、Sentinel、Hystrix(已停更)

Resilience4j 配置示例

  1. 引入依赖:

    <dependency>
        <groupId>io.github.resilience4j</groupId>
        <artifactId>resilience4j-spring-boot2</artifactId>
    </dependency>
    
  2. 配置熔断规则(application.yml):

    resilience4j:
      circuitbreaker:
        instances:
          userService:  # 熔断实例名(对应@CircuitBreaker的name)
            failureRateThreshold: 50  # 失败率阈值(超过50%触发熔断)
            waitDurationInOpenState: 10000  # 熔断后10秒内拒绝请求
            slidingWindowSize: 10  # 统计最近10个请求的失败率
    
  3. 在 Feign 调用中使用熔断:

    @Service
    public class OrderService {
        @Autowired
        private UserFeignClient userFeignClient;
        
        // 熔断注解:name对应配置,fallback指定降级方法
        @CircuitBreaker(name = "userService", fallbackMethod = "getUserFallback")
        public User getUser(Long userId) {
            return userFeignClient.getUserById(userId);
        }
        
        // 降级方法(参数和返回值需与原方法一致)
        public User getUserFallback(Long userId, Exception e) {
            System.out.println("调用user-service失败,触发降级:" + e.getMessage());
            return new User(-1L, "默认用户");  // 返回默认结果
        }
    }
    

六、负载均衡

作用:当一个服务部署多个实例(如 user-service 有 8081、8082 两个端口),请求需要均匀分发到各实例,避免单实例过载。

常用技术:Spring Cloud LoadBalancer(客户端负载均衡,推荐)、Ribbon(渐被淘汰)

配置示例(Spring Cloud LoadBalancer)
LoadBalancer 通常与 Feign/RestTemplate 配合使用,自动从注册中心获取服务实例列表并分发请求。

  1. 引入依赖(已包含在 OpenFeign 中,无需额外添加):

    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-loadbalancer</artifactId>
    </dependency>
    
  2. 配置负载均衡策略(application.yml):

    spring:
      cloud:
        loadbalancer:
          configurations: round-robin  # 轮询策略(默认),可选:random(随机)
    
  3. 自动生效:
    当使用 Feign 调用user-service时,LoadBalancer 会自动从 Nacos 获取所有实例(8081、8082),按轮询策略分发请求。

七、分布式事务

作用:保证跨服务操作的数据一致性。例如 “下单” 需同时修改订单库和库存库,若其中一个失败,需全部回滚。

常用技术:Seata(简单易用)、Saga 模式
Seata 配置示例

  1. 部署 Seata 服务器(TC,事务协调者),修改registry.conf指定注册中心(如 Nacos)。

  2. 微服务接入 Seata:
    引入依赖:

    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-seata</artifactId>
    </dependency>
    
  3. 配置 Seata(application.yml):

    seata:
      tx-service-group: my_test_tx_group  # 事务组(需与Seata服务器配置一致)
      registry:
        type: nacos
        nacos:
          server-addr: localhost:8848
    
  4. 使用@GlobalTransactional注解标记分布式事务:

    @Service
    public class OrderService {
        @Autowired
        private OrderMapper orderMapper;
        @Autowired
        private InventoryFeignClient inventoryFeignClient;
        
        // 标记为分布式事务,若库存扣减失败,订单会回滚
        @GlobalTransactional
        public void createOrder(Order order) {
            // 1. 保存订单
            orderMapper.insert(order);
            // 2. 调用库存服务扣减库存
            inventoryFeignClient.deduct(order.getProductId(), order.getCount());
        }
    }
    

八、监控与追踪

作用:实时监控服务健康状态、性能指标(如响应时间、错误率),追踪跨服务调用链路(如 “下单” 调用了哪些服务,哪个环节耗时最长)。

常用技术

  • 监控:Spring Boot Actuator + Micrometer + Prometheus + Grafana
  • 追踪:Sleuth + Zipkin

Zipkin 链路追踪配置示例

  1. 启动 Zipkin 服务器(收集追踪数据):
    java -jar zipkin-server-2.24.3-exec.jar(默认端口 9411,访问http://localhost:9411)。

  2. 微服务接入 Zipkin:
    引入依赖:

    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-sleuth</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-sleuth-zipkin</artifactId>
    </dependency>
    
  3. 配置 Zipkin(application.yml):

    spring:
      sleuth:
        sampler:
          probability: 1.0  # 采样率(1.0表示全部采样,生产环境可设0.1)
      zipkin:
        base-url: http://localhost:9411  # Zipkin服务器地址
    

总结

Java 微服务各组件协同工作流程:

  1. 服务启动时注册到 Nacos,从 Nacos 配置中心拉取配置;
  2. 客户端通过 Spring Cloud Gateway 调用服务,网关路由到目标服务;
  3. 服务间通过 Feign(同步)或 RabbitMQ(异步)通信,LoadBalancer 负责负载均衡;
  4. 若服务调用失败,Resilience4j 触发熔断降级;
  5. 跨服务事务由 Seata 保证一致性;
  6. 全链路监控通过 Zipkin 和 Prometheus 实现。

每个组件的配置核心是 “接入注册中心”“声明自身角色”“指定协作规则”,通过 Spring Cloud 生态可快速整合这些能力。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值