优点,有入口鉴权,功能分布细化,性能卓越
缺点, 项目复杂难度,信息暴露,复杂链路等各种问题
理解领域概念,学习领域知识,对领域建模
解读
Controller
对外提供服务接口,对内调用领域层简单理解图
网关是微服务架构的唯一入口
涉及到
创建项目 -->导入依赖–>编写配置
父工程创建e-commerce-springcloud
导入需要的对应依赖
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.hyc.ecommerce</groupId>
<artifactId>e-commerce-springcloud</artifactId>
<version>1.0-SNAPSHOT</version>
<modules>
<module>e-commerce-common</module>
<module>e-commerce-mvc-config</module>
</modules>
<packaging>pom</packaging>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.1.RELEASE</version>
</parent>
<properties>
<!-- Spring Cloud Hoxton.SR8 依赖 -->
<spring-cloud.version>Hoxton.SR8</spring-cloud.version>
<!-- spring cloud alibaba 依赖 -->
<spring-cloud-alibaba.version>2.2.4.RELEASE</spring-cloud-alibaba.version>
</properties>
<dependencies>
<!-- lombok 工具通过在代码编译时期动态的将注解替换为具体的代码, IDEA 需要添加 lombok 插件 -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.16.18</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.11</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-collections4</artifactId>
<version>4.4</version>
</dependency>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.6.0</version>
</dependency>
<!-- 引入jwt-->
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-api</artifactId>
<version>0.10.5</version>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-impl</artifactId>
<version>0.10.5</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-jackson</artifactId>
<version>0.10.5</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.47</version>
</dependency>
</dependencies>
<!-- 项目依赖管理 父项目只是声明依赖,子项目需要写明需要的依赖(可以省略版本信息) -->
<dependencyManagement>
<dependencies>
<!-- spring cloud 依赖 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- spring cloud alibaba 依赖 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>${spring-cloud-alibaba.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<!-- 配置远程仓库 -->
<repositories>
<repository>
<id>spring-milestones</id>
<name>Spring Milestones</name>
<url>https://repo.spring.io/milestone</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
</project>
e-commerce-common
模块
依赖如下
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>e-commerce-springcloud</artifactId>
<groupId>com.hyc.ecommerce</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>e-commerce-common</artifactId>
<!-- 模块名及描述信息 -->
<name>e-commerce-common</name>
<description>通用模块</description>
</project>
这么模块之后会放入很多的数据模型,来给功能服务模块使用,这里先创建并且统一响应,之后会有对应的数据模型加入其中
/** * @author : 冷环渊 * @date : 2021/12/2 * @context: 通用响应定义 * { * "code":1 * "message":hyc * "data":{} * } */
@Data
@NoArgsConstructor
@AllArgsConstructor
public class CommonResponse<T> implements Serializable {
//相应码
private Integer code;
//返回消息 信息描述
private String message;
public CommonResponse(Integer code, String message) {
this.code = code;
this.message = message;
}
//泛型内容数据
private T Data;
}
e-commerce-mvc-config
这个模块主要是为了隔离功能,有的服务模块比如网关,不能有web依赖的启动,这样他导入commons就可以了,起到很好的服务对应功能隔离
依赖如下
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>e-commerce-springcloud</artifactId>
<groupId>com.hyc.ecommerce</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>e-commerce-mvc-config</artifactId>
<!-- 模块名及描述信息 -->
<name>e-commerce-mvc-config</name>
<description>通用配置模块</description>
<dependencies>
<!-- 引入 Web 功能 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.hyc.ecommerce</groupId>
<artifactId>e-commerce-common</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
</project>
IgnoreResponseAdvice
忽略统一响应注解定义,就是不需要用我们定义的CommonsResponese的类使用这个注解就可以不使用
/** * @author : 冷环渊 * @date : 2021/12/2 * @context:忽略统一响应注解定义 */
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface IgnoreResponseAdvice {
}
/** * @author : 冷环渊 * @date : 2021/12/2 * @context: 实现统一响应和统一忽略响应注解 * @params : null * @return : * @return : null */
@RestControllerAdvice(value = "com.hyc.ecommerce")
//实现响应体建议接口
public class CommonResponseDataAdvice implements ResponseBodyAdvice<Object> {
@Override
public boolean supports(MethodParameter methodParameter,
Class<? extends HttpMessageConverter<?>> aClass) {
//判断类上面有没有这个注解 IgnoreResponseAdvice
if (methodParameter.getDeclaringClass().isAnnotationPresent(IgnoreResponseAdvice.class)) {
return false;
}
//判断方法上有没有这个注解 IgnoreResponseAdvice
if (methodParameter.getMethod().isAnnotationPresent(IgnoreResponseAdvice.class)) {
return false;
}
//都没有的话 就代表要使用公共返回格式
return true;
}
//处理 如果是需要使用的话怎么用
@Override
public Object beforeBodyWrite(Object o, MethodParameter methodParameter,
MediaType mediaType, Class<? extends HttpMessageConverter<?>> aClass,
ServerHttpRequest serverHttpRequest,
ServerHttpResponse serverHttpResponse) {
//定义最终的返回对象
CommonResponse<Object> response = new CommonResponse<>(0, "");
//如果等于null就代表没有 直接返回
if (o == null) {
return response;
//等于公共返回类型的 就把o转换成 公共返回 CommonResponse<>
} else if (o instanceof CommonResponse) {
response = (CommonResponse<Object>) o;
//如果都不是的话 那就是响应内容 设置响应data 为这个object
} else {
response.setData(o);
}
return response;
}
}
GlobalExceptionAdvice
处理全局异常,只要出现了请求出现了异常给一个统一的返回结果
/** * @author : 冷环渊 * @date : 2021/12/2 * @context:全局异常处理 * @params : null * @return : * @return : null */
@Slf4j
@RestControllerAdvice
public class GlobalExceptionAdvice {
//这个注解的意思就是异常处理起,参数是你想要捕捉的异常
@ExceptionHandler(value = Exception.class)
public CommonResponse<String> handlerCommerceException(HttpServerRequest req, Exception ex) {
//初始化一个公共响应对象
CommonResponse<String> response = new CommonResponse<>(
-1, "business error"
);
//加入报错信息 到信息头
response.setData(ex.getMessage());
//控制后台打印报错日志 返回公共响应体 给调用方一个提示
log.error("commerce service has error:[{}]", ex.getMessage(), ex);
return response;
}
}
版权说明 : 本文为转载文章, 版权归原作者所有 版权申明
原文链接 : https://blog.csdn.net/doomwatcher/article/details/121686885
内容来源于网络,如有侵权,请联系作者删除!