- Provider Side – Service & Data Layer
1.1 Mavan Dependencies
<dependencies>
<!-- ZooKeeper client -->
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>${zk.version}</version>
</dependency>
<!-- Dubbo & Curator -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
<version>${dubbo.version}</version>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
<version>${curator.version}</version>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-recipes</artifactId>
<version>${curator.version}</version>
</dependency>
<!-- MyBatis & DB -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>${mybatis.version}</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>${mybatis-spring.version}</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql.version}</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>${druid.version}</version>
</dependency>
<!-- Spring -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- Logging -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>${log4j.version}</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>${slf4j.version}</version>
</dependency>
</dependencies>
1.2 Data Access
public interface AccountMapper {
Account selectByPrimaryKey(@Param("id") Integer id);
}
<mapper namespace="com.demo.mapper.AccountMapper">
<select id="selectByPrimaryKey" parameterType="int" resultType="com.demo.domain.Account">
SELECT id, username, email
FROM t_account
WHERE id = #{id}
</select>
</mapper>
1.3 Service Layer
public interface AccountService {
Account getAccount(Integer id);
}
@Service
public class AccountServiceImpl implements AccountService {
@Autowired
private AccountMapper accountMapper;
@Override
public Account getAccount(Integer id) {
return accountMapper.selectByPrimaryKey(id);
}
}
1.4 Spring & Dubbo XML
dubbo-provider.xml
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:dubbo="http://dubbo.apache.org/schema/dubbo"
xsi:schemaLocation="... ...">
<dubbo:application name="account-provider"/>
<dubbo:registry address="zookeeper://192.168.10.101:2181"/>
<dubbo:protocol name="dubbo" port="20880"/>
<dubbo:service interface="com.demo.api.AccountService"
ref="accountService"
timeout="1200000"/>
<bean id="accountService" class="com.demo.service.AccountServiceImpl"/>
</beans>
spring-dao.xml
<context:property-placeholder location="classpath:db.properties"/>
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
<property name="driverClassName" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.user}"/>
<property name="password" value="${jdbc.password}"/>
</bean>
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="typeAliasesPackage" value="com.demo.domain"/>
</bean>
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.demo.mapper"/>
</bean>
spring-service.xml
<context:component-scan base-package="com.demo.service"/>
<tx:annotation-driven/>
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
Deploy the provider on Tomcat listening on port 8080.
- Consumer Side – Web Layer
2.1 Maven Dependencies
<dependencies>
<!-- Shared API module -->
<dependency>
<groupId>com.demo</groupId>
<artifactId>account-api</artifactId>
<version>1.0.0</version>
</dependency>
<!-- ZooKeeper & Dubbo -->
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>${zk.version}</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
<version>${dubbo.version}</version>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
<version>${curator.version}</version>
</dependency>
<!-- Spring MVC & JSON -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>${jackson.version}</version>
</dependency>
</dependencies>
2.2 REST Controller
@RestController
@RequestMapping("/api/account")
public class AccountController {
@Autowired
private AccountService accountService;
@GetMapping("/{id}")
public Account fetch(@PathVariable Integer id) {
return accountService.getAccount(id);
}
}
2.3 Spring MVC & Dubbo XML
spring-mvc.xml
<context:component-scan base-package="com.demo.controller"/>
<mvc:annotation-driven/>
dubbo-consumer.xml
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:dubbo="http://dubbo.apache.org/schema/dubbo"
xsi:schemaLocation="... ...">
<dubbo:application name="account-consumer"/>
<dubbo:registry address="zookeeper://192.168.10.101:2181"/>
<dubbo:consumer check="true"/>
<dubbo:reference id="accountService"
interface="com.demo.api.AccountService"/>
<bean id="accountController" class="com.demo.controller.AccountController">
<property name="accountService" ref="accountService"/>
</bean>
</beans>
Start the consumer on Tomcat porrt 8081. Access http://localhost:8081/api/account/1 to verify the integration.