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 的源码。