分布式基础
(21人评价)
谷粒商城--微服务分布式电商项目

谷粒商城--微服务分布式电商项目

价格 免费

nohup sh /home/install/seata/bin/seata-server.sh >log.out 2>1 &

[展开全文]

elasticsearch:存储、搜索海量数据

索引、类型、文档

倒排索引->相关性得分

[展开全文]

GET  /bank/_mapping

PUT /my_index

{

"mapping":{

"properties"{

"age":{"type":"integer"},

"email":{"type":"keyword"},

"name":{"type":"text"}

}

}}

[展开全文]

1.子组件需要引入pubsub-js

import PubSub from 'pubsub-js'

2.不能通能this.PubSub来调用组件。直接PubSub

[展开全文]
  1. 面包屑导航条的name和value是否可以从ES的结果中获取
  2.  面包屑中的连接地址只封装前台传入的参数减去当前参数即可。
  3. 从聚合所有属性集合条件中筛选出符合条件的属性
    // 分析聚合元素
    // 聚合元素-属性
    ParsedNested attrAgg = response.getAggregations().get("attr-agg");
    // 获聚合元素
    Aggregations attrAggs = attrAgg.getAggregations();
    ParsedLongTerms attrIdAgg = attrAggs.get("id-agg");
    List<? extends Terms.Bucket> attrIdAggBuckets = attrIdAgg.getBuckets();
    // 创建attrs集合存储attr
    ArrayList<SearchResult.Attr> attrs = new ArrayList<>();
    for (int i = 0; i < attrIdAggBuckets.size(); i++) {
        Long attrId = attrIdAggBuckets.get(i).getKeyAsNumber().longValue();
        Aggregations aggregations = attrIdAggBuckets.get(i).getAggregations();
        // 获取id聚合的子聚合
        ParsedStringTerms attrNameAgg = aggregations.get("name-agg");
        // 获取id聚合的子聚合的属性名,一个id对应一个属性名
        String attrName = attrNameAgg.getBuckets().get(0).getKeyAsString();
        // 一个attrId对应的attrValue有多个
        ParsedStringTerms attrValAgg = aggregations.get("value-agg");
        List<String> attrVals = attrValAgg.getBuckets().stream()
                // 获取每一个bucket中的值 Terms.Bucket::getKeyAsString
                .map(bucket -> {
                    return bucket.getKeyAsString();
                }).collect(Collectors.toList());
    
        // 设置面包屑
    
        // 获取请求参数
        String queryString = request.getQueryString();
        System.out.println(queryString);
        // 解析每个参数
        String[] split = queryString.split("&");
        List<SearchResult.NavVo> navVos = new ArrayList<>();
        // 遍历每个参数,判断是否以“attrs”开头 attrs=2_LIO-AN02
        for (String s : split) {
            if(s.startsWith("attrs")){
                // 分隔属性
                String[] attrValues = s.split("=");
                String attr = attrValues[1];
                // 分隔attr 2_LIO-AN02
                String[] s1 = attr.split("_");
                String attrVal = s1[1];
                // 加码
                attrVal = URLEncoder.encode(attrVal, "UTF-8");
                // 判断集合中是否有其存在
                if(attrVals.contains(attrVal)){
                    // 设置面包屑值
                    SearchResult.NavVo navVo = new SearchResult.NavVo();
                    navVo.setNavName(attrName);
                    navVo.setNavValue(attrVal);
                    // 设置连接地址 将 &attrs=2_LIO-AN02
                    String link = queryString.replace("&" + s,"");
                    navVo.setLink(link);
                    navVos.add(navVo);
                }
            }
        }
        // 设置
        result.setNavVos(navVos);
    
    …………
    
    }

     

[展开全文]

业务场景:
查询“商品详情页”的逻辑比较复杂,有些数据还需要远程调用,必然需要花费很多时间。
比如:
获取 sku 基本信息     0.5s
获取 sku 图片         0.5s
获取 sku 促销信息     1s
获取 spu 的所有销售属性  1s
获取规格参数组及组下的规格参数    1.5s
spu 详情 1s

如果不使用异步开发,就需要 5.5s 才能显示数据,而使用了异步就能缩短并发访问时间。

同时,还要考虑到获取数据的逻辑性,比如:先获取 sku 相关信息后,才能知晓 spu 信息。


CompletableFuture 是 jdk1.8 以后提供的新功能。 Future 类可以获取到异步结果。

[展开全文]

<!--综合排序-->
<div class="filter_top">
    <div class="filter_top_left" th:with="p = ${param.sort}">
        <a th:class="${(!#strings.isEmpty(p) && #strings.startsWith(p,'hotScore') && #strings.endsWith(p,'desc'))?'sort_a desc':'sort_a'}"
           th:attr="style=${(#strings.isEmpty(p) || #strings.startsWith(p,'hotScore'))?'color:#FFF;border-color:#e4393c;background:#e4393c':'color:#333;border-color:#CCC;background:#FFF'}"
           sort="hotScore" href="/static/search/#">综合排序 [[${(!#strings.isEmpty(p) && #strings.startsWith(p,'hotScore') && #strings.endsWith(p,'desc'))?'↓':'↑'}]] </a>

        <a th:class="${(!#strings.isEmpty(p) && #strings.startsWith(p,'saleCount') && #strings.endsWith(p,'desc'))?'sort_a desc':'sort_a'}"
           th:attr="style=${(!#strings.isEmpty(p) && #strings.startsWith(p,'saleCount'))?'color:#FFF;border-color:#e4393c;background:#e4393c':'color:#333;border-color:#CCC;background:#FFF'}"
           sort="saleCount" href="/static/search/#">销量 [[${(!#strings.isEmpty(p) && #strings.startsWith(p,'saleCount') && #strings.endsWith(p,'desc'))?'↓':'↑'}]] </a>

        <a th:class="${(!#strings.isEmpty(p) && #strings.startsWith(p,'skuPrice') && #strings.endsWith(p,'desc'))?'sort_a desc':'sort_a'}"
           th:attr="style=${(!#strings.isEmpty(p) && #strings.startsWith(p,'skuPrice'))?'color:#FFF;border-color:#e4393c;background:#e4393c':'color:#333;border-color:#CCC;background:#FFF'}"
           sort="skuPrice" href="/static/search/#">价格 [[${(!#strings.isEmpty(p) && #strings.startsWith(p,'skuPrice') && #strings.endsWith(p,'desc'))?'↓':'↑'}]] </a>
    </div>
</div>

[展开全文]

 

微服务

传统的开发模式是单一的,随着业务的不断增加代码的编写越来越复杂,所有功能都在一台服务器上加大了服务器的压力。

微服务就可以解决,微服务就是吧一个大的项目根据业务进行拆分,拆分成各个小的微服务,然后通过一些分布式的技术进行相互调用。

分布式开发:

注册中心,配置中心,网关。

客户端发送请求到网关,然后网关进行过滤返送到注册中心,并且调用对应的路由,并返回相应数据返回到网关在过滤一些无用请求返回客户端数据。

 

 

注册中心用来将各个微服务注册到一个中心中,然后网关就可以根据不同的请求调用对应的微服务了,先进去查找然后进行调用。

配置中心用来将各个微服务相同的配置集中管理到配置中心,然后进行管理。

分布式的常用的技术如下:

springcloud,dubbo等。

 由于原生的springcloud分布式技术的一些组件的停更,无法继续满足市场的要求,所以阿里退出了新一代的spingcloudalibaba分布式技术,他不只需要一些少量的注解 以及一些少量的配置就可以解决springcloud应用进入阿里微服务解决方案,通过阿里中间件来迅速搭建分布式应用系统。

springcloudAlibaba

Nacos:注册中心(服务发现/注册)原生的springcloud用的是Eurka作为注册中心

Nacos:配置中心(动态配置管理)

原生的springcloud用的是Spring Cloud Config作为配置中心

Ribbon:负载均衡(和原生的springcloud的一样)

Feign:远程调用(和原生的springcloud的一样)

Sentinel:服务的熔断,降级、限流(原生的springcloud用的是Netflix Hystrix)

Gatway:API网关(原生的springcloud用得是Netflix Zuul)

Sleuth:调用链监控(和原生的springcloud 一样)

 Seata:分布式事务(Fescar)

 

整合springcloudAlibaba到项目

1.在总

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-alibaba-dependencies</artifactId>
            <version>2.2.0.RELEASE</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

 

2.

 

[展开全文]

sku切换的逻辑

属性颜色包含的skuid=属性内存包含的skuid的交集

[展开全文]

    /* 替换pageNum的方法*/
    function replaceParamVal(url, paramName, replaceVal){
        var oUrl = url.toString();
        var re = eval('/('+ paramName +'=)([^&]*)/gi');
        var nUrl = oUrl.replace(re, paramName +'='+ replaceVal);
        return nUrl;
    }

[展开全文]

远程调用:

重复调用,接口幂等性,重试机制。

[展开全文]

springCache的不足:

1、读模式:

      缓存穿透:查询一个null的数据。在springCache中通过配置cache-null-vakues=true

 

[展开全文]
业界大牛亲自授课
前沿技术实时更新
足不出户学编程
关注尚硅谷微信 一键下载全部视频教程

关注尚硅谷微信

一键下载全部视频教程