springboot结合Dubbo的使用
springboot+dubbo:
在这里使用的是父子工程项目
父工程依赖:
1 <?xml version="1.0" encoding="UTF-8"?> 2 <project xmlns="http://maven.apache.org/POM/4.0.0" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 4 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 5 <modelVersion>4.0.0</modelVersion> 6 7 <groupId>com.aaa.liu.springboot.dubbo</groupId> 8 <artifactId>springDubbo</artifactId> 9 <packaging>pom</packaging> 10 <version>1.0-SNAPSHOT</version> 11 <modules> 12 <module>dubbo-provide</module> 13 <module>dubbo-consumer</module> 14 </modules> 15 16 <dependencyManagement> 17 18 <!-- 19 springboot的jar 20 springboot-web-starter 21 springboot-mybatis整合包 22 mysql驱动包 23 druid(连接池) 24 dubbo和spring的整合包 25 zookeeper的服务器端包(zkServer) 26 zookeeper的客户端包(zkClient) 27 netty(封装了io流的框架) 28 IO流是创始于jdk1.4版本 29 NIO是在jdk的1.5版本诞生 30 netty最终整合了NIO,对NIO做很好的封装 31 --> 32 <dependencies> 33 <dependency> 34 <groupId>org.springframework.boot</groupId> 35 <artifactId>spring-boot-starter-parent</artifactId> 36 <version>1.5.22.RELEASE</version> 37 </dependency> 38 39 <!-- 40 springboot-starter-web 41 --> 42 <dependency> 43 <groupId>org.springframework.boot</groupId> 44 <artifactId>spring-boot-starter-web</artifactId> 45 <version>1.5.22.RELEASE</version> 46 </dependency> 47 <!-- 48 dubbo-spring-boot-starter 49 --> 50 <dependency> 51 <groupId>com.alibaba.spring.boot</groupId> 52 <artifactId>dubbo-spring-boot-starter</artifactId> 53 <version>2.0.0</version> 54 </dependency> 55 56 <!-- netty start --> 57 <dependency> 58 <groupId>org.jboss.netty</groupId> 59 <artifactId>netty</artifactId> 60 <version>3.2.6.Final</version> 61 </dependency> 62 <!-- netty end --> 63 64 <dependency> 65 <groupId>org.apache.zookeeper</groupId> 66 <artifactId>zookeeper</artifactId> 67 <version>3.4.6</version> 68 </dependency> 69 70 <dependency> 71 <groupId>com.github.sgroschupf</groupId> 72 <artifactId>zkclient</artifactId> 73 <version>0.1</version> 74 </dependency> 75 76 <!-- 77 springboot-mybatis整合包 78 --> 79 <dependency> 80 <groupId>org.mybatis.spring.boot</groupId> 81 <artifactId>mybatis-spring-boot-starter</artifactId> 82 <version>1.3.0</version> 83 </dependency> 84 <!-- 85 mysql的驱动包 86 --> 87 <dependency> 88 <groupId>mysql</groupId> 89 <artifactId>mysql-connector-java</artifactId> 90 <version>5.1.38</version> 91 </dependency> 92 <!-- 93 druid连接池 94 --> 95 <dependency> 96 <groupId>com.alibaba</groupId> 97 <artifactId>druid</artifactId> 98 <version>1.1.10</version> 99 </dependency> 100 <!-- thymeleaf--> 101 <dependency> 102 <groupId>org.springframework.boot</groupId> 103 <artifactId>spring-boot-starter-thymeleaf</artifactId> 104 <version>1.5.22.RELEASE</version> 105 </dependency> 106 107 <!--可以不再遵循HTML标准来写页面--> 108 <dependency> 109 <groupId>net.sourceforge.nekohtml</groupId> 110 <artifactId>nekohtml</artifactId> 111 <version>1.9.21</version> 112 </dependency> 113 </dependencies> 114 </dependencyManagement> 115 116 </project>
子项目有两个 ,一个消费者,一个提供者。
如果在RestFul风格中,消费者是需要依赖提供者的,由提供者进行数据操作,消费者从提供者拿。
而在dubbo中,不需要建立层级依赖,直接远程调用
provider依赖:
1 <?xml version="1.0" encoding="UTF-8"?> 2 <project xmlns="http://maven.apache.org/POM/4.0.0" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 4 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 5 <parent> 6 <artifactId>springDubbo</artifactId> 7 <groupId>com.aaa.liu.springboot.dubbo</groupId> 8 <version>1.0-SNAPSHOT</version> 9 </parent> 10 <modelVersion>4.0.0</modelVersion> 11 12 <artifactId>dubbo-provide</artifactId> 13 14 <dependencies> 15 16 <dependency> 17 <groupId>org.springframework.boot</groupId> 18 <artifactId>spring-boot-starter-parent</artifactId> 19 <version>1.5.22.RELEASE</version> 20 <type>pom</type> 21 </dependency> 22 23 <dependency> 24 <groupId>org.springframework.boot</groupId> 25 <artifactId>spring-boot-starter-web</artifactId> 26 </dependency> 27 28 <dependency> 29 <groupId>org.mybatis.spring.boot</groupId> 30 <artifactId>mybatis-spring-boot-starter</artifactId> 31 </dependency> 32 33 <dependency> 34 <groupId>com.alibaba.spring.boot</groupId> 35 <artifactId>dubbo-spring-boot-starter</artifactId> 36 </dependency> 37 38 <!-- netty start --> 39 <dependency> 40 <groupId>org.jboss.netty</groupId> 41 <artifactId>netty</artifactId> 42 </dependency> 43 <!-- netty end --> 44 45 <dependency> 46 <groupId>org.apache.zookeeper</groupId> 47 <artifactId>zookeeper</artifactId> 48 </dependency> 49 50 <dependency> 51 <groupId>com.github.sgroschupf</groupId> 52 <artifactId>zkclient</artifactId> 53 </dependency> 54 55 <!-- 56 springboot-mybatis整合包 57 --> 58 <dependency> 59 <groupId>org.mybatis.spring.boot</groupId> 60 <artifactId>mybatis-spring-boot-starter</artifactId> 61 </dependency> 62 <!-- 63 mysql的驱动包 64 --> 65 <dependency> 66 <groupId>mysql</groupId> 67 <artifactId>mysql-connector-java</artifactId> 68 </dependency> 69 <!-- 70 druid连接池 71 --> 72 <dependency> 73 <groupId>com.alibaba</groupId> 74 <artifactId>druid</artifactId> 75 </dependency> 76 <!-- thymeleaf--> 77 <dependency> 78 <groupId>org.springframework.boot</groupId> 79 <artifactId>spring-boot-starter-thymeleaf</artifactId> 80 </dependency> 81 82 <!--可以不再遵循HTML标准来写页面--> 83 <dependency> 84 <groupId>net.sourceforge.nekohtml</groupId> 85 <artifactId>nekohtml</artifactId> 86 </dependency> 87 </dependencies> 88 </project>
consumer依赖:
1 <?xml version="1.0" encoding="UTF-8"?> 2 <project xmlns="http://maven.apache.org/POM/4.0.0" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 4 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 5 <parent> 6 <artifactId>springDubbo</artifactId> 7 <groupId>com.aaa.liu.springboot.dubbo</groupId> 8 <version>1.0-SNAPSHOT</version> 9 </parent> 10 <modelVersion>4.0.0</modelVersion> 11 12 <artifactId>dubbo-consumer</artifactId> 13 14 <dependencies> 15 16 <dependency> 17 <groupId>org.springframework.boot</groupId> 18 <artifactId>spring-boot-starter-parent</artifactId> 19 <version>1.5.22.RELEASE</version> 20 <type>pom</type> 21 </dependency> 22 23 <dependency> 24 <groupId>org.springframework.boot</groupId> 25 <artifactId>spring-boot-starter-web</artifactId> 26 </dependency> 27 28 <!-- <dependency>--> 29 <!-- <groupId>org.mybatis.spring.boot</groupId>--> 30 <!-- <artifactId>mybatis-spring-boot-starter</artifactId>--> 31 <!-- </dependency>--> 32 33 <!-- dubbo--> 34 <dependency> 35 <groupId>com.alibaba.spring.boot</groupId> 36 <artifactId>dubbo-spring-boot-starter</artifactId> 37 </dependency> 38 <!-- netty start --> 39 <dependency> 40 <groupId>org.jboss.netty</groupId> 41 <artifactId>netty</artifactId> 42 </dependency> 43 <!-- netty end --> 44 45 <dependency> 46 <groupId>org.apache.zookeeper</groupId> 47 <artifactId>zookeeper</artifactId> 48 </dependency> 49 50 <dependency> 51 <groupId>com.github.sgroschupf</groupId> 52 <artifactId>zkclient</artifactId> 53 </dependency> 54 55 <!-- thymeleaf--> 56 <dependency> 57 <groupId>org.springframework.boot</groupId> 58 <artifactId>spring-boot-starter-thymeleaf</artifactId> 59 </dependency> 60 61 <!--可以不再遵循HTML标准来写页面--> 62 <dependency> 63 <groupId>net.sourceforge.nekohtml</groupId> 64 <artifactId>nekohtml</artifactId> 65 </dependency> 66 </dependencies> 67 </project>
provider中的配置信息:
1 server.port=8081 2 server.context-path=/ 3 4 spring.datasource.driver-class-name=com.mysql.jdbc.Driver 5 spring.datasource.url=jdbc:mysql://localhost:3306/mybatis?useSSL=false 6 spring.datasource.username=root 7 spring.datasource.password=123456 8 spring.datasource.type=com.alibaba.druid.pool.DruidDataSource 9 10 mybatis.type-aliases-package=com.aaa.liu.dubbo.model 11 mybatis.mapper-locations=classpath:mapper/*Mapper.xml 12 13 #dubbo的配置 14 #配置dubbo的应用名(在dubbo的admin项目,可以非常直观的看出来该项目是个什么样的项目) 15 #dubbo-admin-->生产者/消费者-->application name -->需要根据当前项目所提供的功能进行命名 16 dubbo.application.name=user-provider 17 #protocol:协议 18 #配置该项目远程调用的时候所使用的协议-->dubbo(tcp,udp...) 19 #在之前所有的项目使用的协议都是http 20 dubbo.protocol.name=dubbo 21 #配置dubbo所必需使用的通讯端口号 22 #使用的端口号可以为:21881、21880、20881、20880.。。 23 dubbo.protocol.port=20881 24 #zookeeper的通讯地址 25 #dubbo配置zookeeper是因为dubbo框架集成zookeeper 26 #provide最终需要向zookeeper注册服务,也就是说必须要让provide项目知道zookeeper是哪一个 27 dubbo.registry.address=zookeeper://192.168.134.142:2181 28 #provider项目必须要让zookeeper知道具体是哪一个类/哪一些类需要注册进zookeeper中 29 #也就是说必须要让zookeeper知道所注册进注册中心的实现类是谁 30 #dubbo中也提供了包的扫描 31 dubbo.scan.base-packages=com.aaa.liu.dubbo.service.impl
provider中的入口类:
1 package com.aaa.liu.dubbo; 2 3 import com.alibaba.dubbo.config.spring.context.annotation.EnableDubbo; 4 5 import org.mybatis.spring.annotation.MapperScan; 6 import org.springframework.boot.SpringApplication; 7 import org.springframework.boot.autoconfigure.SpringBootApplication; 8 9 /** 10 * @Author 刘其佳 11 * @DateTime 2019/9/6 17:49 12 * @Project_Name springDubbo 13 */ 14 @SpringBootApplication 15 @MapperScan("com.aaa.liu.dubbo.mapper") 16 @EnableDubbo 17 public class ApplicationRun8081 { 18 public static void main(String[] args){ 19 SpringApplication.run(ApplicationRun8081.class,args); 20 } 21 }
consumer中的配置信息:
1 server.port=8082 2 server.context-path=/ 3 4 #dubbo的配置 5 #consumer中dubbo的配置和provider中只差了一行(不需要配置扫描包) 6 dubbo.application.name=user-consumer 7 #dubbo的协议名称 8 dubbo.protocol.name=dubbo 9 #dubbo的协议端口号 10 dubbo.protocol.port=20881 11 #注册中心的地址(zookeeper通讯地址) 12 dubbo.registry.address=zookeeper://192.168.134.142:2181 13 14 spring.thymeleaf.cache=false 15 spring.thymeleaf.mode=LEGACYHTML5
consumer的入口类:
1 package com.aaa.liu.dubbo; 2 3 import com.alibaba.dubbo.config.spring.context.annotation.EnableDubbo; 4 import org.springframework.boot.SpringApplication; 5 import org.springframework.boot.autoconfigure.SpringBootApplication; 6 7 /** 8 * @Author 刘其佳 9 * 10 * @DateTime 2019/9/6 19:51 11 * @Project_Name springDubbo 12 */ 13 14 @SpringBootApplication 15 @EnableDubbo 16 public class ApplicationRun8082 { 17 public static void main(String[] args) { 18 SpringApplication.run(ApplicationRun8082.class,args); 19 } 20 }
1、在consumer控制层中,使用远程调用service时,不能再使用自动注入了,因为本项目中,service只有接口,没有实现类,使用@Reference。
2、consumer的service层和provider的service层接口要一模一样。
3、在consumer中不需要跟数据库打交道,所以不用配置数据源,因此在依赖中也不用添加mybatis,如果添加上了会报错。
原因是:mybatis在加载时会自动注入配置好的数据源,如果找不到会报错
4、在项目中进行clear时遇到的错误:com.aaa.liu.springboot.dubbo:dubbo-consumer referencing itself
意思是定位到了自己。
原因:在子工程中多添加了这个依赖:
<dependency>
<groupId>com.aaa.liu.springboot.dubbo</groupId>
<artifactId>dubbo-consumer</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>