一、多版本的支持

如何发布服务,需要将需要暴露的服务接口发布出去供客户端调用,需要在java同级目录新建一个resources目录,然后将resoureces目录标记成Test Resoureces Root,然后在esources目录下新建MATE-INF.spring目录,在该目录下添加配置文件dubbo-server.xml文件
  dubbo的服务端配置文件如下
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:dubbo="http://code.alibabatech.com/schema/dubbo" xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://code.alibabatech.com/schema/dubbohttp://code.alibabatech.com/schema/dubbo/dubbo.xsd">
<!--提供方信息,用于计算依赖关系-->
<dubbo:application name="dubbo-server" owner="mic"/> <!--注册中心 暴露服务地址-->
<dubbo:registry address="zookeeper://192.168.126.129:2181"/> <!--用dubbo协议在20880 端口暴露服务-->
<dubbo:protocol port="20880" name="dubbo"/> <!--声明需要暴露的服务接口,指定协议为dubbo,设置版本号1.1.1-->
<dubbo:service interface="com.gupaoedu.dubbo.IGpHello" ref="gpHelloService" protocol="dubbo" version="1.1.1"/>
<!--声明需要暴露的服务接口,指定协议为dubbo,设置版本号1.1.2-->
<dubbo:service interface="com.gupaoedu.dubbo.IDemoService" ref="demoService" protocol="dubbo" version="1.1.2"/> <!--和本地服务一样实现服务-->
<bean id="gpHelloService" class="com.gupaoedu.dubbo.GpHelloImpl"/> <bean id="demoService" class="com.gupaoedu.dubbo.DemoService"/>
</beans>

服务端的接口以及实现类

public interface IGpHello {String sayHello(String msg);}
public interface IDemoService {String protocolDemo(String msg);}
public class GpHelloImpl implements IGpHello{
@Override
public String sayHello(String msg) {return "Hello:"+msg;}
}
public class GpHelloImpl2 implements IGpHello{
@Override
public String sayHello(String msg) {return "Hello,i'm server 2:"+msg;}
}

编写Main方法,用spring容器来启动服务

public class Main {
public static void main(String[] args) throws IOException {
//默认情况下会使用spring容器来启动服务
com.alibaba.dubbo.container.Main.main(new String[]{"spring","log4j"});}
}
服务启动过程会进行服务注册,启动监听端口,启动服务之后
在客户端通过远程调用访问服务端发布的服务,相应的客户端配置文件 dubbo-client.xml 如下
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://code.alibabatech.com/schema/dubbohttp://code.alibabatech.com/schema/dubbo/dubbo.xsd">
<!--提供方信息-->
<dubbo:application name="dubbo-client" owner="mic"/> <!--注册中心-->
<dubbo:registry id="zokeeper" address="zookeeper://192.168.126.129:2181?register=false" file="d:/dubbo-server"/> <!--声明需要暴露的服务接口,指定版本号-->
<dubbo:reference id="gpHelloService" interface="com.gupaoedu.dubbo.IGpHello" registry="zookeeper" version="1.1.1"/>
</beans>

其实我们可以在zookeeper的客户端可以发现,事实上已经发布了服务方已经发布了两个不同版本的服务,具体如下

 dubbo%3A%2F%2F192.168.126.%3A20880%2Fcom.gupaoedu.dubbo.IDemoService%3Fanyhost%3Dtrue%26application%3Ddubbo-server%26dubbo%3D2.5.3%26interface%3Dcom.gupaoedu.dubbo.IDemoService%26methods%3DprotocolDemo%26owner%3Dmic%26pid%3D22548%26revision%3D1.1.2%26side%3Dprovider%26timestamp%3D1530450331827%26version%3D1.1.2
dubbo%3A%2F%2F192.168.126.%3A20880%2Fcom.gupaoedu.dubbo.IGpHello%3Fanyhost%3Dtrue%26application%3Ddubbo-server%26dubbo%3D2.5.3%26interface%3Dcom.gupaoedu.dubbo.IGpHello%26methods%3DsayHello%26owner%3Dmic%26pid%3D22548%26revision%3D1.1.1%26side%3Dprovider%26timestamp%3D1530450325703%26version%3D1.1.1

我们知道,这两个版本正是我们在服务发布方设置的不同版本号,同样的,在消费端,我们可以通过设置指定的版本号获取相应的版本服务,消费的代码如下

public class App{
public static void main( String[] args ) throws IOException, InterruptedException {
ClassPathXmlApplicationContext context=new ClassPathXmlApplicationContext("dubbo-client.xml");
context.start();
IGpHello demoService = (IGpHello)context.getBean("gpHelloService");//获取远程服务代理
String hello = demoService.sayHello("world");//执行远程调用方法
System.out.println(hello);//显示调用结果
}
}

在控制台,我们可以看到同样的服务发布地址url。

二、主机绑定

  什么叫主机绑定呢?主机绑定的流程是什么?
在发布一个dubbo服务的时候,会生成一个dubbo://ip:port的协议地址。这就是主机绑定过程,那么这个IP是如何生成的呢?大家可以通过ServiceConfig.java 中的 doExportUrlForlProtocol 方法中找到如下代码块。大致的逻辑是,首先从配置文件中获取,如果失败再尝试从本地网卡中获取host,如果这个也失败,会继续执行,直到找到合适的IP地址。
String name = protocolConfig.getName();
if (name == null || name.length() == ) {
name = "dubbo";
} String host = protocolConfig.getHost();//从配置文件中获取host
if (provider != null && (host == null || host.length() == )) {
host = provider.getHost();
}
boolean anyhost = false;
if (NetUtils.isInvalidLocalHost(host)) {
anyhost = true;
try {
host = InetAddress.getLocalHost().getHostAddress();//获取本机的host地址
} catch (UnknownHostException e) {
logger.warn(e.getMessage(), e);
}
if (NetUtils.isInvalidLocalHost(host)) {
if (registryURLs != null && registryURLs.size() > ) {//如果还是没有获取到host地址
for (URL registryURL : registryURLs) {
try {
Socket socket = new Socket();
try {
SocketAddress addr = new InetSocketAddress(registryURL.getHost(), registryURL.getPort());
socket.connect(addr, );
host = socket.getLocalAddress().getHostAddress();//3、
break;
} finally {
try {
socket.close();
} catch (Throwable e) {}
}
} catch (Exception e) {
logger.warn(e.getMessage(), e);
}
}
}
if (NetUtils.isInvalidLocalHost(host)) {//4、
host = NetUtils.getLocalHost();
}
}
}

三、集群容错

在分析dubbo的集群容错前,先了解什么是容错机制?容错机制指的是某种系统控制在一 定范围内的一种允许或包容犯错情况的发生,举个简单例 子,我们在电脑上运行一个程序,有时候会出现无响应的情况,然后系统会弹出一个提示框让我们选择,是立即结 束还是继续等待,然后根据我们的选择执行对应的操作, 这就是“容错”。
       在分布式架构下,网络、硬件、应用都可能发生故障,由 于各个服务之间可能存在依赖关系,如果一条链路中的其 中一个节点出现故障,将会导致雪崩效应。为了减少某一 个节点故障的影响范围,所以我们才需要去构建容错服务(这里要说明一点,容错机制仅仅是处理节点故障的一种机制), 来优雅的处理这种中断的响应结果 。
Dubbo提供了6种容错机制,分别如下 
1. failsafe 失败安全,可以认为是把错误吞掉(记录日 志) 
2. failover(默认)   重试其他服务器; retries(2) ,缺省的重试次数,不包含第一次
3. failfast 快速失败, 失败以后立马报错 
4. failback  失败后自动恢复。 
5. forking  forks. 设置并行数 
6. broadcast  广播,任意一台报错,则执行的方法报错 
配置方式如下,通过cluster方式,配置指定的容错方案
<!--声明需要暴露的服务接口,指定版本号-->
<dubbo:reference id="gpHelloService" interface="com.gupaoedu.dubbo.IGpHello"
registry="zookeeper" version="1.1.1"
cluster="failover"/>
配置的优先级别
客户端会优于服务端,这里还可以细化,可以细化到方法级别
1. 方法级优先,接口级次之,全局配置再次之。 
2. 如果级别一样,则消费方优先,提供方次之
其中,服务提供方配置,通过URL经由注册中心传递给消 费方
什么应该配置在客户端,什么应该配置在服务端,retires、loadBlance、cluster(客户端)、timeout(服务端)
以 timeout 为例,建议由服务提供方设置超时,因为一个方法需要执行多长 时间,服务提供方更清楚,如果一个消费方同时引用多个 服务,就不需要关心每个服务的超时设置。

四、服务降级

降级的目的是为了保证核心服务可用。 
降级可以有几个层面的分类: 自动降级和人工降级; 按 照功能可以分为:读服务降级和写服务降级; 
1. 对一些非核心服务进行人工降级,在大促之前通过降级 开关关闭哪些推荐内容、评价等对主流程没有影响的功 能 
2. 故障降级,比如调用的远程服务挂了,网络故障、或者 RPC服务返回异常。 那么可以直接降级,降级的方案比 如设置默认值、采用兜底数据(系统推荐的行为广告挂 了,可以提前准备静态页面做返回)等等 
3. 限流降级,在秒杀这种流量比较集中并且流量特别大的 情况下,因为突发访问量特别大可能会导致系统支撑不 了。这个时候可以采用限流来限制访问量。当达到阀值 时,后续的请求被降级,比如进入排队页面,比如跳转 到错误页(活动太火爆,稍后重试等) 
dubbo的降级方式: Mock 机制
实现步骤
1. 在client端创建一个TestMock类,实现对应IGpHello 的接口(需要对哪个接口进行 mock,就实现哪个), 名称必须以Mock结尾 
2. 在client端的xml配置文件中,添加如下配置,增加一 个mock属性指向创建的TestMock 
3. 模拟错误(设置 timeout),模拟超时异常,运行测试代码即可访问到TestMock这个类。当服务端故障解除 以后,调用过程将恢复正常 
服务端的类及实现类,以及配置文件,参考第一点的类及实现类以及配置文件,然后再客户端的配置文件的加上mock,具体见如下截图。
<!--声明需要暴露的服务接口,指定版本号-->
<dubbo:reference id="gpHelloService" interface="com.gupaoedu.dubbo.IGpHello"
registry="zookeeper" version="1.1.1" timeout="" cluster="failover"
mock="com.gupaoedu.dubbo.TestMock"/>
根据Mock机制实现步骤
首先我们再客户端添加一个TestMock类,实现IGpHello接口,配置文件我已经添加好了,可以看到我这里的配置相对第一点客户端的配置添加了几个参数 timeout、failover、mock。这里主要是看mock和timeout配置,因为我们是要去验证mock机制,而failover是集群容错的配置,之所以我这里没有将这个参数去掉,是因为确定这里他们不会有配置冲突,配置好之后,先发布服务端的服务,然后运气客户端的App.java.在控制台我们可以看到打印结果,系统繁忙,这个结果说明,我们设置1秒超时,客户端远程调用服务超时,报错了,然后就走到了Mock里。

然后我们再验证,将超时间加大,设置为100,再运行,此时就不会报错,就会正常输出Hello world,输出结果如下

<!--声明需要暴露的服务接口,指定版本号-->
<dubbo:reference id="gpHelloService" interface="com.gupaoedu.dubbo.IGpHello"
registry="zookeeper" version="1.1.1" timeout="" cluster="failover"
mock="com.gupaoedu.dubbo.TestMock"/>

五、总结

好了,总结一下,整理了两个晚上,没有整理出我预想的效果,这篇文章主要是以一种开发文档的形式简单介绍了dubbo的多版本机制实现、主机绑定、集群容错处理机制、以及服务降级处理。后续会介绍dubbo的SPI机制,他是dubbo一种核心机制,我也是刚学习dubbo源码不久,到时候有问题忘大家指正。该篇文章也存在许多不足的地方,比如结构可能不是非常清晰,描述也可能不是非常通俗易懂,后续我会努力矫正,今天就到这了,太困了现在,不写了睡觉。

欢迎扫码关注我的微信公众号,我会不定期的更新一些个人技术文章

  

  

  

  

  

  

Dubbo常用配置解析的更多相关文章

  1. Apache入门 篇(二)之apache 2.2.x常用配置解析

    一.httpd 2.2.x目录结构 Cnetos 6.10 YUM安装httpd 2.2.x # yum install -y httpd 程序环境 主配置文件: /etc/httpd/conf/ht ...

  2. dubbo源码分析7——dubbo的配置解析_与spring的整合

    dubbo的配置其实就是建立在spring的命名空间的配置机制之上的.在dubbo的jar包的META-INF目录下会有spring.handlers这个文件,用来配置spring的命名空间和解析类的 ...

  3. Dubbo(2)--Dubbo常用配置文件解析及核心源码阅读

    1.多版本支持 服务端 创建第二个接口实现类 package com.lf; public class HelloImpl2 implements IHello{ @Override public S ...

  4. 最全面 Nginx 入门教程 + 常用配置解析

    转自 http://blog.csdn.net/shootyou/article/details/6093562 Nginx介绍和安装 一个简单的配置文件 模块介绍 常用场景配置 进阶内容 参考资料 ...

  5. 【转】【Nginx】Nginx 入门教程 + 常用配置解析

    == Nginx介绍和安装 == Nginx是一个自由.开源.高性能及轻量级的HTTP服务器及反转代理服务器, 其性能与IMAP/POP3代理服务器相当.Nginx以其高性能.稳定.功能丰富.配置简单 ...

  6. dubbo常用配置及注意事项

    1.启动时检查缺省会在启动时检查依赖的服务是否可用,不可用时会抛出异常,阻止Spring初始化完成,以便上线时,能及早发现问题,默认check=true. 关闭所有服务的启动时检查:(没有提供者时报错 ...

  7. Nginx入门篇(四)之常用配置解析

    1.Nginx状态信息功能 Nginx的模块当中有一个ngx_http_stub_status_module模块,这个模块主要记录Nginx的基本访问信息,要使用该模块,需要在编译的时候增加http_ ...

  8. nginx常用配置解析

    1.常用公共参数(一般放在http下面,虽然很多参数都支持server和location) keepalive_timeout  60;  #单位为s keepalive_request 2;  #设 ...

  9. 【springcloud】Eureka 常用配置解析

    转自:https://www.cnblogs.com/zyon/p/11023750.html 1. 配置项解析 1.1 通用配置 # 应用名称,将会显示在Eureka界面的应用名称列 spring. ...

随机推荐

  1. go语言入门教程:基本语法之变量声明及注意事项

    一.变量的使用 1.1 什么是变量 变量是为存储特定类型的值而提供给内存位置的名称.在go中声明变量有多种语法. 所以变量的本质就是一小块内存,用于存储数据,在程序运行过程中数值可以改变 1.2 声明 ...

  2. GoldenGate for bigdata 12.3.2.1版本新特性

    在Oracle Tenical Network(OTN)上已经可以下载到最新的ogg4bd版本,地址如下:http://www.oracle.com/technetwork/middleware/go ...

  3. random shutil shevle xml

    random 模块 import random print(random.random())#(0,1)----float 大于0且小于1之间的小数 print(random.randint(1,3) ...

  4. 文件和IO流

    摘要:本文主要介绍了Java的文件处理以及常用的IO流操作. 文件操作 概念 File是数据源(保存数据的地方)的一种,可以表示一个文件,也可以表示一个文件目录. File类只能对文件和文件夹进行创建 ...

  5. android架构原理

    应用层(与用户打交道) 应用架构层(常用的组件和服务) 系统运行层(Android运行环境+原生c/c++库) Linux核心层(linux内核+硬件抽象层)

  6. opencv学习之路(37)、运动物体检测(二)

    一.运动物体轮廓椭圆拟合及中心 #include "opencv2/opencv.hpp" #include<iostream> using namespace std ...

  7. Mapped Statements collection already contains value for ***.***的问题

    情景,在我们配置项目或者开发的过程中,可能由于项目工程量大或误操作等原因,造成Map映射文件的ID重复,造成项目启动报以下错误, org.springframework.beans.factory.B ...

  8. Java利用TCP编程实现简单聊天室

    前言: 本文是我在学习尚学堂JAVA300集第二季网络编程部分仿照视频内容实现而成 具体可以去尚学堂官网观看视频学习 一.实现思路 实现聊天室的最核心部分就是JAVA的TCP网络编程. TCP 传输控 ...

  9. 【做题】CERC2017B. Buffalo Barricades——时间倒流

    原文链接 https://www.cnblogs.com/cly-none/p/CERC2017B.html 题意:在一个网格平面上,有\(n\)个点,其中第\(i\)个点在以\((x_i, y_i) ...

  10. Linux SSH 基于密钥交换的自动登录原理简介及配置说明

    协商交互过程 1.客户端向目标服务器发送登录请求.在SSH 服务启用了证书验证登录方式后,会优先通过证书验证方式进行登录验证. 2.目标服务器根据 SSH 服务配置,在用户对应目录及文件中读取到有效的 ...