SpringBoot整合dubbo

女爷i 2022-01-15 21:21 1122阅读 0赞

1.什么是Dubbo

Dubbo是Alibaba开源的分布式服务框架,它最大的特点是按照分层的方式来架构,使用这种方式可以使各个层之间解耦合(或者最大限度地松耦合)。从服务模型的角度来看, Dubbo采用的是一种非常简单的模型,要么是提供方提供服务,要么是消费方消费服务,所以基于这一点可以抽象出服务提供方(Provider)和服务消费方(Consumer)两个角色,负责治理调用。

2.什么是ZooKeeper

ZooKeeper 是一个分布式的,开放源码的分布式应用程序协调服务。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。(在使用dubbo的时候zookeeper。就是充当注册中心,用来管理注册服务,和消费者引用服务负责注册发现)。

架构图如下(来源:github)
在这里插入图片描述
服务的提供者,把服务发布到zookeeper当中(相当于注册中心),而消费者需要服务的时候,不需用直接寻找服务的发布者,而是问注册中心索要服务,注册中心把其所需要的地址列表返回给消费者,这样消费者就可以调用生产者发布的服务。


开始springboot-整合dubbo测试。

(1)安装zookeeper为了方便,这里采用dokcer镜像的方式

  1. // ps:因为使用官网的镜像下载速度会很慢,这里采用了阿里云镜像加速 下载版本 3.4.11
  2. [root@localhost ~]# docker pull 37y8py0j.mirror.aliyuncs.com/library/zookeeper:3.4.11

下载完成之后,运行镜像

  1. //先查看 有哪一些镜像
  2. [root@localhost ~]# docker images
  3. REPOSITORY TAG IMAGE ID CREATED SIZE
  4. pshk7r7h.mirror.swr.myhuaweicloud.com/library/rabbitmq 3-management c4663bdca2cd 8 days ago 189 MB
  5. 37y8py0j.mirror.aliyuncs.com/library/elasticsearch 7.1.0 12ad640a1ec0 4 weeks ago 894 MB
  6. docker.io/tomcat 7 bf7d94e5177f 3 months ago 359 MB
  7. docker.io/mysql 5.7 ee7cbd482336 3 months ago 372 MB
  8. 37y8py0j.mirror.aliyuncs.com/library/elasticsearch 5.6.9 5c1e1ecfe33a 12 months ago 486 MB
  9. 37y8py0j.mirror.aliyuncs.com/library/zookeeper 3.4.11 56d414270ae3 17 months ago 146 MB
  10. 37y8py0j.mirror.aliyuncs.com/library/elasticsearch 2.4.0 83ed90c49472 2 years ago 343 MB
  11. //运行镜像 -p 代表后台运行 2182:2181 把虚拟机的端口 映射到 zookeeper应用的2181端口
  12. [root@localhost ~]# docker run --name zoo01 --restart always -p 2181:2181 -d 56d414270ae3

(2)创建一个工程———服务的生产者provider
在这里插入图片描述
pom.xml引入相关依赖(我这的spring-boot版本 1.5.21.RELEASE,要引入dubbo-spring-boot-starter 0.1.0版本,一开始引入的是0.2.0版本 ,服务启动发布的时候会报错)

  1. <dependencies>
  2. <!--为了保持服务一直在启动,方便测试-->
  3. <dependency>
  4. <groupId>org.springframework.boot</groupId>
  5. <artifactId>spring-boot-starter-web</artifactId>
  6. </dependency>
  7. <dependency>
  8. <groupId>org.springframework.boot</groupId>
  9. <artifactId>spring-boot-starter-test</artifactId>
  10. <scope>test</scope>
  11. </dependency>
  12. <!--引入dubbo 的依赖-->
  13. <!-- https://mvnrepository.com/artifact/com.alibaba.boot/dubbo-spring-boot-starter -->
  14. <dependency>
  15. <groupId>com.alibaba.boot</groupId>
  16. <artifactId>dubbo-spring-boot-starter</artifactId>
  17. <version>0.1.0</version>
  18. </dependency>
  19. <!--引入zookeeper客户端-->
  20. <!-- https://mvnrepository.com/artifact/com.101tec/zkclient -->
  21. <dependency>
  22. <groupId>com.101tec</groupId>
  23. <artifactId>zkclient</artifactId>
  24. <version>0.10</version>
  25. </dependency>
  26. </dependencies>

编写dubbo的相关配置文件

  1. dubbo.application.name=provider
  2. dubbo.registry.address=zookeeper://192.168.25.131:2181
  3. dubbo.scan.base-packages=com.kuake.springboo.servicet
  4. ##制定暴露服务的协议 (可以省略)
  5. spring.dubbo.protocol.name=dubbo
  6. ###指定暴露服务的端口(可以省略,但是如果生产者都要提供服务,就需要设置不同的端口不然端口会冲突)
  7. spring.dubbo.protocol.port=20880

编写提供的服务代码:

  1. package com.kuake.springboot.service;
  2. /** * @author hao * @create 2019-06-12 ${TIM} */
  3. public interface ProviderService {
  4. //服务接口
  5. public String providerService();
  6. }

实现类:

  1. package com.kuake.springboot.service.impl;
  2. import com.alibaba.dubbo.config.annotation.Service;
  3. import com.kuake.springboot.service.ProviderService;
  4. import org.springframework.stereotype.Component;
  5. /** * @author hao * @create 2019-06-12 ${TIM} */
  6. @Component
  7. @Service// 通过注解暴露服务 与下面配置的方式相同(注意:这个是dubbo包下的@Service注解)
  8. /*<dubbo:application name="e3-manager"/> <!-- 注册地址 zookepper虚拟机所在地 --> <dubbo:registry address="192.168.25.128:2181" protocol="zookeeper"></dubbo:registry> <!-- 使用dubbo协议通过端口暴露服务 ref="tbItemServiceImpl" 默认创建对象时候的名字--> <dubbo:protocol name="dubbo" port="20880"/> <dubbo:service interface="com.e3shop.service.TbItemService" ref="tbItemServiceImpl" timeout="600000"></dubbo:service> <dubbo:service interface="com.e3shop.service.ItemCatService" ref="itemCatServiceImpl" timeout="600000"></dubbo:service> */
  9. public class ProviderServiceImpl implements ProviderService {
  10. @Override
  11. public String providerService() {
  12. return "我来提供服务啦";
  13. }
  14. }

(2)创建一个新工程——-服务的消费者consumer
在这里插入图片描述
同样引入相关依赖

  1. <dependency>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-web</artifactId>
  4. </dependency>
  5. <dependency>
  6. <groupId>org.springframework.boot</groupId>
  7. <artifactId>spring-boot-starter-test</artifactId>
  8. <scope>test</scope>
  9. </dependency>
  10. <!---->
  11. <!--引入dubbo 的依赖-->
  12. <!-- https://mvnrepository.com/artifact/com.alibaba.boot/dubbo-spring-boot-starter -->
  13. <dependency>
  14. <groupId>com.alibaba.boot</groupId>
  15. <artifactId>dubbo-spring-boot-starter</artifactId>
  16. <version>0.1.0</version>
  17. </dependency>
  18. <!--引入zookeeper客户端-->
  19. <!-- https://mvnrepository.com/artifact/com.101tec/zkclient -->
  20. <dependency>
  21. <groupId>com.101tec</groupId>
  22. <artifactId>zkclient</artifactId>
  23. <version>0.10</version>
  24. </dependency>

编写配置文件 ,配置dubbo

  1. ####应用名称
  2. dubbo.application.name=consumer
  3. ### 注册地址
  4. dubbo.registry.address=zookeeper://192.168.25.131:2181

编写消费者的代码:
包结构如下:(注意:服务的接口全限定名要与生生产者那边的权限定名要相同,简单来说就是要放在相同的目录接口下面)
在这里插入图片描述

  1. /** * @author hao * @create 2019-06-12 ${TIM} */
  2. @Service
  3. public class UserService {
  4. /*<!-- 引用dubbo服务 --> <dubbo:application name="e3-manager-web"/> <!-- 注册地址 zookepper虚拟机所在地 --> <dubbo:registry address="192.168.107.129:2181" protocol="zookeeper">/dubbo:registry <!--引用服务 --> <dubbo:reference interface="com.e3shop.service.TbItemService" id="ibItemService">*/
  5. @Reference //从注册中心引用服务,与传统配置文件的方法类似
  6. private ProviderService providerService;
  7. public String getService(){
  8. //使用 服务生产者提供的服务
  9. return providerService.providerService();
  10. }
  11. }

测试代码:

  1. package com.kuake.springboot;
  2. import com.kuake.springboot.userservice.UserService;
  3. import org.junit.Test;
  4. import org.junit.runner.RunWith;
  5. import org.springframework.beans.factory.annotation.Autowired;
  6. import org.springframework.boot.test.context.SpringBootTest;
  7. import org.springframework.test.context.junit4.SpringRunner;
  8. @RunWith(SpringRunner.class)
  9. @SpringBootTest
  10. public class SpringbootDubboConsumerApplicationTests {
  11. @Autowired
  12. UserService userService;
  13. @Test
  14. public void contextLoads() {
  15. System.out.println("我要获得服务");
  16. String service = userService.getService();
  17. System.out.println(service);
  18. }
  19. }
进行测试:

(1)运行消息的生产者,发布服务:

  1. \instantclient-sqlplus-windows.x64-12.1.0.1.0\instantclient_12_1;C:\Pr;gram Files (x86)\Intel\OpenCL SDK\3.0\bin\x86;C:\Program Files (x86)\Intel\OpenCL SDK\3.0\bin\x64;D:\Git\cmd;D:\SSH_SecureShell;.
  2. 2019-06-13 15:22:02.144 INFO 6844 --- [clientConnector] org.apache.zookeeper.ZooKeeper : Client environment:java.io.tmpdir=C:\Users\ADMINI~1\AppData\Local\Temp\
  3. 2019-06-13 15:22:02.144 INFO 6844 --- [clientConnector] org.apache.zookeeper.ZooKeeper : Client environment:java.compiler=<NA>
  4. 2019-06-13 15:22:02.144 INFO 6844 --- [clientConnector] org.apache.zookeeper.ZooKeeper : Client environment:os.name=Windows 7
  5. 2019-06-13 15:22:02.144 INFO 6844 --- [clientConnector] org.apache.zookeeper.ZooKeeper : Client environment:os.arch=amd64
  6. 2019-06-13 15:22:02.144 INFO 6844 --- [clientConnector] org.apache.zookeeper.ZooKeeper : Client environment:os.version=6.1
  7. 2019-06-13 15:22:02.144 INFO 6844 --- [clientConnector] org.apache.zookeeper.ZooKeeper : Client environment:user.name=Administrator
  8. 2019-06-13 15:22:02.144 INFO 6844 --- [clientConnector] org.apache.zookeeper.ZooKeeper : Client environment:user.home=C:\Users\Administrator
  9. 2019-06-13 15:22:02.144 INFO 6844 --- [clientConnector] org.apache.zookeeper.ZooKeeper : Client environment:user.dir=F:\ideaworkplace\springboot-dubbo
  10. 2019-06-13 15:22:02.145 INFO 6844 --- [clientConnector] org.apache.zookeeper.ZooKeeper : Initiating client connection, connectString=192.168.25.131:2181 sessionTimeout=30000 watcher=org.I0Itec.zkclient.ZkClient@3075b107
  11. 2019-06-13 15:22:02.156 INFO 6844 --- [clientConnector] org.I0Itec.zkclient.ZkClient : Waiting for keeper state SyncConnected
  12. 2019-06-13 15:22:02.160 INFO 6844 --- [68.25.131:2181)] org.apache.zookeeper.ClientCnxn : Opening socket connection to server 192.168.25.131/192.168.25.131:2181. Will not attempt to authenticate using SASL (unknown error)
  13. 2019-06-13 15:22:02.162 INFO 6844 --- [68.25.131:2181)] org.apache.zookeeper.ClientCnxn : Socket connection established to 192.168.25.131/192.168.25.131:2181, initiating session
  14. 2019-06-13 15:22:02.178 INFO 6844 --- [68.25.131:2181)] org.apache.zookeeper.ClientCnxn : Session establishment complete on server 192.168.25.131/192.168.25.131:2181, sessionid = 0x1000221ed62000d, negotiated timeout = 30000
  15. 2019-06-13 15:22:02.180 INFO 6844 --- [tor-EventThread] org.I0Itec.zkclient.ZkClient : zookeeper state changed (SyncConnected)
  16. 2019-06-13 15:22:02.183 INFO 6844 --- [ main] c.a.d.r.zookeeper.ZookeeperRegistry : [DUBBO] Register: dubbo://192.168.21.1:20880/com.kuake.springboot.service.ProviderService?anyhost=true&application=provider&dubbo=2.0.1&generic=false&interface=com.kuake.springboot.service.ProviderService&methods=providerService&pid=6844&side=provider&timestamp=1560410521877, dubbo version: 2.0.1, current host: 192.168.21.1
  17. 2019-06-13 15:22:02.198 INFO 6844 --- [ main] c.a.d.r.zookeeper.ZookeeperRegistry : [DUBBO] Subscribe: provider://192.168.21.1:20880/com.kuake.springboot.service.ProviderService?anyhost=true&application=provider&category=configurators&check=false&dubbo=2.0.1&generic=false&interface=com.kuake.springboot.service.ProviderService&methods=providerService&pid=6844&side=provider&timestamp=1560410521877, dubbo version: 2.0.1, current host: 192.168.21.1
  18. 2019-06-13 15:22:02.219 INFO 6844 --- [ main] c.a.d.r.zookeeper.ZookeeperRegistry : [DUBBO] Notify urls for subscribe url provider://192.168.21.1:20880/com.kuake.springboot.service.ProviderService?anyhost=true&application=provider&category=configurators&check=false&dubbo=2.0.1&generic=false&interface=com.kuake.springboot.service.ProviderService&methods=providerService&pid=6844&side=provider&timestamp=1560410521877, urls: [empty://192.168.21.1:20880/com.kuake.springboot.service.ProviderService?anyhost=true&application=provider&category=configurators&check=false&dubbo=2.0.1&generic=false&interface=com.kuake.springboot.service.ProviderService&methods=providerService&pid=6844&side=provider&timestamp=1560410521877], dubbo version: 2.0.1, current host: 192.168.21.1
  19. 2019-06-13 15:22:02.270 INFO 6844 --- [ main] s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat started on port(s): 8080 (http)
  20. 2019-06-13 15:22:02.275 INFO 6844 --- [ main] c.k.s.SpringbootDubboProviderApplication : Started SpringbootDubboProviderApplication in 4.762 seconds (JVM running for 6.592)
  21. 2019-06-13 15:24:29.233 WARN 6844 --- [ver worker #1-1] c.a.d.remoting.transport.AbstractServer : [DUBBO] All clients has discontected from /192.168.21.1:20880. You can graceful shutdown now., dubbo version: 2.0.1, current host: 192.168.21.1
  22. 2019-06-13 15:24:29.234 INFO 6844 --- [:20880-thread-3] c.a.d.rpc.protocol.dubbo.DubboProtocol : [DUBBO] disconected from /192.168.21.1:9130,url:dubbo://192.168.21.1:20880/com.kuake.springboot.service.ProviderService?anyhost=true&application=provider&bind.ip=192.168.21.1&bind.port=20880&channel.readonly.sent=true&codec=dubbo&dubbo=2.0.1&generic=false&heartbeat=60000&interface=com.kuake.springboot.service.ProviderService&methods=providerService&pid=6844&side=provider&timestamp=1560410521877, dubbo version: 2.0.1, current host: 192.168.21.1

控制台打印了注册服务成功了url地址

(2)消费者,引用服务进行测试

  1. package com.kuake.springboot;
  2. import com.kuake.springboot.userservice.UserService;
  3. import org.junit.Test;
  4. import org.junit.runner.RunWith;
  5. import org.springframework.beans.factory.annotation.Autowired;
  6. import org.springframework.boot.test.context.SpringBootTest;
  7. import org.springframework.test.context.junit4.SpringRunner;
  8. @RunWith(SpringRunner.class)
  9. @SpringBootTest
  10. public class SpringbootDubboConsumerApplicationTests {
  11. @Autowired
  12. UserService userService;
  13. @Test
  14. public void contextLoads() {
  15. System.out.println("我要获得服务");
  16. String service = userService.getService();
  17. System.out.println(service);
  18. }
  19. }

运行上述代码:(控制台打印)

  1. 6.657 seconds (JVM running for 8.246)
  2. 我要获得服务
  3. 我来提供服务啦
  4. 2019-06-13 15:24:19.196 INFO 7648 --- [bboShutdownHook] com.alibaba.dubbo.config.AbstractConfig : [DUBBO] Run shutdown hook now., dubbo version: 2.0.1, current host: 192.168.21.1
  5. 2019-06-13 15:24:19.197 INFO 7648 --- [bboShutdownHook] c.a.d.r.support.AbstractRegistryFactory : [DUBBO] Close all registries [zookeeper://192.168.25.131:2181/com.alibaba.dubbo.registry.RegistryService?application=consumer&dubbo=2.0.1&interface=com.alibaba.dubbo.registry.RegistryService&pid=7648&timestamp=1560410656161], dubbo version: 2.0.1, current host: 192.168.21.1
  6. 2019-06-13 15:24:19.197 INFO 7648 --- [bboShutdownHook] c.a.d.r.zookeeper.ZookeeperRegistry : [DUBBO] Destroy registry:zookeeper://192.168.25.131:2181/com.alibaba.dubbo.registry.RegistryService?application=consumer&dubbo=2.0.1&interface=com.alibaba.dubbo.registry.RegistryService&pid=7648&timestamp=1560410656161, dubbo version: 2.0.1, current host: 192.168.21.1
  7. 2019-06-13 15:24:19.197 INFO 7648 --- [bboShutdownHook] c.a.d.r.zookeeper.ZookeeperRegistry : [DUBBO] Unregister: consumer://192.168.21.1/com.kuake.springboot.service.ProviderService?application=consumer&category=consumers&check=false&dubbo=2.0.1&interface=com.kuake.springboot.service.ProviderService&methods=providerService&pid=7648&side=consumer&timestamp=1560410656099, dubbo version: 2.0.1, current host: 192.168.21.1
  8. 2019-06-13 15:24:19.201 INFO 7648 --- [ Thread-4] o.s.w.c.s.GenericWebApplicationContext : Closing org.springframework.web.context.support.GenericWebApplicationContext@568ff82: startup date [Thu Jun 13 15:24:12 CST 2019]; root of context hierarchy
  9. 2019-06-13 15:24:19.207 INFO 7648 --- [ Thread-4] f.a.ReferenceAnnotationBeanPostProcessor : <dubbo:reference object="com.alibaba.dubbo.common.bytecode.proxy0@5eefa415" singleton="true" interface="com.kuake.springboot.service.ProviderService" uniqueServiceName="com.kuake.springboot.service.ProviderService" filter="" listener="" generic="false" id="com.kuake.springboot.service.ProviderService" /> was destroying!
  10. 2019-06-13 15:24:19.208 INFO 7648 --- [ Thread-4] f.a.ReferenceAnnotationBeanPostProcessor : class com.alibaba.dubbo.config.spring.beans.factory.annotation.ReferenceAnnotationBeanPostProcessor was destroying!

成功调用了UserService#getService方法,而getService方法是远程调用生产者发布到注册中心的服务,测试成功

发表评论

表情:
评论列表 (有 0 条评论,1122人围观)

还没有评论,来说两句吧...

相关阅读

    相关 SpringBoot整合Dubbo

    Dubbo简介 Dubbo是Alibaba开源的分布式服务框架,它最大的特点是按照分业务的架构,使用这种方式可以使各个业务之间解耦合(或者最大限度地松耦合)。 简单来说

    相关 SpringBoot整合dubbo

    SpringBoot整合dubbo Dubbo是阿里巴巴公司开源的一个高性能优秀的服务框架,使得应用可通过高性能的 RPC 实现服务的输出和输入功能,可以和Spring框

    相关 springboot整合dubbo

    本文主要通过代码示例来说明springboot和dubbo的整合方式 以下是核心代码示例,其他的资源整合配置和spring+Dubbo相同 声明下:dubbo网址在下面配

    相关 SpringBoot整合Dubbo

    前言   Dubbo 是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案。   简单来说,Dubbo 用于分布式的场景。

    相关 SpringBoot整合dubbo

    1.什么是Dubbo Dubbo是Alibaba开源的分布式服务框架,它最大的特点是按照分层的方式来架构,使用这种方式可以使各个层之间解耦合(或者最大限度地松耦合)。从服