记录一下这周末搭建dubbo的过程。
公司一直使用的是dubbo框架,但是自己却一直停留在了使用的地位上,不知道如何搭建一个dubbo项目。
首先瞄下下dubbo的结构,多分一点可以分为3个模块;一个模块是common,这里面放的内容包括一些公用的DTO,或者dao层的一些。一个模块是provider,服务的提供者,这里面主要提供接口和逻辑层的处理内容。供给这个项目进行调用或者其他项目进行调用。第三个模块是consumer,服务的消费者,主要是处理前端传过来的url,与provider进行交互。
zookeeper的安装,是用于dubbo接口的注册。添加链接描述
最开始新建一个父模块,这里使用的是spring boot的创建模式,不进行描述。然后将其中的src删掉。接下来描述下第一部分common的模块创建过程:
第一步:在该项目下创建一个Module,之后选择的方式依旧是spring boot即可,里面的与第一步相同,不描述了。
由于本次只写个DTO,所以没有配置dao的相关配置。同时,也用不到启动的主函数,也删除了。
如果在之后的启动项目中,找不到DTO啥的,可以在pom.xml添加一下这段话(坑一):
<configuration> <classifier>exec</classifier> </configuration>
第二部分:接下来就是开始创建provider模块了:
第一步,与上个模块基本一致。进行命名创建一个spring boot模块;
第二部,添加pom.xml依赖,需要用到dubbo和zookeeper,以及上个common的依赖
<!-- dubbo依赖--> <dependency> <groupId>com.alibaba.spring.boot</groupId> <artifactId>dubbo-spring-boot-starter</artifactId> <version>2.0.0</version> </dependency> <!-- zookeeper依赖 --> <dependency> <groupId>com.101tec</groupId> <artifactId>zkclient</artifactId> <version>0.10</version> </dependency> <dependency> <groupId>com.order</groupId> <artifactId>order-common</artifactId> <version>0.0.1-SNAPSHOT</version> </dependency>
第三步,写接口和接口的实现。这里需要注意的是注解@Service使用的是dubbo注解。
import com.alibaba.dubbo.config.annotation.Service; import org.springframework.stereotype.Component; @Component @Service(version = "1.0.0")
到这里,这个接口就完成了,可以对本项目以及其他项目提供服务了。第四步,同理,我们需要把它的dubbo服务发布出去,需要在.properties中进行配置,
spring.application.name=spring-boot-dubbo-order-provider spring.dubbo.server=true spring.dubbo.registry=zookeeper://IP:端口 spring.dubbo.protocol.port=20880 server.port=8081
需要注意的是这个端口号和消费者的端口号不能相同。
第五步:在启动类里面配置dubbo的启动项配置:
import com.alibaba.dubbo.spring.boot.annotation.EnableDubboConfiguration; @EnableDubboConfiguration
第三部分:接下来创建的是消费者consumer模块
第一步,创建生产的模式依旧一样,不描述。
第二步,引入pom.xml的依赖,因为是Web服务,所以需要多引入一个容器(或者创建的时候添加Web,springboot会自带tomcat),还要多引入一个provider的依赖。
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <exclusions> <exclusion> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> </exclusion> <!--<exclusion>--> <!--<groupId>org.springframework.boot</groupId>--> <!--<artifactId>spring-boot-starter-logging</artifactId>--> <!--</exclusion>--> </exclusions> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-undertow</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <!-- dubbo依赖--> <dependency> <groupId>com.alibaba.spring.boot</groupId> <artifactId>dubbo-spring-boot-starter</artifactId> <version>2.0.0</version> </dependency> <!-- zookeeper --> <dependency> <groupId>com.101tec</groupId> <artifactId>zkclient</artifactId> <version>0.10</version> </dependency> <dependency> <groupId>com.order</groupId> <artifactId>order-common</artifactId> <version>0.0.1-SNAPSHOT</version> </dependency> <dependency> <groupId>com.order</groupId> <artifactId>order-provider</artifactId> <version>0.0.1-SNAPSHOT</version> </dependency>
第四步:在controller层中使用@Reference注解进行调用接口
import com.alibaba.dubbo.config.annotation.Reference; @RestController public class DubboConsumerController { @Reference(version = "1.0.0") private OrderService orderService; @RequestMapping("/") public UserInfo index(){ return orderService.getUserById(Long.valueOf(1)); } }
第五步:在.properties中进行配置zookeeper和端口号
server.port=8080 spring.application.name=spring-boot-consumer-provider spring.dubbo.registry=zookeeper://IP:端口
第六步,在启动类里面添加dubbo的启动项配置:
@EnableDubboConfiguration
启动项目后,在网页进行测试,成功返回了字符串。
最后,在dubbo-admin进行查看服务提供者和服务消费者,会发现两者都正常。
消息提供者provider:
服务消费者:consumer