由于最近项目要用到dubbo+zookeeper。所以就在网上找了一些例子来看,试着自己搭建了一个项目,并放到了服务器上,大家有兴趣可以访问。这篇文章主要记录项目搭建以及部署过程中踩过的坑,希望能帮到你。。。
项目结构如下:
项目目录结构
项目是idea新建一个简单springboot项目,然后在这个项目基础上新建两个module项目:
springboot-dubbo-provider项目:
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">
<modelVersion>4.0.0</modelVersion>
<groupId>com.wty.DubboWty</groupId>
<artifactId>dubboclient</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>dubboclient</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.2.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<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>
<!--dubbo-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
<version>2.4.10</version>
<exclusions>
<exclusion>
<artifactId>spring</artifactId>
<groupId>org.springframework</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.4.6</version>
<exclusions>
<exclusion>
<artifactId>slf4j-log4j12</artifactId>
<groupId>org.slf4j</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>com.github.sgroschupf</groupId>
<artifactId>zkclient</artifactId>
<version>0.1</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<classifier>exec</classifier>
</configuration>
</plugin>
</plugins>
</build>
</project>
注:这里有个坑,就是最后打包的时候,必须加上
<configuration>
<classifier>exec</classifier>
</configuration>
,如果不加,本地跑是没有问题的,但是打包发布服务的时候就有问题了,具体什么意思,可以看这篇文章:
https://blog.csdn.net/guduyishuai/article/details/60968728
接口类:
public interface SayHello {
String sayHello(String name);
}
实现类:
@Service
public class SayHelloImpl implements SayHello{
@Override
public String sayHello(String name) {
System.out.println("service 被调用了");
return "Hello "+name;
}
}
项目resources目录下新建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:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
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
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
<!-- 配置dubbo -->
<!-- 提供方应用信息,用于计算依赖关系 -->
<dubbo:application name="taotao-manager-service" />
<!-- 使用multicast广播注册中心暴露服务地址 不安全,不稳定 -->
<!--<dubbo:registry address="multicast://224.5.6.7:1234" />-->
<!--直连-->
<!--<dubbo:registry address="N/A" />-->
<dubbo:registry protocol="zookeeper" address="你部署的zookeeper服务器的ip:2181" check="false" subscribe="false"/>
<!-- 用dubbo协议在20880端口暴露服务 -->
<dubbo:protocol name="dubbo" port="20880" />
<!-- 声明需要暴露的服务接口 -->
<dubbo:service interface="com.wty.dubbo.springbootdubboprovider.Service.SayHello"
ref="sayHello" />
<!-- 具体服务接口的实现 -->
<bean id="sayHello" class="com.wty.dubbo.springbootdubboprovider.Service.ServiceImpl.SayHelloImpl" />
</beans>
启动类加上注解
@ImportResource(value = {"classpath:dubbo-provider.xml"})扫描配置文件:
@SpringBootApplication
@ImportResource(value = {"classpath:dubbo-provider.xml"})
public class SpringbootDubboProviderApplication {
public static void main(String[] args) {
SpringApplication.run(SpringbootDubboProviderApplication.class, args);
}
}
springboot-dubbo-consumer项目:
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">
<modelVersion>4.0.0</modelVersion>
<groupId>com.wty.dubbo</groupId>
<artifactId>springboot-dubbo-consumer</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>springboot-dubbo-consumer</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.2.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<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.wty.dubbo</groupId>
<artifactId>springboot-dubbo-provider</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
<!--<dependency>-->
<!--<groupId>com.wty.dubbo</groupId>-->
<!--<artifactId>springboot-dubbo-provider</artifactId>-->
<!--<version>0.0.1-SNAPSHOT</version>-->
<!--</dependency>-->
<!--dubbo-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
<version>2.4.10</version>
<exclusions>
<exclusion>
<artifactId>spring</artifactId>
<groupId>org.springframework</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.4.6</version>
<exclusions>
<exclusion>
<artifactId>slf4j-log4j12</artifactId>
<groupId>org.slf4j</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>com.github.sgroschupf</groupId>
<artifactId>zkclient</artifactId>
<version>0.1</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
SayHelloController类:
@RestController
public class SayHelloController {
@Autowired
SayService sayService;
@RequestMapping("/hello")
public String say(@RequestParam("name") String name) {
System.out.println("name:" +name);
return sayService.say(name);
}
}
SayService类:
@Component
public class SayService {
@Resource
private SayHello sayHello;
public String say (String name) {
System.out.println("服务层"+name);
String s= sayHello.sayHello(name);
return s;
}
}
注:这里有个坑,就是@Reference注解千万不能用,用了就报错。后来改用@Resource就不报错了。
具体两者之间差异自行百度。
项目resources目录下新建dubbo-consumer.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:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
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
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
<!-- 配置dubbo服务 -->
<dubbo:application name="taotao-manager-web" />
<!-- 使用广播 -->
<!--<dubbo:registry address="multicast://224.5.6.7:1234" />-->
<dubbo:registry protocol="zookeeper" address="zookeeper服务器的地址:2181" check="false"/>
<!-- 声明要调用的服务,timeout是设置连接超时最长时间,如果不设置,默认一秒超时,重试3次 -->
<dubbo:reference interface="com.wty.dubbo.springbootdubboprovider.Service.SayHello"
id="sayHello" timeout="1000000" />
</beans>
启动类:
@SpringBootApplication
@ImportResource("classpath:dubbo-consumer.xml")
public class SpringbootDubboConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(SpringbootDubboConsumerApplication.class, args);
}
}
注:因为是两个项目同时启动,所以要改一下项目启动端口号。这个很简单,在项目application.properties里面加上一行代码:
server.port=8012 就可以了。建议两个项目都改一下,不要和其他项目冲突。
现在项目基本搭建完成,只要你配置的zookeeper服务器正常可以访问,那么这个项目就肯定没有问题。启动的时候先启动provider,再启动consumer就行。
接下来说一下打包部署的事,打包的时候provider项目要install到本地仓库中去,因为加了<configuration> <classifier>exec</classifier> </configuration> 代码,所以会在本地仓库生成两个jar包,一个是可依赖的,一个是可执行的。
部署的时候部署可依赖jar包就可以了。然后package consumer项目的时候provider项目必须时启动状态,要不然打包也是不成功的。把这两个jar包打包成功后就可以上传服务器启动了。这里还要注意一点就是启动的时候不要java -jar 这样启动一个再启动另一个的话第一个项目会停掉,建议使用后台启动命令
nohup java -jar wty-0.0.1-SNAPSHOT.jar > wty.log 2>&1 & 后台启动 日志打印到wty.log文件中 返回进程号
这个时候就可以访问了。。。这是我的项目,可以访问的:
http://47.104.17.51:8012/hello?name="你的名字”
代码上传到github欢迎讨论: