基于 Maven 多模块的 SpringCloud 微服务架构实战

基于 Maven 多模块的 SpringCloud 微服务架构实战

尽意
2024-12-04 / 0 评论 / 18 阅读 / 正在检测是否收录...
温馨提示:
本文最后更新于2024年12月04日,已超过50天没有更新,若内容或图片失效,请留言反馈。
随着微服务架构的普及,越来越多的项目开始采用分布式服务模式。在本文中,我们基于 SpringCloud Alibaba 构建一套简单但功能齐全的微服务架构。技术栈包括 NacosOpenFeignSpringCloud GatewayOkHttp 等,架构基于 Maven 的多模块项目管理方式。

目标架构

本项目采用多模块 Maven 项目管理,结构如下:

springcloud-demo
├── pom.xml                # 父 POM
├── gateway-service        # 网关服务模块
├── service-a              # 服务 A 模块
├── service-b              # 服务 B 模块
└── nacos-server           # Nacos 配置说明
功能概览
  1. 服务注册与发现:Nacos 作为服务注册中心,实现动态服务注册与发现。
  2. 服务通信:使用 OpenFeign 实现跨服务的 HTTP 调用,支持负载均衡。
  3. 统一网关:通过 SpringCloud Gateway 实现统一入口和路由管理。
  4. 连接池优化:结合 OkHttp 提高 OpenFeign 的网络连接效率。
  5. 配置管理:通过 Nacos 实现动态的集中配置管理。

技术栈解析

1. Nacos

  • 作用:作为服务注册与配置中心,支持动态服务发现和配置热更新。
  • 使用场景:服务注册发现、集中化配置管理。

2. OpenFeign

  • 作用:基于声明式的 REST 客户端,简化服务间调用。
  • 优势:自动负载均衡,支持多种序列化方式和超时配置。

3. SpringCloud Gateway

  • 作用:提供统一网关入口,支持路由转发、限流、熔断等功能。
  • 优势:对微服务访问统一管理,提升扩展性与安全性。

4. OkHttp

  • 作用:为 OpenFeign 提供底层连接池支持,提高网络通信效率。
  • 优势:轻量高效,支持连接复用。

父项目 POM 配置

在父项目的 pom.xml 中,定义公共依赖和子模块:

<modules>
    <module>gateway-service</module>
    <module>service-a</module>
    <module>service-b</module>
</modules>

<dependencyManagement>
    <dependencies>
        <!-- SpringCloud Alibaba 依赖管理 -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-alibaba-dependencies</artifactId>
            <version>2021.0.5.0</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

<dependencies>
    <!-- Spring Boot 基础依赖 -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter</artifactId>
    </dependency>
    <!-- Nacos 服务发现 -->
    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    </dependency>
    <!-- OpenFeign 依赖 -->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-openfeign</artifactId>
    </dependency>
    <!-- SpringCloud Gateway 依赖 -->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-gateway</artifactId>
    </dependency>
</dependencies>

各子模块实现

1. Nacos 配置

Nacos 官方 下载,启动命令:

# 单机模式
sh startup.sh -m standalone

Nacos 默认端口为 8848,访问 http://localhost:8848/nacos 查看管理界面,默认用户名和密码均为 nacos

2. Service A
  • 功能:提供简单的 REST 接口。
  • 依赖:Nacos 服务注册。

application.yml

server:
  port: 8081

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

Controller 示例

@RestController
@RequestMapping("/service-a")
public class ServiceAController {

    @GetMapping("/hello")
    public String hello() {
        return "Hello from Service A";
    }
}

3. Service B
  • 功能:调用 Service A 的接口。
  • 依赖:OpenFeign,Nacos 服务注册。

application.yml

server:
  port: 8082

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

Feign Client

@FeignClient(name = "service-a")
public interface ServiceAFeignClient {

    @GetMapping("/service-a/hello")
    String callServiceA();
}

Controller 示例

@RestController
@RequestMapping("/service-b")
public class ServiceBController {

    @Autowired
    private ServiceAFeignClient serviceAFeignClient;

    @GetMapping("/call")
    public String call() {
        return serviceAFeignClient.callServiceA();
    }
}

4. Gateway 服务
  • 功能:通过网关统一路由到服务 A 和服务 B。
  • 依赖:SpringCloud Gateway,Nacos 服务注册。

application.yml

server:
  port: 8080

spring:
  application:
    name: gateway-service
  cloud:
    gateway:
      routes:
        - id: service-a-route
          uri: lb://service-a
          predicates:
            - Path=/service-a/**
        - id: service-b-route
          uri: lb://service-b
          predicates:
            - Path=/service-b/**
  nacos:
    discovery:
      server-addr: 127.0.0.1:8848

配置 OkHttp 连接池

为 OpenFeign 配置 OkHttp 优化性能:

FeignConfig

@Configuration
public class FeignConfig {

    @Bean
    public OkHttpClient okHttpClient() {
        return new OkHttpClient.Builder()
                .connectTimeout(10, TimeUnit.SECONDS)
                .readTimeout(10, TimeUnit.SECONDS)
                .writeTimeout(10, TimeUnit.SECONDS)
                .build();
    }

    @Bean
    public OkHttpFeignClient feignClient(OkHttpClient okHttpClient) {
        return new OkHttpFeignClient(okHttpClient);
    }
}

service-b 的 Feign Client 中即可使用配置的 OkHttp 连接池。


测试流程

  1. 启动 Nacos:确保 Nacos 服务运行在 8848 端口。
  2. 启动各服务:按照顺序启动 gateway-serviceservice-aservice-b
  3. 访问接口:通过 Gateway 访问服务:

    • http://localhost:8080/service-a/hello 返回 Hello from Service A
    • http://localhost:8080/service-b/call 通过 Feign 调用 Service A。

2

评论 (0)

取消