从零到一构建微服务:Java和Spring Boot实现服务注册与发现的全流程揭秘

50 阅读4分钟

引言

微服务架构是一种构建分布式应用程序的现代方法,将应用拆分为多个小而独立的服务。每个微服务实现特定功能,可以独立部署和扩展。与传统的单体架构不同,微服务架构通过降低耦合性,提升了系统的可扩展性和维护性。本文将介绍如何使用Java和Spring Boot构建微服务架构,利用Spring Cloud实现服务的注册、发现和调用。

微服务架构基础概念

  1. 微服务:小而独立的服务,具有清晰的边界,每个微服务仅关注其功能单元。
  2. 服务注册与发现:微服务架构中的服务需要动态发现彼此。服务注册中心负责追踪所有服务实例,客户端或其他服务可以通过注册中心找到目标服务。
  3. 负载均衡:在服务调用过程中,为了保证系统的可用性和响应速度,通常会在多个实例中选择负载较低的实例处理请求。
  4. API网关:集中管理所有微服务的入口,负责请求转发、身份验证等任务。

项目设计

在本示例中,我们将设计一个包含以下组件的简单微服务系统:

  1. 服务注册中心:使用Spring Cloud的Eureka服务实现服务注册与发现。
  2. 订单服务:一个负责处理订单的微服务。
  3. 客户服务:一个负责管理客户信息的微服务。
  4. API网关:使用Spring Cloud Gateway构建,作为所有微服务的入口。

依赖管理

为了实现这些功能,我们需要引入以下依赖:

  • Spring Boot:用于构建微服务应用。
  • Spring Cloud Netflix Eureka:用于服务注册与发现。
  • Spring Cloud Gateway:用于API网关管理。
xml
<dependencies>
    <!-- Spring Boot and Web Dependencies -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <!-- Eureka Server Dependency -->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
    </dependency>

    <!-- Eureka Client Dependency -->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
    </dependency>

    <!-- Spring Cloud Gateway Dependency -->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-gateway</artifactId>
    </dependency>
</dependencies>

技术实现

1. 服务注册中心

Eureka Server作为服务注册中心,提供服务注册与发现功能。通过配置Eureka Server,微服务可以动态注册自己,其他服务则可以通过Eureka Server来发现目标服务的地址。

Eureka Server的配置

创建一个Spring Boot项目,添加@EnableEurekaServer注解并在application.yml中配置Eureka服务:

java
@SpringBootApplication
@EnableEurekaServer
public class EurekaServerApplication {
    public static void main(String[] args) {
        SpringApplication.run(EurekaServerApplication.class, args);
    }
}
yaml
# application.yml
server:
  port: 8761

eureka:
  client:
    register-with-eureka: false
    fetch-registry: false
  server:
    wait-time-in-ms-when-sync-empty: 0

2. 订单服务

订单服务作为一个简单的微服务,会注册到Eureka Server并暴露一些接口来处理订单。使用@EnableEurekaClient注解使订单服务成为Eureka的客户端。

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

配置application.yml以指定Eureka Server的地址:

yaml
server:
  port: 8081

eureka:
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka/

订单服务的控制器类:

java
@RestController
@RequestMapping("/orders")
public class OrderController {
    
    @GetMapping("/{orderId}")
    public ResponseEntity<String> getOrder(@PathVariable String orderId) {
        return ResponseEntity.ok("Order ID: " + orderId);
    }
}

3. 客户服务

类似订单服务,客户服务也会注册到Eureka Server中。配置方法和订单服务相同。客户服务提供客户信息的管理接口:

java
@RestController
@RequestMapping("/customers")
public class CustomerController {

    @GetMapping("/{customerId}")
    public ResponseEntity<String> getCustomer(@PathVariable String customerId) {
        return ResponseEntity.ok("Customer ID: " + customerId);
    }
}

4. API网关

Spring Cloud Gateway作为API网关,将所有请求路由到相应的微服务。网关服务也需要注册到Eureka Server中,以便它能发现其他服务。

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

配置API网关的路由规则,指定将/order/**的请求转发给订单服务,将/customer/**的请求转发给客户服务:

yaml
server:
  port: 8080

spring:
  cloud:
    gateway:
      routes:
        - id: order-service
          uri: lb://ORDER-SERVICE
          predicates:
            - Path=/orders/**
        - id: customer-service
          uri: lb://CUSTOMER-SERVICE
          predicates:
            - Path=/customers/**
eureka:
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka/

服务调用流程

  • 服务注册:每个微服务启动时自动注册到Eureka Server。
  • 服务发现:API网关根据请求路径匹配不同的服务,并通过Eureka查找到对应的服务地址。
  • 负载均衡:API网关将请求转发给目标服务时使用负载均衡。

总结

在本文中,构建了一个基于Java和Spring Boot的微服务架构,包含服务注册中心、订单服务、客户服务和API网关四个组件。利用Spring Cloud的Eureka实现了服务的注册和发现功能,使用Spring Cloud Gateway实现请求的转发。