# mall
**Repository Path**: luckma/mall
## Basic Information
- **Project Name**: mall
- **Description**: springcloud分布式电商平台
- **Primary Language**: Java
- **License**: Apache-2.0
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 2
- **Forks**: 3
- **Created**: 2020-08-13
- **Last Updated**: 2021-09-04
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# mall
#### 介绍
自己测试分布式项目
#### 软件架构
软件架构说明
##### Nginx 进行反向代理
##### API 网关 spring-cloud-gateway
##### 注册中心 spring-cloud-alibaba-Nacos
##### 配置中心 spring-cloud-alibaba-Nacos
##### 分布式事务 spring-cloud-alibaba-Seata https://seata.io/zh-cn/docs/overview/what-is-seata.html
##### 远程服务调用 Spring-Cloud-Feign
##### 服务的熔断限流降级 Sentinel 哨兵
##### 服务链路追踪 Sleuth+Zipkin
##### 文件服务器 阿里云 oss
##### 短信服务 阿里云短信API接口
##### 缓存中间件 redis
##### 分布式锁 redisson
##### **全文检索 ElasticSearch**
##### 消息队列 RabbitMQ
###### mall-auth-server 登录注册服务
###### **mall-common 通用模块**
###### **mall-coupon 优惠服务**
###### **mall-gateway api网关服务**
###### **mall-member 会员服务**
###### **mall-order 订单服务**
###### **mall-product 产品服务**
###### **mall-ware 仓储服务**
###### **mall-third-party 第三方服务 (阿里云oss)**
###### **renren-fast 前端服务**
###### **renren-generator 自动生成代码**
###### mall-test-sso-client 单点登录客户端1
###### mall-test-sso-client2 单点登录客户端2
###### mall-test-sso-server 单点登录服务器
###### mall-cart 购物车模块
###### mall-seckill 秒杀模块
###### **数据库 MySQL8.0.12**
###### thymeleaf 模板引擎
###### 测试工具 JMeter
#### 安装教程
##### 整合mybatis-plus
1.导入依赖
```xml
com.baomidou
mybatis-plus-boot-starter
3.3.2
```
2. 配置
官方文档:https://baomidou.com/
1) 配置数据源
1. 导入数据库驱动
2. 在application.yml配置数据源
2) 配置mybatis-plus
1. 使用@MapperScan("com.mall.product.dao")
2. 告诉mybatis-plus,sql映射文件位置 和配置主键自增
mybatis-plus:
mapper-locations: classpath:/mapper/**/*.xml
global-config:
db-config:
id-type: auto
#### 使用说明
##### 引入redis
```xml
org.springframework.boot
spring-boot-starter-data-redis
```
```yaml
spring:
redis:
host: 192.168.137.141
port: 6379
```
##### 引入redisson
```xml
org.redisson
redisson
3.13.3
```
配置redis
##### 整合spring cache简化缓存开发
1.引入依赖
```xml
org.springframework.boot
spring-boot-starter-cache
```
2.写配置
CacheAutoConfiguration中导入了RedisCacheConfiguration
自动配好了缓存管理器RedisCacheManager
配置redis作为缓存
spring.cache.type=redis
3.测试
@EnableCaching 开启缓存功能
4.默认行为
5.标签
@CacheEvict 级联删除所有的关联数据
6. spring cache的不足
##### 引入thymeleaf
1.引入starter
```xml
org.springframework.boot
spring-boot-starter-thymeleaf
```
2.关闭缓存
```yaml
spring:
thymeleaf:
cache: false
```
静态资源放在static文件夹下
html页面放在templates中
3.实现不重启服务就能更新页面
关闭缓存并导入
```xml
org.springframework.boot
spring-boot-devtools
true
```
按ctrl+f9 代码修改建议重启
##### 想要访问远程服务
1. 引入open-feign
2. 编写一个接口,告诉springcloud这个接口需要调用远程服务
1)声明接口的每一个方法都是调用哪个远程服务的哪个请求
3. 开启远程服务调用功能
##### 如何使用nacos当作配置中心
1.引入依赖
```xml
com.alibaba.cloud
spring-cloud-starter-alibaba-nacos-config
```
2.创建一个bootstrap.properties
```properties
spring.application.name=mall-coupon
spring.cloud.nacos.config.server-addr=192.168.137.145:8848
```
3.给配置中心默认添加一个 数据集(Data Id) 默认规则, 应用名.propertiey
4.给应用名.properties添加任何配置
5.动态获取
@RefreshScope 动态获取并刷新配置
@Value("${配置项的名}") 获取某个配置的值
如果配置中心和当前应用的配置文件中都配置了相同的项,优先使用配置中心的
6.细节
1)命名空间 public(保留空间);默认新增的配置都在public空间
1.开发、测试、生产环境 利用命名空间来做环境隔离
```properties
spring.cloud.nacos.config.namespace=123f84f9-1a70-4123-8f19-d47c822f6735
```
2.基于每一个微服务之间互相隔离配置,每一个微服务都创建自己的命名空间,只加载自己命名空间下的所有配置
2)配置集
所有配置的集合
3)配置集id 类似于文件名
4)配置分组
5)同时加载多个配置集
只需要在bootstrap.properties中说明配置中心
#### 参与贡献
1. Fork 本仓库
2. 新建 Feat_xxx 分支
3. 提交代码
4. 新建 Pull Request
#### 细节
##### 逻辑删除
1.配置全局的逻辑删除规则
加上逻辑删除注解@TableLogin
跨域访问
####后台校验 JSR303
!!注意
导入的包是
```xml
org.hibernate.validator
hibernate-validator
7.0.0.Alpha2
```
给bean加注解
import javax.validation.*;
1. 给需要校验的属性添加@NotBlank(message = "品牌名必须提交")
2. @Valid开启校验
效果:校验错误会有默认的响应
3. 在提交的后边紧跟BindingResult result,可以获取到校验的结果
```java
@RequestMapping("/save")
public R save(@Valid @RequestBody BrandEntity brand, BindingResult result){
brandService.save(brand);
return R.ok();
}
```
缺点:每个表单都需要校验,很繁琐
4.统一的异常处理
@ControllerAdvice
4. 分组校验
1)给校验注解上标注什么情况需要进行校验
```java
@Validated
@NotBlank(message = "品牌名必须提交",groups = {AddGroup.class,UpdateGroup.class})
private String name;
```
2) @RequestMapping("/save")
public R save(@Validated(AddGroup.class) @RequestBody BrandEntity brand/*, BindingResult result*/){
3) 没有指定分组的校验注解,在分组校验情况下不会被校验
5. 自定义校验
1)编写一个自定义的校验注解
```java
@Documented
@Constraint(validatedBy = { ListValueConstraintValidator.class }) //可以指定多个不同的校验器,适配类型的校验
@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE })
@Retention(RUNTIME)
public @interface ListValue {
```
2)编写一个自定义的校验器
3)关联自定义的校验器和自定义的校验注解
6. 解决视图映射
当一个请求只跳转时可以配置
```java
@Configuration
public class MallWebConfig implements WebMvcConfigurer {
//视图映射 ,解决跳转问题
@Override
public void addViewControllers(ViewControllerRegistry registry) {
registry.addViewController("/login.html").setViewName("login");
registry.addViewController("/reg.html").setViewName("reg");
}
}
```
### 分布式session
同一个服务,复制多份在不同的服务器,session不同步
####解决:
1.session复制 tomcat原生支持
缺点:数据量传输大
2.客户端存储
缺点:不安全
**3. hash一致性 √**
**4. 统一存储√**
不同服务,不能跨域
解决:
子域session共享
#### 配置解决跨域和复制
1. 导入依赖
```xml
org.springframework.session
spring-session-data-redis
```
2. 配置使用session redis 将session数据保存到redis中
```properties
spring.session.store-type=redis
```
3. 编写配置文件 配置序列化器和设置spring session完成跨域访问
```java
package com.mall.product.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.RedisSerializer;
import org.springframework.session.web.http.CookieSerializer;
import org.springframework.session.web.http.DefaultCookieSerializer;
/**
* @Description: springSession配置类
* @Created: with IntelliJ IDEA.
**/
@Configuration
public class MallSessionConfig {
@Bean
public CookieSerializer cookieSerializer() {
DefaultCookieSerializer cookieSerializer = new DefaultCookieSerializer();
//放大作用域
cookieSerializer.setDomainName("mall.com");
cookieSerializer.setCookieName("MALLSESSION");
return cookieSerializer;
}
@Bean
public RedisSerializer