dubbo原理
多模块项目创建
- 多模块创建参考。
- 各个模块依赖关系:
- 父模块管理依赖版本,不直接依赖。
- 打包注意:
- springboot默认打包成可执行jar,无法被依赖。
- 打包插件里需要重命名jar包,原文件才不会被重命名,可依赖。
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<classifier>exec</classifier>
</configuration>
</plugin>
</plugins>
provider
接口定义模块
- house-contract:定义dubbo接口,无额外依赖。
package com.babyjuan.house.contract.service;
public interface SecondHandHouseService {
BaseResponse<List<String>> getAllDistricts();
}
公共模块
- house-common:引入接口定义、web应用、dubbo需要的依赖+通用工具类。
<dependency>
<groupId>com.babyjuan</groupId>
<artifactId>house-contract</artifactId>
<version>${house.version}</version>
</dependency>
<!--web-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>${spring.boot.version}</version>
<exclusions>
<!--log4j和logback冲突,干掉logback-->
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<!--rpc-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
</dependency>
<dependency>
<groupId>io.netty</groupId>
<artifactId>netty-all</artifactId>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
</dependency>
<!--utils-->
<dependency>
<groupId>commons-beanutils</groupId>
<artifactId>commons-beanutils</artifactId>
</dependency>
<dependency>
<groupId>joda-time</groupId>
<artifactId>joda-time</artifactId>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
</dependency>
存储模块
- house-repository:引入公共模块和存储依赖,访问db等存储。
<dependency>
<groupId>com.babyjuan</groupId>
<artifactId>house-common</artifactId>
<version>${house.version}</version>
</dependency>
<!--dao-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<!-- 分页插件 -->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
</dependency>
<!-- alibaba的druid数据库连接池 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
</dependency>
package com.babyjuan.house.repository;
public interface MysqlRepository {
List<String> queryAllDistricts();
}
查询模块
<dependency>
<groupId>com.babyjuan</groupId>
<artifactId>house-repository</artifactId>
<version>${house.version}</version>
</dependency>
package com.babyjuan.house.api.service;
@Service
public class SecondHandHouseServiceImpl implements SecondHandHouseService {
@Autowired
private MysqlRepository mysqlRepository;
@Override
public BaseResponse<List<String>> getAllDistricts() {
List<String> districts = mysqlRepository.queryAllDistricts();
return BaseResponse.newSuccessResponse(districts);
}
}
- 在
house-api-provider.xml
暴露接口实现。
<?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://dubbo.apache.org/schema/dubbo"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
http://dubbo.apache.org/schema/dubbo
http://dubbo.apache.org/schema/dubbo/dubbo.xsd">
<dubbo:application name="house-api"/>
<dubbo:registry protocol="zookeeper" address="127.0.0.1:2181" timeout="60000"/>
<dubbo:protocol name="dubbo" port="28081"/>
<dubbo:service interface="com.babyjuan.house.contract.service.SecondHandHouseService" ref="secondHandHouseServiceImpl"/>
</beans>
consumer
rpc适配模块
- house-integration:依赖公共模块,调用其他dubbo服务。
<dependency>
<groupId>com.babyjuan</groupId>
<artifactId>house-common</artifactId>
<version>${house.version}</version>
</dependency>
- 在
house-consumer.xml
申明需要调用的服务。
<?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://dubbo.apache.org/schema/dubbo"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
http://dubbo.apache.org/schema/dubbo
http://dubbo.apache.org/schema/dubbo/dubbo.xsd">
<dubbo:application name="house-rest"/>
<dubbo:registry protocol="zookeeper" address="127.0.0.1:2181" timeout="60000"/>
<dubbo:consumer check="false"/>
<dubbo:protocol name="dubbo" port="28080"/>
<dubbo:reference id="secondHandHouseService" interface="com.babyjuan.house.contract.service.SecondHandHouseService"/>
</beans>
web模块
- house-rest:引入适配器模块,提供http接口。
<dependency>
<groupId>com.babyjuan</groupId>
<artifactId>house-integration</artifactId>
<version>${house.version}</version>
</dependency>
package com.babyjuan.house.gateway.controller;
@Controller
@RequestMapping("/secondHandHouse")
public class SecondHandHouseController {
@Autowired
private SecondHandHouseService secondHandHouseService;
@RequestMapping("/districts")
@ResponseBody
public BaseResponse<List<String>> getAllDistricts() {
return secondHandHouseService.getAllDistricts();
}
}