SpringBoot 整合Dubbo
使用springboot整合dubbo在网上有很多教程,至于我为什么出一篇文章呢?全因为我!因为这个搞了一天,不分享我憋得慌。
搭建项目结构
搭建项目文件
ConsumerApplication
@SpringBootApplication
public class ConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(ConsumerApplication.class,args);
}
}
DemoController
@RestController
public class DemoController {
@DubboReference
private DemoService demoService;
@GetMapping("/{msg}")
public String getDemo(@PathVariable("msg") String msg){
return demoService.say(msg);
}
}
DemoService
public interface DemoService {
String say(String s);
}
DemoServiceImpl
@DubboService
public class DemoServiceImpl implements DemoService {
@Override
public String say(String s) {
return "Hello !" + s;
}
}
ProviderApplication
@SpringBootApplication
@EnableDubbo
public class ProviderApplication {
public static void main(String[] args) {
SpringApplication.run(ProviderApplication.class,args);
}
}
application.yaml
dubbo:
registry:
address: zookeeper://localhost:2181
timeout: 60000
application-provider.yaml
server:
port: 8081
dubbo:
application:
name: provider-application
application-consumer.yaml
server:
port: 8082
dubbo:
application:
name: consumer-application
pom.xml
<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.7.1</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.liu</groupId>
<artifactId>dubbo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>dubbo</name>
<description>dubbo</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<!-- spring mvc-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- lombok-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<!-- 测试-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.dubbo/dubbo-spring-boot-starter -->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>3.1.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.dubbo/dubbo-registry-zookeeper -->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-registry-zookeeper</artifactId>
<version>3.1.0</version>
</dependency>
</dependencies>
<build>
<resources>
<resource>
<directory>src/main/java</directory>
<filtering>true</filtering>
<includes>
<include>**/*.xml</include>
</includes>
</resource>
</resources>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
设置启动配置
设置ProviderApplication的启动参数
设置运行参数
设置运行的文件
consumer 同理,改成consumer。平平无奇创项目,over ~
zookeeper在window上
在window上下载zookeeper
zookeeper 地址: https://zookeeper.apache.org/releases.html
进入网页点击链接下载
解压下载的文件夹
复制zoo_sample.cfg为zoo.cfg并编写配置
在相应位置创建文件夹
好的,可以启动了 ! bin目录下点击zkServer.cmd
测试程序
测试成功
zookeeper在Linux虚拟机上时
讲道理,到这里我应该快乐的开始学习了,但是!我偏偏想着把zookeeper移植到Linux虚拟机上,奇奇怪怪的就开始出现了。。。。此处省略zookeeper的部署过程。
出现zookeeper不能连接的错误
反省问题
一开始考虑是不是因为客户端和zookeeper的版本不兼容,
但是因为在windows上部署zookeeper可以连接,
所以就排除了版本不兼容的问题,又考虑到是不是连接延时问题
但是我的延时已经设置成为60s了,不应该是这方面问题
然后我就想,是不是因为其他特殊参数的影响??
我使用zookeeper作为注册中心,dubbo依靠zookeeper
那以dubbo的尿性,肯定在一开始就把zookeeper加载好了。
那我去翻SPI接口,应该可以找到原因!
关于Dubbo SPI内容。参考:https://chuxiwen.top/archives/dubbo-de-spi-ji-zhi
尝试解决
在SPI接口中找注册中心
dubbo依赖的注册方式
顺着方法找到连接的逻辑
惊喜发现
到这里,心中已经有数,解决问题的逻辑一定在这个方法中,开搞!!!
找到问题
也就是说,只有我可以把这个10改一下,是不是就可以了??继续搞!!!
通过yaml文件点到dubbo的配置类
发现该配置类中没有blockUntilConnectedWait这个参数,但是发现了一个Map集合,这个集合可以添加其他参数,难不成??这个特殊的参数是通过这个map进行获取吗!
修改application.yaml文件
dubbo:
registry:
address: zookeeper://192.168.92.100:2181
timeout: 60000
parameters:
"blockUntilConnectedWait": 100
问题解决
当看见这个,激动的快哭出来,搞了一天啊!!上面看似逻辑通顺,都是无数次尝试一步步试错搞出来的。感谢!
最后在看看这美妙的Hello!dubbo!
总结
当确保自己的操作没有问题时,一定要根据框架的特性想到一些解决办法,必要时要debug。这次整合确实耽误了很多时间,但是不亏,得瑟一会~~~