springboot+dubbo微服务架构的初级搭建

2 篇文章 0 订阅
1 篇文章 0 订阅

最近由于项目赶工以及个人私事处理比较多,更新满了下来,前段时间有朋友想了解下微服务架构,然后我结合上家公司的组织架构搭建了一套微服务的初级架构,日志记录使用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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值