关键词:
Four Day
github地址:https://github.com/Zealon159/light-reading-cloud
1.配置文件精解
(1)boootstrap.yml
spring:
# 服务逻辑名称
application:
name: light-reading-cloud-account
cloud:
nacos:
# 配置中心
config:
server-addr: xxxxx
file-extension: yml
refresh: true
shared-dataids: light-reading-cloud-account.yml # Data ID
namespace: 4d109a4d-f34d-4e86-9e39-c2d36db24b00 #命名空间
# 注册中心
discovery:
server-addr: xxxxxx
namespace: 4d109a4d-f34d-4e86-9e39-c2d36db24b00
(2)配置中心的yml文件
2.Config
当然在配置文件更方便,以下使用配置类进行配置
(1)书架线程池配置
@Configuration
@ConfigurationProperties(prefix = "spring.thread-pool.bookshelf")
public class BookshelfThreadPoolConfig
/** 核心线程数 */
private int corePoolSize;
/** 最大线程数 */
private int maximumPoolSize;
/** 线程存活时间 */
private Long keepAliveTime;
/** 队列容量 */
private int queueCapacity;
/**
* 云书架数据消费线程池
* @return
*/
@Bean(value = "userBookshelfQueueThreadPool")
public ExecutorService buildUserBookshelfQueueThreadPool()
ThreadFactory namedThreadFactory = new ThreadFactoryBuilder()
.setNameFormat("user-bookshelf-queue-thread-%d").build();
// 实例化线程池
ExecutorService pool = new ThreadPoolExecutor(this.getCorePoolSize(), this.getMaximumPoolSize(), this.getKeepAliveTime(), TimeUnit.MILLISECONDS,
new ArrayBlockingQueue<>(this.getQueueCapacity()),namedThreadFactory,new ThreadPoolExecutor.AbortPolicy());
return pool;
public int getCorePoolSize()
return corePoolSize;
public void setCorePoolSize(int corePoolSize)
this.corePoolSize = corePoolSize;
public int getMaximumPoolSize()
return maximumPoolSize;
public void setMaximumPoolSize(int maximumPoolSize)
this.maximumPoolSize = maximumPoolSize;
public Long getKeepAliveTime()
return keepAliveTime;
public void setKeepAliveTime(Long keepAliveTime)
this.keepAliveTime = keepAliveTime;
public int getQueueCapacity()
return queueCapacity;
public void setQueueCapacity(int queueCapacity)
this.queueCapacity = queueCapacity;
(2)Mybatis及其Swagger配置
@Configuration
@MapperScan(basePackages = "cn.zealon.readingcloud.account.dao",
sqlSessionTemplateRef="accountCenterSqlSessionTemplate")
public class MybatisConfig
private final static String MAPPER_LOCATIONS = "classpath*:mappers/*.xml";
/** 工厂配置 */
@Bean
public SqlSessionFactory sqlSessionFactoryBean(@Qualifier("accountCenterDataSource") DataSource dataSource) throws Exception
// 设置数据源
SqlSessionFactoryBean factory = new SqlSessionFactoryBean();
factory.setDataSource(dataSource);
// 添加XML映射
ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
factory.setMapperLocations(resolver.getResources(MAPPER_LOCATIONS));
//添加插件
factory.setPlugins(new Interceptor[] this.getPageHelper() );
return factory.getObject();
/** 会话模板 */
@Bean(name = "accountCenterSqlSessionTemplate")
public SqlSessionTemplate setSqlSessionTemplate(SqlSessionFactory sqlSessionFactory)
return new SqlSessionTemplate(sqlSessionFactory);
/** 分页插件 */
private PageHelper getPageHelper()
//配置分页插件,详情请查阅官方文档
PageHelper pageHelper = new PageHelper();
Properties properties = new Properties();
//分页尺寸为0时查询所有纪录不再执行分页
properties.setProperty("pageSizeZero", "true");
//页码<=0 查询第一页,页码>=总页数查询最后一页
properties.setProperty("reasonable", "true");
//支持通过 Mapper 接口参数来传递分页参数
properties.setProperty("supportMethodsArguments", "true");
properties.setProperty("params", "count=countSql");
//切换数据源,自动解析不同数据库的分页
properties.setProperty("autoRuntimeDialect", "true");
pageHelper.setProperties(properties);
return pageHelper;
/**
* swagger 配置类
* http://localhost:8080/swagger-ui.html
* @author zealon
* @since 2019-07-04
*/
@Configuration
@EnableSwagger2
public static class AccountSwaggerConfig
/**
* swagger生成
* @return Docket
*/
@Bean
public Docket customDocket()
Docket docket = new Docket(DocumentationType.SWAGGER_2)
.select()
.apis(RequestHandlerSelectors.basePackage("cn.zealon.readingcloud.account.controller"))
.paths(PathSelectors.any())
.build()
.apiInfo(apiInfo());
return docket;
/**
* swagger基础信息
* @return ApiInfo swagger信息
*/
private ApiInfo apiInfo()
return new ApiInfoBuilder()
.title("账户中心接口")
.description("账户中心")
.termsOfServiceUrl("")
.contact(new Contact("", "", ""))
.license("")
.licenseUrl("")
.version("1.0.0")
.build();
(3)Redis配置
@EnableCaching
@Configuration
public class RedisConfig
@Bean
public RedisTemplate redisTemplate(RedisConnectionFactory redisConnectionFactory)
RedisTemplate<String, Object> redis = new RedisTemplate<>();
redis.setConnectionFactory(redisConnectionFactory);
this.setSerializer(redis);
return redis;
/** 配置Key的生成方式 */
@Bean
public KeyGenerator keyGenerator()
return new KeyGenerator()
@Override
public Object generate(Object o, Method method, Object... objects)
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append(o.getClass().getName()).append(method.getName());
for (Object object : objects)
stringBuilder.append(object.toString());
return stringBuilder.toString();
;
/** 缓存管理器 */
@Bean
public CacheManager cacheManager(RedisConnectionFactory redisConnectionFactory)
//初始化一个RedisCacheWriter
RedisCacheWriter redisCacheWriter = RedisCacheWriter.nonLockingRedisCacheWriter(redisConnectionFactory);
//设置CacheManager的值序列化方式为json序列化
RedisSerializer<Object> jsonSerializer = new GenericJackson2JsonRedisSerializer();
RedisSerializationContext.SerializationPair<Object> pair = RedisSerializationContext.SerializationPair.fromSerializer(jsonSerializer);
RedisCacheConfiguration defaultCacheConfig = RedisCacheConfiguration.defaultCacheConfig().serializeValuesWith(pair);
//设置默认超过期时间是30秒
defaultCacheConfig = defaultCacheConfig.entryTtl(Duration.ofSeconds(300));
//初始化RedisCacheManager
return new RedisCacheManager(redisCacheWriter, defaultCacheConfig);
/** 设置RedisTemplate的序列化方式 */
public void setSerializer(RedisTemplate redisTemplate)
StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
ObjectMapper om = new ObjectMapper();
om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
jackson2JsonRedisSerializer.setObjectMapper(om);
//设置键(key)的序列化方式
redisTemplate.setKeySerializer(stringRedisSerializer);
//设置值(value)的序列化方式
redisTemplate.setHashKeySerializer(stringRedisSerializer);
redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer);
redisTemplate.afterPropertiesSet();
(4)公用线程池配置
@Configuration
@ConfigurationProperties(prefix = "spring.thread-pool.common")
public class ThreadPoolConfig
/** 核心线程数 */
private int corePoolSize;
/** 最大线程数 */
private int maximumPoolSize;
/** 线程存活时间 */
private Long keepAliveTime;
/** 队列容量 */
private int queueCapacity;
/**
* 云书架数据消费线程池
* @return
*/
@Bean(value = "commonQueueThreadPool")
public ExecutorService buildCommonQueueThreadPool()
ThreadFactory namedThreadFactory = new ThreadFactoryBuilder()
.setNameFormat("common-queue-thread-%d").build();
// 实例化线程池
ExecutorService pool = new ThreadPoolExecutor(this.getCorePoolSize(), this.getMaximumPoolSize(), this.getKeepAliveTime(), TimeUnit.MILLISECONDS,
new ArrayBlockingQueue<>(this.getQueueCapacity()),namedThreadFactory,new ThreadPoolExecutor.AbortPolicy());
return pool;
public int getCorePoolSize()
return corePoolSize;
public void setCorePoolSize(int corePoolSize)
this.corePoolSize = corePoolSize;
public int getMaximumPoolSize()
return maximumPoolSize;
public void setMaximumPoolSize(int maximumPoolSize)
this.maximumPoolSize = maximumPoolSize;
public Long getKeepAliveTime()
return keepAliveTime;
public void setKeepAliveTime(Long keepAliveTime)
this.keepAliveTime = keepAliveTime;
public int getQueueCapacity()
return queueCapacity;
public void setQueueCapacity(int queueCapacity)
this.queueCapacity = queueCapacity;
(5)数据源配置
@Configuration
public class AccountCenterDataSourceConfig
/** 数据源Bean */
@Bean(name = "accountCenterDataSource")
@ConfigurationProperties(prefix = "spring.datasource.account-center")
public DataSource accountCenterDataSource()
return new DruidDataSource();
/** 事务管理器 */
@Bean(name = "accountCenterTransactionManager")
public DataSourceTransactionManager setTransactionManager(@Qualifier("accountCenterDataSource") DataSource dataSource)
return new DataSourceTransactionManager(dataSource);
github轻松阅读微服务实战项目流程详解第二天:api网关的设计与实现(代码片段)
TwoDay1.配置文件精解(1)bootstrap.yml文件(2)nacos中关于gateway的配置信息(3)applicaton.properties白名单配置2.代码详解(1)IP限流(2)白名单(3)Jwt工具类验证to 查看详情
github轻松阅读微服务实战项目流程详解第三天:公共模块的设计与实现(代码片段)
ThreeDay1.缓存(1)账户中心缓存Key(2)图书资源缓存Key(3)精品页缓存key(5)缓存操作类2.常量(1)精品页常量类(2)jwt常量类3.图书相关枚举(1)图书分类枚举类( 查看详情
springcloud微服务实战
第1章课程介绍课程导学和学习建议第2章微服务介绍什么是微服务,单体架构优缺点,常见的几种架构模式。第3章服务注册与发现介绍微服务中的服务注册与发现机制,SpringCloudEureka组件的使用以及如何保证高可用第4章服务拆分以... 查看详情
docker详解与部署微服务实战
2013年发布至今,Docker一直广受瞩目,被认为可能会改变软件行业。但是,许多人并不清楚Docker到底是什么,要解决什么问题,好处又在哪里?今天就来详细解释,帮助大家理解它,还带有简单易懂的实例,教你如何将它用于日... 查看详情
3.20go微服务实战(微服务实战)---日志和监控
第20章 日志和监控20.1 日志实践20.2 指标 20.2.1 指标数据类型 20.2.2 命名约定 20.2.3 存储和查询 20.2.4 Grafana20.3 日志记录 20.3.1 具有关联ID的分布式跟踪 20.3.2 ElasticSearch、Logstash和Kibana 20.3.3 Kibana 20.4 异常 查看详情
3.20go微服务实战(微服务实战)---日志和监控
第20章 日志和监控20.1 日志实践20.2 指标 20.2.1 指标数据类型 20.2.2 命名约定 20.2.3 存储和查询 20.2.4 Grafana20.3 日志记录 20.3.1 具有关联ID的分布式跟踪 20.3.2 ElasticSearch、Logstash和Kibana 20.3.3 Kibana 20.4 异常 查看详情
3.21go微服务实战(微服务实战)---持续交付
第21章 持续交付21.1 持续交付简介 21.1.1 手动部署 21.1.2 持续交付的好处 21.1.3 持续交付面面观 21.1.4 持续交付的过程21.2 容器编排的选项和基础架构21.3 Terraform 21.3.1 提供者 21.3.2 Terraform配置入口点 21.3.3 VPC模块 21.3.... 查看详情
3.21go微服务实战(微服务实战)---持续交付
第21章 持续交付21.1 持续交付简介 21.1.1 手动部署 21.1.2 持续交付的好处 21.1.3 持续交付面面观 21.1.4 持续交付的过程21.2 容器编排的选项和基础架构21.3 Terraform 21.3.1 提供者 21.3.2 Terraform配置入口点 21.3.3 VPC模块 21.3.... 查看详情
微服务实战:选择微服务部署策略
微服务实战(一):微服务架构的优势与不足微服务实战(二):使用APIGateway微服务实战(三):深入微服务架构的进程间通信微服务实战(四):服务发现的可行方案以及实践案例微服务实践(五):微服务的事件驱动... 查看详情
一本专为java/spring开发人员准备的微服务实战指南
...发现、监控、分布式跟踪、安全性、管理等。这本《Spring微服务实战》(第2版)可以帮你解决这些难题。《Spring微服务实战》(第2版)是一本专为Java/Spring开发人员准备的微服务实战指南,书中将介绍Spring中... 查看详情
chrisrichardson微服务实战系列
微服务实战(一):微服务架构的优势与不足微服务实战(二):使用APIGateway微服务实战(三):深入微服务架构的进程间通信微服务实战(四):服务发现的可行方案以及实践案例微服务实践(五):微服务的事件驱动数据... 查看详情
微服务实战|声明式服务调用openfeign实践(代码片段)
上一篇微服务实战|负载均衡组件及源码分析文章目录OpenFeign介绍项目实战创建项目启动项目验证总结OpenFeign介绍一开始,我们使用原生的DiscoveryClient发现服务和使用RestTemplate进行服务间调用,然后我们自己手动开发了一... 查看详情
2.9go微服务实战(go语言基础)---goweb编程
第9章 GoWeb编程9.1 net/http包 9.1.1 GoWeb工作的基本原理 9.1.2 http详解9.2 Web框架 9.2.1 选择框架 9.2.2 httprouter框架9.3 Web底层服务 9.3.1 Scoket简介 9.3.2 TCPSocket 9.3.3 UDPSocket 9.3.4 WebSocket9.4 中间件 9.4.1 基本用法 9.4.2 进阶... 查看详情
springcloudalibaba微服务实战三十|统一资源服务器配置模块
...节内容我们就来完成此功能。由于间隔时间较久,建议先阅读下面两篇相关文章回顾一下。SpringCloudAlibaba微服务实战十九-集成RBAC授权SpringCloudAlibaba微服务实战二十八-网关授权VS微服务授权话不多 查看详情
基于springcloud的微服务实战
1引言1.1目的本博文是基于springboot+springcloud实现的微服务架构改造,提供对研发人员的技术架构支持。版本0.0.1主要实现了四个模块的功能:服务生产者,服务消费者,服务注册中心,客户端负载均衡。后续还会根据项目进展进... 查看详情
springcloudalibaba微服务实战二-服务注册
导读:在之前一篇文章中我们准备好了基于SpringCloudAlibaba的基础组件,本期主要内容是将所有的服务注册进Nacos,并让account-service和product-service能对外提供基础的增删改查能力。基础框架搭建在你的IDEA中建立一个多模块的项目(... 查看详情
springcloud微服务实战
参考技术A阅读《Spring微服务实战》笔记项目地址:https://gitee.com/liaozb1996/spring-cloud-in-action配置管理原则:SpringCloudConfig后端存储:文件系统、Git标注引导类:配置服务器配置:创建配置文件:访问配置:客户端配置:spring-cloud-co... 查看详情
精通系列)创建springboot项目+基于ssm多模块项目案例+微服务实战(代码片段)
Gradle文章目录Java之Gradle【IDEA版】入门到精通(上)(一篇文章精通系列)【安装+基本使用+项目创建+项目部署+文件操作+依赖管理+插件使用】Java之Gradle【IDEA版】入门到精通(下)(... 查看详情