Dubbo的基本使用

 


1、Dubbo的基本介绍

Dubbo 是阿里巴巴公司开源的一个高性能、轻量级的 Java RPC 框架。 它提供了三大核心能力:面向接口的远程方法调用,智能容错和负载均衡,以及服务自动注册和发现。 

 

1.1、基本概念

 

  • 服务提供者Provider:暴露服务的服务提供方,服务提供者在启动时,向注册中心注册自己提供的服务。
  • 服务消费者Consumer调用远程服务的服务消费方,服务消费者在启动时,向注册中心订阅自己所需的服务,服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。
  • 注册中心Registry:注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者
  • 监控中心Monitor:服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心

调用关系说明:

  1. 服务容器负责启动,加载,运行服务提供者。
  2. 服务提供者在启动时,向注册中心注册自己提供的服务。
  3. 服务消费者在启动时,向注册中心订阅自己所需的服务。
  4. 注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者。
  5. 服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。

 

 

2、zookeeper(注册中心)

Zookeeper是一个高性能的,分布式的,开放源码的分布式应用程序协调服务,简称zk。

 

2.1、zookeeper 下载

下载可在官网下载,如 3.4.11 地址参考:https://archive.apache.org/dist/zookeeper/zookeeper-3.4.11/

 

2.2、zookeper安装使用(window版)

ZooKeeper服务器是用Java创建的,它运行在JVM之上。需要安装JDK 7或更高版本。

zookeeper 下载后直接解压即可。在bin文件下,直接通过命令行执行 zkServer.cmd 即为启动 zookeeper。

第一次启动时可能会有报错,如下:

此时只需在 conf 目录下将 zoo_sample.cfg 文件复制一份,将名字改为 zoo.cfg 即可。打开 zoo.cfg 文件,可以看到内容如下:

可以将 dataDir 路径修改为我们想要保存文件的路径,如:../data,然后建立相应的目录即可。

再次启动 zookeeper,可以看到可正常启动,输出如下:

可以运行 zkCli.cmd 连接到zookeeper的服务器,如下:

 

2.3、zookeper安装使用(Linux版)

ZooKeeper服务器是用Java创建的,它运行在JVM之上。需要安装JDK 7或更高版本。

 

将下载的ZooKeeper放到/opt/ZooKeeper目录下:

复制代码
  1. #打开 opt目录
  2. cd /opt
  3. #创建zooKeeper目录
  4. mkdir zooKeeper
  5. #将zookeeper安装包移动到 /opt/zooKeeper
  6. mv apache-zookeeper-3.5.6-bin.tar.gz /opt/zookeeper/
复制代码

将tar包解压到/opt/zookeeper目录下

  1. tar -zxvf apache-zookeeper-3.5.6-bin.tar.gz

配置zoo.cfg

  1. #进入到conf目录
  2. cd /opt/zooKeeper/apache-zookeeper-3.5.6-bin/conf/
  3. #拷贝
  4. cp zoo_sample.cfg zoo.cfg

修改zoo.cfg

复制代码
  1. #打开目录
  2. cd /opt/zooKeeper/
  3. #创建zooKeeper存储目录
  4. mkdir zkdata
  5. #修改zoo.cfg
  6. vim /opt/zooKeeper/apache-zookeeper-3.5.6-bin/conf/zoo.cfg
复制代码

修改存储目录:dataDir=/opt/zookeeper/zkdata

 

 

启动ZooKeeper 

  1. cd /opt/zooKeeper/apache-zookeeper-3.5.6-bin/bin/
  2. #启动
  3. ./zkServer.sh start

看到下图表示ZooKeeper成功启动

 

2.3.1、查看ZooKeeper状态

查看ZooKeeper状态

  1. ./zkServer.sh status

下图表示zookeeper启动成功。standalone代表zk没有搭建集群,现在是单节点

 

 下图表示zookeeper没有启动

 

3、提供者消费者示例

(建议参考 3.2、springboot搭建dubbo示例)

3.1、spring搭建dubbo示例

基于以下图实现服务 提供者、消费者,即以用户服务作为提供者,订单服务作为消费者。

分别创建 maven 工程 user-service-provider、order-service-consumer,还需要创建一个专门用于存服务接口的工程 dubbo-interface。

提供者工程 user-service-provider 引入以下依赖:(dubbo依赖会自动引入 spring 的相关依赖),另外需要引入 dubbo-interface 工程。

复制代码
  1. <dependencies>
  2. <!-- 引入dubbo -->
  3. <!-- https://mvnrepository.com/artifact/com.alibaba/dubbo -->
  4. <dependency>
  5. <groupId>com.alibaba</groupId>
  6. <artifactId>dubbo</artifactId>
  7. <version>2.6.2</version>
  8. </dependency>
  9.  
  10. <!-- 注册中心使用的是zookeeper,引入操作zookeeper的客户端 -->
  11. <!--
  12. 由于我们使用zookeeper作为注册中心,所以需要操作zookeeper
  13. dubbo 2.6以前的版本引入zkclient操作zookeeper
  14. dubbo 2.6及以后的版本引入curator操作zookeeper
  15. 下面两个zk客户端根据dubbo版本2选1即可
  16. -->
  17. <dependency>
  18. <groupId>org.apache.curator</groupId>
  19. <artifactId>curator-framework</artifactId>
  20. <version>2.12.0</version>
  21. </dependency>
  22.  
  23. </dependencies>
复制代码

提供者工程添加配置文件 provider.xml,并添加以下配置内容:

复制代码
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
  5. xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
  6. http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd
  7. http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
  8.  
  9. <!-- 1、指定当前服务/应用的名字(同样的服务名字相同,不要和别的服务同名) -->
  10. <dubbo:application name="user-service-provider"></dubbo:application>
  11. <!-- 2、指定注册中心的位置 -->
  12. <!-- <dubbo:registry address="zookeeper://127.0.0.1:2181"></dubbo:registry> -->
  13. <dubbo:registry protocol="zookeeper" address="127.0.0.1:2181"></dubbo:registry>
  14. <!-- 3、指定通信规则(通信协议?通信端口) -->
  15. <dubbo:protocol name="dubbo" port="20882"></dubbo:protocol>
  16. <!-- 4、暴露服务 ref:指向服务的真正的实现对象 -->
  17. <dubbo:service interface="com.atguigu.gmall.service.UserService"
  18. ref="userServiceImpl01" timeout="1000" version="1.0.0">
  19. <dubbo:method name="getUserAddressList" timeout="1000"></dubbo:method>
  20. </dubbo:service>
  21. <!-- 服务的实现 -->
  22. <bean id="userServiceImpl01" class="com.atguigu.gmall.service.impl.UserServiceImpl"></bean>
  23. <!--统一设置服务提供方的规则 -->
  24. <dubbo:provider timeout="1000"></dubbo:provider>
  25. <dubbo:service interface="com.atguigu.gmall.service.UserService"
  26. ref="userServiceImpl02" timeout="1000" version="2.0.0">
  27. <dubbo:method name="getUserAddressList" timeout="1000"></dubbo:method>
  28. </dubbo:service>
  29. <bean id="userServiceImpl02" class="com.atguigu.gmall.service.impl.UserServiceImpl2"></bean>
  30. <!-- 连接监控中心 -->
  31. <dubbo:monitor protocol="registry"></dubbo:monitor>
  32. </beans>
复制代码

暴露的服务的实现类 UserServiceImpl、UserServiceImpl2 代码大概如下:

复制代码
  1. public class UserServiceImpl2 implements UserService {
  2. @Override
  3. public List<UserAddress> getUserAddressList(String userId) {
  4. System.out.println("UserServiceImpl.....new...");
  5. UserAddress address1 = new UserAddress(1, "北京市昌平区宏福科技园综合楼3层", "1", "李老师", "010-56253825", "Y");
  6. UserAddress address2 = new UserAddress(2, "深圳市宝安区西部硅谷大厦B座3层(深圳分校)", "1", "王老师", "010-56253825", "N");
  7. return Arrays.asList(address1,address2);
  8. }
  9. }
复制代码

启动提供者,main 方法如下:

复制代码
  1. public class MainApplication {
  2. public static void main(String[] args) throws IOException {
  3. ClassPathXmlApplicationContext ioc = new ClassPathXmlApplicationContext("provider.xml");
  4. ioc.start();
  5. System.in.read();
  6. }
  7. }
复制代码

启动提供者后可以在管理控制台看到注册的服务:

 

在消费者工程引入依赖:

复制代码
  1. <dependencies>
  2.  
  3. <!-- 引入dubbo -->
  4. <dependency>
  5. <groupId>com.alibaba</groupId>
  6. <artifactId>dubbo</artifactId>
  7. <version>2.6.2</version>
  8. </dependency>
  9. <!-- 注册中心使用的是zookeeper,引入操作zookeeper的客户端端 -->
  10. <dependency>
  11. <groupId>org.apache.curator</groupId>
  12. <artifactId>curator-framework</artifactId>
  13. <version>2.12.0</version>
  14. </dependency>
  15.  
  16. </dependencies>
复制代码

消费者工程添加配置文件 consumer.xml,并添加以下配置内容:

复制代码
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xmlns:dubbo="http://dubbo.apache.org/schema/dubbo"
  5. xmlns:context="http://www.springframework.org/schema/context"
  6. xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
  7. http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd
  8. http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd
  9. http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
  10. <context:component-scan base-package="com.atguigu.gmall.service.impl"></context:component-scan>
  11.  
  12. <dubbo:application name="order-service-consumer"></dubbo:application>
  13. <dubbo:registry address="zookeeper://127.0.0.1:2181"></dubbo:registry>
  14. <!-- 配置本地存根-->
  15. <!--声明需要调用的远程服务的接口;生成远程服务代理 -->
  16. <!--
  17. 1)、精确优先 (方法级优先,接口级次之,全局配置再次之)
  18. 2)、消费者设置优先(如果级别一样,则消费方优先,提供方次之)
  19. -->
  20. <!-- timeout="0" 默认是1000ms-->
  21. <!-- retries="":重试次数,不包含第一次调用,0代表不重试-->
  22. <!-- 幂等(设置重试次数)【查询、删除、修改】、非幂等(不能设置重试次数)【新增】 -->
  23. <dubbo:reference interface="com.atguigu.gmall.service.UserService"
  24. id="userService" timeout="5000" retries="3" version="*">
  25. <!-- <dubbo:method name="getUserAddressList" timeout="1000"></dubbo:method> -->
  26. </dubbo:reference>
  27. <!-- 配置当前消费者的统一规则:所有的服务都不检查 -->
  28. <dubbo:consumer check="false" timeout="5000"></dubbo:consumer>
  29.  
  30. <dubbo:monitor protocol="registry"></dubbo:monitor>
  31. <!-- <dubbo:monitor address="127.0.0.1:7070"></dubbo:monitor> -->
  32. </beans>
复制代码

消费者建一个实现类,直接使用提供者的方法,如下:

复制代码
  1. @Service
  2. public class OrderServiceImpl implements OrderService {
  3.  
  4. @Autowired
  5. UserService userService;
  6. @Override
  7. public List<UserAddress> initOrder(String userId) {
  8. // TODO Auto-generated method stub
  9. System.out.println("用户id:"+userId);
  10. //1、查询用户的收货地址
  11. List<UserAddress> addressList = userService.getUserAddressList(userId);
  12. for (UserAddress userAddress : addressList) {
  13. System.out.println(userAddress.getUserAddress());
  14. }
  15. return addressList;
  16. }
  17. }
复制代码

启动消费者 main 方法,如下:

复制代码
  1. public class MainApplication {
  2. @SuppressWarnings("resource")
  3. public static void main(String[] args) throws IOException {
  4. ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("consumer.xml");
  5. OrderService orderService = applicationContext.getBean(OrderService.class);
  6. orderService.initOrder("1");
  7. System.out.println("调用完成....");
  8. System.in.read();
  9. }
  10. }
复制代码

可以看到输出:

由此,消费者调用提供者提供的服务即完成。

(上面的示例没有把 dubbo-interface 工程具体写出来,可以参考下面 3.2)

 

3.2、springboot搭建dubbo示例

创建工程 dubbotest01,在该工程下创建 module:dubbo-interface、dubbo-provider、dubbo-consumer。其中,dubbo-provider 和 dubbo-consumer 创建为 springboot 项目,可用于测试服务调用,dubbo-interface 只需创建为普通 maven 项目即可,只需在里面管理一些公共接口类。dubbo-interface 后面被打成 jar 包,它的作用只是提供接口。

3.2.1、搭建dubbo-interface 模块

在 dubbo-interface 模块中创建接口类 HelloService,如下:

  1. package com.example.dubbointerface;
  2. public interface HelloService {
  3. public String sayHello(String name);
  4. }

 

3.2.2、搭建dubbo-provider模块

dubbo-provider 中添加依赖,包括dubbo 、zookeeper以及 dubbo-interface 的依赖,如下:

复制代码
  1. <dependencies>
  2. <dependency>
  3. <groupId>org.springframework.boot</groupId>
  4. <artifactId>spring-boot-starter-web</artifactId>
  5. </dependency>
  6. <!--引入dubbo-interface的依赖-->
  7. <dependency>
  8. <groupId>com.example</groupId>
  9. <artifactId>dubbo-interface</artifactId>
  10. <version>0.0.1-SNAPSHOT</version>
  11. </dependency>
  12.  
  13. <!--引入dubbo的依赖-->
  14. <dependency>
  15. <groupId>com.alibaba.spring.boot</groupId>
  16. <artifactId>dubbo-spring-boot-starter</artifactId>
  17. <version>2.0.0</version>
  18. </dependency>
  19. <!-- 引入zookeeper的依赖 -->
  20. <dependency>
  21. <groupId>com.101tec</groupId>
  22. <artifactId>zkclient</artifactId>
  23. <version>0.10</version>
  24. </dependency>
  25. </dependencies>
复制代码

在 application.properties 配置文件中配置 dubbo 相关信息

复制代码
  1. # 配置应用启动端口,避免端口冲突
  2. server.port=8333
  3. spring.dubbo.application.name=dubbo-provider
  4. spring.dubbo.application.registry=zookeeper://192.168.118.131:2181
  5.  
  6. #可通过以下配置修改默认的20880端口
  7. spring.dubbo.protocol.port=20883
复制代码

 

实现 HelloService 接口,如下:

复制代码
  1. import com.alibaba.dubbo.config.annotation.Service;
  2. import org.springframework.stereotype.Component;
  3. @Component
  4. @Service //将这个类提供的方法(服务)对外发布,将访问的地址、ip、路径注册到注册中心。(注意,@Service 注解使用的时 Dubbo 提供的而不是 Spring 提供的。)
  5. public class HelloServiceImpl implements HelloService {
  6. @Override
  7. public String sayHello(String name) {
  8. return "Hello " + name;
  9. }
  10. }
复制代码

给启动类加上 @EnableDubboConfiguration 注解开启Dubbo 的自动配置。

复制代码
  1. import com.alibaba.dubbo.spring.boot.annotation.EnableDubboConfiguration;
  2. import org.springframework.boot.SpringApplication;
  3. import org.springframework.boot.autoconfigure.SpringBootApplication;
  4. @SpringBootApplication
  5. // 开启dubbo的自动配置
  6. @EnableDubboConfiguration
  7. public class DubboProviderApplication {
  8. public static void main(String[] args) {
  9. SpringApplication.run(DubboProviderApplication.class, args);
  10. }
  11. }
复制代码

 

3.2.3、搭建dubbo-consumer模块

dubbo-consumer 中添加依赖,包括dubbo 、zookeeper以及 dubbo-interface 的依赖,如下:

复制代码
  1. <dependencies>
  2. <dependency>
  3. <groupId>org.springframework.boot</groupId>
  4. <artifactId>spring-boot-starter-web</artifactId>
  5. </dependency>
  6.  
  7. <dependency>
  8. <groupId>com.example</groupId>
  9. <artifactId>dubbo-interface</artifactId>
  10. <version>0.0.1-SNAPSHOT</version>
  11. </dependency>
  12. <!--引入dubbo的依赖-->
  13. <dependency>
  14. <groupId>com.alibaba.spring.boot</groupId>
  15. <artifactId>dubbo-spring-boot-starter</artifactId>
  16. <version>2.0.0</version>
  17. </dependency>
  18. <!-- 引入zookeeper的依赖 -->
  19. <dependency>
  20. <groupId>com.101tec</groupId>
  21. <artifactId>zkclient</artifactId>
  22. <version>0.10</version>
  23. </dependency>
  24. </dependencies>
复制代码

在 application.properties 配置文件中配置 dubbo 相关信息

复制代码
  1. # 配置端口
  2. server.port=8330
  3. spring.dubbo.application.name=dubbo-consumer
  4. spring.dubbo.application.registry=zookeeper://192.168.118.131:2181
  5.  
  6. #可通过以下配置修改默认的20880端口
  7. spring.dubbo.protocol.port=20884
复制代码

 

编写一个简单 Controller ,HelloController 来调用远程服务,如下:

复制代码
  1. import com.alibaba.dubbo.config.annotation.Reference;
  2. import com.example.dubbointerface.HelloService;
  3. import org.springframework.web.bind.annotation.RequestMapping;
  4. import org.springframework.web.bind.annotation.RestController;
  5. @RestController
  6. public class HelloController {
  7. /**
  8. 1.从zookeeper注册中心获取对应服务提供者的访问路径
  9. 2.进行远程调用RPC
  10. 3.将结果封装为一个代理对象,给变量赋值
  11. */
  12. @Reference //远程注入
  13. private HelloService helloService;
  14. @RequestMapping("/hello")
  15. public String hello() {
  16. String hello = helloService.sayHello("world");
  17. System.out.println(helloService.sayHello("SnailClimb"));
  18. return hello;
  19. }
  20. }
复制代码

给启动类加上 @EnableDubboConfiguration 注解开启Dubbo 的自动配置。

复制代码
  1. import com.alibaba.dubbo.spring.boot.annotation.EnableDubboConfiguration;
  2. import org.springframework.boot.SpringApplication;
  3. import org.springframework.boot.autoconfigure.SpringBootApplication;
  4. import org.springframework.context.annotation.ImportResource;
  5. @SpringBootApplication
  6. @EnableDubboConfiguration
  7. public class DubboConsumerApplication {
  8. public static void main(String[] args) {
  9. SpringApplication.run(DubboConsumerApplication.class, args);
  10. }
  11. }
复制代码

启动 zookeeper,启动 provider 和 consumer 服务,调用 consumer 服务的 HelloController 类,即访问 http://localhost:8330/hello,可以看到输出如下:

 由此,使用SpringBoot+Dubbo 搭建分布式服务成功。

 

4、zookeeper管理控制台(dubbo-admin)

dubbo-admin 管理平台,是图形化的服务管理页面。该平台从注册中心中获取到所有的提供者 / 消费者,可进行配置管理 路由规则、动态配置、服务降级、访问控制、权重调整、负载均衡等管理功能。

 

4.1、dubbo-admin的安装使用

4.1.1、dubbo-admin下载打包

dubbo-admin 是一个前后端分离的项目,前端使用vue,后端使用springboot。

dubbo-admin下载地址 :https://github.com/apache/dubbo-admin

下载解压后进入 dubbo-admin-server\src\main\resources 目录,找到 application.properties 配置文件进行配置修改,将 zookeeper 地址修改为正确地址,如:

  1. # centers in dubbo2.7, if you want to add parameters, please add them to the url
  2. admin.registry.address=zookeeper://192.168.118.131:2181
  3. admin.config-center=zookeeper://192.168.118.131:2181
  4. admin.metadata-report.address=zookeeper://192.168.118.131:2181

在 dubbo-admin-develop 根目录执行打包命令:mvn clean package -Dmaven.test.skip=true,看到 build success 即打包成功。

  1. 或者先在 dubbo-admin-server 中打包,使用 mvn package -Dmaven.test.skip=true ,
  2. 然后 java -jar 启动打包生成的 jar 包,如:java -jar dubbo-admin-server-0.3.0.jar。
  3. 然后再去 dubbo-admin-ui 里面执行 npm install 等待下载前端的依赖,完毕后启动前端 npm run dev 

如果 dubbo-admin-server 编译报错,提示 zookeeper server创建失败什么的,可将上面的 admin.registry.address 配置改为:

  1. admin.registry.address=zookeeper://192.168.118.131:2181?blockUntilConnectedWait=100000&timeout=100000

 

4.1.2、启动前后端

切换到目录打包后的后端 jar 包目录:dubbo-Admin-develop\dubbo-admin-distribution\target,执行以下命令启动后台:

  1. java -jar .\dubbo-admin-0.1.jar

在 dubbo-admin-ui 目录下执行以下命令启动前端:

  1. npm run dev

启动完成后即可通过 localhost:8081 看到后台管理页面了,启动结果如下:(默认登录账户密码都是 root)

 

4.2、dubbo-admin的基本使用

可以在服务查询中看到已注册的服务,如下:

 

点击服务的详情,可以看到该服务的详细信息和该服务的消费者,如下:

 

 

posted @   wenxuehai  阅读(1981)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
//右下角添加目录
点击右上角即可分享
微信分享提示