github轻松阅读微服务实战项目流程详解第四天:账户服务的设计与实现(代码片段)

Roninaxious Roninaxious     2023-01-12     459

关键词:


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版】入门到精通(下)(... 查看详情