dubbo 的使用 dubbo文档: https://dubbo.gitbooks.io/dubbo-dev-book/design.html
com.alibaba.dubbo.container.spring.SpringContainer
private static final Logger logger = LoggerFactory.getLogger(SpringContainer.class);
public static final String SPRING_CONFIG = "dubbo.spring.config";
public static final String DEFAULT_SPRING_CONFIG = "classpath*:META-INF/spring/*.xml";
static ClassPathXmlApplicationContext context;
默认读取META-INF/spring/下的文件 所以把dubbo的配置文件放在该目录下面
启动类:
package com.xiepanpan.dubbo;
/**
* @author: xiepanpan
* @Date: 2020/7/11
* @Description: 通过spring容器启动dubbo
*/
public class Main {
public static void main(String[] args) {
com.alibaba.dubbo.container.Main.main(new String[]{"spring","log4j"});
}
}
spring jetty log4j
rmi/hession/webservice/http/thrift/dubbo(默认)
支持同一个服务不同协议
<dubbo:protocol port="20880" name="dubbo"/>
<dubbo:protocol port="8080" name="hessian"/>
<dubbo:service interface="com.gupaoedu.dubbo.IGpHello"
ref="gpHelloService" protocol="dubbo,hessian" registry="zk1"/>
支持不同服务不同协议
<!--注册中心-->
<dubbo:registry id="zk1" address="zookeeper://192.168.11.156:2181"/>
<dubbo:registry id="zk2" address="zookeeper://192.168.11.157:2181"/>
在发布一个Dubbo服务的时候,会生成一个dubbo://ip:port的协议地址,那么这个IP是根据什么生成的呢?大家可以ServiceConfig.java代码中找到如下代码;可以发现,在生成绑定的主机的时候,会通过一层一层的判断,直到获取到合法的ip地址。
private void doExportUrlsFor1Protocol(ProtocolConfig protocolConfig, List<URL> registryURLs) {
String name = protocolConfig.getName();
if (name == null || name.length() == 0) {
name = "dubbo";
}
String host = protocolConfig.getHost();
if (provider != null && (host == null || host.length() == 0)) {
host = provider.getHost();
}
boolean anyhost = false;
//1.从配置文件中获取host
if (NetUtils.isInvalidLocalHost(host)) {
anyhost = true;
try {
//2.从网卡获取本地地址
host = InetAddress.getLocalHost().getHostAddress();
} catch (UnknownHostException e) {
logger.warn(e.getMessage(), e);
}
if (NetUtils.isInvalidLocalHost(host)) {
//3.从注册中心中获取
if (registryURLs != null && registryURLs.size() > 0) {
for (URL registryURL : registryURLs) {
try {
Socket socket = new Socket();
try {
SocketAddress addr = new InetSocketAddress(registryURL.getHost(), registryURL.getPort());
socket.connect(addr, 1000);
host = socket.getLocalAddress().getHostAddress();
break;
} finally {
try {
socket.close();
} catch (Throwable e) {}
}
} catch (Exception e) {
logger.warn(e.getMessage(), e);
}
}
}
if (NetUtils.isInvalidLocalHost(host)) {
//4.遍历本地网卡,返回第一个合理的IP
host = NetUtils.getLocalHost();
}
}
}
什么是容错机制? 容错机制指的是某种系统控制在一定范围内的一种允许或包容犯错情况的发生,举个简单例子,我们在电脑上运行一个程序,有时候会出现无响应的情况,然后系统会弹出一个提示框让我们选择,是立即结束还是继续等待,然后根据我们的选择执行对应的操作,这就是“容错”。
在分布式架构下,网络、硬件、应用都可能发生故障,由于各个服务之间可能存在依赖关系,如果一条链路中的其中一个节点出现故障,将会导致雪崩效应。为了减少某一个节点故障的影响范围,所以我们才需要去构建容错服务,来优雅的处理这种中断的响应结果
Dubbo提供了6种容错机制,分别如下
配置方式如下,通过cluster方式,配置指定的容错方案
<dubbo:reference id="xpHelloService"
interface="com.gupaoedu.dubbo.IXpHello"
protocol="dubbo" cluster="failover"/>
以timeout为例,显示了配置的查找顺序,其它retries, loadbalance等类似。
其中,服务提供方配置,通过URL经由注册中心传递给消费方。
建议由服务提供方设置超时,因为一个方法需要执行多长时间,服务提供方更清楚,如果一个消费方同时引用多个服务,就不需要关心每个服务的超时设置。
降级的目的是为了保证核心服务可用。
降级可以有几个层面的分类: 自动降级和人工降级; 按照功能可以分为:读服务降级和写服务降级;
dubbo的降级方式: Mock
实现步骤
<!-- 声明需要暴露的服务接口 -->
<dubbo:reference id="demoService"
interface="com.xiepanpan.dubbo.IGpHello"
registry="zookeeper"
mock="com.xiepanpan.dubbo.TestMock"/>