最近由于项目赶工以及个人私事处理比较多,更新满了下来,前段时间有朋友想了解下微服务架构,然后我结合上家公司的组织架构搭建了一套微服务的初级架构,日志记录使用logback。微服务是近来比较火的词,微服务的提出到现在也没有多长时间,但是发展很迅速。微服务强调一个微字,就是要小,可以单独提供服务,已满足一些企业的日常需求,微服务维护方便,是拆分型的,和传统的单项目相比单项目代码量大,维护不宜,耦合性高,写作开发容易冲突等,关于微服务的好处我就不再多说了。目前流行的微服务架构dubbo,springcloud等,我使用的是springboot+dubbo+mybatis进行组合搭建。
项目组织架构层级:
首先先构思下具体的层级关系,可以用图的方式一目了然:
根据构思的层级关系可以构建项目目录如下:
项目搭建
1.配置配置文件
web,service, job等都可以单独发布所以每一个都有自己的application.yml,在需要启动服务的application.yml中先配置基本信息:
spring:
profiles : dev
datasource:
ztm:
url: jdbc:mysql://127.0.0.1:3306/springbootdb?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false
username: root
password: root
driver-class-name: com.mysql.jdbc.Driver
minIdle: 1
maxActive: 2
initialSize: 1
timeBetweenEvictionRunsMillis: 3000
minEvictableIdleTimeMillis: 300000
testWhileIdle: true
testOnBorrow: false
testOnReturn: false
dubbo:
application:
name
registry:
address: zookeeper://127.0.0.1:2181
protocol:
name: dubbo
port: 20880
scan: com.demo.service
server:
port: 8084
logging:
file: ${user.home}/logs/demo/demo.log
level:
root: INFO
mybatis:
basePackage: com.zto
ztm:
mapperLocations: classpath*:com/demo/mapper//*.xml
typeAliasesPackage: com.demo.domain
把数据库的基本信息以及dubbo服务的提供者以及项目的启动端口进行配置。
2.首先把工具层构建好
json的工具类,http接口的工具类以及其他需要使用的工具类先构建,后续有新增的都加到这个conmmon子项目中去,由其他去调用
3.构建数据库持久层
/**
*
* @ClassName: DruidConfiguration
* @Description: 配置数据源datasource
*
*/
@Configuration
public class DruidConfiguration {
@Bean(name = "ztm", initMethod = "init", destroyMethod = "close")
public DataSource compare2DataSource(
@Value("${spring.datasource.ztm.driver-class-name}") String driver,
@Value("${spring.datasource.ztm.url}") String url,
@Value("${spring.datasource.ztm.username}") String username,
@Value("${spring.datasource.ztm.password}") String password,
@Value("${spring.datasource.ztm.minIdle}") int minIdle,
@Value("${spring.datasource.ztm.maxActive}") int maxActive,
@Value("${spring.datasource.ztm.initialSize}") int initialSize,
@Value("${spring.datasource.ztm.timeBetweenEvictionRunsMillis}") long timeBetweenEvictionRunsMillis,
@Value("${spring.datasource.ztm.minEvictableIdleTimeMillis}") long minEvictableIdleTimeMillis,
@Value("${spring.datasource.ztm.validationQuery}") String validationQuery,
@Value("${spring.datasource.ztm.testWhileIdle}") boolean testWhileIdle,
@Value("${spring.datasource.ztm.testOnBorrow}") boolean testOnBorrow,
@Value("${spring.datasource.ztm.testOnReturn}") boolean testOnReturn) {
DruidDataSource druidDataSource = new DruidDataSource();
druidDataSource.setDriverClassName(driver);
druidDataSource.setUrl(url);
druidDataSource.setUsername(username);
druidDataSource.setPassword(password);
druidDataSource.setMinIdle(minIdle);
druidDataSource.setMaxActive(maxActive);
druidDataSource.setInitialSize(initialSize);
druidDataSource
.setTimeBetweenEvictionRunsMillis(timeBetweenEvictionRunsMillis);
druidDataSource
.setMinEvictableIdleTimeMillis(minEvictableIdleTimeMillis);
druidDataSource.setValidationQuery(validationQuery);
druidDataSource.setTestWhileIdle(testWhileIdle);
druidDataSource.setTestOnBorrow(testOnBorrow);
druidDataSource.setTestOnReturn(testOnReturn);
return druidDataSource;
}
}
@Configuration
@MapperScan(basePackages = { "com.demo.mapper.ztm" }, sqlSessionFactoryRef = "ztmSqlSessionFactory")
public class ZtmMybatisConfiguration {
@Autowired
@Qualifier("ztm")
private DataSource dataSource;
@Bean(name = "ztmSqlSessionFactory")
public SqlSessionFactoryBean sqlSessionFactory(@Value("${mybatis.ztm.mapperLocations}") String mapperLocations,
@Value("${mybatis.ztm.typeAliasesPackage}")String typeAliasesPackage) throws Exception {
SqlSessionFactoryBean sessionFactoryBean = new SqlSessionFactoryBean();
sessionFactoryBean.setDataSource(dataSource);
sessionFactoryBean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources(mapperLocations));
sessionFactoryBean.setTypeAliasesPackage(typeAliasesPackage);
return sessionFactoryBean;
}
@Bean(name = "ztmTransactionManager")
public DataSourceTransactionManager transactionManager() {
return new DataSourceTransactionManager(dataSource);
}
}
目录结构如下:
4.dao层构建
dao的调用持久层进行处理为上级提供方法和服务的层级
5.service层构建
service可以单独启动对外暴露服务,所以有自己的启动类和配置文件,是服务的高层,其上层还有web,同样的job,mobile以及broker等同级层级和servcie的构建相同
6.视图层web构建
视图层构建和service方法相同,不过其pom.xml中会引用其下级使用的层级,并配合一些前端模版进行视图展示
7.dubbo的整合
在配置文件application.yml中配置了dubbo的相关配置以后,咱们引用的dubbo的服务jar以及注册中心使用的zk引用为:
<dependency>
<groupId>com.github.sgroschupf</groupId>
<artifactId>zkclient</artifactId>
<exclusions>
<exclusion>
<artifactId>log4j</artifactId>
<groupId>log4j</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>io.dubbo.springboot</groupId>
<artifactId>spring-boot-starter-dubbo</artifactId>
<version>1.0.0</version>
</dependency>
有了这些就可以在来对外暴露服务了:
@Service(version="1.0.0")
public class UserServiceimpl implements UserService{
@Autowired
private UserBiz biz;
@Override
public User getById(Integer id) {
return biz.getById(id);
}
}
这样在项目启动的时候服务就会被注册到注册中心zk,如果启动dubbo控制台就可以在dubbo控制台中看到一个无消费的服务
,有了服务提供者,下面在来一个服务消费者,首先配置配置文件:
dubbo:
application:
name
registry:
address: zookeeper://127.0.0.1:2181
scan: com.demo.controller
对服务进行消费:
@RestController
@Component
public class UserController {
@Reference(version = "1.0.0")
private UserService userService;
@RequestMapping(value="/{id}",method=RequestMethod.GET)
public User getById(@PathVariable Integer id) {
return userService.getById(id);
}
}
至此就把服务提供和消费者搞定了,框架的大致也有了,后面会加入一些前端框架和一些nosql的技术来填充,比如redis,mq等。有什么疑问或不对的,欢迎提出。
springboot整合dubbo(无xml):https://blog.csdn.net/helloword_monkey/article/details/78939072