Dubbo在ssm中的应用
- 项目结构
- 一个父项目,拆分为4个子模块,pojo,dao,service,controller
- service也作为一个父项目,拆分成2个子项目,服务的接口,服务的提供者实现类
- 实现类依赖于接口,controller作为消费方也依赖于接口
- 父项目依赖
- 因为dubbo中包含spring部分,而dubbo中spring的版本比较低,而我们的spring版本比较高,所以我们把dubbo中的spring替掉
- 子项目dao的依赖
- dao依赖pojo
- 子项目service下,子项目provider,用来获取数据库
- pom依赖,使用tomcat插件
- 3个相关xml配置文件,1个properties文件
- 子项目controller,相当于消费者
- 2个相关xml配置文件,spring-mvc.xml和spring-dubbo.xml
SSM整合dubbo案例
1.新建ssm_dubbo的父项目
- 在父项目的pom文件中添加依赖管理和JDK
<dependencyManagement>
<dependencies>
<!--mysql-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.19</version>
</dependency>
<!--单元测试-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
<!--druid数据源-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.15</version>
</dependency>
<!--spring-mvc依赖-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>4.3.24.RELEASE</version>
</dependency>
<!--mybatis-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.4</version>
</dependency>
<!-- spring aop的面向切面的配置-->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.9.0</version>
</dependency>
<!--druid数据源-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.15</version>
</dependency>
<!--rest风格使用-->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.8.10</version>
</dependency>
<!--mybatis spring的插件,将mybatis交给spring来管理-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.3.2</version>
</dependency>
<!--spring-tx-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>4.3.24.RELEASE</version>
</dependency>
<!--spring jdbc,包含事务-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>4.3.24.RELEASE</version>
</dependency>
<!--dubbo-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
<version>2.6.4</version>
<!-- 剔除dubbo中比较低版本的spring依赖 -->
<exclusions>
<exclusion>
<groupId>org.springframework</groupId>
<artifactId>spring</artifactId>
</exclusion>
</exclusions>
</dependency>
<!--zookeeper-->
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.5.6</version>
</dependency>
<!--zkclient-->
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
<version>0.8</version>
</dependency>
<!--commons-io序列化接口-->
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.4</version>
</dependency>
<!--java.lang.NoClassDefFoundError: org/apache/curator/RetryPolicy报错-->
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
<version>2.8.0</version>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-recipes</artifactId>
<version>2.8.0</version>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<!--添加jdk-->
<plugins>
<!-- define the project compile level -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.6.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</build>
2.在ssm_dubbo下新建子模块dubbo_pojo
- 添加依赖
<dependencies>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.10</version>
<scope>provided</scope>
</dependency>
</dependencies>
- 新建pojo:Users.java ,
- 让Users.java实现序列化接口
package com.ym.pojo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Users implements Serializable {
//Serializable: 序列化接口
private int userId;
private String userName;
private String password;
private String email;
private String tel;
private int level;
private int integral;
private int ifNew;
}
3.在ssm_dubbo中新建子模块dubbo_dao
- dubbo_dao需要依赖dubbo_pojo模块
- 在pom文件中添加依赖
<dependencies>
<!--依赖dubbo_pojo模块-->
<dependency>
<groupId>com.ym</groupId>
<artifactId>dubbo_pojo</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
</dependency>
</dependencies>
- 新建dao层接口IUserDao.java
package com.ym.dao;
import com.ym.pojo.Users;
import java.util.List;
public interface IUserDao {
List<Users> getAllUser();
}
- resource包下新建与dao层接口对应的mapper文件IUserDao.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!-- 整个映射文件为mapper节点,里面包含namespace属性 -->
<mapper namespace="com.ym.dao.IUserDao">
<sql id="all">
select * from users
</sql>
<select id="getAllUser" resultType="Users">
<include refid="all" />
</select>
</mapper>
3.在ssm_dubbo中新建子模块dubbo_service_content
- dubbo_service_content依赖dubbo_dao
- pom文件中添加依赖
<dependencies>
<dependency>
<groupId>com.ym</groupId>
<artifactId>dubbo_dao</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
a.在子模块dubbo_service_content新增子模块dubbo_service_content_interface接口
- 新建service层接口IUserService.java
package com.ym.service;
import com.ym.pojo.Users;
import java.util.List;
public interface IUserService {
List<Users> getAllUser();
}
b.在子模块dubbo_service_content新增子模块dubbo_service_content_provider生产者
- dubbo_service_content_provider需要依赖dubbo_service_content_interface接口
- 打包格式改为war
- pom文件中添加依赖和tomcat插件
<dependencies>
<!--dubbo_service_content_interface-->
<dependency>
<groupId>com.ym</groupId>
<artifactId>dubbo_service_content_interface</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
</dependency>
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<!--<type>pom</type>-->
</dependency>
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
</dependency>
<!--java.lang.NoClassDefFoundError: org/apache/curator/RetryPolicy报错-->
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-recipes</artifactId>
</dependency>
</dependencies>
<build>
<!--不过滤java下的xml文件-->
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
</includes>
<filtering>false</filtering>
</resource>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>false</filtering>
</resource>
</resources>
<plugins>
<!-- 添加tomcat插件 -->
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
<configuration>
<path>/</path>
<port>8082</port>
</configuration>
</plugin>
</plugins>
</build>
-
在resource包下新建db.properties , mybatis-config.xml , spring-dubbo.xml , spring-mybatis.xml文件
-
db.properties
url=jdbc:mysql://localhost:3307/supermarket?useSSL=false&serverTimezone=UTC&characterEncoding=utf-8 driver=com.mysql.cj.jdbc.Driver uname=root upass=root
-
mybatis-config.xml
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration> <!--给当前mybatis项目添加日志功能,采用第三方日志jar包--> <settings> <setting name="logImpl" value="LOG4J"/> </settings> </configuration>
-
spring-dubbo.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://code.alibabatech.com/schema/dubbo" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd"> <context:component-scan base-package="com.ym.service" /> <!--定义服务提供者在dubbo的名称--> <dubbo:application name="DubboServiceContentProvider" /> <!--配置dubbo协议,dubbo,RMI,hession--> <dubbo:protocol name="dubbo" port="20880" /> <!--完成dubbo注册--> <dubbo:registry address="zookeeper://118.190.25.61:2181"></dubbo:registry> <!--将接口暴露出去--> <dubbo:service interface="com.ym.service.IUserService" ref="userServiceImpl" /> </beans>
-
spring-mybatis.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:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd"> <!--引入数据库的配置文件信息--> <context:property-placeholder location="classpath:db.properties" /> <!--druid数据源--> <bean id="ds" class="com.alibaba.druid.pool.DruidDataSource"> <property name="url" value="${url}" /> <property name="driverClassName" value="${driver}" /> <property name="username" value="${uname}" /> <property name="password" value="${upass}" /> </bean> <bean id="ssfb" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="typeAliasesPackage" value="com.ym.pojo" /> <property name="mapperLocations" value="classpath*:dao/*Dao.xml" /> <property name="dataSource" ref="ds" /> <property name="configLocation" value="classpath:mybatis-config.xml"/> </bean> <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <property name="basePackage" value="com.ym.dao" /> <property name="sqlSessionFactoryBeanName" value="ssfb"/> </bean> <!--配置事务管理器--> <bean id="dstm" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="ds"/> </bean> <!--声明事务的实现方式 以这些关键字开头的方法分别设置事务的隔离级别以及出错后的操作--> <tx:advice id="tx" transaction-manager="dstm"> <tx:attributes> <tx:method name="save*" propagation="REQUIRED" isolation="DEFAULT" rollback-for="Exception"/> <tx:method name="insert*" propagation="REQUIRED" isolation="DEFAULT" rollback-for="Exception"/> <tx:method name="update*" propagation="REQUIRED" isolation="DEFAULT" rollback-for="Exception"/> <tx:method name="delete*" propagation="REQUIRED" isolation="DEFAULT" rollback-for="Exception"/> </tx:attributes> </tx:advice> <aop:config> <aop:pointcut id="mpt" expression="execution(* com.ym.service.*.*(..))"/> <aop:advisor advice-ref="tx" pointcut-ref="mpt"/> </aop:config> <!--添加扫描,对service层进行单元测试的时候,一定要定位到service包下--> <context:component-scan base-package="com.ym.service" /> </beans>
-
-
新建webapp , WEB-INF 包和 web.xml文件来加载所有的配置文件
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" version="3.1"> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:spring-*.xml</param-value> </context-param> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> </web-app>
-
service层接口实现类UserServiceImpl.java
package com.ym.service.impl; import com.ym.dao.IUserDao; import com.ym.service.IUserService; import com.ym.pojo.Users; import org.springframework.stereotype.Service; import javax.annotation.Resource; import java.util.List; @Service public class UserServiceImpl implements IUserService { @Resource private IUserDao userDao; @Override public List<Users> getAllUser() { return userDao.getAllUser(); } }
4.在ssm_dubbo中新建子模块dubbo_portal
-
dubbo_portal需要依赖dubbo_service_content_interface接口(不能直接依赖于提供者)
-
在pom文件中添加依赖和tomcat
<dependencies> <!--依赖dubbo_service_content_interface --> <dependency> <groupId>com.ym</groupId> <artifactId>dubbo_service_content_interface</artifactId> <version>1.0-SNAPSHOT</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> </dependency> <dependency> <groupId>org.apache.zookeeper</groupId> <artifactId>zookeeper</artifactId> <!--<type>pom</type>--> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>dubbo</artifactId> </dependency> <dependency> <groupId>com.101tec</groupId> <artifactId>zkclient</artifactId> </dependency> <!--java.lang.NoClassDefFoundError: org/apache/curator/RetryPolicy报错--> <dependency> <groupId>org.apache.curator</groupId> <artifactId>curator-framework</artifactId> </dependency> <dependency> <groupId>org.apache.curator</groupId> <artifactId>curator-recipes</artifactId> </dependency> </dependencies> <build> <!--不过滤java下的xml文件--> <resources> <resource> <directory>src/main/java</directory> <includes> <include>**/*.xml</include> </includes> <filtering>false</filtering> </resource> <resource> <directory>src/main/resources</directory> <includes> <include>**/*.properties</include> <include>**/*.xml</include> </includes> <filtering>false</filtering> </resource> </resources> <plugins> <!-- 添加tomcat插件 --> <plugin> <groupId>org.apache.tomcat.maven</groupId> <artifactId>tomcat7-maven-plugin</artifactId> <version>2.2</version> <configuration> <path>/</path> <port>8083</port> </configuration> </plugin> </plugins> </build>
-
在resources包下新建spring-dubbo.xml , spring-mvc.xml文件
-
spring-dubbo.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://code.alibabatech.com/schema/dubbo" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd"> <dubbo:application name="DubboProtal" /> <!--完成dubbo注册--> <dubbo:registry address="zookeeper://118.190.25.61:2181" ></dubbo:registry> <dubbo:reference interface="com.ym.service.IUserService" id="userServiceImpl" /> </beans>
-
spring-mvc.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:context="http://www.springframework.org/schema/context" xmlns:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.3.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd"> <context:component-scan base-package="com.ym.controller" /> <mvc:annotation-driven /> <mvc:default-servlet-handler /> </beans>
-
-
新建webapp , WEB-INF包 , 和web.xml文件
-
web.xml文件
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" version="3.1"> <display-name>ssm_dubbo</display-name> <welcome-file-list> <welcome-file>index.html</welcome-file> <welcome-file>index.htm</welcome-file> <welcome-file>index.jsp</welcome-file> <welcome-file>default.html</welcome-file> <welcome-file>default.htm</welcome-file> <welcome-file>default.jsp</welcome-file> </welcome-file-list> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:spring-*.xml</param-value> </context-param> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <servlet> <servlet-name>springDispatherServlet</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:spring-mvc.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>springDispatherServlet</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> </web-app>
-
-
controller层功能类UserController.java
package com.ym.controller; import com.ym.pojo.Users; import com.ym.service.IUserService; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; import javax.annotation.Resource; import java.util.List; @RestController public class UserController { @Resource private IUserService userService; @GetMapping("/getAllUser") public List<Users> getAllUser(){ return userService.getAllUser(); } }
5.启动运行测试
-
启动zookeeper
-
启动provider对应的tomcat
-
启动protal消费者对应的tomcat
-
页面上得到数据对应的json
[{"userId":0,"userName":null,"password":"zhangsan","email":"zhangsan@163.com","tel":"13679189439","level":1,"integral":0,"ifNew":0},{"userId":0,"userName":null,"password":"222222","email":"gg@163.com","tel":"15536541234","level":1,"integral":0,"ifNew":0},{"userId":0,"userName":null,"password":"222222","email":"hei@163.com","tel":"17755421234","level":1,"integral":0,"ifNew":0},{"userId":0,"userName":null,"password":"222222","email":"lf@163.com","tel":"13715546631","level":1,"integral":0,"ifNew":0},{"userId":0,"userName":null,"password":"222222","email":"miemie@163.com","tel":"1235468798","level":1,"integral":0,"ifNew":0},{"userId":0,"userName":null,"password":"222222","email":"lf@163.com","tel":"13715546631","level":1,"integral":0,"ifNew":0},{"userId":0,"userName":null,"password":"222222","email":"135445888@qq.com","tel":"15315468536","level":1,"integral":0,"ifNew":0},{"userId":0,"userName":null,"password":"222222","email":"cc@163.com","tel":"18312546321","level":1,"integral":0,"ifNew":0},{"userId":0,"userName":null,"password":"222222","email":"sl@163.com","tel":"15545876652","level":1,"integral":0,"ifNew":0},{"userId":0,"userName":null,"password":"222222","email":"wspp@163.com","tel":"13865421355","level":1,"integral":0,"ifNew":0},{"userId":0,"userName":null,"password":"root","email":"52299@qq.com","tel":"13333335555","level":1,"integral":0,"ifNew":0},{"userId":0,"userName":null,"password":"hello","email":"ym18815536389@163.com","tel":"15512348888","level":1,"integral":0,"ifNew":0}]
-
至此SSM整合dubbo完成
-
如果想分别监控提供者和消费者,可以配置dubbo-admin的war包来启动服务监控消费者和提供者
网友评论