使用springcloud将普通项目拆分为微服务

79 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第五天,点击查看活动详情


使用springcloud将普通项目拆分为微服务

公司有需求将普通项目拆分为微服务,使用springcloud。

项目中有hql,并且为多数据源,尝试用springboot的配置

@EnableJpaRepositories通过该注解扫描带有@Repository注解的类,再而扫描到有@Entity注解的对象
@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(
        entityManagerFactoryRef = "entityManageFactoryPrimary",
        transactionManagerRef = "transactionManagerPrimary",
        basePackageClasses = GenericDao.class
)
public class EntityManagerConfig {

    @Autowired
   private MybatisConfig mybatisConfig;

    @Primary
    @Bean(name = "entityManagerPrimary")
    public EntityManager entityManager(EntityManagerFactoryBuilder builder) throws Exception {
        return entityManageFactory(builder).getObject().createEntityManager();
    }

    @Primary
    @Bean(name = "entityManageFactoryPrimary")
    public LocalContainerEntityManagerFactoryBean entityManageFactory(EntityManagerFactoryBuilder builder) throws Exception {
        DynamicDataSource dynamicDataSource = mybatisConfig.dataSource(mybatisConfig.db1DataSource());
        //指定数据库对象模型的路径
        LocalContainerEntityManagerFactoryBean entityManagerFactory =  builder.dataSource(dynamicDataSource)
                .packages("com.test.database.model").build();
        Properties jpaProperties = new Properties();
        jpaProperties.put("hibernate.dialect", "org.hibernate.dialect.MySQL5Dialect");
        jpaProperties.put("hibernate.physical_naming_strategy", "org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy");
        //设定字符集格式
        jpaProperties.put("hibernate.connection.charSet", "utf-8");
        //是否在日志中显示sql语句
        jpaProperties.put("hibernate.show_sql", "false");
        entityManagerFactory.setJpaProperties(jpaProperties);
        entityManagerFactory.setPersistenceProviderClass(HibernatePersistenceProvider.class);
        //包扫描
//        entityManagerFactory.setPackagesToScan({""});
        return entityManagerFactory;
    }

    @Primary
    @Bean(name = "transactionManagerPrimary")
    public PlatformTransactionManager transactionManager(EntityManagerFactoryBuilder builder) throws Exception {
        return new JpaTransactionManager(entityManageFactory(builder).getObject());
    }


}

 多数据源读取原本为sql使用,尝试给hql配置读取

@Configuration
//@MapperScan(basePackages = {"com.XX.database.mapper"}, markerInterface = IMyMapper.class)
public class MybatisConfig {

    private static final String DRIIVER_CLASSNAME = "driverClassName";
    private static final String URL = "url";
    private static final String USERNAME = "username";
    private static final String PASSWORD = "password";
    private static final String INITIALSIZE = "initialSize";
    private static final String MAXACTIVE = "maxActive";
    private static final String MINIDLE = "minIdle";
    private static final String MAXWAIT = "maxWait";
    private static final String TESTONBORROW = "testOnBorrow";
    private static final String VALIDATIONQUERY = "validationQuery";
    private static final String TESTWHILEIDLE = "testWhileIdle";
    private static ResourceBundle dbconfig = ResourceBundle.getBundle("dbconfig");

    /**
     * 创建数据源(数据源的名称:方法名可以取为XXXDataSource(),XXX为数据库名称,该名称也就是数据源的名称)
     */
    @Bean
    public DataSource db1DataSource() throws Exception {
        //读取配置文件中设置的数据库信息,数据源地址,用户名密码等
        Properties props = new Properties();
        props.put(DRIIVER_CLASSNAME, dbconfig.getString("jdbc.driver-class-name"));
        props.put(URL, dbconfig.getString("jdbc.url"));
        props.put(USERNAME, dbconfig.getString("jdbc.username"));
        props.put(PASSWORD, dbconfig.getString("jdbc.password"));
        props.put(INITIALSIZE, dbconfig.getString("jdbc.initialSize"));
        props.put(MAXACTIVE, dbconfig.getString("jdbc.maxActive"));
        props.put(MINIDLE, dbconfig.getString("jdbc.minIdle"));
        props.put(MAXWAIT, dbconfig.getString("jdbc.maxWait"));
        props.put(TESTONBORROW, dbconfig.getString("jdbc.testOnBorrow"));
        props.put(VALIDATIONQUERY, dbconfig.getString("jdbc.validationQuery"));
        props.put(TESTWHILEIDLE, dbconfig.getString("jdbc.testWhileIdle"));
        return DruidDataSourceFactory.createDataSource(props);
    }

    /**
     * 添加数据源则加 @Qualifier("db2DataSource") DataSource db2DataSource
     *
     * @param db1DataSource
     * @return
     */
    @Bean
    @Primary
    public DynamicDataSource dataSource(@Qualifier("db1DataSource") DataSource db1DataSource) {
        //设置多个数据源
        Map<Object, Object> targetDataSources = new HashMap<>();
        targetDataSources.put(DatabaseType.db1, db1DataSource);
//        targetDataSources.put(DatabaseType.db2, db2DataSource);
        DynamicDataSource dataSource = new DynamicDataSource();
        dataSource.setTargetDataSources(targetDataSources);
        //默认db1设置为数据源
        dataSource.setDefaultTargetDataSource(db1DataSource);
        return dataSource;
    }
   /**
     * 根据数据源创建SqlSessionFactory
     *
     * @param
     * @return
     * @throws Exception
     * @Qualifier("db2DataSource") DataSource db2DataSource
     */
    @Bean
    public SqlSessionFactory sqlSessionFactory(@Qualifier("db1DataSource") DataSource db1DataSource
    ) throws Exception {
        SqlSessionFactoryBean fb = new SqlSessionFactoryBean();
        // 指定数据源(这个必须有,否则报错)
        fb.setDataSource(this.dataSource(db1DataSource));
        // 指定基包
        fb.setTypeAliasesPackage(dbconfig.getString("mybatis.typeAliasesPackage"));
        PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
        Resource[] resources = resolver.getResources(dbconfig.getString("mybatis.mapperLocations"));

        fb.setMapperLocations(resources);
        return fb.getObject();
    }


}

目前状态:爆出大量错误

Positive matches:
-----------------

   AopAutoConfiguration matched:
      - @ConditionalOnClass found required classes 'org.springframework.context.annotation.EnableAspectJAutoProxy', 'org.aspectj.lang.annotation.Aspect', 'org.aspectj.lang.reflect.Advice', 'org.aspectj.weaver.AnnotatedElement' (OnClassCondition)
      - @ConditionalOnProperty (spring.aop.auto=true) matched (OnPropertyCondition)

   AopAutoConfiguration.CglibAutoProxyConfiguration matched:
      - @ConditionalOnProperty (spring.aop.proxy-target-class=true) matched (OnPropertyCondition)

   CodecsAutoConfiguration matched:
      - @ConditionalOnClass found required class 'org.springframework.http.codec.CodecConfigurer' (OnClassCondition)

   CodecsAutoConfiguration.JacksonCodecConfiguration matched:
      - @ConditionalOnClass found required class 'com.fasterxml.jackson.databind.ObjectMapper' (OnClassCondition)

   CodecsAutoConfiguration.JacksonCodecConfiguration#jacksonCodecCustomizer matched:
      - @ConditionalOnBean (types: com.fasterxml.jackson.databind.ObjectMapper; SearchStrategy: all) found bean 'jacksonObjectMapper' (OnBeanCondition)

挑了一部分贴出来,了解到当我们用debug模式时,控制台就会打印出对应的那些配置类被加载了。而这就是生效的类。在启动报告中有两个部分一部分是Positive matches另一部分是Negative matches
以下就是控制台打印出来的Positive matches信息,自动加载了很多的配置类。还有就是第二部分Negative matches。这里只是展示了Positive部分。使用自动配置的报告可以更加高效的查看出那些自动配置是生效的,那些自动配置是没有被加载。

了解哪些没有被加载,进一步进行处理。