之前项目由于要用到dubbo,用了一段时间之后,觉得有必要简单总结下springboot+dubbo的整合。我们的项目其实主要分为 四个模块:card、common、core、server。其中card模块就是controller层、common模块主要放一些实体类+server接口、core层就是map的xml文件 + mapper映射接口,最后server模块就是server接口的实现类了。
下面就 一起来看下dubbo项目的简单设置。
1、环境
jdk1.8+springboot+dubbo +swagger (swagger可以大大提高接口测试的效率)
其中swagge可以参考 swagger使用介绍
另外需要把dubbo所依赖的alibaba jar包放入maven项目的con目录中,我的是这样:
2、项目模块
项目中的pom文件的parent部分
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.L-CARD</groupId>
<artifactId>L-CARD</artifactId>
<packaging>pom</packaging>
<version>1.0-SNAPSHOT</version>
<modules>
<module>card</module>
<module>server</module>
<module>common</module>
<module>core</module>
</modules>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<java.vesion>1.8</java.vesion>
<spring.version>4.3.6.RELEASE</spring.version>
<spring-boot.version>1.3.6.RELEASE</spring-boot.version>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
<profiles>
<profile>
<id>jdk-1.8</id>
<activation>
<activeByDefault>true</activeByDefault>
<jdk>1.8</jdk>
</activation>
<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion>
</properties>
</profile>
</profiles>
</project>
2.1dubbo项目的提供方
2.1.1common模块:
目录结构:
pom文件:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>L-CARD</artifactId>
<groupId>com.L-CARD</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>common</artifactId>
<dependencies>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.5.4</version>
</dependency>
<!-- 参数校验jar包 start -->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>5.4.1.Final</version>
</dependency>
<dependency>
<groupId>dom4j</groupId>
<artifactId>dom4j</artifactId>
<version>1.6.1</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.16.16</version>
</dependency>
</dependencies>
</project>
先创建实体类和dao层接口
AdminLogin.java实体类:
package com.left.model;
import lombok.Data;
import org.hibernate.validator.constraints.NotBlank;
import java.io.Serializable;
import java.util.Date;
/**
* admin_login
*/
@Data
public class AdminLogin implements Serializable {
/**
* 主键
*/
private Long id;
/**
* 用户名
*/
private String username;
/**
* 密码(md5)
*/
private String password;
/**
* 真实名字
*/
private String trueName;
/**
* 手机号
*/
private String mobile;
/**
* 创建时间
*/
private Date createdAt;
/**
* 操作日期
*/
private Date updatedAt;
/**
* 1.有效2.无效
*/
private Integer status;
/**
* 输入密码错误次数
*/
private Integer errorCount;
/**
* 登录token
*/
private String token;
/**
* salt:混淆密码
*/
private String salt;
/**
* 管理员角色id
*/
private Long adminRoleId;
}
AdminLoginManager接口:
package com.left.service;
import com.left.model.AdminLogin;
import com.left.pub.ResponseData;
import java.util.Map;
/**
*/
public interface AdminLoginManager {
/**
* 根据token查找登录账户
* @param token
* @return
*/
AdminLogin findByToken(String token);
}
2.1.2 server模块:
目录结构:
主要代码就是前面server接口得实现类
先配置dubbo提供方配置文件dubbo-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://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="L-CARD-SERVER"/>
<!-- 使用multicast广播注册中心暴露服务地址 -->
<dubbo:registry address="${dubbo.registry}" file="./dubbo-left-server.cache"/>
<!-- 用dubbo协议在20880端口暴露服务 -->
<dubbo:protocol name="dubbo" port="${dubbo.port}"/>
<!-- 声明需要暴露的服务接口 -->
<dubbo:service interface="com.left.service.AdminLoginManager" ref="adminLoginManager" timeout="10000" retries="0" delay="-1"/>
<!-- 和本地bean一样实现服务 -->
<bean id="adminLoginManager" class="com.left.impl.AdminLoginManagerImpl"/>
</beans>
application配置文件:
server:
port: 8000
tomcat:
max-threads: 1000
spring:
datasource:
driverClassName: com.mysql.jdbc.Driver
initialSize: 5
minIdle: 2
maxActive: 20
filters: stat,config,wall
usernameSlave: root
urlSlave: jdbc:mysql://127.0.01:3306/left_pillar?characterEncoding=utf-8
passwordSlave: xx
publicKeySlave: xx
username: root
url: jdbc:mysql://127.0.0.1:3306/xx?characterEncoding=utf-8
password: xx
publicKey: xx
dubbo:
registry: redis://127.0.0.1:6379
port: 20881
pom文件:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>L-CARD</artifactId>
<groupId>com.L-CARD</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>server</artifactId>
<dependencies>
<dependency>
<groupId>com.L-CARD</groupId>
<artifactId>core</artifactId>
<version>1.0-SNAPSHOT</version>
<exclusions>
<exclusion>
<artifactId>commons-logging</artifactId>
<groupId>commons-logging</groupId>
</exclusion>
<exclusion>
<artifactId>spring-tx</artifactId>
<groupId>org.springframework</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
<version>1.3.6.RELEASE</version>
<exclusions>
<exclusion>
<artifactId>spring-context</artifactId>
<groupId>org.springframework</groupId>
</exclusion>
<exclusion>
<artifactId>spring-core</artifactId>
<groupId>org.springframework</groupId>
</exclusion>
<exclusion>
<artifactId>slf4j-api</artifactId>
<groupId>org.slf4j</groupId>
</exclusion>
<exclusion>
<artifactId>jackson-databind</artifactId>
<groupId>com.fasterxml.jackson.core</groupId>
</exclusion>
<exclusion>
<artifactId>log4j-over-slf4j</artifactId>
<groupId>org.slf4j</groupId>
</exclusion>
</exclusions>
</dependency>
<!--spring-boot -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>1.3.6.RELEASE</version>
<exclusions>
<exclusion>
<artifactId>spring-core</artifactId>
<groupId>org.springframework</groupId>
</exclusion>
<exclusion>
<artifactId>spring-beans</artifactId>
<groupId>org.springframework</groupId>
</exclusion>
<exclusion>
<artifactId>spring-context</artifactId>
<groupId>org.springframework</groupId>
</exclusion>
<exclusion>
<artifactId>spring-aop</artifactId>
<groupId>org.springframework</groupId>
</exclusion>
<exclusion>
<artifactId>spring-webmvc</artifactId>
<groupId>org.springframework</groupId>
</exclusion>
<exclusion>
<artifactId>jackson-databind</artifactId>
<groupId>com.fasterxml.jackson.core</groupId>
</exclusion>
<exclusion>
<artifactId>hibernate-validator</artifactId>
<groupId>org.hibernate</groupId>
</exclusion>
</exclusions>
</dependency>
<!--dubbo-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
<version>2.8.4</version>
<exclusions>
<exclusion>
<artifactId>spring</artifactId>
<groupId>org.springframework</groupId>
</exclusion>
<exclusion>
<artifactId>spring-core</artifactId>
<groupId>org.springframework</groupId>
</exclusion>
<exclusion>
<artifactId>slf4j-api</artifactId>
<groupId>org.slf4j</groupId>
</exclusion>
<exclusion>
<artifactId>spring-context</artifactId>
<groupId>org.springframework</groupId>
</exclusion>
<exclusion>
<artifactId>spring-expression</artifactId>
<groupId>org.springframework</groupId>
</exclusion>
<exclusion>
<artifactId>spring-aop</artifactId>
<groupId>org.springframework</groupId>
</exclusion>
<exclusion>
<artifactId>spring-web</artifactId>
<groupId>org.springframework</groupId>
</exclusion>
<exclusion>
<artifactId>spring-beans</artifactId>
<groupId>org.springframework</groupId>
</exclusion>
<exclusion>
<artifactId>javassist</artifactId>
<groupId>org.javassist</groupId>
</exclusion>
<exclusion>
<artifactId>commons-codec</artifactId>
<groupId>commons-codec</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.1.0</version>
<exclusions>
<exclusion>
<artifactId>commons-pool</artifactId>
<groupId>commons-pool</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>commons-pool</groupId>
<artifactId>commons-pool</artifactId>
<version>1.6</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>4.3.6.RELEASE</version>
<exclusions>
<exclusion>
<artifactId>spring-beans</artifactId>
<groupId>org.springframework</groupId>
</exclusion>
<exclusion>
<artifactId>spring-core</artifactId>
<groupId>org.springframework</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.javassist</groupId>
<artifactId>javassist</artifactId>
<version>3.18.1-GA</version>
</dependency>
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.8.0</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.8.3</version>
</dependency>
<!--阿里短服务-->
<dependency>
<groupId>org.taobao</groupId>
<artifactId>taobao-code-core</artifactId>
<version>3.3.1</version>
</dependency>
<dependency>
<groupId>org.taobao</groupId>
<artifactId>taobao-code-api</artifactId>
<version>1.0.0</version>
</dependency>
</dependencies>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<java.vesion>1.8</java.vesion>
<spring.version>4.3.6.RELEASE</spring.version>
<spring-boot.version>1.3.6.RELEASE</spring-boot.version>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>1.5.3.RELEASE</version>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
server接口的实现类AdminLoginManagerImpl:
package com.left.impl;
import com.left.enums.CodeEnums;
import com.left.mapper.AdminLoginMapper;
import com.left.model.AdminLogin;
import com.left.pub.LpayException;
import com.left.pub.ResponseData;
import com.left.service.AdminLoginManager;
import com.left.util.Des3;
import com.left.util.Page;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.DigestUtils;
import org.springframework.util.StringUtils;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* Created by Right on 2018/5/7.
*/
public class AdminLoginManagerImpl implements AdminLoginManager{
@Autowired
private AdminLoginMapper adminLoginMapper;
@Override
public AdminLogin findByToken(String token) {
return adminLoginMapper.findByToken(token);
}
}
2.1.3 core模块:
主要代码就是mapper映射类和mapper.xml文件
pom文件:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>L-CARD</artifactId>
<groupId>com.L-CARD</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>core</artifactId>
<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.37</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
<version>1.4.0.RELEASE</version>
<exclusions>
<exclusion>
<artifactId>spring-beans</artifactId>
<groupId>org.springframework</groupId>
</exclusion>
<exclusion>
<artifactId>spring-boot-starter</artifactId>
<groupId>org.springframework.boot</groupId>
</exclusion>
<exclusion>
<artifactId>spring-core</artifactId>
<groupId>org.springframework</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.2.0</version>
<exclusions>
<exclusion>
<artifactId>spring-boot-autoconfigure</artifactId>
<groupId>org.springframework.boot</groupId>
</exclusion>
<exclusion>
<artifactId>spring-boot-starter</artifactId>
<groupId>org.springframework.boot</groupId>
</exclusion>
<exclusion>
<artifactId>spring-boot-starter-jdbc</artifactId>
<groupId>org.springframework.boot</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.5.4</version>
<exclusions>
<exclusion>
<artifactId>jackson-annotations</artifactId>
<groupId>com.fasterxml.jackson.core</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.22</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>4.3.6.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>4.3.6.RELEASE</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.5</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.3.6.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>4.3.6.RELEASE</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.8.9</version>
</dependency>
<dependency>
<groupId>com.L-CARD</groupId>
<artifactId>common</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<java.vesion>1.8</java.vesion>
<spring.version>4.3.6.RELEASE</spring.version>
<spring-boot.version>1.3.6.RELEASE</spring-boot.version>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
</project>
BaseMapper:
package com.left;
/**
* 基础方法
* @author pillar
* @param <T>
*/
public interface BaseMapper<T> {
/**
* 根据id删除
* @param id
* @return
*/
int deleteByPrimaryKey(Long id);
/**
* 添加
* @param t
* @return
*/
int insert(T t);
/**
* 添加对象(添加不为空的参数)
* @param t
* @return
*/
int insertSelective(T t);
/**
*根据id查询单个对象
* @param id
* @return
*/
T selectByPrimaryKey(Long id);
/**
* 修改对象(修改参数不为空的对象)
* @param t
* @return
*/
int updateByPrimaryKeySelective(T t);
/**
* 修改对象
* @param t
* @return
*/
int updateByPrimaryKey(T t);
}
mapper接口:
package com.left.mapper;
import com.left.BaseMapper;
import com.left.model.AdminLogin;
import org.apache.ibatis.annotations.Param;
import java.util.Date;
import java.util.List;
import java.util.Map;
public interface AdminLoginMapper extends BaseMapper<AdminLogin>{
/**
* 根据token查找登录账户
* @param token
* @return
*/
AdminLogin findByToken(String token);
}
mapper.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="com.left.mapper.AdminLoginMapper">
<resultMap id="BaseResultMap" type="com.left.model.AdminLogin">
<id column="id" jdbcType="BIGINT" property="id" />
<result column="username" jdbcType="VARCHAR" property="username" />
<result column="password" jdbcType="VARCHAR" property="password" />
<result column="true_name" jdbcType="VARCHAR" property="trueName" />
<result column="mobile" jdbcType="VARCHAR" property="mobile" />
<result column="created_at" jdbcType="TIMESTAMP" property="createdAt" />
<result column="updated_at" jdbcType="TIMESTAMP" property="updatedAt" />
<result column="status" jdbcType="TINYINT" property="status" />
<result column="error_count" jdbcType="TINYINT" property="errorCount" />
<result column="token" jdbcType="VARCHAR" property="token" />
<result column="salt" jdbcType="VARCHAR" property="salt" />
<result column="admin_role_id" jdbcType="BIGINT" property="adminRoleId" />
</resultMap>
<sql id="Base_Column_List">
id, username, password, true_name, mobile, created_at, updated_at, status, error_count,
token, salt,admin_role_id
</sql>
<select id="selectByPrimaryKey" parameterType="java.lang.Long" resultMap="BaseResultMap">
select
<include refid="Base_Column_List" />
from admin_login
where status = 1 AND id = #{id,jdbcType=BIGINT}
</select>
</mapper>
mybatis配置文件的配置:
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<settings>
<setting name="callSettersOnNulls" value="true"/>
<setting name="mapUnderscoreToCamelCase" value="true"/>
<setting name="logImpl" value="LOG4J"/>
</settings>
<plugins>
<plugin interceptor="com.left.interceptor.PageInterceptor">
<property name="pattern" value="Page"/>
</plugin>
</plugins>
</configuration>
3.dubbo服务消费方配置
3.1 card模块:
dubbo配置文件dubbo-card.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="L-CARD-CARD"/>
<!-- 使用redis广播注册中心暴露发现服务地址 -->
<dubbo:registry address="${dubbo.registry}" file="./dubbo-left-card.cache"/>
<!-- 生成远程服务代理,可以和本地bean一样使用-->
<dubbo:reference id="merchantLoginManager" interface="com.left.service.MerchantLoginManager" />
</beans>
application.yml配置文件:
server:
port: 8002
dubbo:
registry: redis://127.0.0.1:6379
LoginController类:
package com.left.controller;
import com.left.enums.CodeEnums;
import com.left.fillter.BaseController;
import com.left.model.AdminLogin;
import com.left.model.MerchantLogin;
import com.left.pub.ResponseData;
import com.left.service.MerchantLoginManager;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import java.util.Random;
/**
* Created by Right on 2018/5/9.
*/
@RestController
@Api(description = "商户端登录相关")
@RequestMapping("merchant_login")
public class MerchantLoginController extends BaseController{
@Autowired
private MerchantLoginManager merchantLoginManager;
@PostMapping("login")
@ApiOperation("商户端登录")
public ResponseData login(@ApiParam(required = true,value = "账号")@RequestParam("username")String username,
@ApiParam(required = true,value = "密码")@RequestParam("password")String password) throws Exception {
return merchantLoginManager.login(username,password);
}
@PostMapping("merchant_out")
@ApiOperation("管理员退出登录")
public ResponseData loginOut(@ApiParam(required = true,value = "token")@RequestParam("token")String token){
MerchantLogin merchantLogin = getAccount(token);
int i = new Random().nextInt(99999999);
merchantLogin.setToken(token+i);
return merchantLoginManager.update(merchantLogin);
}
}
spring+dubbo大致的简单配置过程就如以上,最后启动server和card两个模块就可以运行。其中有部分公共代码已省略,只列出大致的项目结构。