dubbo源码分析之dubbo基本功能点(一)

dubbo 的使用
dubbo文档:
https://dubbo.gitbooks.io/dubbo-dev-book/design.html

image-20200711125149334

dubbo 支持的容器

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

dubbo 多协议支持

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服务的时候,会生成一个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种容错机制,分别如下

  1. failsafe 失败安全,可以认为是把错误吞掉(记录日志)

  2. failover(默认) 重试其他服务器; retries(2)重试两次

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

  4. failback 失败后自动恢复。

  5. forking forks. 设置并行数

  6. broadcast 广播,任意一台报错,则执行的方法报错

配置方式如下,通过cluster方式,配置指定的容错方案

<dubbo:reference id="xpHelloService"
                 interface="com.gupaoedu.dubbo.IXpHello"
                 protocol="dubbo" cluster="failover"/>

配置优先级别

以timeout为例,显示了配置的查找顺序,其它retries, loadbalance等类似。

  1. 方法级优先,接口级次之,全局配置再次之。

  2. 如果级别一样,则消费方优先,提供方次之。

其中,服务提供方配置,通过URL经由注册中心传递给消费方。

建议由服务提供方设置超时,因为一个方法需要执行多长时间,服务提供方更清楚,如果一个消费方同时引用多个服务,就不需要关心每个服务的超时设置。

服务降级

降级的目的是为了保证核心服务可用。

降级可以有几个层面的分类: 自动降级和人工降级; 按照功能可以分为:读服务降级和写服务降级;

  1. 对一些非核心服务进行人工降级,在大促之前通过降级开关关闭哪些推荐内容、评价等对主流程没有影响的功能

  2. 故障降级,比如调用的远程服务挂了,网络故障、或者RPC服务返回异常。 那么可以直接降级,降级的方案比如设置默认值、采用兜底数据(系统推荐的行为广告挂了,可以提前准备静态页面做返回)等等

  3. 限流降级,在秒杀这种流量比较集中并且流量特别大的情况下,因为突发访问量特别大可能会导致系统支撑不了。这个时候可以采用限流来限制访问量。当达到阀值时,后续的请求被降级,比如进入排队页面,比如跳转到错误页(活动太火爆,稍后重试等)

dubbo的降级方式: Mock

实现步骤

  1. 在client端创建一个TestMock类,实现对应IGpHello的接口(需要对哪个接口进行mock,就实现哪个),名称必须以Mock结尾

  2. 在client端的xml配置文件中,添加如下配置,增加一个mock属性指向创建的TestMock

  3. 模拟错误(设置timeout),模拟超时异常,运行测试代码即可访问到TestMock这个类。当服务端故障解除以后,调用过程将恢复正常

<!-- 声明需要暴露的服务接口 -->
<dubbo:reference id="demoService"
                 interface="com.xiepanpan.dubbo.IGpHello"
                 registry="zookeeper"
                 mock="com.xiepanpan.dubbo.TestMock"/>
Python网络爬虫与推荐算法新闻推荐平台:网络爬虫:通过Python实现新浪新闻的爬取,可爬取新闻页面上的标题、文本、图片、视频链接(保留排版) 推荐算法:权重衰减+标签推荐+区域推荐+热推荐.zip项目工程资源经过严格测试可直接运行成功且功能正常的情况才上传,可轻松复刻,拿到资料包后可轻松复现出一样的项目,本人系统开发经验充足(全领域),有任何使用问题欢迎随时与我联系,我会及时为您解惑,提供帮助。 【资源内容】:包含完整源码+工程文件+说明(如有)等。答辩评审平均分达到96分,放心下载使用!可轻松复现,设计报告也可借鉴此项目,该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的。 【提供帮助】:有任何使用问题欢迎随时与我联系,我会及时解答解惑,提供帮助 【附带帮助】:若还需要相关开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步 【项目价值】:可用在相关项目设计中,皆可应用在项目、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面,可借鉴此优质项目实现复刻,设计报告也可借鉴此项目,也可基于此项目来扩展开发出更多功能 下载后请首先打开README文件(如有),项目工程可直接复现复刻,如果基础还行,也可在此程序基础上进行修改,以实现其它功能。供开源学习/技术交流/学习参考,勿用于商业用途。质量优质,放心下载使用。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值