kafka实战最佳经验,【源码分析设计模式 10

(2)HighBuilding


package designMode.advance.builder;



public class HighBuilding extends HouseBuilder {

    @Override

    public void buildBasic() {

        System.out.println(" 高楼的打地基100米 ");

    }



    @Override

    public void buildWalls() {

        System.out.println(" 高楼的砌墙20cm ");

    }



    @Override

    public void roofed() {

        System.out.println(" 高楼的透明屋顶 ");

    }

} 

4、指挥者HouseDirector



package designMode.advance.builder;



public class HouseDirector {

    HouseBuilder houseBuilder = null;



    //构造器传入 houseBuilder

    public HouseDirector(HouseBuilder houseBuilder) {

        this.houseBuilder = houseBuilder;

    }



    //通过setter 传入 houseBuilder

    public void setHouseBuilder(HouseBuilder houseBuilder) {

        this.houseBuilder = houseBuilder;

    }



    //如何处理建造房子的流程,交给指挥者

    public House constructHouse() {

        houseBuilder.buildBasic();

        houseBuilder.buildWalls();

        houseBuilder.roofed();

        return houseBuilder.buildHouse();

    }

} 

5、测试类



package designMode.advance.builder;



public class Client {

    public static void main(String[] args) {

        //盖普通房子

        CommonHouse commonHouse = new CommonHouse();

        //准备创建房子的指挥者

        HouseDirector houseDirector = new HouseDirector(commonHouse);

        //完成盖房子,返回产品(普通房子)

        House house = houseDirector.constructHouse();



        System.out.println("--------------------------");

        //盖高楼

        HighBuilding highBuilding = new HighBuilding();

        //重置建造者

        houseDirector.setHouseBuilder(highBuilding);

        //完成盖房子,返回产品(高楼)

        houseDirector.constructHouse();

    }

} 

6、控制台输出


六、建造者模式在SpringMVC中的实现

=====================

1、在springMVC中,我们就可以看到建造者模式的身影。


springMVC在构建UriComponents的内容时,就用到了建造者模式,我们先来看看UriComponents这个类是提供了哪些Components


public abstract class UriComponents implements Serializable {



    private static final String DEFAULT_ENCODING = "UTF-8";



    // 用于分割uri的正则表达式,下面会说到

    private static final Pattern NAMES_PATTERN = Pattern.compile("\\{([^/]+?)\\}");





    private final String scheme;



    private final String fragment;





    protected UriComponents(String scheme, String fragment) {

        this.scheme = scheme;

        this.fragment = fragment;

    }





    // 多个Components对应的getter方法



    /**

     * 返回URL的scheme.

     */

    public final String getScheme() {

        return this.scheme;

    }



    /**

     * 返回URL的fragment.

     */

    public final String getFragment() {

        return this.fragment;

    }



    /**

     * 返回URL的schemeSpecificPar

     */

    public abstract String getSchemeSpecificPart();



    /**

     * 返回userInfo

     */

    public abstract String getUserInfo();



    /**

     * 返回URL的host

     */

    public abstract String getHost();



    /**

     * 返回URL的port

     */

    public abstract int getPort();



    /**

     * 返回URL的path

     */

    public abstract String getPath();



    /**

     * 返回URL的path部分的集合

     */

    public abstract List<String> getPathSegments();



    /**

     * 返回URL的query部分

     */

    public abstract String getQuery();



    /**

     * 返回URL的query参数map

     */

    public abstract MultiValueMap<String, String> getQueryParams();





    /**

     * 将URL的components用特定的编码规则编码并返回,默认为utf-8

     */

    public final UriComponents encode() {

        try {

            return encode(DEFAULT_ENCODING);

        }

        catch (UnsupportedEncodingException ex) {

            // should not occur

            throw new IllegalStateException(ex);

        }

    }



    /**

     * 编码的抽象方法,传入相应的编码规则

     */

    public abstract UriComponents encode(String encoding) throws UnsupportedEncodingException;



    /**

     * 将URL中的模板参数换成对应的值

     */

    public final UriComponents expand(Map<String, ?> uriVariables) {

        Assert.notNull(uriVariables, "'uriVariables' must not be null");

        return expandInternal(new MapTemplateVariables(uriVariables));

    }



    /**

     * 将URL中的模板参数换成对应的值,输入为数组

     */

    public final UriComponents expand(Object... uriVariableValues) {

        Assert.notNull(uriVariableValues, "'uriVariableValues' must not be null");

        return expandInternal(new VarArgsTemplateVariables(uriVariableValues));

    }



    /**

     * 将URL中的模板参数换成对应的值,输入为UriTemplateVariables

     */

    public final UriComponents expand(UriTemplateVariables uriVariables) {

        Assert.notNull(uriVariables, "'uriVariables' must not be null");

        return expandInternal(uriVariables);

    }



    /**

     * 将URL中的模板参数换成对应的值的最终的实现方法

     */

    abstract UriComponents expandInternal(UriTemplateVariables uriVariables);



    /**

     * 处理URL

     */

    public abstract UriComponents normalize();



    /**

     * 返回URL的string

     */

    public abstract String toUriString();



    /**

     * 返回URI格式的方法

     */

    public abstract URI toUri();



    @Override

    public final String toString() {

        return toUriString();

    }



    /**

     * 将这些Components的值赋给其builder类

     */

    protected abstract void copyToUriComponentsBuilder(UriComponentsBuilder builder);

上面的代码不包括UriComponents类下其余的静态辅助方法,单单从此类的包含多种components中,就可以看出UriComponents的复杂程度。这些components大都对应了url的某个部分,能帮助springMVC对请求的url内容进行识别。springMVC就是通过将uri构建成这个类,再对uri进行处理的。

2、UriComponentsBuilder


那么springMVC究竟是如何让请求的uri生成相应的UriComponents类呢?就要看看UriComponentsBuilder这个类了。

首先看看它的两个构造函数:


/**

 * 默认构造方法,其中path的构造类为CompositePathComponentBuilder,它为UriComponentsBuilder的内部静态类,主要实现对url的path部分进行构造。

 */

protected UriComponentsBuilder() {

    this.pathBuilder = new CompositePathComponentBuilder();

}



/**

 * 创建一个传入UriComponentsBuilder类的深拷贝对象

 */

protected UriComponentsBuilder(UriComponentsBuilder other) {

    this.scheme = other.scheme;

    this.ssp = other.ssp;

    this.userInfo = other.userInfo;

    this.host = other.host;

    this.port = other.port;

    this.pathBuilder = other.pathBuilder.cloneBuilder();

    this.queryParams.putAll(other.queryParams);

    this.fragment = other.fragment;

}

由于url的path部分是比较复杂的,这边springMVC用了内部类的方式,为path单独加了两个builder类,分别是CompositePathComponentBuilder、FullPathComponentBuilder,这里就不扩展来说了。看完了UriComponentsBuilder的构造方法,我们来看它是如何将给定的uri生成为相应的UriComponents的。这里就从比较容易理解的fromUriString方法入手吧:


// 静态方法,从uri的字符串中获得uri的各种要素

public static UriComponentsBuilder fromUriString(String uri) {

    Assert.notNull(uri, "URI must not be null");

    // 利用正则表达式,获得uri的各个组成部分

    Matcher matcher = URI_PATTERN.matcher(uri);

    if (matcher.matches()) {

        UriComponentsBuilder builder = new UriComponentsBuilder();

        // 获得对应要素的字符串

        String scheme = matcher.group(2);

        String userInfo = matcher.group(5);

        String host = matcher.group(6);

        String port = matcher.group(8);

        String path = matcher.group(9);

        String query = matcher.group(11);

        String fragment = matcher.group(13);

        // uri是否透明的标志位

        boolean opaque = false;

        // uri存在scheme且后面不跟:/则为不透明uri 

        例如mailto:java-net@java.sun.com

        if (StringUtils.hasLength(scheme)) {

            String rest = uri.substring(scheme.length());

            if (!rest.startsWith(":/")) {

                opaque = true;

            }

        }

        builder.scheme(scheme);

        // 如果为不透明uri,则具备ssp,需要设置ssp

        if (opaque) {

            String ssp = uri.substring(scheme.length()).substring(1);



# 总结

蚂蚁面试比较重视基础,所以Java那些基本功一定要扎实。蚂蚁的工作环境还是挺赞的,因为我面的是稳定性保障部门,还有许多单独的小组,什么三年1班,很有青春的感觉。面试官基本水平都比较高,基本都P7以上,除了基础还问了不少架构设计方面的问题,收获还是挺大的。

**[资料领取方式:戳这里](https://gitee.com/vip204888/java-p7)**

* * *

**经历这次面试我还通过一些渠道发现了需要大厂真实面试主要有**:蚂蚁金服、拼多多、阿里云、百度、唯品会、携程、丰巢科技、乐信、软通动力、OPPO、银盛支付、中国平安等初,中级,高级Java面试题集合,附带超详细答案,希望能帮助到大家。

gth());

            if (!rest.startsWith(":/")) {

                opaque = true;

            }

        }

        builder.scheme(scheme);

        // 如果为不透明uri,则具备ssp,需要设置ssp

        if (opaque) {

            String ssp = uri.substring(scheme.length()).substring(1);



# 总结

蚂蚁面试比较重视基础,所以Java那些基本功一定要扎实。蚂蚁的工作环境还是挺赞的,因为我面的是稳定性保障部门,还有许多单独的小组,什么三年1班,很有青春的感觉。面试官基本水平都比较高,基本都P7以上,除了基础还问了不少架构设计方面的问题,收获还是挺大的。

**[资料领取方式:戳这里](https://gitee.com/vip204888/java-p7)**

* * *

**经历这次面试我还通过一些渠道发现了需要大厂真实面试主要有**:蚂蚁金服、拼多多、阿里云、百度、唯品会、携程、丰巢科技、乐信、软通动力、OPPO、银盛支付、中国平安等初,中级,高级Java面试题集合,附带超详细答案,希望能帮助到大家。

![蚂蚁金服5面,总结了49个面试题,遇到的面试官都是P7级别以上](https://img-blog.csdnimg.cn/img_convert/a8bc86de3c451c2e1fab0dcc16a5839f.png)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Kafka 0.9.0 是一个分布式流处理平台,用于高效地处理和传输大规模数据流。它采用了发布-订阅的消息队列模型,能够以高吞吐量、低延迟的方式处理数据。 在源码分析上,我可以给你一些大致的指导,但是详细的分析可能需要具体的问题或主题。以下是一些主要的模块和功能,你可以根据需要选择感兴趣的部分进行深入研究: 1. Broker:Kafka 的核心组件,负责接收、存储和转发消息。可以了解 Broker 的启动过程、消息存储机制和网络通信模块等。 2. Producer:负责向 Kafka 集群发送消息。可以了解 Producer 的消息发送流程、消息分区机制和消息确认机制等。 3. Consumer:负责从 Kafka 集群消费消息。可以了解 Consumer 的消息订阅机制、消费者组管理和消息位移管理等。 4. Topic 和 Partition:Kafka 将消息分为多个 Topic,并将每个 Topic 划分为多个 Partition。可以了解 Topic 和 Partition 的创建、分配和管理等。 5. Replica 和 Leader-Follower:Kafka 使用副本机制来保证数据的可靠性。可以了解 Replica 的同步和选举机制,以及 Leader-Follower 模型的实现细节。 6. ZooKeeper:Kafka 使用 ZooKeeper 来进行集群的协调和管理。可以了解 Kafka 对 ZooKeeper 的依赖和使用方式。 以上只是一些主要的模块和功能,Kafka源码非常庞大和复杂,涉及到很多细节和算法。如果你有具体的问题或感兴趣的主题,我可以提供更详细的指导。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值