当前位置:   article > 正文

Dubbo基础及监控平台安装部署_dubbo监控中心

dubbo监控中心

目录

 

1、Dubbo背景

2、Dubbo基础概念

2.1 架构图

2.2 Dubbo特性

3、Dubbo入门示例

3.1 基本依赖

3.2 服务提供者

3.3 服务消费者

3.4 纯手工API实现(了解)

4、Dubbo常用功能

4.1 启动时检查

4.2 直连提供者

4.3 只订阅

4.4 只注册

4.5 静态服务

4.6 多协议

4.7 多注册中心

4.8 服务分组

4.9 多版本

4.10 分组聚合

4.11 结果缓存

4.12 回声测试

4.13 令牌验证

5、管理控制台搭建

5.1 下载Dubbo全系源码包

5.2 Dubbo全系maven打包

5.3 上传dubbo-admin包

5.4 配置服务注册中心zookeeper地址

6、监控平台搭建

6.1 监控平台作用

6.2 开启monitor服务

6.3 上传监控插件并配置

6.4 启动monitor并访问


1、Dubbo背景

随着互联网的发展,网站应用的规模不断扩大,常规的垂直应用架构已无法应对,分布式服务架构以及流动计算架构势在必行,亟需一个治理系统确保架构有条不紊的演进。

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2h1eGlhbmcxOTg1MTExNA==,size_16,color_FFFFFF,t_70

单一应用架构

当网站流量很小时,只需一个应用,将所有功能都部署在一起,以减少部署节点和成本。此时,用于简化增删改查工作量的数据访问框架(ORM)是关键。

垂直应用架构

当访问量逐渐增大,单一应用增加机器带来的加速度越来越小,提升效率的方法之一是将应用拆成互不相干的几个应用,以提升效率。此时,用于加速前端页面开发的Web框架(MVC)是关键。

分布式服务架构

当垂直应用越来越多,应用之间交互不可避免,将核心业务抽取出来,作为独立的服务,逐渐形成稳定的服务中心,使前端应用能更快速的响应多变的市场需求。此时,用于提高业务复用及整合的分布式服务框架(RPC)是关键。

弹性服务架构

当服务越来越多,容量的评估,小服务资源的浪费等问题逐渐显现,此时需增加一个调度中心基于访问压力实时管理集群容量,提高集群利用率。此时,用于提高机器利用率的资源调度和治理中心(SOA)是关键。

总结:服务的调用量越来越大,服务的容量问题就暴露出来,这个服务需要多少机器支撑?什么时候该加机器?

  • 第一步,要将服务现在每天的调用量,响应时间,都统计出来,作为容量规划的参考指标。

  • 其次,可以动态调整权重,在线上,将某台机器的权重一直加大,并在加大的过程中记录响应时间的变化,直到响应时间到达阈值,记录此时的访问量,再以此访问量乘以机器数反推总容量

以上就是Dubbo的背景需求!

2、Dubbo基础概念

2.1 架构图

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2h1eGlhbmcxOTg1MTExNA==,size_16,color_FFFFFF,t_70

节点角色说明

节点角色说明
Provider暴露服务的服务提供方
Consumer调用远程服务的服务消费方
Registry服务注册与发现的注册中心
Monitor统计服务的调用次数和调用时间的监控中心
Container服务运行容器

调用关系说明

  1. 服务容器负责启动,加载,运行服务提供者。

  2. 服务提供者在启动时,向注册中心注册自己提供的服务。

  3. 服务消费者在启动时,向注册中心订阅自己所需的服务。

  4. 注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者。

  5. 服务消费者,从提供者地址列表中,基于负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。

  6. 统计服务消费者和提供者在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心。

2.2 Dubbo特性

下面是dubbo官方首页关于Dubbo特性的介绍

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2h1eGlhbmcxOTg1MTExNA==,size_16,color_FFFFFF,t_70

延伸:基于此,Dubbo 架构具有以下几个特点,分别是连通性、健壮性、伸缩性、以及向未来架构的升级性。

连通性

  • 注册中心负责服务地址的注册与查找,相当于目录服务,服务提供者和消费者只在启动时与注册中心交互,注册中心不转发请求,压力较小

  • 监控中心负责统计各服务调用次数,调用时间等,统计先在内存汇总后每分钟一次发送到监控中心服务器,并以报表展示

  • 服务提供者向注册中心注册其提供的服务,并汇报调用时间到监控中心,此时间不包含网络开销

  • 服务消费者向注册中心获取服务提供者地址列表,并根据负载算法直接调用提供者,同时汇报调用时间到监控中心,此时间包含网络开销

  • 注册中心,服务提供者,服务消费者三者之间均为长连接,监控中心除外

  • 注册中心通过长连接感知服务提供者的存在,服务提供者宕机,注册中心将立即推送事件通知消费者

  • 注册中心和监控中心全部宕机,不影响已运行的提供者和消费者,消费者在本地缓存了提供者列表

  • 注册中心和监控中心都是可选的,服务消费者可以直连服务提供者

健壮性

  • 监控中心宕掉不影响使用,只是丢失部分采样数据

  • 数据库宕掉后,注册中心仍能通过缓存提供服务列表查询,但不能注册新服务

  • 注册中心集群,任意一台宕掉后,将自动切换到另一台

  • 注册中心全部宕掉后,服务提供者和服务消费者仍能通过本地缓存通讯

  • 服务提供者无状态,任意一台宕掉后,不影响使用

  • 服务提供者全部宕掉后,服务消费者应用将无法使用,并无限次重连等待服务提供者恢复

伸缩性

  • 注册中心为对等集群,可动态增加机器部署实例,所有客户端将自动发现新的注册中心

  • 服务提供者无状态,可动态增加机器部署实例,注册中心将推送新的服务提供者信息给消费者

升级性

当服务集群规模进一步扩大,带动IT治理结构进一步升级,需要实现动态部署,进行流动计算,现有分布式服务架构不会带来阻力。下图是未来可能的一种架构:

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2h1eGlhbmcxOTg1MTExNA==,size_16,color_FFFFFF,t_70

节点角色说明

节点角色说明
Deployer自动部署服务的本地代理
Repository仓库用于存储服务应用发布包
Scheduler调度中心基于访问压力自动增减服务提供者
Admin统一管理控制台
Registry服务注册与发现的注册中心
Monitor统计服务的调用次数和调用时间的监控中心

 

3、Dubbo入门示例

Dubbo 可以采用全Spring配置方式,透明化接入应用,对应用没有任何 API侵入,只需用Spring加载Dubbo的配置即可,Dubbo 基于 Spring 的 Schema扩展进行加载。

3.1 基本依赖

  1. <dependencies>
  2.        <dependency>
  3.            <groupId>org.springframework</groupId>
  4.            <artifactId>spring-context</artifactId>
  5.            <version>5.2.9.RELEASE</version>
  6.        </dependency>
  7.        <dependency>
  8.            <groupId>org.apache.zookeeper</groupId>
  9.            <artifactId>zookeeper</artifactId>
  10.            <version>3.4.9</version>
  11.        </dependency>
  12.        <dependency>
  13.            <groupId>com.101tec</groupId>
  14.            <artifactId>zkclient</artifactId>
  15.            <version>0.10</version>
  16.        </dependency>
  17.        <dependency>
  18.            <groupId>com.alibaba</groupId>
  19.            <artifactId>dubbo</artifactId>
  20.            <version>2.5.3</version>
  21.        </dependency>
  22.        <dependency>
  23.            <groupId>junit</groupId>
  24.            <artifactId>junit</artifactId>
  25.            <version>4.13</version>
  26.        </dependency>
  27.    </dependencies>

3.2 服务提供者

3.2.1 需要暴露的接口

  1. package com.ydt.dubbo.service;
  2. public interface DemoService {
  3.    String sayHello(String name);
  4. }
  1. package com.ydt.dubbo.service;
  2. public class DemoServiceImpl implements DemoService {
  3.    public String sayHello(String name) {
  4.        return "Hello " + name;
  5.   }
  6. }

3.2.2 Spring配置

  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
  6.       http://www.springframework.org/schema/beans/spring-beans.xsd
  7.       http://code.alibabatech.com/schema/dubbo
  8.       http://code.alibabatech.com/schema/dubbo/dubbo.xsd
  9. ">
  10.    <!-- 提供方应用信息,用于计算依赖关系 -->
  11.    <dubbo:application name="dubbo-provider"/>
  12.    <!-- 用dubbo协议在20880端口暴露服务 消费方只能被动接受-->
  13.    <dubbo:protocol name="dubbo" port="20880"/>
  14.    <!-- 使用zookeeper注册中心暴露地址 -->
  15.    <dubbo:registry address="zookeeper://192.168.223.128" port="2181"/>
  16.    <!-- 和本地bean一样实现服务 -->
  17.    <bean id="demoService" class="com.ydt.dubbo.service.DemoServiceImpl"/>
  18.    <!-- 声明需要暴露的服务接口 -->
  19.    <dubbo:service interface="com.ydt.dubbo.service.DemoService" ref="demoService"/>
  20. </beans>

3.2.3 启动Spring容器注册服务

  1. package com.ydt.dubbo.test;
  2. import org.junit.Test;
  3. import org.springframework.context.support.ClassPathXmlApplicationContext;
  4. import java.io.IOException;
  5. public class DubboProviderTest {
  6.    @Test
  7.    public void test() throws IOException {
  8.        ClassPathXmlApplicationContext context
  9.                = new ClassPathXmlApplicationContext(new String[]{"applicationContext.xml"});
  10.        context.start();
  11.        System.in.read(); // 按任意键退出
  12.   }
  13. }

 

3.3 服务消费者

3.3.1 需要消费的接口

这个地方实际生产中一般会单独列一个接口模块出来,生产者和消费者都依赖它

  1. package com.ydt.dubbo.service;
  2. public interface DemoService {
  3.    String sayHello(String name);
  4. }

3.3.2 Spring配置

  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
  6.       http://www.springframework.org/schema/beans/spring-beans.xsd
  7.       http://code.alibabatech.com/schema/dubbo
  8.       http://code.alibabatech.com/schema/dubbo/dubbo.xsd
  9. ">
  10.    <!-- 消费方应用名,用于计算依赖关系,不是匹配条件,不要与提供方一样 -->
  11.    <dubbo:application name="dubbo-customer"/>
  12.    <!-- 使用zookeeper注册中心发现服务地址 -->
  13.    <dubbo:registry address="zookeeper://192.168.223.128" port="2181"/>
  14.    <!-- 生成远程服务代理,可以和本地bean一样使用demoService -->
  15.    <dubbo:reference id="demoService" interface="com.ydt.dubbo.service.DemoService" />
  16. </beans>

3.3.3 消费者测试

  1. package com.ydt.dubbo.test;
  2. import com.ydt.dubbo.service.DemoService;
  3. import org.junit.Test;
  4. import org.springframework.context.support.ClassPathXmlApplicationContext;
  5. public class DubboCustomerTest {
  6.   @Test
  7.   public void test(){
  8.       ClassPathXmlApplicationContext context
  9.               = new ClassPathXmlApplicationContext(new String[] {"applicationContext.xml"});
  10.       context.start();
  11.       DemoService demoService = (DemoService)context.getBean("demoService"); // 获取远程服务代理
  12.       String hello = demoService.sayHello("world"); // 执行远程方法
  13.       System.out.println( hello ); // 显示调用结果
  14.   }
  15. }

20210309230233660.png

3.4 纯手工API实现(了解)

3.4.1 生产者

  1. //纯手工服务发布
  2. @Test
  3. public void test2(){
  4.    DemoService demoService = new DemoServiceImpl();
  5.    // 当前应用配置
  6.    ApplicationConfig application = new ApplicationConfig();
  7.    application.setName("dubbo-privider");
  8.    // 连接注册中心配置
  9.    RegistryConfig registry = new RegistryConfig();
  10.    registry.setPort(2181);
  11.    registry.setAddress("zookeeper://192.168.223.128");
  12.    // 服务提供者协议配置
  13.    ProtocolConfig protocol = new ProtocolConfig();
  14.    protocol.setName("dubbo");
  15.    protocol.setPort(21880);
  16.    // 注意:ServiceConfig为重对象,内部封装了与注册中心的连接,以及开启服务端口
  17.    // 服务提供者暴露服务配置,此实例很重,封装了与注册中心的连接,请自行缓存,否则可能造成内存和连接泄漏
  18.    ServiceConfig<DemoService> service = new ServiceConfig<DemoService>();
  19.    service.setApplication(application);
  20.    // 多个注册中心可以用setRegistries(),至于消费者,你去对应的注册中心发现服务即可
  21.    service.setRegistry(registry);
  22.    // 多个协议可以用setProtocols(),消费者被动接受
  23.    service.setProtocol(protocol);
  24.    service.setInterface(DemoService.class);
  25.    service.setRef(demoService);
  26.    service.setVersion("1.0.0");
  27.    // 暴露及注册服务
  28.    service.export();
  29.    while (true);
  30. }

3.4.2 消费者

  1. //纯手工消费
  2. @Test
  3. public void test2(){
  4.    // 当前应用配置
  5.    ApplicationConfig application = new ApplicationConfig();
  6.    application.setName("dubbo-customer");
  7.    // 连接注册中心配置
  8.    RegistryConfig registry = new RegistryConfig();
  9.    registry.setPort(2181);
  10.    registry.setAddress("zookeeper://192.168.223.128");
  11.    // 注意:ReferenceConfig为重对象,内部封装了与注册中心的连接,以及与服务提供方的连接
  12.    // 引用远程服务,此实例很重,封装了与注册中心的连接以及与提供者的连接,请自行缓存,否则可能造成内存和连接泄漏
  13.    ReferenceConfig<DemoService> reference = new ReferenceConfig<DemoService>();
  14.    reference.setApplication(application);
  15.    reference.setRegistry(registry); // 多个注册中心可以用setRegistries()
  16.    reference.setInterface(DemoService.class);
  17.    reference.setVersion("1.0.0");
  18.    // 和本地bean一样使用demoService
  19.    // 注意:此代理对象内部封装了所有通讯细节,对象较重,请缓存复用
  20.    DemoService demoService = reference.get();
  21.    System.out.println(demoService.sayHello("laohu"));
  22. }

 

4、Dubbo常用功能

4.1 启动时检查

Dubbo服务消费者默认会在启动时检查依赖的服务是否可用,不可用时会抛出异常,阻止 Spring 初始化完成,以便上线时,能及早发现问题,默认 check="true"。可以通过 check="false" 关闭检查,比如,测试时,有些服务不关心,或者出现了循环依赖,必须有一方先启动。

另外,如果你的服务提供者Spring容器是懒加载的,请关闭消费者的check,否则服务临时不可用时,会抛出异常,拿到null引用,如果check="false",总是会返回引用(null也是一种引用),当服务恢复时,能自动连上。

 <dubbo:reference id="demoService" interface="com.ydt.dubbo.service.DemoService" check="true"/>

20210309230247894.png

4.2 直连提供者

在开发及测试环境下,经常需要绕过注册中心,只测试指定服务提供者,这时候可能需要点对点直连,点对点直连方式,将以服务接口为单位,忽略注册中心的提供者列表,A 接口配置点对点,不影响 B 接口从注册中心获取列表

  1. <!-- 绕开注册中心,直接指向服务提供者 -->
  2.    <!--<dubbo:registry address="zookeeper://192.168.223.128" port="2181"/>-->
  3.    <!-- 生成远程服务代理,可以和本地bean一样使用demoService -->
  4.    <dubbo:reference id="demoService" interface="com.ydt.dubbo.service.DemoService" url="dubbo://127.0.0.1:20880"/>

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2h1eGlhbmcxOTg1MTExNA==,size_16,color_FFFFFF,t_70

4.3 只订阅

为方便开发测试,经常会在线下共用一个所有服务可用的注册中心,这时,如果一个正在开发中的服务提供者注册,可能会影响消费者不能正常运行。可以让服务提供者开发方,只订阅服务(开发的服务可能依赖其它服务),而不注册正在开发的服务,通过直连测试正在开发的服务。

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2h1eGlhbmcxOTg1MTExNA==,size_16,color_FFFFFF,t_70

  1. <!--服务提供者-->
  2. <dubbo:registry address="zookeeper://192.168.223.128" port="2181" register="false"/>

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2h1eGlhbmcxOTg1MTExNA==,size_16,color_FFFFFF,t_70

  1. <!--服务消费者-->
  2. <!-- 使用zookeeper注册中心发现服务地址 -->
  3. <!--<dubbo:registry address="zookeeper://192.168.223.128" port="2181"/>-->
  4. <!-- 生成远程服务代理,可以和本地bean一样使用demoService -->
  5. <dubbo:reference id="demoService" interface="com.ydt.dubbo.service.DemoService" url="dubbo://127.0.0.1:20880"/>

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2h1eGlhbmcxOTg1MTExNA==,size_16,color_FFFFFF,t_70

4.4 只注册

如果有两个镜像环境,两个注册中心,有一个服务(C)只在其中一个注册中心(R1)有部署,另一个注册中心(R2)没有部署,服务A和B会依赖于D,需要将服务D同时注册到两个注册中心,D又依赖于C,但却不能让D服务同时依赖于两个注册中心的服务,因为C只在R1中有注册。

可以让服务提供者,注册服务D到两个注册中心(R1和R2),但只从一个注册中心(R1)订阅服务,D服务对于R2来讲就是只注册。

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2h1eGlhbmcxOTg1MTExNA==,size_16,color_FFFFFF,t_70

  1. <!--服务提供者-->
  2. <dubbo:registry address="zookeeper://192.168.223.129" port="2181"/>
  1. <!--服务消费者-->
  2. <dubbo:registry address="zookeeper://192.168.223.128" port="2181"/>
  3. <dubbo:registry address="zookeeper://192.168.223.129" port="2181" subscribe="false"/>

20210309230651979.png

 

4.5 静态服务

有时候希望人工管理服务提供者的上线和下线,此时需将注册中心标识为非动态管理模式。

  1. <!--服务提供者-->
  2. <dubbo:registry address="zookeeper://192.168.223.128" port="2181" dynamic="false"/>

服务提供者初次注册时为禁用状态,需人工启用。断线时,将不会被自动删除,需人工禁用。

如果是一个第三方服务提供者(必须可用),可以直接向注册中心写入提供者地址信息,消费者正常使用

  1. //静态服务启用
  2.    @Test
  3.    public void test3(){
  4.        RegistryFactory registryFactory = ExtensionLoader.getExtensionLoader(RegistryFactory.class).getAdaptiveExtension();
  5.        Registry registry = registryFactory.getRegistry(URL.valueOf("zookeeper://192.168.223.128:2181"));
  6.        //注意该服务必须为可用
  7.        registry.register(URL.valueOf("dubbo://127.0.0.1:20880/com.ydt.dubbo.service.DemoService"));
  8.   }
  9.    //静态服务禁用
  10.    @Test
  11.    public void test4(){
  12.        RegistryFactory registryFactory = ExtensionLoader.getExtensionLoader(RegistryFactory.class).getAdaptiveExtension();
  13.        Registry registry = registryFactory.getRegistry(URL.valueOf("zookeeper://192.168.223.128:2181"));
  14.        registry.unregister(URL.valueOf("dubbo://127.0.0.1:20880/com.ydt.dubbo.service.DemoService"));
  15.   }

4.6 多协议

Dubbo 允许配置多协议,在不同服务上支持不同协议或者同一服务上同时支持多种协议。

不同服务在性能上适用不同协议进行传输,比如大数据用短连接协议,小数据大并发用长连接协议,当然同一个服务也可以同时以不同的协议进行发布,消费者使用其中之一接受即可!

  1. <!------------------------------------------服务提供者---------------------------------------------------------->
  2. <!-- 声明多个协议端口,如果不声明,使用默认端口,具体查看Protocol接口获取缺省端口具体实现 -->
  3. <dubbo:protocol name="dubbo" port="20880"/>
  4. <dubbo:protocol name="rmi" port="20881"/>
  5. <!-- 声明需要暴露的服务接口 -->
  6. <dubbo:service interface="com.ydt.dubbo.service.DemoService" ref="demoService" protocol="dubbo"/>
  7. <dubbo:service interface="com.ydt.dubbo.service.DemoService2" ref="demoService2" protocol="rmi"/>
  1. <!--------------------------------------------------------服务消费者---------------------------------------------------------->
  2. <!--不设置默认使用dubbo,可以专门指定,当然也必须指定,都说了消费者需要被动接受 -->
  3. <dubbo:reference id="demoService" interface="com.ydt.dubbo.service.DemoService"/>
  4. <dubbo:reference id="demoService2" interface="com.ydt.dubbo.service.DemoService2" protocol="rmi"/>

Dubbo支持的常见协议

 特性传输协议序列化方式适用范围
dubbo缺省协议,单一长连接基于TCP的NIO异步传输基于hessian作为序列化协议传入传出参数数据包较小(建议小于100K),消费者比提供者个数多,单一消费者无法压满提供者,尽量不要用dubbo协议传输大文件或超大字符串
rmi阻塞式短连接基于TCP的同步传输java二进制序列化传入传出参数数据包大小混合,消费者与提供者个数差不多,可传文件。
hessian多个短连接基于HTTP的同步传输hessian序列化协议传入传出参数数据包较大,提供者比消费者个数多,提供者压力较大,可传文件。
http多个短连接基于HTTP的同步传输json序列化传入传出参数数据包大小混合,提供者比消费者个数多,可用浏览器查看,可用表单或URL传入参数,暂不支持传文件。
webservice多个短连接基于 WebService 的HTTP协议远程调用SOAP文本序列化系统集成,跨语言调用
memcached基于memcached实现的RPC协议   
redis基于Redis实现的RPC协议   
  1. 面试题:
  2. 1、dubbo 默认使用什么序列化框架,你知道的还有哪些?
  3. 默认使用Hessian序列化。还有Duddo、FastJson、Java自带序列化。
  4. 2、dubbo推荐用什么协议?
  5. 默认使用dubbo协议。

4.7 多注册中心

Dubbo 支持同一服务向多注册中心同时注册,或者不同服务分别注册到不同的注册中心上去,甚至可以同时引用注册在不同注册中心上的同名服务。另外,注册中心是支持自定义扩展的。

多注册中心分开注册,主要是为了区分服务面向的依赖对象!

  1. <!--------------------------------------------------------服务提供者---------------------------------------------------------->
  2. <!-- 使用zookeeper注册中心暴露地址 -->
  3. <dubbo:registry id="aaa" address="zookeeper://192.168.223.128" port="2181"/>
  4. <dubbo:registry id="bbb" address="zookeeper://192.168.223.129" port="2181"/>
  5. <!-- 声明需要暴露的服务接口 -->
  6. <dubbo:service interface="com.ydt.dubbo.service.DemoService" ref="demoService" registry="aaa"/>
  7. <dubbo:service interface="com.ydt.dubbo.service.DemoService2" ref="demoService2" registry="aaa,bbb"/>
  1. <!--------------------------------------------------------服务消费者---------------------------------------------------------->
  2. <!-- 使用zookeeper注册中心发现服务地址 -->
  3. <dubbo:registry id="aaa" address="zookeeper://192.168.223.128" port="2181"/>
  4. <dubbo:registry id="bbb" address="zookeeper://192.168.223.129" port="2181"/>
  5. <!-- 生成远程服务代理,可以和本地bean一样使用demoService -->
  6. <dubbo:reference id="demoService" interface="com.ydt.dubbo.service.DemoService" registry="aaa"/>
  7. <dubbo:reference id="demoService2" interface="com.ydt.dubbo.service.DemoService2" registry="bbb"/>

消费者连接多个注册中心配置:

  1. <!-- 使用zookeeper注册中心发现服务地址 -->
  2. <!-- 多注册中心配置,竖号分隔表示同时连接多个不同注册中心,同一注册中心的多个集群地址用逗号分隔 -->
  3. <dubbo:registry id="aaa" address="zookeeper://192.168.223.128|zookeeper://192.168.223.129" port="2181"/>
  4. <!-- 生成远程服务代理,可以和本地bean一样使用demoService -->
  5. <dubbo:reference id="demoService" interface="com.ydt.dubbo.service.DemoService"/>
  6. <dubbo:reference id="demoService2" interface="com.ydt.dubbo.service.DemoService2"/>

4.8 服务分组

当一个接口有多种实现时,可以用 group 区分。

  1. <!--------------------------------------------------------服务提供者---------------------------------------------------------->
  2. <!-- DemoServiceImpl2和DemoServiceImpl22实现的同一个接口DemoService2 -->
  3. <bean id="demoService2" class="com.ydt.dubbo.service.DemoServiceImpl2"/>
  4. <bean id="demoService22" class="com.ydt.dubbo.service.DemoServiceImpl22"/>
  5. <!-- 声明需要暴露的服务接口 -->
  6. <dubbo:service group="aaa" interface="com.ydt.dubbo.service.DemoService2" ref="demoService2"/>
  7. <dubbo:service group="bbb" interface="com.ydt.dubbo.service.DemoService2" ref="demoService22"/>
  1. <!--------------------------------------------------------服务消费者---------------------------------------------------------->
  2. <dubbo:reference id="demoService2" group="aaa" interface="com.ydt.dubbo.service.DemoService2"/>
  3. <dubbo:reference id="demoService22" group="bbb" interface="com.ydt.dubbo.service.DemoService2"/>

4.9 多版本

当一个接口实现,出现不兼容升级时,可以用版本号过渡,版本号不同的服务相互间不引用。

可以按照以下的步骤进行版本迁移:

  1. 在低压力时间段,先升级一半提供者为新版本

  2. 再将所有消费者升级为新版本

  3. 然后将剩下的一半提供者升级为新版本

  1. <!-------------------------------服务提供者:同一个服务接口两个实现,使用版本进行区分发布,不影响老版本服务------------------------------------->
  2. <dubbo:service version="1.0.0" interface="com.ydt.dubbo.service.DemoService2" ref="demoService2"/>
  3. <dubbo:service version="2.0.0" interface="com.ydt.dubbo.service.DemoService2" ref="demoService22"/>
  1. <!-------------------------------------服务消费者:使用不同的版本进行消费-------------------------------------------->
  2. <dubbo:reference id="demoService" version="1.0.0" interface="com.ydt.dubbo.service.DemoService2"/>

4.10 分组聚合

按组合并返回结果,比如菜单服务,接口一样,但有多种实现,用group区分,现在消费方需从每种group中调用一次返回结果,合并结果返回,这样就可以实现聚合菜单项。

  1. <!-------------------------------服务提供者:同一个服务接口两个实现,使用分组分别发布------------------------------------->
  2. <dubbo:service group="merger1" interface="com.ydt.dubbo.service.DemoService2" ref="demoService2"/>
  3. <dubbo:service group="merger2" interface="com.ydt.dubbo.service.DemoService2" ref="demoService22"/>
  1. <!-------------------------------------服务消费者:进行合并调用-------------------------------------------->
  2. <dubbo:reference id="demoService2" group="merger1,merger2" interface="com.ydt.dubbo.service.DemoService2">
  3.    <dubbo:method name="getMenuInfo" merger="true"></dubbo:method>
  4. </dubbo:reference>

 

4.11 结果缓存

结果缓存,用于加速热门数据的访问速度,Dubbo 提供声明式缓存,以减少用户加缓存的工作量 。

  • lru 基于最近最少使用原则删除多余缓存,保持最热门的数据被缓存。

  • threadlocal 当前线程缓存,比如一个页面渲染,用到很多 portal,每个 portal 都要去查用户信息,通过线程缓存,可以减少这种多余访问。ThreadLocal对象,这保证了每个线程对应一个HashMap,每个线程只能访问自己的缓存。

  • JCache---自定义缓存实现(实现Cache接口)

  1. <!-------------------------------------服务消费者:多次调用,只会有第一次进入到服务提供者接口-------------------------------------------->
  2. <dubbo:reference id="demoService2" group="merger1,merger2" interface="com.ydt.dubbo.service.DemoService2">
  3.    <dubbo:method name="getMenuInfo" merger="true" cache="lru"></dubbo:method>
  4. </dubbo:reference>

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2h1eGlhbmcxOTg1MTExNA==,size_16,color_FFFFFF,t_70

 

 

4.12 回声测试

回声测试用于检测服务是否可用,回声测试按照正常请求流程执行,能够测试整个调用是否通畅,可用于监控。所有服务自动实现 EchoService 接口,只需将任意服务引用强制转型为 EchoService,即可使用。

  1. ClassPathXmlApplicationContext context
  2.        = new ClassPathXmlApplicationContext(new String[] {"applicationContext.xml"});
  3. // 远程服务引用
  4. DemoService2 demoService = (DemoService2)context.getBean("demoService2");
  5. EchoService echoService = (EchoService) demoService; // 强制转型为EchoService
  6. // 回声测试可用性
  7. String status = (String) echoService.$echo("OK");
  8. System.out.println(status);

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2h1eGlhbmcxOTg1MTExNA==,size_16,color_FFFFFF,t_70

 

4.13 令牌验证

通过令牌验证在注册中心控制权限,以决定要不要下发令牌给消费者,可以防止消费者绕过注册中心访问提供者

  1. <!--随机token令牌,使用UUID生成-->
  2. <dubbo:service interface="com.ydt.dubbo.service.DemoService" ref="demoService" token="true"/>
  3. <!--固定token令牌,相当于密码-->
  4. <dubbo:service interface="com.ydt.dubbo.service.DemoService" ref="demoService" token="123456"/>
  5. <!--消费者消费时必须配置注册中心,并且不能使用url="dubbo://127.0.0.1:20880"这样的直连配置-->

5、管理控制台搭建

5.1 下载Dubbo全系源码包

下载地址:https://github.com/apache/dubbo/tree/2.5.x,也可以下载你心仪的版本,可惜dubbo-admin应用于生产的只能到2.5版本(有缺陷),后续版本分成了好几个项目:https://github.com/apache/dubbo-admin

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2h1eGlhbmcxOTg1MTExNA==,size_16,color_FFFFFF,t_70

 

5.2 Dubbo全系maven打包

进入dubbo根目录,执行命令:mvn clean package -Dmaven.test.skip=true

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2h1eGlhbmcxOTg1MTExNA==,size_16,color_FFFFFF,t_70

 

5.3 上传dubbo-admin包

上传dubbo-admin包到tomcat服务器webapps目录并启动,并且dubbo-admin的作者设计的并不完美,该项目是基于webx的开发的,所以如果你想要不报一些莫名其妙的404错误,将dubbo-admin下面的文件复制到/ROOT目录下(先把tomcat该目录下的引导页文件删除)

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2h1eGlhbmcxOTg1MTExNA==,size_16,color_FFFFFF,t_70

 

启动tomcat:

  1. cd /usr/local/tomcat
  2. ./bin/startup.sh

访问地址:http://192.168.223.128:8080/dubbo-admin-2.5.10/ 使用guest/guest登录

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2h1eGlhbmcxOTg1MTExNA==,size_16,color_FFFFFF,t_70

 

说明部署成功!

5.4 配置服务注册中心zookeeper地址

  1. vim webapps/dubbo-admin-2.5.10/WEB-INF/dubbo.properties
  2. -------------------------------------------配置如下------------------------------------------------
  3. #集群模式zookeeper
  4. #dubbo.registry.address=zookeeper://192.168.223.128:2181?backup=192.168.223.129:2181,192.168.223.130:2181
  5. #单机模式zookeeper
  6. dubbo.registry.address=zookeeper://192.168.223.128:2181
  7. #管理账号
  8. dubbo.admin.root.password=root
  9. #访问账号
  10. dubbo.admin.guest.password=guest

部署dubbo服务注册到zookeeper,并重启tomcat,可以看到zookeeper上注册的服务信息:

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2h1eGlhbmcxOTg1MTExNA==,size_16,color_FFFFFF,t_70

 

注意:管理控制台不是Dubbo搭建分布式系统必须的,但是它可以帮助我们对服务进行更好的治理和监控。

 

6、监控平台搭建

6.1 监控平台作用

Dubbo-Monitor主要是用来统计服务和调用次数和调用时间,服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心,监控中心则使用数据绘制图表来显示。

6.2 开启monitor服务

首先服务消费者和服务提供则都需要开启monitor,开启方式只需要在服务配置spring核心配置文件中添加如下配置即可

  1. <!-- 启动monitor-->
  2. <dubbo:monitor protocol="registry" />

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2h1eGlhbmcxOTg1MTExNA==,size_16,color_FFFFFF,t_70

 

6.3 上传监控插件并配置

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2h1eGlhbmcxOTg1MTExNA==,size_16,color_FFFFFF,t_70

 

  1. tar -zxvf dubbo-monitor-simple-2.5.10-assembly.tar.gz
  2. mv dubbo-monitor-simple-2.5.10/ dubbo-monitor
  3. cd dubbo-monitor/
  4. vim conf/dubbo.properties
  5. --------------------------------------修改配置如下-------------------------------------------------------
  6. dubbo.container=log4j,spring,registry,jetty
  7. dubbo.application.name=simple-monitor
  8. dubbo.application.owner=
  9. # zookeeper注册中心的配置
  10. #dubbo.registry.address=zookeeper://192.168.223.128:2181?backup=192.168.223.129:2181,192.168.223.130:2181
  11. dubbo.registry.address=zookeeper://192.168.223.128:2181
  12. #dubbo.registry.address=redis://127.0.0.1:6379
  13. #dubbo.registry.address=dubbo://127.0.0.1:9090
  14. # monitor提供远程服务监听端口,服务提供者和消费者都会调用这个端口提供服务,发送统计信息到monitor。
  15. dubbo.protocol.port=7070
  16. # jetty容器的监听地址,注意不要端口冲突
  17. dubbo.jetty.port=8081
  18. dubbo.jetty.directory=/usr/local/dubbo-monitor
  19. dubbo.charts.directory=${dubbo.jetty.directory}/charts
  20. dubbo.statistics.directory=${user.home}/monitor/statistics
  21. dubbo.log4j.file=logs/dubbo-monitor-simple.log
  22. dubbo.log4j.level=WARN

6.4 启动monitor并访问

  1. [root@ydt1 dubbo-monitor]# ./bin/start.sh
  2. Starting the simple-monitor .......OK!
  3. PID: 54044
  4. STDOUT: logs/stdout.log

启动成功。登录访问http://192.168.223.128:8081

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2h1eGlhbmcxOTg1MTExNA==,size_16,color_FFFFFF,t_70

 

PS:如果发现统计结果没出现,请打开dubbo-monitor的后台日志查看,如果报如下错误:

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2h1eGlhbmcxOTg1MTExNA==,size_16,color_FFFFFF,t_70

 

说明两个包冲突了,请修改pom.xml文件重新打包:

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2h1eGlhbmcxOTg1MTExNA==,size_16,color_FFFFFF,t_70

 

排除掉dubbo核心包中的dubbo-config-spring和dubbo-remoting-api

  1. <dependency>
  2.            <groupId>com.alibaba</groupId>
  3.            <artifactId>dubbo</artifactId>
  4.            <version>${project.parent.version}</version>
  5. <exclusions>
  6.                <exclusion>
  7.                    <groupId>com.alibaba</groupId>
  8.                    <artifactId>dubbo-config-spring</artifactId>
  9.                </exclusion>
  10.                <exclusion>
  11.                    <groupId>com.alibaba</groupId>
  12.                    <artifactId>dubbo-remoting-api</artifactId>
  13.                </exclusion>
  14.            </exclusions>
  15.        </dependency>

重新进入dubbo-monitor-simple根目录重新maven打包:

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2h1eGlhbmcxOTg1MTExNA==,size_16,color_FFFFFF,t_70

 

重新上传配置即可得到服务的统计数据:

20210309231038396.png

 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/169626
推荐阅读
相关标签
  

闽ICP备14008679号