前言
之前以及了解过了springboot cloud 微服务的一系列框架,其中dubbo在3之前一直作为一款优秀的rpc框架存在(对标spring cloud中的feign组件),为此duboo3出以后,dubbo也逐渐变成了一个微服务整合平台,目前我进行学习的是个时候遇到很多坑dubbo x springboot 官方开发文档
环境安装
弱依赖环境 统一建议使用docker 安装
运行zookper 作为注册中心 naocs当然也可以
docker run --name some-zookeeper -p 2181:2181 --restart always -d zookeeper
管理可视化界面
docker run --name dubbo-admin -e admin.registry.address=zookeeper://some-zookeeper:2181 -p 8080:8080 --link some-zookeeper --restart always -d apache/dubbo-admin
此时访问虚拟机地址 :8080 默认密码账户 root
和springcloud不同的是,dubbo中一个接口实现就为一个服务
搭建工程
下面的操作都是根据官网来的
目录结构
父工程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>org.example</groupId><artifactId>Dubbo-demo</artifactId><version>1.0-SNAPSHOT</version><packaging>pom</packaging><modules><module>dubbo-comsumer</module><module>dubbo-provider</module><module>dubbo-commom</module></modules><properties><dubbo.version>3.2.0-beta.4</dubbo.version><spring-boot.version>2.7.12</spring-boot.version><maven.compiler.source>17</maven.compiler.source><maven.compiler.target>17</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><dependencyManagement><dependencies><dependency><groupId>org.apache.dubbo</groupId><artifactId>dubbo-spring-boot-starter</artifactId><version>3.1.10</version></dependency><!-- Spring Boot --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-dependencies</artifactId><version>${spring-boot.version}</version><type>pom</type><scope>import</scope></dependency><!-- Dubbo --><dependency><groupId>org.apache.dubbo</groupId><artifactId>dubbo-bom</artifactId><version>${dubbo.version}</version><type>pom</type><scope>import</scope></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><version>${spring-boot.version}</version></dependency><dependency><groupId>org.apache.dubbo</groupId><artifactId>dubbo-dependencies-zookeeper-curator5</artifactId><version>${dubbo.version}</version><type>pom</type></dependency></dependencies></dependencyManagement><build><pluginManagement><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><version>${spring-boot.version}</version></plugin></plugins></pluginManagement></build>
</project>
子模块-privider 服务提供者
<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.itheima</groupId><artifactId>dubbo-provider</artifactId><version>1.0-SNAPSHOT</version><packaging>war</packaging><parent><groupId>org.example</groupId><artifactId>Dubbo-demo</artifactId><version>1.0-SNAPSHOT</version></parent><properties><maven.compiler.source>17</maven.compiler.source><maven.compiler.target>17</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><dependencies><dependency><groupId>org.example</groupId><artifactId>dubbo-commom</artifactId><version>1.0-SNAPSHOT</version></dependency><!-- dubbo --><dependency><groupId>org.apache.dubbo</groupId><artifactId>dubbo-spring-boot-starter</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.apache.dubbo</groupId><artifactId>dubbo-dependencies-zookeeper-curator5</artifactId><type>pom</type><exclusions><exclusion><artifactId>slf4j-reload4j</artifactId><groupId>org.slf4j</groupId></exclusion></exclusions></dependency><!-- spring boot starter --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency></dependencies></project>
其中common 是自己抽离出来的通用接口模块,这里一切都和springcloud中使用feign类似远程调用工具feign
一样
commom 通用接口模块
其中的定义的一个接口
public interface DoubleUserService {public String getUser();
}
服务端实现接口
使用dubboservice 暴露接口
@DubboService(version = "2.0")
public class DoubleUserServiceImpl2 implements DoubleUserService {@Overridepublic String getUser() {return "数据库查询出是:李四";}
}
该注解参数
第二个实现接口的类 指定版本为1
@DubboService(version = "1.0")
public class DoubleUserServiceImpl implements DoubleUserService {@Overridepublic String getUser() {return "数据库查询出来是username: 王二";}
}
yaml 配置文件
dubbo:application:name: dubbo-springboot-demo-providerprotocol:name: dubboport: -1registry:address: zookeeper://${zookeeper.address:192.168.249.133}:2181#我的工程跟官网这里不加会报错 官网不会 很奇怪parameters:blockUntilConnectedWait: 50
server:port: 8762
启动类
@SpringBootApplication
@EnableDubbo(scanBasePackages = "org.example.Service")
public class ProviderApplication {public static void main(String[] args) {SpringApplication.run(ProviderApplication.class,args);}
}
此时成功注册并且web界面可以观察
服务消费端(目前有问题没有解决)
这里我是跟着官网来的,但是问题出现的很严重
pom文件
<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.itheima</groupId><artifactId>dubbo-comsumer</artifactId><version>1.0-SNAPSHOT</version><packaging>war</packaging>
<parent><groupId>org.example</groupId><artifactId>Dubbo-demo</artifactId><version>1.0-SNAPSHOT</version>
</parent><properties><maven.compiler.source>17</maven.compiler.source><maven.compiler.target>17</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><dependencies><dependency><groupId>org.example</groupId><artifactId>dubbo-commom</artifactId><version>1.0-SNAPSHOT</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- dubbo --><dependency><groupId>org.apache.dubbo</groupId><artifactId>dubbo-spring-boot-starter</artifactId></dependency><dependency><groupId>org.apache.dubbo</groupId><artifactId>dubbo-dependencies-zookeeper-curator5</artifactId><type>pom</type><exclusions><exclusion><artifactId>slf4j-reload4j</artifactId><groupId>org.slf4j</groupId></exclusion></exclusions></dependency><dependency><groupId>com.itheima</groupId><artifactId>dubbo-provider</artifactId><version>1.0-SNAPSHOT</version></dependency><!-- spring boot starter --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency></dependencies></project>
作为服务消费方,使用到dubbo服务的控制层
@RestController
@RequestMapping("user")
public class Usercontroller {@DubboReference(version="1.0") //指定调用版本private DoubleUserService userService;@GetMapping("info1")public String get1(){String s = userService.getUser();return "info:"+s;}
}
启动类 这个enable我百度文档说加不加都不所谓
//@EnableDubbo@SpringBootApplication
public class ComsumerApplication {public static void main(String[] args) {SpringApplication.run(ComsumerApplication.class,args);}
我指定了使用的服务接口,并且指定了版本
配置文件
dubbo:application:name: dubbo-springboot-demo-comsumerprotocol:name: dubboport: -1registry:address: zookeeper://${zookeeper.address:192.168.249.133}:2181parameters:blockUntilConnectedWait: 50server:port: 8444 # 选择一个可用的端口
问题1:出现了报错 端口已经绑定 并且无论我切换任意端口都无法接口该问题
java.net.BindException: Address already in use: bindat java.base/sun.nio.ch.Net.bind0(Native Method) ~[na:na]at java.base/sun.nio.ch.Net.bind(Net.java:555) ~[na:na]at java.base/sun.nio.ch.ServerSocketChannelImpl.netBind(ServerSocketChannelImpl.java:337) ~[na:na]at java.base/sun.nio.ch.ServerSocketChannelImpl.bind(ServerSocketChannelImpl.java:294) ~[na:na]at io.netty.channel.socket.nio.NioServerSocketChannel.doBind(NioServerSocketChannel.java:141) ~[netty-transport-4.1.92.Final.jar:4.1.92.Final]at io.netty.channel.AbstractChannel$AbstractUnsafe.bind(AbstractChannel.java:562) ~[netty-transport-4.1.92.Final.jar:4.1.92.Final]at io.netty.channel.DefaultChannelPipeline$HeadContext.bind(DefaultChannelPipeline.java:1334) ~[netty-transport-4.1.92.Final.jar:4.1.92.Final]at io.netty.channel.AbstractChannelHandlerContext.invokeBind(AbstractChannelHandlerContext.java:600) ~[netty-transport-4.1.92.Final.jar:4.1.92.Final]at io.netty.channel.AbstractChannelHandlerContext.bind(AbstractChannelHandlerContext.java:579) ~[netty-transport-4.1.92.Final.jar:4.1.92.Final]at io.netty.channel.DefaultChannelPipeline.bind(DefaultChannelPipeline.java:973) ~[netty-transport-4.1.92.Final.jar:4.1.92.Final]at io.netty.channel.AbstractChannel.bind(AbstractChannel.java:260) ~[netty-transport-4.1.92.Final.jar:4.1.92.Final]at io.netty.bootstrap.AbstractBootstrap$2.run(AbstractBootstrap.java:356) ~[netty-transport-4.1.92.Final.jar:4.1.92.Final]at io.netty.util.concurrent.AbstractEventExecutor.runTask(AbstractEventExecutor.java:174) ~[netty-common-4.1.92.Final.jar:4.1.92.Final]at io.netty.util.concurrent.AbstractEventExecutor.safeExecute(AbstractEventExecutor.java:167) ~[netty-common-4.1.92.Final.jar:4.1.92.Final]at io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:470) ~[netty-common-4.1.92.Final.jar:4.1.92.Final]at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:569) ~[netty-transport-4.1.92.Final.jar:4.1.92.Final]at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:997) ~[netty-common-4.1.92.Final.jar:4.1.92.Final]at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74) ~[netty-common-4.1.92.Final.jar:4.1.92.Final]at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30) ~[netty-common-4.1.92.Final.jar:4.1.92.Final]at java.base/java.lang.Thread.run(Thread.java:840) ~[na:na]
但是dubbo-adnmin 界面却可以发现该服务
问题2:于是既然服务已经发现,那么我尝试访问这个消费者的控制层,因为这里会对服务提供者进行远程调用,可是报错
No provider available from registry 192.168.249.133:2181 for service org.example.api.DoubleUserService:1.0.0 on consumer 192.168.10.98 use dubbo version 3.2.0-beta.4, please check status of providers(disabled, not registered or in blacklist).
我已经各自百度2天了,官方文档也没有类似问题 ,本文章长期更新,等解决了在补完
问题解决办法
问题二解决了 我把注册中心从zookper切换为了nacosdubbo配置中心文档
注册中心切换为nacos
因为nacos3适配的nacos在2.0以上,nacos在2.2过后也发生了大改变(需要挂载更多端口),为此这里安装的是nacos 2.2.0
docker run --name nacos-server \
-p 8848:8848 \
-p 7848:7848 \
-p 9848:9848 \
-p 9849:9849 \
--privileged=true \
--restart=always \
-e JVM_XMS=256m \
-e JVM_XMX=256m \
-e MODE=standalone \
-e PREFER_HOST_MODE=hostname \
-v /mydata/nacos/logs:/home/nacos/logs \
-d nacos/nacos-server:v2.2.0
消费者和服务提供者pom文件
<properties><maven.compiler.source>17</maven.compiler.source><maven.compiler.target>17</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><dependencies><dependency><groupId>org.example</groupId><artifactId>dubbo-commom</artifactId><version>1.0-SNAPSHOT</version></dependency><!-- dubbo --><dependency><groupId>org.apache.dubbo</groupId><artifactId>dubbo-spring-boot-starter</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.apache.dubbo</groupId><artifactId>dubbo-dependencies-zookeeper-curator5</artifactId><type>pom</type><exclusions><exclusion><artifactId>slf4j-reload4j</artifactId><groupId>org.slf4j</groupId></exclusion></exclusions></dependency><!-- spring boot starter --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency>
<!-- <dependency>-->
<!-- <groupId>org.apache.dubbo</groupId>-->
<!-- <artifactId>dubbo</artifactId>-->
<!-- <version>3.0.9</version>-->
<!-- </dependency>--><dependency><groupId>com.alibaba.nacos</groupId><artifactId>nacos-client</artifactId><version>2.2.0</version></dependency></dependencies>
服务提供模块配置文件
dubbo:application:name: dubbo-springboot-demo-providerprotocol:name: dubboport: -1registry:address: nacos://192.168.249.133:8848?username=nacos&password=nacos
# parameters:
# blockUntilConnectedWait: 50
server:port: 8762
打开服务器/虚拟机ip:8848/nacos 密码账户 默认都是nacos
发现注册成功 dubbo一个接口就是一个服务
然后对应的修改消费端口的配置文件
dubbo:config-center:timeout: 10000application:name: dubbo-springboot-demo-comsumerprotocol:name: dubboregistry:address: nacos://192.168.249.133:8848?username=nacos&password=nacostimeout: 10000
# parameters:
# blockUntilConnectedWait: 50server:port: 7777 # 选择一个可用的端口
启动后发现端口依旧报错 修改任意端口都是该问题
Address already in use: bind
但是当我访问消费端的控制层
!!!既然出数据了,并且我在生产者provider添加了日志
确实成功证明dubbo的rpc功能可以实现