美文网首页Java学习笔记互联网科技Java 杂谈
Mall电商实战项目发布重大更新,全面支持SpringBoot

Mall电商实战项目发布重大更新,全面支持SpringBoot

作者: Java技术剑 | 来源:发表于2020-08-10 15:17 被阅读0次

更新内容一览

升级至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电商实战项目地址及项目教程。

相关文章

网友评论

    本文标题:Mall电商实战项目发布重大更新,全面支持SpringBoot

    本文链接:https://www.haomeiwen.com/subject/hmdjdktx.html