SpringBoot(四):与dobbo的整合(注解形式与xml形式)

原文地址:http://blog.csdn.net/mj86534210/article/details/77941268

平时项目一直用的ssm+dubbo,现在公司打算采用springboot+dubbo整合,所以就去研究了下。

这里写出两种形式的整合,凭兴趣爱好选择。


一.初始化mysql表:

  1. DROP TABLE `user` IF EXISTS  
  2. CREATE TABLE `user` (  
  3.   `id` varchar(32) NOT NULL,  
  4.   `name` varchar(255) DEFAULT NULL,  
  5.   `age` int(11) DEFAULT NULL,  
  6.   PRIMARY KEY (`id`)  
  7. ) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

二、构建项目

为了测试方便起见,这里使用JPA+H2数据库

项目结构

1、user-api

SpringBoot(四):与dobbo的整合(注解形式与xml形式)

如果使用JPA,实体上加注解,需要引入

[java] view plain copy
  1. <dependency>  
  2.     <groupId>org.springframework.boot</groupId>  
  3.     <artifactId>spring-boot-starter-data-jpa</artifactId>  
  4. </dependency>  
实体类

[java] view plain copy
  1. @Entity  
  2. @Table(name = "t_user")  
  3. public class User implements Serializable{  
  4.       
  5.     private static final long serialVersionUID = -1369148652554782331L;  
  6.       
  7.     @Id  
  8.     @GeneratedValue  
  9.     private Integer id;  
  10.       
  11.     private String name;  
  12.       
  13.     private Integer age;  
  14.   
  15.     get/set省略。。。  
service类略...


2、user-service(基于注解的实现)

SpringBoot(四):与dobbo的整合(注解形式与xml形式)

需要添加的依赖

[html] view plain copy
  1. <dependencies>  
  2.     <dependency>  
  3.         <groupId>org.springframework.boot</groupId>  
  4.         <artifactId>spring-boot-starter-data-jpa</artifactId>  
  5.     </dependency>  
  6. span style="white-space:pre;">      </span><!-- h2数据库 -->  
  7.     <dependency>  
  8.         <groupId>com.h2database</groupId>  
  9.         <artifactId>h2</artifactId>  
  10.         <scope>runtime</scope>  
  11.     </dependency>  
  12.     <dependency>  
  13.         <groupId>org.springframework.boot</groupId>  
  14.         <artifactId>spring-boot-starter-test</artifactId>  
  15.         <scope>test</scope>  
  16.     </dependency>  
  17.   
  18.     <dependency>  
  19.         <groupId>com.example</groupId>  
  20.         <artifactId>user-api</artifactId>  
  21.         <version>0.0.1-SNAPSHOT</version>  
  22.     </dependency>  
  23.   
  24.     <!-- Spring Boot Dubbo 依赖 -->  
  25.     <dependency>  
  26.         <groupId>io.dubbo.springboot</groupId>  
  27.         <artifactId>spring-boot-starter-dubbo</artifactId>  
  28.         <version>1.0.0</version>  
  29.     </dependency>  
  30. </dependencies>  
配置文件application.properties

[html] view plain copy
  1. spring.jpa.hibernate.ddl-auto=create  
  2. spring.jpa.hibernate.show-sql: true  
  3. spring.h2.console.enabled: true  
  4.         
  5. server.port=8081  
  6.   
  7. # Dubbo 生产者  
  8. spring.dubbo.application.name=provider  
  9. # 注册中心  
  10. spring.dubbo.registry.address=zookeeper://localhost:2181  
  11. # 协议  
  12. spring.dubbo.protocol.name=dubbo  
  13. # 端口  
  14. spring.dubbo.protocol.port=20880  
  15. # 扫描包  
  16. spring.dubbo.scan=com.example.demo  

userDao

[java] view plain copy
  1. /** 
  2.  * userDao 
  3.  * @author majie 
  4.  */  
  5. @Repository  
  6. public interface UserDao extends JpaRepository<User, String> {  
  7.   
  8. }  
userServiceImpl

[html] view plain copy
  1. <span style="color:#333333;">import java.util.List;  
  2. import org.springframework.beans.factory.annotation.Autowired;  
  3. import com.example.demo.dao.UserDao;  
  4. import com.example.demo.entity.User;  
  5. import com.example.demo.service.UserService;  
  6. </span><span style="color:#ff0000;">import com.alibaba.dubbo.config.annotation.Service;//这里引入的不是spring的service包</span><span style="color:#333333;">  
  7.   
  8. /**  
  9.  * service实现类  
  10.  * 约定生产者在实现类上提供dubbo服务  
  11.  *   
  12.  * @author majie  
  13.  */  
  14. @Service(version="1.0.0")  
  15. public class UserServiceImpl implements UserService {  
  16.   
  17.     @Autowired  
  18.     private UserDao dao;  //其他方法省略</span>  
version表示版本号

其他配置,基本和xml中配置一样,只不过这里是写入类里面了

SpringBoot(四):与dobbo的整合(注解形式与xml形式)

启动类

[java] view plain copy
  1. package com.example.demo;  
  2.   
  3. import org.springframework.boot.SpringApplication;  
  4. import org.springframework.boot.autoconfigure.SpringBootApplication;  
  5.   
  6. @SpringBootApplication  
  7. public class Provider {  
  8.   
  9.     public static void main(String[] args) throws InterruptedException {  
  10.         SpringApplication.run(Provider.class, args);  
  11.     }  
  12. }  
使用注解的启动类不需要改变


user-service(基于xml实现)
修改dubbo依赖为(现在dubbo更新到了2.5.4还没去试过)

[html] view plain copy
  1. <dependency>  
  2.     <groupId>com.alibaba</groupId>  
  3.     <artifactId>dubbo</artifactId>  
  4.     <version>2.5.3</version>  
  5.     <exclusions>  
  6.         <exclusion>  
  7.             <groupId>org.springframework</groupId>  
  8.             <artifactId>spring</artifactId>  
  9.         </exclusion>  
  10.     </exclusions>  
  11. </dependency>  
  12.   
  13. <dependency>  
  14.     <groupId>org.apache.zookeeper</groupId>  
  15.     <artifactId>zookeeper</artifactId>  
  16.     <version>3.4.6</version>  
  17.     <scope>compile</scope>  
  18. </dependency>  
  19.   
  20. <dependency>  
  21.     <groupId>com.101tec</groupId>  
  22.     <artifactId>zkclient</artifactId>  
  23.     <version>0.4</version>  
  24. </dependency>  


配置文件

spring-dubbo.xml

[html] view plain copy
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <beans xmlns="http://www.springframework.org/schema/beans"  
  3.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"  
  4.     xsi:schemaLocation="http://www.springframework.org/schema/beans  
  5.            http://www.springframework.org/schema/beans/spring-beans.xsd  
  6.            http://code.alibabatech.com/schema/dubbo  
  7.            http://code.alibabatech.com/schema/dubbo/dubbo.xsd">  
  8.   
  9.     <!-- 提供方应用信息,用于计算依赖关系 -->  
  10.     <dubbo:application name="dubbo-provider" />  
  11.   
  12.     <!-- 使用zookeeper注册中心暴露服务地址 -->  
  13.     <dubbo:registry protocol="zookeeper" address="localhost:2181" />  
  14.   
  15.     <!-- 用dubbo协议在20880端口暴露服务 -->  
  16.     <dubbo:protocol name="dubbo" port="20880" />  
  17.   
  18.     <!-- 声明需要暴露的服务接口 -->  
  19.     <dubbo:service interface="com.example.demo.service.UserService" ref="userService" />  
  20. </beans>  


启动类

[java] view plain copy
  1. import java.util.concurrent.CountDownLatch;  
  2. import org.slf4j.Logger;  
  3. import org.slf4j.LoggerFactory;  
  4. import org.springframework.boot.autoconfigure.SpringBootApplication;  
  5. import org.springframework.boot.builder.SpringApplicationBuilder;  
  6. import org.springframework.context.ApplicationContext;  
  7. import org.springframework.context.annotation.Bean;  
  8. import org.springframework.context.annotation.ImportResource;  
  9.   
  10. @SpringBootApplication  
  11. @ImportResource({"classpath:spring-dubbo.xml"})   //引入配置文件  
  12. public class Provider {  
  13.   
  14.     private static final Logger logger = LoggerFactory.getLogger(Provider.class);  
  15.   
  16.     @Bean  
  17.     public CountDownLatch closeLatch() {  
  18.         return new CountDownLatch(1);  
  19.     }  
  20.   
  21.     public static void main(String[] args) throws InterruptedException {  
  22.         ApplicationContext ctx = new SpringApplicationBuilder().sources(Provider.class).web(false).run(args);  
  23.   
  24.         logger.info("项目启动!");  
  25.   
  26.         CountDownLatch closeLatch = ctx.getBean(CountDownLatch.class);  
  27.         closeLatch.await();  
  28.     }  
  29. }  


@Service的注解要改成spring的注解


3、web消费者(基于注解)

SpringBoot(四):与dobbo的整合(注解形式与xml形式)

添加依赖

[html] view plain copy
  1. <dependency>  
  2.     <groupId>org.springframework.boot</groupId>  
  3.     <artifactId>spring-boot-starter-web</artifactId>  
  4. </dependency>  
  5.   
  6. <dependency>  
  7.     <groupId>org.springframework.boot</groupId>  
  8.     <artifactId>spring-boot-starter-test</artifactId>  
  9.     <scope>test</scope>  
  10. </dependency>  
  11.   
  12. <dependency>  
  13.     <groupId>com.example</groupId>  
  14.     <artifactId>user-api</artifactId>  
  15.     <version>0.0.1-SNAPSHOT</version>  
  16.     <!-- 排除这个jar 不引入数据库 -->  
  17.     <exclusions>  
  18.         <exclusion>  
  19.             <groupId>org.springframework.boot</groupId>  
  20.             <artifactId>spring-boot-starter-data-jpa</artifactId>  
  21.         </exclusion>  
  22.     </exclusions>  
  23. </dependency>  
  24.   
  25. <!-- Spring Boot Dubbo 依赖 -->  
  26. <dependency>  
  27.     <groupId>io.dubbo.springboot</groupId>  
  28.     <artifactId>spring-boot-starter-dubbo</artifactId>  
  29.     <version>1.0.0</version>  
  30. </dependency>  
因为引入了user-pai,所以会引入jpa的jar,springboot是会根据依赖自动去扫描,看是有该配置,如果没有就会报错,

这里为了不在web中引入数据库,需要排除该jar.再或者你在配置文件配置和service一样的


配置文件

[html] view plain copy
  1. server.port=8080  
  2.   
  3. ## Dubbo 服务消费者配置  
  4. spring.dubbo.application.name=consumer  
  5. spring.dubbo.registry.address=zookeeper://localhost:2181  
  6. spring.dubbo.scan=com.example.demo  


Controller

[java] view plain copy
  1. @RestController  
  2. public class UserController {  
  3.       
  4.     @Reference(version="1.0.0")  
  5.     private UserService userService;  
  6.       
  7.     @GetMapping("/get")  
  8.     public List<User> getUser() {  
  9.         return userService.getList();  
  10.     }  
这里需要使用@Reference注解,而不是使用@Autowired或者@Resource,当然后面对应的信息也需要和生产者类似

启动入口和servic一样。


web消费者(基于xml)

依赖修改和service一样

配置文件:spring-duubo.xml

[html] view plain copy
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <beans xmlns="http://www.springframework.org/schema/beans"  
  3.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"  
  4.     xsi:schemaLocation="http://www.springframework.org/schema/beans  
  5.            http://www.springframework.org/schema/beans/spring-beans.xsd  
  6.            http://code.alibabatech.com/schema/dubbo  
  7.            http://code.alibabatech.com/schema/dubbo/dubbo.xsd">  
  8.   
  9.     <!-- 提供方应用信息,用于计算依赖关系 -->  
  10.     <dubbo:application name="dubbo-consumer" />  
  11.   
  12.     <!-- 使用zookeeper注册中心暴露服务地址 -->  
  13.     <dubbo:registry protocol="zookeeper" address="localhost:2181" />  
  14.   
  15.     <!-- 声明需要暴露的服务接口 -->  
  16.     <dubbo:reference id="userService" interface="com.example.demo.service.UserService" />  
  17. </beans>  

Controller层和正常的springmvc一样写法

注入用@Autowired或者@Resource

启动类一样,引入文件就好。


测试

启动zk以后,因为我们没有设置check=false,所以这里先启动生产者,然后在启动消费者进行测试


最后关于热部署的问题。

springboot整合dubbo的时候,如果引入

[html] view plain copy
  1. <dependency>  
  2.         <groupId>org.springframework.boot</groupId>  
  3.         <artifactId>spring-boot-devtools</artifactId>  
  4.     </dependency>  
会报错。可能是jar包冲突引起的,弄了半天没有解决。就换了种方式

引入依赖

[html] view plain copy
  1. <dependency>  
  2.     <groupId>org.springframework</groupId>  
  3.     <artifactId>springloaded</artifactId>  
  4. </dependency>  
添加build

[html] view plain copy
  1. <build>  
  2.     <plugins>  
  3.         <plugin>  
  4.             <groupId>org.springframework.boot</groupId>  
  5.             <artifactId>spring-boot-maven-plugin</artifactId>  
  6.             <dependencies>  
  7.                 <!-- spring热部署 -->  
  8.                 <dependency>  
  9.                     <groupId>org.springframework</groupId>  
  10.                     <artifactId>springloaded</artifactId>  
  11.                     <version>1.2.7.RELEASE</version>  
  12.                 </dependency>  
  13.             </dependencies>  
  14.         </plugin>  
  15.     </plugins>  
  16. </build>  
启动的时候需要debug启动,才能完成热部署。