写在前面:
关于环境搭建可能遇到的问题
1.dubbo文件直接扔到tomcat的webapp下面,启动tomcat即可,但要注意,在此之前要先启动zookeeper。否则报错。
本机启动程序位置:/usr/local/zookeeper-3.4.8/bin
启动命令:./zkServer.sh start
2.出现dubbo监控中心访问不了或者zk连接超时。
首先查看zookeeper是否启动成功,可以进入tomcat的logs下查看日志是否正常:tail -f catalina.out
如果一直卡在这里就是有问题了
其次,查看默认端口2181是否在防火墙开启:
cd /usr/lib/firewalld/services/
将2181端口添加进去:
vim ssh.xml 添加:
<port protocol="tcp" port="2181"/>
不添加也可以,将防火墙关闭即可:
systemctl stop firewalld
进入正题:
我们将项目拆分成多个模块创建Module:
web:接受用户请求------------------springboot类型
entity:实体类-------------------------maven类型
service-api:业务接口--------------maven类型
wervice-impl:业务实现------------springboot类型
mapper:DAO-------------------------maven类型
关于各个模块之间的依赖关系:
1.web的依赖:
<!--添加业务层接口依赖 用于注入对象-->
<dependency>
<groupId>com.demo</groupId>
<artifactId>dubbo-user-server-api</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
<!--dubbo整合springboot-->
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>0.2.0</version>
</dependency>
2.entity:
@Data
@AllArgsConstructor
@NoArgsConstructor
@TableName("t_user")//来源于mybatis-plus
public class User implements Serializable {
private static final long serialVersionUID = -7104875007556931674L;
@TableId(type = IdType.AUTO)//来源于mybatis-plus
private Integer id;
private String username;
private String password;
}
依赖:
<!--
mybatis-plus
在实体类中添加该依赖
是因为要要使用 其实体类中的注解
-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>2.3</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.10</version>
</dependency>
3.service-api依赖:
<!--实体类用于接口泛型-->
<dependency>
<groupId>com.demo</groupId>
<artifactId>dubbo-user-entity</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
4.service-impl依赖:
<!--实体类泛型使用-->
<dependency>
<groupId>com.demo</groupId>
<artifactId>dubbo-user-entity</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
<!--service的接口-->
<dependency>
<groupId>com.demo</groupId>
<artifactId>dubbo-user-server-api</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
<!--mapper接口
用于在service显示类自动注入对象-->
<dependency>
<groupId>com.demo</groupId>
<artifactId>dubbo-user-mapper</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.6</version>
</dependency>
<!--sboot和dubbo整合的依赖-->
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>0.2.0</version>
</dependency>
<dependency>
<!--<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>-->
<groupId>junit</groupId>
<artifactId>junit</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
5.mapper依赖:
<!--mybatis-plus 用于接口中继承basemapper -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>2.3</version>
</dependency>
<!--实体类
接口的泛型使用-->
<dependency>
<groupId>com.demo</groupId>
<artifactId>dubbo-user-entity</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
service-impl 作为我们的提供者端,需要注意的小点:
1.导入依赖 在serviceimpl添加dubbo依赖
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>0.2.0</version>
</dependency>
2.修改impl主启动类的扫描注解使用dubbo的@service (注意看包名)
我们原始的是spring的:org.springframework.stereotype.Service
dubbo的:
org.springframework.beans.factory.annotation.Autowired;
3.impl主启动类添加dubbo的启动类扫描:@DubboComponentScan(basePackages = “com.demo”)
springboot的@componentScan就不要了
4.impl配置文件配置dubbo
#dubbo
dubbo:
application:
name: user-service #dubbo发布的服务的名称(自定义)
registry:
address: zookeeper://192.168.61.200:2181 #注册中心的地址 就是zookeper的地址(192.168.61.200为zookeeper所在的服务器ip 2181是其默认端口号)
5.启动impl主启动类:
启动impl主启动类正常启动则可以到注册中心看到:
访问地址:http://192.168.61.200:8080/dubbo/
默认账号和密码均为:root
如果IDEA日志显示timeout 很可能是因为zoopeeper服务器上的2181端口未开放。解决:
进入:/usr/lib/firewalld/services 修改ssh.xml
添加:
重启防火强:systemctl restart firewalld
或者 直接关闭防火强:
systemctl stop firewalld
然后,再次启动主启动类。
6.当我们搭建集群(多个提供者)时,启动时可能会碰到这个端口占用的错误,这个是dubbo默认给提供者分配的本地端口:
因为前面启动的提供者已经使用了该端口:
第一种解决方法:我们可以通过指定不同的端口来解决冲突:
#dubbo
dubbo:
application:
name: user-service #dubbo发布的服务的名称(自定义)
registry:
address: zookeeper://192.168.61.200:2181 #注册中心的地址 就是zookeper的地址(192.168.61.200为zookeeper所在的服务器ip 2181是其默认端口号)
protocol:
port: 20888 #指定端口
重新启动后:
第二种解决方法:让它自动寻找可用的端口
#dubbo
dubbo:
application:
name: user-service #dubbo发布的服务的名称(自定义)
registry:
address: zookeeper://192.168.61.200:2181 #注册中心的地址 就是zookeper的地址(192.168.61.200为zookeeper所在的服务器ip 2181是其默认端口号)
protocol:
port: -1 #-1表示让其自动寻找可用端口
web作为我们的消费者端,需要注意的小点:
1.添加dubbo依赖
2.添加service接口依赖
3.修改控制器中注入对象的注解将@Autowired 换成@Reference(注意:有两个 用dubbo的)
4.配置dubbo,主要是用于消费者去注册中心获取服务信息:
#dubbo
dubbo:
application:
name: user-web
registry:
address: zookeeper://192.168.61.200:2181 #注册中心的地址 就是zookeper的地址(192.168.61.200为zookeeper所在的服务器ip 2181是其默认端口号)
5.启动web启动类。此时会报一个错误:
是因为springboot中,只要我们引入spring-web的依赖 他就会默认帮我们去创建数据源 ,但是我们并不需要在消费者端创建数据源 是由impl去创建的 所以我们需要排除数据源(exclude = DataSourceAutoConfiguration.class)
6.再次启动,会报错 说实体类没有序列化(如果你之前没有序列化的话),将其序列化然后再次启动,不出意外应该可以成功。这样我们的zookeeper上生产者和消费者的信息就都能看到了。
以上就是一个demo项目,提供一个搭建基本骨架的思路,其中可能遇到的问题和解决方法也都如上所述。
最后放上代码,希望有所帮助:
https://gitee.com/open_source_china_w/OriginOper.git