zoukankan      html  css  js  c++  java
  • Spring Boot----Dubbo

    概述

    治理和维护各个分系统

    参考官网:http://dubbo.apache.org/zh-cn/docs/user/references/registry/introduction.html (可中英文切换)

    下载安装Zookeeper

    linux

      使用docker部署

    windows: 参考(https://blog.csdn.net/ring300/article/details/80446918),下载的zookeeper目录中需要包含lib(内置jar包,否则需要自己导入)

      1、将conf目录下的zoo_sample.cfg文件,复制粘贴一份,重命名为zoo.cfg

      2、创建data目录和log目录

      3、修改zoo.cfg 文件中的

    dataDir=D:ookeeperdata
    datalogDir=D:ookeeperlog
    

      4、启动 双击 zkServer.cmd

    对zoo.cfg文件配置说明

      tickTime:这个时间是作为 Zookeeper 服务器之间或客户端与服务器之间维持心跳的时间间隔,也就是每个 tickTime 时间就会发送一个心跳。

      initLimit:这个配置项是用来配置 Zookeeper 接受客户端(这里所说的客户端不是用户连接 Zookeeper 服务器的客户端,而是 Zookeeper 服务器集群中连接到 Leader 的 Follower 服务器)初始化连接

    时最长能忍受多少个心跳时间间隔数。当已经超过 10 个心跳的时间(也就是 tickTime)长度后 Zookeeper 服务器还没有收到客户端的返回信息,那么表明这个客户端连接失败。总的时间长度就是

    10*2000=20 秒

      syncLimit:这个配置项标识 Leader 与 Follower 之间发送消息,请求和应答时间长度,最长不能超过多少个 tickTime 的时间长度,总的时间长度就是 5*2000=10 秒

      dataDir:顾名思义就是 Zookeeper 保存数据的目录,默认情况下,Zookeeper 将写数据的日志文件也保存在这个目录里。

      clientPort:这个端口就是客户端连接 Zookeeper 服务器的端口,Zookeeper 会监听这个端口,接受客户端的访问请求。

    搭建Dubbo Admin

    源码下载:https://github.com/apache/dubbo-admin/tree/master(注意是master分支,dubbo admin好像在重构)

    具体操作请看官方文档。

    修改 dubbo-admin-masterdubbo-adminsrcmain
    esourcesapplication.properties中的Zookeeper地
    cd dubbo-admin-masterdubbo-admin
    mvn clean package :将所有模块进行打包
    cd  target
    java -jar dubbo-admin-0.0.1-SNAPSHOT.jar

    访问:localhost:7001  密码和用户名都是root

    搭建Dubbo Monitor

    在搭建dubbo admin是下载的文件夹中有一个dubbo-monitor-simple(一个建档的监控信息配置)

    cd  dubbo-admin-masterdubbo-monitor-simple
    mvn clean package
    cd target
    解压 dubbo-monitor-simple-2.0.0-assembly.tar.gz
    修改 dubbo-monitor-simple-2.0.0confdubbo.properties (修改zookeeper地址等)
    cd assembly.bin
    双击 start.bat
    

    需要配置application.yml:参考  http://dubbo.apache.org/en-us/docs/user/references/xml/dubbo-monitor.html

    使用是整个demo测试正常,但是monitor使用不成功,查看日志:java.lang.ClassNotFoundException: org.apache.dubbo.common.URL(未解决),后来查看日志没有报错了,但是还是不成功

    1、Dubbo一些基本使用

    注意问题:测试的时候,如果provider修改了,consumer服务器有时候也需要重启,不知道为什么?

    1.1 Dubbo 启动配置的加载顺序

    JVM -D参数 > xml > properties

    参考:http://dubbo.apache.org/zh-cn/docs/user/configuration/properties.html

    1.2 超时,配置覆盖规则

    参考:http://dubbo.apache.org/zh-cn/docs/user/configuration/xml.html (不同粒度之间的覆盖关系)

    1.3 Dubbo 启动时检测配置

    参考;http://dubbo.apache.org/zh-cn/docs/user/demos/preflight-check.html

    dubbo 缺省配置:http://dubbo.apache.org/zh-cn/docs/user/references/xml/dubbo-consumer.html

    1.4 重试次数

    注意幂等请求可以设置重试,非幂等不能设置重试

    参考:http://dubbo.apache.org/zh-cn/docs/user/references/xml/dubbo-consumer.html

    1.5 关于xml

    http://dubbo.apache.org/zh-cn/docs/user/configuration/properties.html

    1.6 关于配置

    可以使用dubbo.xml,application.properties,也可以使用注解@Service(version="xx",timeout=1)。。

    1.7  多版本

    一个 provider 接口被多个实现类实现

    服务提供者实现多个版本的实现

    @Service(version = "0.0.1")
    public class UserServiceImpl implements ProviderService{}

    服务消费者指定版本

    @Reference(version = "0.0.2")
    ProviderService providerService;

    1.8 本地存根

    1、对于consumer,需要调用providerService

    @Reference(version = "0.0.2")
    ProviderService providerService;

    2、我们需要在创建ProviderService接口的实现类

    public class ProviderServiceStub implements ProviderService {
        @Reference
        ProviderService providerService;
    
        //必须创建一个有参构造器
        //providerService 传入的远程代理对象
        public ProviderServiceStub(ProviderService providerService) {
            this.providerService = providerService;
        }
    
        @Override
        public String providerMethod() {
            if (false){
                System.out.println("true");
                String s = providerService.providerMethod();
                return s;
            }
            System.out.println("false");
            return "空";
        }
    }
    

    3 修改 @Reference

    @Reference(version = "0.0.2",stub = "com.zy.dubbo.service.Impl.ProviderServiceStub")
    ProviderService providerService;

    xml的配置可以参考官方文档:http://dubbo.apache.org/zh-cn/docs/user/demos/local-stub.html

    1.8 Dubbo的 @EnableDubbo的作用

    主要目的就是进行包扫描的,扫描所有的 org.apache.dubbo.config.annotation.Service;

    @EnableDubbo(scanBasePackages="com.zy.dubbo.service.Impl")可以指定具体的包扫描

    1.9 springboot 使用xml配置dubbo

    只需要使用 @ImportResource(value = {"classpath:provider.xml"}) 加载springboot启动类上,之前的所有的注解@Service,@EnableDubbo,@Reference,全部通过xml配置。

    1.10 springboot 使用API配置dubbo

    单单使用注解的方式,对于Dubbo:method 不方便操作。所以我们也可以采用使用注解加API结合的模式配合dubbo

    官网文档:http://dubbo.apache.org/zh-cn/docs/user/configuration/api.html

    如果配置了 public ServiceConfig<ProviderService> serviceConfig(ProviderService providerServiceImpl){},表示往注册中心注册了一个服务,所以不需要使用@EnableDubbo和@Service

    以提供者配置为例

    @Configuration
    public class DubboConfig {
        @Bean
        public ApplicationConfig applicationConfig(){
            ApplicationConfig application = new ApplicationConfig();
            application.setName("provider");
            return application;
        }
        @Bean
        public RegistryConfig registryConfig(){
            RegistryConfig registryConfig = new RegistryConfig();
            registryConfig.setAddress("zookeeper://localhost:2181");
            return registryConfig;
        }
        @Bean
        public MonitorConfig monitorConfig(){
            MonitorConfig monitorConfig = new MonitorConfig();
            monitorConfig.setProtocol("registry");
            return monitorConfig;
        }
        //暴露单个服务,对于ProviderServiceImpl,spring会自动从容器中拿,(可以是实现类,也可以是接口,测试的时候,如果有多个接口实现类且加上@Component
        // 会选择其中一个实现类,所以最好使用实现类)
        //注解中的 @Service
        @Bean
        public ServiceConfig<ProviderService> serviceConfig(ProviderServiceImpl02 providerServiceImpl){
            ServiceConfig<ProviderService> serviceConfig = new ServiceConfig<>();
            serviceConfig.setInterface(ProviderService.class);
            serviceConfig.setRef(providerServiceImpl);
            serviceConfig.setVersion("0.0.3");
    
            List<MethodConfig> methods = new ArrayList<MethodConfig>();
            MethodConfig method = new MethodConfig();
            method.setName("providerMethod");
            method.setTimeout(3000);
            method.setRetries(0);
            methods.add(method);
            serviceConfig.setMethods(methods);
    
            serviceConfig.setApplication(applicationConfig());
            serviceConfig.setRegistry(registryConfig());
            serviceConfig.export();
            return serviceConfig;
        };
    }
    

    但是如果使用API配置额外需要使用注解往注册中心注册服务,我们就需要@EnableDubbo和@Service来注册服务了,此时我们注册中心就会有三个服务,并且版本0.0.3的providerMethod还设置了超时

    @Service(version = "0.0.1")
    @Component
    public class ProviderServiceImpl implements ProviderService {
        @Override
        public String  providerMethod(){
            System.out.println("消费者提供服务成功");
            return "0.0.1";
        }
    }
    ------------------------------------------------------------------
    @Service(version = "0.0.2")
    @Component
    public class ProviderServiceImpl02 implements ProviderService {
        @Override
        public String  providerMethod() {
            System.out.println("消费者提供服务成功2");
            return "0.0.2";
        }
    }

    1.11 Dubbo 高可用

    如果Zookeeper宕机了,如果服务之间之前访问过,会在本地创建缓存通讯,即使zookeeper宕机了,服务之间既然能够访问,原因在于dubbo可以直连

    所以即使没有注册中心,服务之间依然可以相互通讯

    可以测试

    @Reference(url = "localhost:20881")

    1.12 dubbo负载均衡

    官方文档:http://dubbo.apache.org/zh-cn/docs/user/demos/loadbalance.html

    随机算法(基于权重) Random LoadBalance

    轮询算法   RoundRobin LoadBalance

    最少活跃数算法:LeastActive LoadBalance(每次调用服务器后在本地有对应的响应时间,下次调用选择一个最少调用时间的服务器,进行请求)

    一致性hash算法:ConsistentHash LoadBalance(比如请求带了一个id=1,1进行hash算法获得一个值,通过这个值,来选择服务器进行请求)

    dubbo默认基于随机(基于权重)负载均衡机制,

    可以默认指定 @Service(version = "0.0.1",weight = 100)

    可以动态的进行权重加减

    1.13 服务降级和容错

    一个服务器需要来处理需要的服务请求,有一些请求不是很重要重要,但是依然需要服务器耗费资源来处理请求,此时的其他请求处理就很慢,此时如果大量请求来调用一些重要服务,我们就需要关闭某些不重要的服务,来减少服务器压力。

    我们可以屏蔽功能:屏蔽(恢复)消费者调用服务提供者,请求不会到达服务器,服务器不会处理请求,减少服务器压力

    我们可以容错功能:请求会到提供者,当提供者处理请求出错了,直接返回null,消费者不抛出异常

    1.14 集群容错模式

    简单实用可以参考:http://dubbo.apache.org/zh-cn/docs/user/demos/fault-tolerent-strategy.html

    实际开发需要整合hystrix

    使用方法1:(测试过程中会发生容错时而容错不起作用,发送大量请求,某几次依然会报错(后来发现在fallback方法中出现的错误))

    1、在提供者配置

    使用@HystrixCommand注解方法,并在启动类上加上注解 @EnableHystrix,但是实际测试过程过不需要这些配置

        @HystrixCommand
        @Override
        public String  providerMethod(){
            System.out.println("提供服务成功");
            return "0.0.1";
        }
    

    2、消费者配置,并在启动类上加上@EnableHystrix

        @HystrixCommand(fallbackMethod = "testfallback")
        @Override
        public String  test() {
            String s = providerService.providerMethod();
            return s;
        }
        public String  testfallback() {
            System.out.println("testfallback");
            return "错误了....";
        }
    

    使用方法2:(测试过程中正常)

    消费者不用任何配置

    提供者配置 @HystrixCommand,并在启动类上加上@EnableHystrix

        @HystrixCommand(fallbackMethod = "providerMethodFallback")
        @Override
        public String  providerMethod() {
            System.out.println("消费者提供服务成功2");
            if(Math.random()>0.5){
                System.out.println(">0.5");
                int a = 1/0;
            }
            return "0.0.2";
        }
        public String  providerMethodFallback(){
            System.out.println("提供者出错了....");
            return "提供者出错了....";
        }
    

      

  • 相关阅读:
    Windows Mobile 中 Cellular Emulator 与 Device Emulator 连接不上的解决办法?
    Windows Mobile Space Index
    通过Windows Mobile连接管理器建立网络连接
    为Windows mobile编写设计友好的控件[Writing designer friendly controls for Windows Mobile]
    TransparentImage、TransparentBlt [Daliy APIs]
    GetDC、GetDCEx、GetWindowDC [Daily APIs]
    SHCreateMenuBar [Daily APIs]
    无法创建VC++ 智能项目的解决方法?
    CreateCompatibleBitmap [Daliy APIs]
    Windows Mobile Gesture 开发学习 持续更新
  • 原文地址:https://www.cnblogs.com/yanxiaoge/p/11441010.html
Copyright © 2011-2022 走看看