Mall电商实战项目发布重大更新,全面支持SpringBoot
更新内容一览
升级至SpringBoot 2.3.0.RELEASE;
支持Elasticsearch 7.6.2版本;
ELK日志收集功能完善,采用分场景收集日志的方案;
Swagger配置统一,简化配置;
Redis配置统一,简化配置;
Window和Linux部署文档更新。
更新内容介绍
升级SpringBoot 2.3.0
之前一直使用的是SpringBoot 2.1.7版本,这个版本是2019年8月发布的,距离现在已经一年多了,也到了更新版本的时候了。SpringBoot 2.3.0 是今年5月发布的,还是比较新的版本
支持Elasticsearch 7.6.2
由于SpringBoot版本的升级,导致Elasticsearch被迫升级,当然Elasticsearch 7.x也是现在主流的版本。升级过程中踩了很多坑
ELK日志收集功能完善
之前的日志收集功能一直都不是很完善,也没有采用分场景收集日志的方法,这次终于完善了。日志收集系统搭建和分场景收集日志方案
Swagger配置统一
之前在各个模块之中都有自己的Swagger配置,比如mall-admin、mall-portal和mall-search中都有自己的配置,现已进行了统一。
首先是在mall-common模块中添加了Swagger的基础配置BaseSwaggerConfig,在其他模块中使用只需继承该配置,并重写swaggerProperties()这个抽象方法即可;
/**
* Swagger基础配置
* Created by macro on 2020/7/16.
*/
publicabstractclassBaseSwaggerConfig{
@Bean
publicDocketcreateRestApi(){
SwaggerProperties swaggerProperties = swaggerProperties();
Docket docket =newDocket(DocumentationType.SWAGGER_2)
.apiInfo(apiInfo(swaggerProperties))
.select()
.apis(RequestHandlerSelectors.basePackage(swaggerProperties.getApiBasePackage()))
.paths(PathSelectors.any())
.build();
if(swaggerProperties.isEnableSecurity()) {
docket.securitySchemes(securitySchemes()).securityContexts(securityContexts());
}
returndocket;
}
privateApiInfoapiInfo(SwaggerProperties swaggerProperties){
returnnewApiInfoBuilder()
.title(swaggerProperties.getTitle())
.description(swaggerProperties.getDescription())
.contact(newContact(swaggerProperties.getContactName(), swaggerProperties.getContactUrl(), swaggerProperties.getContactEmail()))
.version(swaggerProperties.getVersion())
.build();
}
privateListsecuritySchemes(){
//设置请求头信息
List<ApiKey> result = new ArrayList<>();
ApiKey apiKey = new ApiKey("Authorization", "Authorization", "header");
result.add(apiKey);
return result;
}
private List<SecurityContext> securityContexts() {
//设置需要登录认证的路径
List<SecurityContext> result = new ArrayList<>();
result.add(getContextByPath("/*/.*"));
return result;
}
private SecurityContext getContextByPath(String pathRegex) {
return SecurityContext.builder()
.securityReferences(defaultAuth())
.forPaths(PathSelectors.regex(pathRegex))
.build();
}
private List<SecurityReference> defaultAuth() {
List<SecurityReference> result = new ArrayList<>();
AuthorizationScope authorizationScope = new AuthorizationScope("global", "accessEverything");
AuthorizationScope[] authorizationScopes = new AuthorizationScope[1];
authorizationScopes[0] = authorizationScope;
result.add(new SecurityReference("Authorization", authorizationScopes));
return result;
}
/**
* 自定义Swagger配置
*/
public abstract SwaggerProperties swaggerProperties();
}
其中有个SwaggerProperties类是我们自定义的配置类,有哪些配置,看看注释就清楚了;
/**
* Swagger自定义配置
* Created by macro on 2020/7/16.
*/
@Data
@EqualsAndHashCode(callSuper = false)
@Builder
publicclass SwaggerProperties {
/**
* API文档生成基础路径
*/
privateStringapiBasePackage;
/**
* 是否要启用登录认证
*/
privatebooleanenableSecurity;
/**
* 文档标题
*/
privateStringtitle;
/**
* 文档描述
*/
privateStringdescription;
/**
* 文档版本
*/
privateStringversion;
/**
* 文档联系人姓名
*/
privateStringcontactName;
/**
* 文档联系人网址
*/
privateStringcontactUrl;
/**
* 文档联系人邮箱
*/
privateStringcontactEmail;
}
在mall-admin模块中,只需继承BaseSwaggerConfig,并配置好SwaggerProperties即可,是不是很方便!
/**
* Swagger API文档相关配置
* Created by macro on 2018/4/26.
*/
@Configuration
@EnableSwagger2
publicclass SwaggerConfig extends BaseSwaggerConfig {
@Override
public SwaggerProperties swaggerProperties() {
returnSwaggerProperties.builder()
.apiBasePackage("com.macro.mall.controller")
.title("mall后台系统")
.description("mall后台相关接口文档")
.contactName("macro")
.version("1.0")
.enableSecurity(true)
.build();
}
}
Redis配置统一
在使用Redis时,我们或多或少会自定义一些配置,该配置目前也统一了。
首先是在mall-common模块中添加了Redis的基础配置BaseRedisConfig,在其他模块中使用只需继承该配置即可;
/**
* Redis基础配置
* Created by macro on 2020/6/19.
*/
publicclassBaseRedisConfig {
@Bean
publicRedisTemplate redisTemplate(RedisConnectionFactory redisConnectionFactory) {
RedisSerializer serializer = redisSerializer();
RedisTemplate redisTemplate =newRedisTemplate<>();
redisTemplate.setConnectionFactory(redisConnectionFactory);
redisTemplate.setKeySerializer(newStringRedisSerializer());
redisTemplate.setValueSerializer(serializer);
redisTemplate.setHashKeySerializer(newStringRedisSerializer());
redisTemplate.setHashValueSerializer(serializer);
redisTemplate.afterPropertiesSet();
returnredisTemplate;
}
@Bean
publicRedisSerializer redisSerializer() {
//创建JSON序列化器
Jackson2JsonRedisSerializer<Object> serializer = new Jackson2JsonRedisSerializer<>(Object.class);
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
//必须设置,否则无法将JSON转化为对象,会转化成Map类型
objectMapper.activateDefaultTyping(LaissezFaireSubTypeValidator.instance,ObjectMapper.DefaultTyping.NON_FINAL);
serializer.setObjectMapper(objectMapper);
return serializer;
}
@Bean
public RedisCacheManager redisCacheManager(RedisConnectionFactory redisConnectionFactory) {
RedisCacheWriter redisCacheWriter = RedisCacheWriter.nonLockingRedisCacheWriter(redisConnectionFactory);
//设置Redis缓存有效期为1天
RedisCacheConfiguration redisCacheConfiguration = RedisCacheConfiguration.defaultCacheConfig()
.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(redisSerializer())).entryTtl(Duration.ofDays(1));
return new RedisCacheManager(redisCacheWriter, redisCacheConfiguration);
}
@Bean
public RedisService redisService(){
return new RedisServiceImpl();
}
}
比如我们在mall-security模块中需要使用Redis,直接继承该配置即可;
/**
* Redis配置类
* Created by macro on 2020/3/2.
*/
@EnableCaching
@Configuration
publicclass RedisConfig extends BaseRedisConfig {
}
当需要操作Redis时,直接注入RedisService对象,然后使用它操作即可。
/**
* UmsAdminCacheService实现类
* Created by macro on 2020/3/13.
*/
@Service
publicclassUmsAdminCacheServiceImplimplementsUmsAdminCacheService{
@Autowired
privateRedisService redisService;
}
Window和Linux部署文档更新
由于部分组件的升级,部署文档也更新了,三种部署方式,总有一种适合你的!
mall在Windows环境下的部署
mall在Linux环境下的部署(基于Docker容器)
mall在Linux环境下的部署(基于Docker Compose)
项目地址
转发+关注,然后私信回复关键字 “项目” 获取这个超火的Spring Boot电商实战项目地址及项目教程。