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"});}
}
<?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。
二、主机绑定
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:reference id="gpHelloService" interface="com.gupaoedu.dubbo.IGpHello"
registry="zookeeper" version="1.1.1"
cluster="failover"/>
四、服务降级
<!--声明需要暴露的服务接口,指定版本号-->
<dubbo:reference id="gpHelloService" interface="com.gupaoedu.dubbo.IGpHello"
registry="zookeeper" version="1.1.1" timeout="" cluster="failover"
mock="com.gupaoedu.dubbo.TestMock"/>

然后我们再验证,将超时间加大,设置为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常用配置解析的更多相关文章
- 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 ...
- dubbo源码分析7——dubbo的配置解析_与spring的整合
dubbo的配置其实就是建立在spring的命名空间的配置机制之上的.在dubbo的jar包的META-INF目录下会有spring.handlers这个文件,用来配置spring的命名空间和解析类的 ...
- Dubbo(2)--Dubbo常用配置文件解析及核心源码阅读
1.多版本支持 服务端 创建第二个接口实现类 package com.lf; public class HelloImpl2 implements IHello{ @Override public S ...
- 最全面 Nginx 入门教程 + 常用配置解析
转自 http://blog.csdn.net/shootyou/article/details/6093562 Nginx介绍和安装 一个简单的配置文件 模块介绍 常用场景配置 进阶内容 参考资料 ...
- 【转】【Nginx】Nginx 入门教程 + 常用配置解析
== Nginx介绍和安装 == Nginx是一个自由.开源.高性能及轻量级的HTTP服务器及反转代理服务器, 其性能与IMAP/POP3代理服务器相当.Nginx以其高性能.稳定.功能丰富.配置简单 ...
- dubbo常用配置及注意事项
1.启动时检查缺省会在启动时检查依赖的服务是否可用,不可用时会抛出异常,阻止Spring初始化完成,以便上线时,能及早发现问题,默认check=true. 关闭所有服务的启动时检查:(没有提供者时报错 ...
- Nginx入门篇(四)之常用配置解析
1.Nginx状态信息功能 Nginx的模块当中有一个ngx_http_stub_status_module模块,这个模块主要记录Nginx的基本访问信息,要使用该模块,需要在编译的时候增加http_ ...
- nginx常用配置解析
1.常用公共参数(一般放在http下面,虽然很多参数都支持server和location) keepalive_timeout 60; #单位为s keepalive_request 2; #设 ...
- 【springcloud】Eureka 常用配置解析
转自:https://www.cnblogs.com/zyon/p/11023750.html 1. 配置项解析 1.1 通用配置 # 应用名称,将会显示在Eureka界面的应用名称列 spring. ...
随机推荐
- js开发环境配置
使用Sublime Text3作为主要开发工具.下载地址:http://www.sublimetext.com/3. sublime拥有大量实用插件,使用插件需要先下载PackageControl以便 ...
- 在java中实现数据导入excel表格中
1.首先前端代码如下: 一个导出按钮:<input id="export" class="btn btn-primary" type="butt ...
- ASUS RT-N16 使用OpenWrt 安装 ss记录
本文用于记录一下使用ASUS RT-N16 使用OpenWrt 安装 shadowsocks的过程. 前后一共折腾了一个星期,原先使用的是tomato固件,但是在配置iptables的过程中,执行 r ...
- 有关this
this是Javascript函数内部的一个特殊对象,引用的是函数运行时的环境对象,也就是说,this是动态的(箭头函数除外),是在运行时进行绑定的,并不是在编写时绑定(箭头函数是编写时绑定). th ...
- Overture小课堂之如何演绎钢琴滑音
在我们学习钢琴和学习使用Overture时,要学习如何弹奏和使用滑音.那么我们先来看看什么是滑音,如何使用钢琴演绎,在Overture里滑音又在哪里呢? 滑音,在音乐术语中通常指一种装饰音和演奏指法. ...
- 用python进行OpenCV实战之用OpenCV3实现图片载入、显示和储存(argparse详细解释)
将下面文档存为load_display_save.py #-*- coding:utf-8 -*- ap = argparse.ArgumentParser() ap.add_argument(&qu ...
- freopen()函数在ACM中的使用
#ifndef ONLINE_JUDGE freopen("in.txt","r",stdin); #endif https://blog.csdn.net/c ...
- 在CAcUiTabChildDialog中使用点取或者(拾取)时卡住的问题
问题描述:在Tab的对话框中,其子对话框CAcUiTabChildDialog中用点取或者(拾取)时卡住的问题 在子对话框中: BeginEditorCommand(); CompleteEditor ...
- Django中的FBV与CBV
一. FBV FBV(function based views) 基于函数的视图, 即一个url对应一个视图函数. 1.1 FBV代码示例 urls.py from django.contrib im ...
- Linux之DHCP搭建命令集锦
systemctl start dhcpd //启动DHCP systemctl enable dhcpd //配置服务开机启动 ps aux | grep ...