【Java】【从零开发微服务框架】
# 从零开发微服务框架:设计模式、反射、注解与并发优化的完美结合
> 本文将通过一个完整的微服务框架实现,带你深入理解设计模式、Java反射、注解机制以及并发优化的实际应用。所有代码均可直接运行,建议跟随实战。
## 目录
1. [微服务框架概述](#微服务框架概述)
2. [框架架构设计](#框架架构设计)
3. [核心注解定义](#核心注解定义)
4. [设计模式应用](#设计模式应用)
5. **[完整代码实现](#完整代码实现)**
6. [JVM调优与并发优化](#jvm调优与并发优化)
7. [性能测试与优化](#性能测试与优化)
8. [总结](#总结)
---
## 微服务框架概述
### 什么是微服务
微服务架构是一种将单一应用程序开发为一组小型服务的方法,每个服务运行在自己的进程中,并使用轻量级机制(通常是HTTP API)进行通信。
### 我们要实现的功能
- ✅ 通过注解定义RESTful API
- ✅ 自动路由请求到对应方法
- ✅ 支持多种请求参数绑定
- ✅ 拦截器链(AOP)
- ✅ 配置管理(YAML)
- ✅ 线程池优化
- ✅ 异步处理支持
---
## 框架架构设计
```
┌─────────────────────────────────────────┐
│ Microservice Framework │
├─────────────────────────────────────────┤
│ @RestController @RequestMapping │ ← 注解层
├─────────────────────────────────────────┤
│ Controller Service Repository │ ← 分层架构
├─────────────────────────────────────────┤
│ Dispatcher HandlerAdapter View │ ← 核心引擎
├─────────────────────────────────────────┤
│ InterceptorChain ArgumentResolver │ ← AOP & 参数解析
├─────────────────────────────────────────┤
│ ConfigManager PropertiesLoader │ ← 配置管理
├─────────────────────────────────────────┤
│ ThreadPool AsyncExecutor │ ← 并发处理
├─────────────────────────────────────────┤
│ HTTP Server Servlet Container │ ← Web层
└─────────────────────────────────────────┘
请求处理流程:
HTTP请求 → Tomcat → DispatcherServlet → 拦截器链 → Controller方法 → 返回响应
```
---
## 核心注解定义
首先定义框架需要的核心注解:
```java
package com.micro.annotation;
import java.lang.annotation.*;
/**
* REST控制器注解
*/
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface RestController {
/**
* 路径前缀
*/
String value() default "";
}
/**
* 请求映射注解
*/
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE, ElementType.METHOD})
public @interface RequestMapping {
/**
* 请求路径
*/
String value() default "";
/**
* 请求方法
*/
RequestMethod[] method() default {};
/**
* 请求参数
*/
String[] params() default {};
}
/**
* GET请求映射
*/
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface GetMapping {
String value() default "";
}
/**
* POST请求映射
*/
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface PostMapping {
String value() default "";
}
/**
* PUT请求映射
*/
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface PutMapping {
String value() default "";
}
/**
* DELETE请求映射
*/
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface DeleteMapping {
String value() default "";
}
/**
* 请求参数注解
*/
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.PARAMETER)
public @interface RequestParam {
/**
* 参数名称
*/
String value();
/**
* 是否必填
*/
boolean required() default true;
/**
* 默认值
*/
String defaultValue() default "";
}
/**
* 路径变量注解
*/
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.PARAMETER)
public @interface PathVariable {
/**
* 变量名称
*/
String value() default "";
}
/**
* 请求体注解
*/
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.PARAMETER)
public @interface RequestBody {
}
/**
* 响应体注解
*/
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface ResponseBody {
}
/**
* 请求方法枚举
*/
public enum RequestMethod {
GET, POST, PUT, DELETE, PATCH, HEAD, OPTIONS, TRACE
}
```
---
## 设计模式应用
### 1. 策略模式 - 参数解析器
```java
package com.micro.core;
import com.micro.annotation.RequestBody;
import com.micro.annotation.PathVariable;
import com.micro.annotation.RequestParam;
import javax.servlet.http.HttpServletRequest;
import java.util.*;
/**
* 参数解析器工厂 - 策略模式
*/
public class ArgumentResolverFactory {
private static final Map, ArgumentResolver> RESOLVER_MAP = new HashMap<>();
static {
// 注册内置解析器
registerResolver(String.class, new StringArgumentResolver());
registerResolver(Integer.class, new IntegerArgumentResolver());
registerResolver(int.class, new IntegerArgumentResolver());
registerResolver(Long.class, new LongArgumentResolver());
registerResolver(long.class, new LongArgumentResolver());
registerResolver(Boolean.class, new BooleanArgumentResolver());
registerResolver(boolean.class, new BooleanArgumentResolver());
registerResolver(Double.class, new DoubleArgumentResolver());
registerResolver(double.class, new DoubleArgumentResolver());
}
/**
* 注册参数解析器
*/
public static void registerResolver(Class> type, ArgumentResolver resolver) {
RESOLVER_MAP.put(type, resolver);
}
/**
* 获取参数解析器
*/
public static ArgumentResolver getResolver(Class> type) {
return RESOLVER_MAP.get(type);
}
/**
* 参数解析器接口
*/
public interface ArgumentResolver {
/**
* 解析参数
*/
Object resolve(HttpServletRequest request, String parameterName,
Class> parameterType) throws Exception;
}
/**
* String参数解析器
*/
static class StringArgumentResolver implements ArgumentResolver {
@Override
public Object resolve(HttpServletRequest request, String parameterName,
Class> parameterType) {
return request.getParameter(parameterName);
}
}
/**
* Integer参数解析器
*/
static class IntegerArgumentResolver implements ArgumentResolver {
@Override
public Object resolve(HttpServletRequest request, String parameterName,
Class> parameterType) {
String value = request.getParameter(parameterName);
return value != null ? Integer.parseInt(value) : null;
}
}
/**
* Long参数解析器
*/
static class LongArgumentResolver implements ArgumentResolver {
@Override
public Object resolve(HttpServletRequest request, String parameterName,
Class> parameterType) {
String value = request.getParameter(parameterName);
return value != null ? Long.parseLong(value) : null;
}
}
/**
* Boolean参数解析器
*/
static class BooleanArgumentResolver implements ArgumentResolver {
@Override
public Object resolve(HttpServletRequest request, String parameterName,
Class> parameterType) {
String value = request.getParameter(parameterName);
return value != null ? Boolean.parseBoolean(value) : null;
}
}
/**
* Double参数解析器
*/
static class DoubleArgumentResolver implements ArgumentResolver {
@Override
public Object resolve(HttpServletRequest request, String parameterName,
Class> parameterType) {
String value = request.getParameter(parameterName);
return value != null ? Double.parseDouble(value) : null;
}
}
}
/**
* 注解参数解析器(处理@RequestParam、@PathVariable等)
*/
public class AnnotationArgumentResolver {
/**
* 解析带注解的参数
*/
public static Object resolveAnnotationParameter(HttpServletRequest request,
java.lang.reflect.Parameter parameter,
String[] pathVariables) throws Exception {
// @RequestParam注解
if (parameter.isAnnotationPresent(RequestParam.class)) {
RequestParam requestParam = parameter.getAnnotation(RequestParam.class);
String paramName = requestParam.value().isEmpty() ?
parameter.getName() : requestParam.value();
String value = request.getParameter(paramName);
if (value == null && requestParam.required()) {
if (!requestParam.defaultValue().isEmpty()) {
value = requestParam.defaultValue();
} else {
throw new IllegalArgumentException("缺少必填参数: " + paramName);
}
}
return convertType(value, parameter.getType());
}
// @PathVariable注解
if (parameter.isAnnotationPresent(PathVariable.class)) {
PathVariable pathVariable = parameter.getAnnotation(PathVariable.class);
String varName = pathVariable.value().isEmpty() ?
parameter.getName() : pathVariable.value();
// 从路径变量中查找
for (String pv : pathVariables) {
String[] parts = pv.split("=");
if (parts.length == 2 && parts[0].equals(varName)) {
return convertType(parts[1], parameter.getType());
}
}
throw new IllegalArgumentException("缺少路径变量: " + varName);
}
// @RequestBody注解
if (parameter.isAnnotationPresent(RequestBody.class)) {
return parseRequestBody(request, parameter.getType());
}
// 默认处理
return ArgumentResolverFactory.getResolver(parameter.getType())
.resolve(request, parameter.getName(), parameter.getType());
}
/**
* 类型转换
*/
private static Object convertType(String value, Class> targetType) {
if (value == null) {
return null;
}
if (targetType == String.class) {
return value;
} else if (targetType == Integer.class || targetType == int.class) {
return Integer.parseInt(value);
} else if (targetType == Long.class || targetType == long.class) {
return Long.parseLong(value);
} else if (targetType == Boolean.class || targetType == boolean.class) {
return Boolean.parseBoolean(value);
} else if (targetType == Double.class || targetType == double.class) {
return Double.parseDouble(value);
}
return value;
}
/**
* 解析请求体
*/
private static Object parseRequestBody(HttpServletRequest request, Class> type) throws Exception {
// 简化实现:假设请求体是JSON格式
java.io.BufferedReader reader = request.getReader();
StringBuilder body = new StringBuilder();
String line;
while ((line = reader.readLine()) != null) {
body.append(line);
}
// 使用JSON解析(这里简化处理)
return body.toString();
}
}
```
### 2. 模板方法模式 - 拦截器
```java
package com.micro.interceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* 拦截器接口 - 模板方法模式
*/
public interface HandlerInterceptor {
/**
* 前置处理(模板方法)
*/
default boolean preHandle(HttpServletRequest request,
HttpServletResponse response,
Object handler) throws Exception {
return true;
}
/**
* 后置处理
*/
default void postHandle(HttpServletRequest request,
HttpServletResponse response,
Object handler,
Object modelAndView) throws Exception {
}
/**
* 完成处理
*/
default void afterCompletion(HttpServletRequest request,
HttpServletResponse response,
Object handler,
Exception ex) throws Exception {
}
}
/**
* 拦截器链
*/
public class InterceptorChain {
private final List interceptors = new java.util.ArrayList<>();
private int currentIndex = -1;
public void addInterceptor(HandlerInterceptor interceptor) {
interceptors.add(interceptor);
}
/**
* 执行拦截器链
*/
public boolean applyPreHandle(HttpServletRequest request,
HttpServletResponse response,
Object handler) throws Exception {
for (int i = 0; i < interceptors.size(); i++) {
HandlerInterceptor interceptor = interceptors.get(i);
if (!interceptor.preHandle(request, response, handler)) {
triggerAfterCompletion(request, response, handler, null);
return false;
}
currentIndex = i;
}
return true;
}
/**
* 触发后置处理
*/
public void applyPostHandle(HttpServletRequest request,
HttpServletResponse response,
Object handler,
Object modelAndView) throws Exception {
for (int i = interceptors.size() - 1; i >= 0; i--) {
interceptors.get(i).postHandle(request, response, handler, modelAndView);
}
}
/**
* 触发完成处理
*/
public void triggerAfterCompletion(HttpServletRequest request,
HttpServletResponse response,
Object handler,
Exception ex) throws Exception {
for (int i = currentIndex; i >= 0; i--) {
interceptors.get(i).afterCompletion(request, response, handler, ex);
}
}
}
/**
* 日志拦截器
*/
public class LoggingInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response,
Object handler) throws Exception {
System.out.println("[" + System.currentTimeMillis() + "] " +
request.getMethod() + " " + request.getRequestURI());
return true;
}
@Override
public void afterCompletion(HttpServletRequest request,
HttpServletResponse response,
Object handler,
Exception ex) throws Exception {
System.out.println("[" + System.currentTimeMillis() + "] " +
"Response status: " + response.getStatus());
}
}
/**
* 权限拦截器
*/
public class AuthInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response,
Object handler) throws Exception {
String token = request.getHeader("Authorization");
if (token == null || token.isEmpty()) {
response.setStatus(401);
response.getWriter().write("{\"error\":\"Unauthorized\"}");
return false;
}
// 验证token
if (!validateToken(token)) {
response.setStatus(403);
response.getWriter().write("{\"error\":\"Forbidden\"}");
return false;
}
return true;
}
private boolean validateToken(String token) {
// 简化实现:token不为空即验证通过
return token != null && !token.isEmpty();
}
}
/**
* 性能监控拦截器
*/
public class PerformanceInterceptor implements HandlerInterceptor {
private static final ThreadLocal startTime = new ThreadLocal<>();
@Override
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response,
Object handler) throws Exception {
startTime.set(System.currentTimeMillis());
return true;
}
@Override
public void afterCompletion(HttpServletRequest request,
HttpServletResponse response,
Object handler,
Exception ex) throws Exception {
long duration = System.currentTimeMillis() - startTime.get();
System.out.println("Request " + request.getRequestURI() +
" took " + duration + "ms");
startTime.remove();
}
}
```
### 3. 单例模式 - 配置管理器
```java
package com.micro.config;
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;
import java.util.concurrent.ConcurrentHashMap;
/**
* 配置管理器 - 单例模式
*/
public class ConfigManager {
private static volatile ConfigManager instance;
private final Map properties = new ConcurrentHashMap<>();
private ConfigManager() {
}
/**
* 获取单例实例(双重检查锁定)
*/
public static ConfigManager getInstance() {
if (instance == null) {
synchronized (ConfigManager.class) {
if (instance == null) {
instance = new ConfigManager();
}
}
}
return instance;
}
/**
* 加载配置文件
*/
public void loadConfig(String filePath) {
try (InputStream input = new FileInputStream(filePath)) {
Properties props = new Properties();
props.load(input);
for (String key : props.stringPropertyNames()) {
properties.put(key, props.getProperty(key));
}
System.out.println("配置加载成功,共 " + properties.size() + " 个配置项");
} catch (Exception e) {
throw new RuntimeException("加载配置文件失败", e);
}
}
/**
* 获取配置值
*/
public String getProperty(String key) {
return properties.get(key);
}
/**
* 获取配置值(带默认值)
*/
public String getProperty(String key, String defaultValue) {
return properties.getOrDefault(key, defaultValue);
}
/**
* 获取整数配置值
*/
public int getIntProperty(String key, int defaultValue) {
String value = properties.get(key);
return value != null ? Integer.parseInt(value) : defaultValue;
}
/**
* 获取布尔配置值
*/
public boolean getBooleanProperty(String key, boolean defaultValue) {
String value = properties.get(key);
return value != null ? Boolean.parseBoolean(value) : defaultValue;
}
/**
* 设置配置值
*/
public void setProperty(String key, String value) {
properties.put(key, value);
}
/**
* 获取所有配置
*/
public Map getAllProperties() {
return new HashMap<>(properties);
}
}
```
---
## 完整代码实现
### 4. 核心Dispatcher
```java
package com.micro.core;
import com.micro.annotation.*;
import com.micro.config.ConfigManager;
import com.micro.interceptor.HandlerInterceptor;
import com.micro.interceptor.InterceptorChain;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.lang.reflect.Method;
import java.lang.reflect.Parameter;
import java.util.*;
import java.util.concurrent.*;
/**
* 核心分发器 - 微服务框架的核心
*/
public class DispatcherServlet extends HttpServlet {
private final Map handlerMapping = new ConcurrentHashMap<>();
private final InterceptorChain interceptorChain = new InterceptorChain();
private ExecutorService executorService;
@Override
public void init() throws ServletException {
System.out.println("微服务框架初始化中...");
// 加载配置
ConfigManager config = ConfigManager.getInstance();
config.loadConfig("application.properties");
// 初始化线程池
int threadPoolSize = config.getIntProperty("server.threadPoolSize", 20);
executorService = Executors.newFixedThreadPool(threadPoolSize);
// 扫描并注册Controller
scanControllers();
// 注册拦截器
registerInterceptors();
System.out.println("微服务框架初始化完成");
}
/**
* 扫描并注册Controller
*/
private void scanControllers() {
// 简化实现:手动注册
registerController(new UserController());
registerController(new OrderController());
}
/**
* 注册Controller
*/
private void registerController(Object controller) {
Class> controllerClass = controller.getClass();
RestController restController = controllerClass.getAnnotation(RestController.class);
if (restController == null) {
return;
}
String classPath = restController.value();
for (Method method : controllerClass.getDeclaredMethods()) {
// 检查方法上的映射注解
String methodPath = null;
RequestMethod[] requestMethods = {};
if (method.isAnnotationPresent(RequestMapping.class)) {
RequestMapping mapping = method.getAnnotation(RequestMapping.class);
methodPath = mapping.value();
requestMethods = mapping.method();
} else if (method.isAnnotationPresent(GetMapping.class)) {
methodPath = method.getAnnotation(GetMapping.class).value();
requestMethods = new RequestMethod[]{RequestMethod.GET};
} else if (method.isAnnotationPresent(PostMapping.class)) {
methodPath = method.getAnnotation(PostMapping.class).value();
requestMethods = new RequestMethod[]{RequestMethod.POST};
} else if (method.isAnnotationPresent(PutMapping.class)) {
methodPath = method.getAnnotation(PutMapping.class).value();
requestMethods = new RequestMethod[]{RequestMethod.PUT};
} else if (method.isAnnotationPresent(DeleteMapping.class)) {
methodPath = method.getAnnotation(DeleteMapping.class).value();
requestMethods = new RequestMethod[]{RequestMethod.DELETE};
}
if (methodPath != null) {
String fullPath = (classPath + methodPath).replaceAll("/+", "/");
HandlerMethod handlerMethod = new HandlerMethod(controller, method, requestMethods);
handlerMapping.put(fullPath, handlerMethod);
System.out.println("注册路由: " + fullPath + " -> " + method.getName());
}
}
}
/**
* 注册拦截器
*/
private void registerInterceptors() {
ConfigManager config = ConfigManager.getInstance();
if (config.getBooleanProperty("interceptor.logging.enabled", true)) {
interceptorChain.addInterceptor(new com.micro.interceptor.LoggingInterceptor());
}
if (config.getBooleanProperty("interceptor.auth.enabled", false)) {
interceptorChain.addInterceptor(new com.micro.interceptor.AuthInterceptor());
}
if (config.getBooleanProperty("interceptor.performance.enabled", true)) {
interceptorChain.addInterceptor(new com.micro.interceptor.PerformanceInterceptor());
}
}
@Override
protected void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 异步处理
executorService.submit(() -> {
try {
doDispatch(request, response);
} catch (Exception e) {
e.printStackTrace();
}
});
}
/**
* 分发请求
*/
private void doDispatch(HttpServletRequest request, HttpServletResponse response)
throws Exception {
String requestURI = request.getRequestURI();
RequestMethod requestMethod = RequestMethod.valueOf(request.getMethod());
// 查找处理器
HandlerMethod handlerMethod = findHandler(requestURI, requestMethod);
if (handlerMethod == null) {
response.setStatus(404);
response.getWriter().write("{\"error\":\"Not Found\"}");
return;
}
// 执行拦截器链
if (!interceptorChain.applyPreHandle(request, response, handlerMethod)) {
return;
}
try {
// 解析路径变量
String[] pathVariables = parsePathVariables(requestURI, handlerMethod);
// 执行处理方法
Object result = invokeHandlerMethod(request, handlerMethod, pathVariables);
// 设置响应
if (method.isAnnotationPresent(ResponseBody.class)) {
response.setContentType("application/json;charset=UTF-8");
response.getWriter().write(convertToJson(result));
} else {
response.getWriter().write(result != null ? result.toString() : "");
}
// 执行后置拦截器
interceptorChain.applyPostHandle(request, response, handlerMethod, result);
} catch (Exception e) {
response.setStatus(500);
response.getWriter().write("{\"error\":\"" + e.getMessage() + "\"}");
interceptorChain.triggerAfterCompletion(request, response, handlerMethod, e);
return;
}
interceptorChain.triggerAfterCompletion(request, response, handlerMethod, null);
}
/**
* 查找处理器
*/
private HandlerMethod findHandler(String requestURI, RequestMethod requestMethod) {
// 精确匹配
HandlerMethod handler = handlerMapping.get(requestURI);
if (handler != null && handler.matchesMethod(requestMethod)) {
return handler;
}
// 模糊匹配(支持路径变量)
for (Map.Entry entry : handlerMapping.entrySet()) {
if (matchesPath(requestURI, entry.getKey()) &&
entry.getValue().matchesMethod(requestMethod)) {
return entry.getValue();
}
}
return null;
}
/**
* 路径匹配
*/
private boolean matchesPath(String requestURI, String pattern) {
String[] requestParts = requestURI.split("/");
String[] patternParts = pattern.split("/");
if (requestParts.length != patternParts.length) {
return false;
}
for (int i = 0; i < patternParts.length; i++) {
if (!patternParts[i].equals(requestParts[i]) &&
!patternParts[i].startsWith("{")) {
return false;
}
}
return true;
}
/**
* 解析路径变量
*/
private String[] parsePathVariables(String requestURI, HandlerMethod handlerMethod) {
// 简化实现:返回空数组
return new String[0];
}
/**
* 调用处理方法
*/
private Object invokeHandlerMethod(HttpServletRequest request,
HandlerMethod handlerMethod,
String[] pathVariables) throws Exception {
Method method = handlerMethod.getMethod();
Object controller = handlerMethod.getController();
Parameter[] parameters = method.getParameters();
Object[] args = new Object[parameters.length];
for (int i = 0; i < parameters.length; i++) {
args[i] = AnnotationArgumentResolver.resolveAnnotationParameter(
request, parameters[i], pathVariables);
}
return method.invoke(controller, args);
}
/**
* 转换为JSON(简化实现)
*/
private String convertToJson(Object obj) {
if (obj == null) {
return "null";
}
if (obj instanceof String) {
return "\"" + obj + "\"";
}
if (obj instanceof Number || obj instanceof Boolean) {
return obj.toString();
}
// 简化对象转JSON
return obj.toString();
}
@Override
public void destroy() {
if (executorService != null) {
executorService.shutdown();
}
System.out.println("微服务框架已关闭");
}
/**
* 处理器方法
*/
private static class HandlerMethod {
private final Object controller;
private final Method method;
private final RequestMethod[] requestMethods;
public HandlerMethod(Object controller, Method method, RequestMethod[] requestMethods) {
this.controller = controller;
this.method = method;
this.requestMethods = requestMethods;
}
public Object getController() { return controller; }
public Method getMethod() { return method; }
public boolean matchesMethod(RequestMethod requestMethod) {
if (requestMethods.length == 0) {
return true;
}
return Arrays.asList(requestMethods).contains(requestMethod);
}
}
}
```
### 5. 异步处理器
```java
package com.micro.async;
import java.util.concurrent.*;
/**
* 异步任务执行器
*/
public class AsyncExecutor {
private static volatile AsyncExecutor instance;
private final ExecutorService executorService;
private final CompletionService