平时项目一直用的ssm+dubbo,现在公司打算采用springboot+dubbo整合,所以就去研究了下。
这里写出两种形式的整合,凭兴趣爱好选择。
一.初始化mysql表:
- DROP TABLE `user` IF EXISTS
- CREATE TABLE `user` (
- `id` varchar(32) NOT NULL,
- `name` varchar(255) DEFAULT NULL,
- `age` int(11) DEFAULT NULL,
- PRIMARY KEY (`id`)
- ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
二、构建项目
为了测试方便起见,这里使用JPA+H2数据库
项目结构
1、user-api
如果使用JPA,实体上加注解,需要引入
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-data-jpa</artifactId>
- </dependency>
- @Entity
- @Table(name = "t_user")
- public class User implements Serializable{
- private static final long serialVersionUID = -1369148652554782331L;
- @Id
- @GeneratedValue
- private Integer id;
- private String name;
- private Integer age;
- get/set省略。。。
2、user-service(基于注解的实现)
需要添加的依赖
- <dependencies>
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-data-jpa</artifactId>
- </dependency>
- span style="white-space:pre;"> </span><!-- h2数据库 -->
- <dependency>
- <groupId>com.h2database</groupId>
- <artifactId>h2</artifactId>
- <scope>runtime</scope>
- </dependency>
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-test</artifactId>
- <scope>test</scope>
- </dependency>
- <dependency>
- <groupId>com.example</groupId>
- <artifactId>user-api</artifactId>
- <version>0.0.1-SNAPSHOT</version>
- </dependency>
- <!-- Spring Boot Dubbo 依赖 -->
- <dependency>
- <groupId>io.dubbo.springboot</groupId>
- <artifactId>spring-boot-starter-dubbo</artifactId>
- <version>1.0.0</version>
- </dependency>
- </dependencies>
- spring.jpa.hibernate.ddl-auto=create
- spring.jpa.hibernate.show-sql: true
- spring.h2.console.enabled: true
- server.port=8081
- # Dubbo 生产者
- spring.dubbo.application.name=provider
- # 注册中心
- spring.dubbo.registry.address=zookeeper://localhost:2181
- # 协议
- spring.dubbo.protocol.name=dubbo
- # 端口
- spring.dubbo.protocol.port=20880
- # 扫描包
- spring.dubbo.scan=com.example.demo
userDao
- /**
- * userDao
- * @author majie
- */
- @Repository
- public interface UserDao extends JpaRepository<User, String> {
- }
- <span style="color:#333333;">import java.util.List;
- import org.springframework.beans.factory.annotation.Autowired;
- import com.example.demo.dao.UserDao;
- import com.example.demo.entity.User;
- import com.example.demo.service.UserService;
- </span><span style="color:#ff0000;">import com.alibaba.dubbo.config.annotation.Service;//这里引入的不是spring的service包</span><span style="color:#333333;">
- /**
- * service实现类
- * 约定生产者在实现类上提供dubbo服务
- *
- * @author majie
- */
- @Service(version="1.0.0")
- public class UserServiceImpl implements UserService {
- @Autowired
- private UserDao dao; //其他方法省略</span>
其他配置,基本和xml中配置一样,只不过这里是写入类里面了
启动类
- package com.example.demo;
- import org.springframework.boot.SpringApplication;
- import org.springframework.boot.autoconfigure.SpringBootApplication;
- @SpringBootApplication
- public class Provider {
- public static void main(String[] args) throws InterruptedException {
- SpringApplication.run(Provider.class, args);
- }
- }
user-service(基于xml实现)
修改dubbo依赖为(现在dubbo更新到了2.5.4还没去试过)
- <dependency>
- <groupId>com.alibaba</groupId>
- <artifactId>dubbo</artifactId>
- <version>2.5.3</version>
- <exclusions>
- <exclusion>
- <groupId>org.springframework</groupId>
- <artifactId>spring</artifactId>
- </exclusion>
- </exclusions>
- </dependency>
- <dependency>
- <groupId>org.apache.zookeeper</groupId>
- <artifactId>zookeeper</artifactId>
- <version>3.4.6</version>
- <scope>compile</scope>
- </dependency>
- <dependency>
- <groupId>com.101tec</groupId>
- <artifactId>zkclient</artifactId>
- <version>0.4</version>
- </dependency>
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="dubbo-provider" />
- <!-- 使用zookeeper注册中心暴露服务地址 -->
- <dubbo:registry protocol="zookeeper" address="localhost:2181" />
- <!-- 用dubbo协议在20880端口暴露服务 -->
- <dubbo:protocol name="dubbo" port="20880" />
- <!-- 声明需要暴露的服务接口 -->
- <dubbo:service interface="com.example.demo.service.UserService" ref="userService" />
- </beans>
启动类
- import java.util.concurrent.CountDownLatch;
- import org.slf4j.Logger;
- import org.slf4j.LoggerFactory;
- import org.springframework.boot.autoconfigure.SpringBootApplication;
- import org.springframework.boot.builder.SpringApplicationBuilder;
- import org.springframework.context.ApplicationContext;
- import org.springframework.context.annotation.Bean;
- import org.springframework.context.annotation.ImportResource;
- @SpringBootApplication
- @ImportResource({"classpath:spring-dubbo.xml"}) //引入配置文件
- public class Provider {
- private static final Logger logger = LoggerFactory.getLogger(Provider.class);
- @Bean
- public CountDownLatch closeLatch() {
- return new CountDownLatch(1);
- }
- public static void main(String[] args) throws InterruptedException {
- ApplicationContext ctx = new SpringApplicationBuilder().sources(Provider.class).web(false).run(args);
- logger.info("项目启动!");
- CountDownLatch closeLatch = ctx.getBean(CountDownLatch.class);
- closeLatch.await();
- }
- }
@Service的注解要改成spring的注解
3、web消费者(基于注解)
添加依赖
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-web</artifactId>
- </dependency>
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-test</artifactId>
- <scope>test</scope>
- </dependency>
- <dependency>
- <groupId>com.example</groupId>
- <artifactId>user-api</artifactId>
- <version>0.0.1-SNAPSHOT</version>
- <!-- 排除这个jar 不引入数据库 -->
- <exclusions>
- <exclusion>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-data-jpa</artifactId>
- </exclusion>
- </exclusions>
- </dependency>
- <!-- Spring Boot Dubbo 依赖 -->
- <dependency>
- <groupId>io.dubbo.springboot</groupId>
- <artifactId>spring-boot-starter-dubbo</artifactId>
- <version>1.0.0</version>
- </dependency>
这里为了不在web中引入数据库,需要排除该jar.再或者你在配置文件配置和service一样的
配置文件
- server.port=8080
- ## Dubbo 服务消费者配置
- spring.dubbo.application.name=consumer
- spring.dubbo.registry.address=zookeeper://localhost:2181
- spring.dubbo.scan=com.example.demo
- @RestController
- public class UserController {
- @Reference(version="1.0.0")
- private UserService userService;
- @GetMapping("/get")
- public List<User> getUser() {
- return userService.getList();
- }
启动入口和servic一样。
web消费者(基于xml)
依赖修改和service一样
配置文件:spring-duubo.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="dubbo-consumer" />
- <!-- 使用zookeeper注册中心暴露服务地址 -->
- <dubbo:registry protocol="zookeeper" address="localhost:2181" />
- <!-- 声明需要暴露的服务接口 -->
- <dubbo:reference id="userService" interface="com.example.demo.service.UserService" />
- </beans>
Controller层和正常的springmvc一样写法
注入用@Autowired或者@Resource
启动类一样,引入文件就好。
测试
启动zk以后,因为我们没有设置check=false,所以这里先启动生产者,然后在启动消费者进行测试
最后关于热部署的问题。
springboot整合dubbo的时候,如果引入
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-devtools</artifactId>
- </dependency>
引入依赖
- <dependency>
- <groupId>org.springframework</groupId>
- <artifactId>springloaded</artifactId>
- </dependency>
- <build>
- <plugins>
- <plugin>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-maven-plugin</artifactId>
- <dependencies>
- <!-- spring热部署 -->
- <dependency>
- <groupId>org.springframework</groupId>
- <artifactId>springloaded</artifactId>
- <version>1.2.7.RELEASE</version>
- </dependency>
- </dependencies>
- </plugin>
- </plugins>
- </build>