1多版本支持

   应用:对一个接口进行的升级的时候,新的接口可能会和之前的版本有冲突,进行版本号的控制,进行灰度发布,对新的功能加版本进行隔离。(version=1.0.1)

 添加新的实现类 UpHelloImpl

dubbo-provider项目的 dubbo-server.xml文件修改  添加版本version控制

<dubbo:service interface="com.jiy.dubbo.IJIYHello" ref="jiyHelloService"  registry="zk1" version="1.0.0"/>

    <dubbo:service interface="com.jiy.dubbo.IJIYHello" ref="UpHelloImpl" registry="zk1" version="1.0.1"/>

     <bean id="UpHelloImpl" class="com.jiy.dubbo.UpHelloImpl"></bean>
    <bean id="jiyHelloService" class="com.jiy.dubbo.JiyHelloImpl"></bean>

在client端 dubbo-client.xml文件 添加对版本的指定

<dubbo:reference interface="com.jiy.dubbo.IJIYHello" id="demoService" version="1.0.1" check="false"/>

 

2 主机绑定

private String findConfigedHosts(ProtocolConfig protocolConfig, List<URL> registryURLs, Map<String, String> map) {
        boolean anyhost = false;

               。。。。。。。
            //从配置文件中获得绑定地址
          String hostToBind = getValueFromConfig(protocolConfig, DUBBO_IP_TO_BIND);

        // if bind ip is not found in environment, keep looking up
        if (StringUtils.isEmpty(hostToBind)) { //如果地址不为空
            hostToBind = protocolConfig.getHost();
            if (provider != null && StringUtils.isEmpty(hostToBind)) {
                hostToBind = provider.getHost();
            }
            if (isInvalidLocalHost(hostToBind)) {
                anyhost = true;
                try {
                    logger.info( "No valid ip found from environment, try to find valid host from DNS.");
                    hostToBind = InetAddress.getLocalHost().getHostAddress();
                } catch (UnknownHostException e) {
                    logger.warn(e.getMessage(), e);
                }
                if (isInvalidLocalHost(hostToBind)) {
                    if (CollectionUtils.isNotEmpty(registryURLs)) {//如果注册中心地址不为空
                        for (URL registryURL : registryURLs) {
                            if (MULTICAST.equalsIgnoreCase(registryURL.getParameter("registry"))) {
                                // skip multicast registry since we cannot connect to it via Socket
                                continue;
                            }
                            try (Socket socket = new Socket()) { //通过socket获得连接
                                SocketAddress addr = new InetSocketAddress(registryURL.getHost(), registryURL.getPort());
                                socket.connect(addr, 1000);
                                hostToBind = socket.getLocalAddress().getHostAddress();
                                break;
                            } catch (Exception e) {
                                logger.warn(e.getMessage(), e);
                            }
                        }
                    }
                    if (isInvalidLocalHost(hostToBind)) {
                        hostToBind = getLocalHost();
                    }
                }
            }
        }

        map.put(Constants.BIND_IP_KEY, hostToBind);

       。。。。。。。。

        return hostToRegistry;
    }

 

3 集群容错

    允许在系统的控制范围内允许或者包容某些错误的发生。

客户端配置文件

<dubbo:reference interface="com.jiy.dubbo.IJIYHello" cluster="failfast" id="demoService" version="1.0.1" check="false"/>

    6中容错机制 设置cluster = (failsafe,failover,failfast。。。)   

   failsafe  失败安全

   failover(默认) 失败后重试其他服务器   retries(2) 重试次数,不包含第一次

   failfast 快速失败,失败以后立马报错

   failback  失败后自动恢复

   forking   forks设置并行的最大数。同时调用多个节点只要一个成功返回就以成功的为准

   broadcast 广播调用,任意一台报错,则执行方法报错

    查询语句默认使用failover   事务建议使用failfast
 

4 服务降级

     容错是服务降级的一种实现方式。

    降级的目的是为了保证核心服务可用,通过关闭一些服务,提高整体资源和架构的吞吐量。

    dobbo降级方式 Mock。 可以在客户端进行。

  定义Mock类

public class TestMork implements IJIYHello{
    @Override
    public String sayHello(String s) {
        return "系统繁忙";
    }
}

配置文件添加  mock属性 指向定义的mork类

<dubbo:reference interface="com.jiy.dubbo.IJIYHello" mock="com.jiy.dubbo.TestMork" id="demoService" version="1.0.1" check="false"/>

 

5 配置优先级别

客户端优于服务端 

      1方法级别优先、然后是接口、接着是全局配置

      2 如果级别一样,客户端优先

     timeout(服务端)  cluster(客户端)

6 什么是SPI

SPI 全称为 Service Provider Interface,是一种服务发现机制。SPI 的本质是将接口实现类的全限定名配置在文件中,并由服务加载器读取配置文件,加载实现类。这样可以在运行时,动态为接口替换实现类。正因此特性,我们可以很容易的通过 SPI 机制为我们的程序提供拓展功能。SPI 机制在第三方框架中也有所应用,比如 Dubbo 就是通过 SPI 机制加载所有的组件。不过,Dubbo 并未使用 Java 原生的 SPI 机制,而是对其进行了增强,使其能够更好的满足需求。在 Dubbo 中,SPI 是一个非常重要的模块。基于 SPI,我们可以很容易的对 Dubbo 进行拓展。如果大家想要学习 Dubbo 的源码,SPI 机制务必弄懂。接下来,我们先来了解一下 Java SPI 与 Dubbo SPI 的用法,然后再来分析 Dubbo SPI 的源码。