随着微服务架构的普及,越来越多的项目开始采用分布式服务模式。在本文中,我们基于 SpringCloud Alibaba 构建一套简单但功能齐全的微服务架构。技术栈包括 Nacos、OpenFeign、SpringCloud Gateway、OkHttp 等,架构基于 Maven 的多模块项目管理方式。
目标架构
本项目采用多模块 Maven 项目管理,结构如下:
springcloud-demo
├── pom.xml # 父 POM
├── gateway-service # 网关服务模块
├── service-a # 服务 A 模块
├── service-b # 服务 B 模块
└── nacos-server # Nacos 配置说明
功能概览
- 服务注册与发现:Nacos 作为服务注册中心,实现动态服务注册与发现。
- 服务通信:使用 OpenFeign 实现跨服务的 HTTP 调用,支持负载均衡。
- 统一网关:通过 SpringCloud Gateway 实现统一入口和路由管理。
- 连接池优化:结合 OkHttp 提高 OpenFeign 的网络连接效率。
- 配置管理:通过 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 连接池。
测试流程
- 启动 Nacos:确保 Nacos 服务运行在 8848 端口。
- 启动各服务:按照顺序启动
gateway-service
、service-a
、service-b
。 访问接口:通过 Gateway 访问服务:
http://localhost:8080/service-a/hello
返回Hello from Service A
。http://localhost:8080/service-b/call
通过 Feign 调用 Service A。
评论 (0)