spring boot + zookeeper + dubbo + mybatis + mysql

开源分布式框架 dubbo ; zookeeper作为集群管理服务器

项目结构:

4个项目的依赖关系是:common里面暂时存放的只有user一个实体类,这个项目不依赖其他的项目,其他3个项目都需要依赖它,所有这个项目需要先打包(maven clean,maven install);

第二个需要打包的是 app项目,service和web项目都依赖它,然后再打包service项目,最后web项目。

syz-commer-common 项目目录:

syz-commer-app 就是单独的一个service接口,因为只是搭建个环境,就只写了一个service和 一个方法,

项目目录:

service 代码如下:(就是根据用户id获取一个用户的信息)

package com.commer.app.UserService;

import com.commer.app.entity.User;

public interface UserService {    

  //根据用户id获取用户信息  

  User getById(Integer id);

}

syz-commer-service 这个项目作为dubbo的一个服务提供者,最重要的就是暴露服务,数据库的连接,mybatis的映射都在这

项目目录:

App类作为dubbo的一个服务启动类(发布服务,连接数据库,指定映射文件),同时加载spring boot的配置文件,主要代码:

package com.commer.app;

import java.io.IOException;

import javax.sql.DataSource;

import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.ComponentScan.Filter;
import org.springframework.context.annotation.ImportResource;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;

import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.dubbo.config.annotation.Service;


@SpringBootApplication
@ComponentScan(basePackages = { "com.commer.app.service.impl" }, includeFilters = {
		@Filter(classes = { Service.class}) })
@ImportResource(locations = { "classpath:dubboprovider.xml" })
@MapperScan("com.commer.app.mapper")

public class App {

	@Bean(initMethod = "init", destroyMethod = "close")
	@ConfigurationProperties(prefix = "spring.datasource")
	public DataSource dataSource() {
		return new DruidDataSource();
	}

	@Bean
	public SqlSessionFactory sqlSessionFactoryBean() throws Exception {
		PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
		SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
		sqlSessionFactoryBean.setDataSource(dataSource());
		sqlSessionFactoryBean.setMapperLocations(resolver.getResources("classpath*:/mybatis-mapping/*Mapper.xml"));
		return sqlSessionFactoryBean.getObject();
	}

	public static void main(String[] args) throws IOException {
		SpringApplication.run(App.class, args);
		System.out.println("服务运行中...");
		System.in.read();
	}
}

userMapper类(dao 类)

package com.commer.app.mapper;

import java.util.List;
import java.util.Map;

import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Component;

import com.commer.app.entity.User;

@Component
public interface UserMapper {
	
    //根据用户id获取用户信息
    User getById(Integer id);

}
这里需要注意的地方就是 @Component这个注解(表示该类给扫描组件),如果不加这个注解的话,UserServiceImpl @Resource获取UserMapper Bean会是个空(这个是spring自己的一个扫描组件配置,可以自己去看下这方面的知识);

然后先看 UserServiceImpl代码:

package com.commer.app.service.impl;

import javax.annotation.Resource;
import com.alibaba.dubbo.config.annotation.Service;
import com.commer.app.UserService.UserService;
import com.commer.app.entity.User;
import com.commer.app.mapper.UserMapper;

@Service
public class UserServiceImpl implements UserService {
    @Resource
    private UserMapper userMapper;

    @Override
    public User getById(Integer id) {
        return userMapper.getById(id);
    }

}

@Service如果导入的是一个 spring自带的一个 @service注解的话,dubbo提供者发布的时候会一直失败, 注意这个地方,导致项目一直发布不了,因为作为一个dubbo服务提供者,启动时需要知道发布的服务是在哪,不使用dubbo提供的@service注解。就会出现上面的问题。import com.alibaba.dubbo.config.annotation.Service;


application.properties(主要配置数据库连接)

# db config
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.driverClassName=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/test?useSSL=false&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&autoReconnect=true
spring.datasource.username=root
spring.datasource.password=dekan
spring.datasource.initialSize=20
spring.datasource.minIdle=10
spring.datasource.maxActive=100

然后重点是 dubbo服务提供者的配置文件:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
	http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
	<!-- 提供方应用信息,用于计算依赖关系 -->
	 <dubbo:application name="syz-commer-service" />

	<!-- 使用zookeeper注册中心暴露服务地址 -->
	 <dubbo:registry address="zookeeper://127.0.0.1:2181"/>

	<!-- 用dubbo协议在20880端口暴露服务 -->
	 <dubbo:protocol name="dubbo" port="20880" />

	<!-- 监控中心配置 -->
<!-- 	<dubbo:monitor protocol="registry"/> -->

	 <dubbo:annotation />
</beans>

注册中心使用zookeeper,扫描所有的包并且发布。


最后就看 dubbo的一个服务消费者了。

首先看 启动类 webStart:

package com.commer.app;


import com.commer.app.UserService.UserService;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.support.SpringBootServletInitializer;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.ImportResource;


@SpringBootApplication
@ImportResource(locations = {"classpath:dubbo-consumer.xml"})
public class webStart extends SpringBootServletInitializer {

    public static void main(String[] args) {
        ApplicationContext tc = SpringApplication.run(webStart.class, args);
        UserService userService = tc.getBean(UserService.class);
        System.out.println(userService.getById(1).getUsername());
    }

}

然后后面重要的就是 dubbo服务消费者的配置文件了:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"  
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"  
    xmlns:context="http://www.springframework.org/schema/context" xmlns:p="http://www.springframework.org/schema/p"  
    xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"  
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd  
        http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.1.xsd  
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd   
        http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd"> 

	<!-- 消费方应用名,用于计算依赖关系 -->
	<dubbo:application name="syz-commer-web"/>

	<!-- 使用zookeeper注册中心暴露发现服务地址 -->
	<dubbo:registry address="zookeeper://127.0.0.1:2181"/>

	<!-- 开启启动时检测,当没有可用服务时,会报异常,程序中断,为false时,程序不中断,但是调用服务时报异常 -->
	<dubbo:consumer check="false" timeout="60000"/>

	<!-- 监控中心配置 -->
    <!-- 生成远程服务代理,可以像使用本地bean一样使用userService -->  
    <dubbo:reference id="userService" interface="com.commer.app.UserService.UserService" check="true"
		loadbalance="roundrobin" proxy="jdk"/>
      
</beans> 
首先启动App类,发布服务,再启动zookeeper服务器,将dubbo服务提供者注册到zookeeper集群中管理,然后再启动webStart类整个过程就搭建完了。

猜你喜欢

转载自blog.csdn.net/shiyuezhong/article/details/79664713