SpringCloud 电商平台

 需要源码私信我

1、项目介绍

乐购电商平台项目属于b2b模式的线上商城,支持用户在线浏览商品,在线搜索商品,并且可以将喜欢的商品加入购物车从而下单购买商品,同时支持线上支付,支付模式支持支付宝、微信。用户还可以参与低价商品秒杀。

2、项目技术

SpringBoot+SpringCloud+Redis+Mybatis+Shiro+Nginx +Vue+

Element-UI+Thymeleaf+Nacos+Seata+Sentinel+Sleuth&Zpkin+RabbitMQ

3、开发环境

IDEA、JDK1.8、Tomcat、MySQL、Maven、Git

4、功能介绍

 用户管理、商品管理、商品类别管理、订单管理、支付管理、地址管理、评论管理等

5、环境搭建 很重要!很重要!很重要!

LInux

解压linux 压缩包后,导入虚拟机,输入用户名:root,密码:sasa,

《1.进入/etc/sysconfig/network-scripts/--》《2. vi ifcfg-ens33--》3.修改 -- 

192.168.237.75=说明:进入《编辑》点击《虚拟网络编辑器》查看《Vmnet8,子网地址,第二点后的字段如192.168.237.5   为  237   》 DNS1="192.168.237.1"     IPADDR="192.168.237.75"
GATEWAY="192.168.237.75"

TYPE="Ethernet"
PROXY_METHOD="none"
BROWSER_ONLY="no"
BOOTPROTO="static"
DEFROUTE="yes"
IPV4_FAILURE_FATAL="no"
IPV6INIT="yes"
IPV6_AUTOCONF="yes"
IPV6_DEFROUTE="yes"
IPV6_FAILURE_FATAL="no"
IPV6_ADDR_GEN_MODE="stable-privacy"
NAME="ens33"

UUID="9bf60c47-d18b-4973-9828-d6c3f857ba2e"
DEVICE="ens33"
ONBOOT="yes"
IPADDR="192.168.237.75"
PREFIX="24"
GATEWAY="192.168.237.75"
DNS1="192.168.237.1"
IPV6_PRIVACY="no"

》4---》reboot(重启)

5---》

5.1cd /data/nginx/conf -->

5.2 vi nginx.conf

6-- 》

修改 upstream zmall{
        server    192.168.237.1:7000;
    }

《

worker_processes  1;

events {
    worker_connections  1024;
}

http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;

    #upstream ruoyi-admin-servers { 
    #        ip_hash; 
    #        server ruoyi-admin01:8080; 
    #        server ruoyi-admin02:8080; 
    #    }
    upstream nacos-cluster { 
        ip_hash; 
        server nacos01:8848;
        server nacos02:8848;
        server nacos03:8848;
    }
       upstream zmall{
        server    192.168.233.1:7000;
    }

    server {
        listen       80;
        server_name  *.zmall.com;
        charset utf-8;
        
        location /nacos/ {
            proxy_pass http://nacos-cluster;
        }
                location /static/ {
            root /usr/share/nginx/html;
        }
        
        location / {
                # proxy_pass 将监听到的请求转发到对应的upstream网关地址。即在此完成了访问网址-> nginx -> 网关
                proxy_pass http://zmall;
                # proxy_set_header 给通过nginx 的请求添加请求头的部分信息
                    proxy_set_header Host $host;
            }
        
        #location /prod-api/ {
            #proxy_set_header Host $http_host;
        #    proxy_set_header X-Real-IP $remote_addr;
        #    proxy_set_header REMOTE-HOST $remote_addr;
        #    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        #    proxy_pass http://ruoyi-admin-servers/; #设置代理转发地址
        #}

        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
}

 java 项目篇

将电商项目解压后,导入到idea,配置maven

下载SwitchHosts ,点击加号一个本地的hosts ,标题随意

内容:

192.168.237.75    zmall-server
192.168.237.75    zmall.com
192.168.237.75    product.zmall.com
192.168.237.75    order.zmall.com
192.168.237.75    cart.zmall.com
192.168.237.75    zmall-admin.com
192.168.237.75    auth.zmall.com
192.168.237.75    skill.zmall.com
192.168.237.75    admin.zmall.com
127.0.0.1    ssoserver.com
127.0.0.1    client1.com
127.0.0.1    product.zmall1.com
启动所有的项目
ZmallOrderApplication2 
ZmallGatewayApplication 
ZmallCartApplication 
ZmallProductApplication
ZmallAdminApplication 
ZmallOrderApplication

欧克,到这里应该就都可以了,如果你想更深入了解的话就继续往下看吧

application.yml 与 boostart.yml

application.yml SpringBoot 应用的自动化配置

boostart.yml 使用有三种场景

1.使用Spring Cloud Config 配置中心时,这时候需要在boostart.yml 配置文件中配置连接外部配置中心的配置属性来加载配置信息

2.一些加密解密的场景

3.一些固定的不能被修改的信息

6.代码实现

Sentinel--服务容错

Sentinel Sentinel 是阿里巴巴开源的一款断路器实现,本身在阿里内部已经被大规模采用,非常稳定。

linux 6.0.1--->

docker pull bladex/sentinel-dashboard:1.8.0
docker run --name sentinel -d -p 8858:8858 --restart always --network net-zmall bladex/sentinel-dashboard:1.8.0

6.1 ---》在zmall_common(公告模块)pom 文件导入依赖

<!--sentinel-->
 <dependency>
 <groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId> 
</dependency>

6.2 ---》在订单模块 中resource 文件夹下,application.yml文件夹下

spring:
  cloud:
    sentinel:
      transport:
        port: 9999 #跟控制台交流的端口,随意指定一个未使用的端口即可
        dashboard: zmall-server:8858 # 指定控制台服务的地址
      web-context-unify: false #关闭自动收敛
      eager: true #主动发送心跳 当服务启动时自己主动出现在sentinel 控制台上

6.3 ---》在GateWay模块 中resource 文件夹下,application.yml文件夹下

spring:
  cloud:
    sentinel:
      transport:
        port: 9998 #跟控制台交流的端口,随意指定一个未使用的端口即可
        dashboard: zmall-server:8858 # 指定控制台服务的地址
      web-context-unify: false #关闭自动收敛
      eager: true #主动发送心跳 当服务启动时自己主动出现在sentinel 控制台上

6.4---》 重新启动订单服务 

访问订单模块下的服务

order.zmall.com/order/prod?pid=733

访问Sentinel Dashboard

输入用户名密码都是:sentinel 

点击zmall-order 点击zu点链路,就可看到你所访问的url 了

6.5---》

新建流控,建立如下

(在zmall-order 下只可以对本模块限流,)

只要实现了这个异常

package com.zking.zmall.order.config;

import com.alibaba.csp.sentinel.adapter.spring.webmvc.callback.BlockExceptionHandler;
import com.alibaba.csp.sentinel.slots.block.BlockException;
import com.alibaba.csp.sentinel.slots.block.degrade.DegradeException;
import com.alibaba.csp.sentinel.slots.block.flow.FlowException;
import com.alibaba.fastjson.JSON;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.stereotype.Component;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

//异常处理页面
@Component
public class ExceptionHandlerPage implements BlockExceptionHandler {
    @Override
    public void handle(HttpServletRequest request, HttpServletResponse response, BlockException e) throws Exception {
        response.setContentType("application/json;charset=utf-8");
        ResponseData data = null;
        if (e instanceof FlowException) {
            data = new ResponseData(-1, "接口被限流了...");
        } else if (e instanceof DegradeException) {
            data = new ResponseData(-2, "接口被降级了...");
        }
        response.getWriter().write(JSON.toJSONString(data));
    }
}

@Data
@AllArgsConstructor//全参构造
@NoArgsConstructor//无参构造
class ResponseData {
    private int code;
    private String message;
}

 再次访问你会发现{code:-1, message:"接口被限流了..."  }

6.6---》

网关限流

网关是所有请求的公共入口,所以可以在网关进行限流,而且限流的方式也很多,我们本次采用前 面学过的Sentinel组件来实现网关的限流。Sentinel支持对SpringCloud Gateway、Zuul等主流网关进行限流。

从1.6.0版本开始,Sentinel提供了SpringCloud Gateway的适配模块,可以提供两种资源维度的限流:

  • route维度:即在Spring配置文件中配置的路由条目,资源名为对应的routeId

  • 自定义API维度:用户可以利用Sentinel提供的API来自定义一些API分组

6.6.1--> 在zmall-common||在zmall-gateway导入依赖

<dependency>
    <groupId>com.alibaba.csp</groupId>
    <artifactId>sentinel-spring-cloud-gateway-adapter</artifactId>
</dependency>
 

6.6.2---> 编写配置类 基于Sentinel 的Gateway限流是通过其提供的Filter来完成的,使用时只需注入对应的 SentinelGatewayFilter实例以及 SentinelGatewayBlockExceptionHandler 实例即可

推荐使用在sentinel控制台建立流控规则,因为容易。

package com.zking.config;
​
import com.alibaba.csp.sentinel.adapter.gateway.common.SentinelGatewayConstants;
import com.alibaba.csp.sentinel.adapter.gateway.common.api.ApiDefinition;
import com.alibaba.csp.sentinel.adapter.gateway.common.api.ApiPathPredicateItem;
import com.alibaba.csp.sentinel.adapter.gateway.common.api.ApiPredicateItem;
import com.alibaba.csp.sentinel.adapter.gateway.common.api.GatewayApiDefinitionManager;
import com.alibaba.csp.sentinel.adapter.gateway.common.rule.GatewayFlowRule;
import com.alibaba.csp.sentinel.adapter.gateway.common.rule.GatewayRuleManager;
import com.alibaba.csp.sentinel.adapter.gateway.sc.SentinelGatewayFilter;
import com.alibaba.csp.sentinel.adapter.gateway.sc.callback.BlockRequestHandler;
import com.alibaba.csp.sentinel.adapter.gateway.sc.callback.GatewayCallbackManager;
import com.alibaba.csp.sentinel.adapter.gateway.sc.exception.SentinelGatewayBlockExceptionHandler;
import org.springframework.beans.factory.ObjectProvider;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;
import org.springframework.core.annotation.Order;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.codec.ServerCodecConfigurer;
import org.springframework.web.reactive.function.BodyInserters;
import org.springframework.web.reactive.function.server.ServerResponse;
import org.springframework.web.reactive.result.view.ViewResolver;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;
​
import javax.annotation.PostConstruct;
import java.util.*;
@Configuration
public class GatewayConfiguration {
    private final List<ViewResolver> viewResolvers;
// 自定义限流异常页面
    @PostConstruct
    public void initBlockHandlers() {
        BlockRequestHandler blockRequestHandler = new BlockRequestHandler() {
            public Mono<ServerResponse> handleRequest(ServerWebExchange serverWebExchange, Throwable throwable) {
                Map map = new HashMap<>();
                map.put("code", 0);
                map.put("message", "接口被限流了");
                return ServerResponse.status(HttpStatus.OK).
                        contentType(MediaType.APPLICATION_JSON_UTF8).
                        body(BodyInserters.fromObject(map));
            }
        };
        GatewayCallbackManager.setBlockHandler(blockRequestHandler);
    }
​
}
​
    private final ServerCodecConfigurer serverCodecConfigurer;
​
    public GatewayConfiguration(ObjectProvider<List<ViewResolver>> viewResolversProvider,
                                ServerCodecConfigurer serverCodecConfigurer) {
        this.viewResolvers = viewResolversProvider.getIfAvailable(Collections::emptyList);
        this.serverCodecConfigurer = serverCodecConfigurer;
    }
​
    // 初始化一个限流的过滤器
    @Bean
    @Order(Ordered.HIGHEST_PRECEDENCE)
    public GlobalFilter sentinelGatewayFilter() {
        return new SentinelGatewayFilter();
    }
​
    // 配置初始化的限流参数
    @PostConstruct
    public void initGatewayRules() {
        Set<GatewayFlowRule> rules = new HashSet<>();
        rules.add(
                new GatewayFlowRule("product_route") //资源名称,对应路由id
                        .setCount(1) // 限流阈值
                        .setIntervalSec(1) // 统计时间窗口,单位是秒,默认是 1 秒
        );
        GatewayRuleManager.loadRules(rules);
    }
​
    // 配置限流的异常处理器
    @Bean
    @Order(Ordered.HIGHEST_PRECEDENCE)
    public SentinelGatewayBlockExceptionHandler sentinelGatewayBlockExceptionHandler() {
        return new SentinelGatewayBlockExceptionHandler(viewResolvers, serverCodecConfigurer);
    }

6.6.3---> 测试 在一秒钟内多次访问http://zmall.com/prod/detail/1就可以看到限流启作用了。

6.6.4---> 自定义API分组 自定义API分组是一种更细粒度的限流规则定义

 // 配置初始化的限流参数
    @PostConstruct
    public void initGatewayRules() {
//        Set<GatewayFlowRule> rules = new HashSet<>();
//        rules.add(
//                new GatewayFlowRule("product_route") //资源名称,对应路由id
//                        .setCount(1) // 限流阈值
//                        .setIntervalSec(1) // 统计时间窗口,单位是秒,默认是 1 秒
//        );
//        GatewayRuleManager.loadRules(rules);
​
​
        Set<GatewayFlowRule> rules = new HashSet<>();
        rules.add(new GatewayFlowRule("product_api1").setCount(1).setIntervalSec(1));
        rules.add(new GatewayFlowRule("product_api2").setCount(1).setIntervalSec(1));
        GatewayRuleManager.loadRules(rules);
    }
   
   //自定义API分组
    @PostConstruct
    private void initCustomizedApis() {
        Set<ApiDefinition> definitions = new HashSet<>();
        ApiDefinition api1 = new ApiDefinition("product_api1")
                .setPredicateItems(new HashSet<ApiPredicateItem>() {
  {
                    // 以/product-serv/product/api1 开头的请求
                    add(new ApiPathPredicateItem().setPattern("/product-serv/product/api1/**").
                            setMatchStrategy(SentinelGatewayConstants.URL_MATCH_STRATEGY_PREFIX));
                }});
        ApiDefinition api2 = new ApiDefinition("product_api2")
                .setPredicateItems(new HashSet<ApiPredicateItem>() {
  {
                    // 以/product-serv/product/api2/demo1 完成的url路径匹配
                    add(new ApiPathPredicateItem().setPattern("/product-serv/product/api2/demo1"));
                }});
        definitions.add(api1);
        definitions.add(api2);
        GatewayApiDefinitionManager.loadApiDefinitions(definitions);
    }

6.6.5--->新建流控,也可在zmall-gateway下建立如下

(在zmall-gateway下只可以对所有模块限流,网关是所有请求的公共入口,所以可以在网关进行限流)

 再次访问你会发现{code:-1, message:"接口被限流了..."  }

7.Sleuth 链路追踪---->

链路追踪介绍

在大型系统的微服务化构建中,一个系统被拆分成了许多模块。这些模块负责不同的功能,组合成 系统,最终可以提供丰富的功能。在这种架构中,一次请求往往需要涉及到多个服务。互联网应用构建 在不同的软件模块集上,这些软件模块,有可能是由不同的团队开发、可能使用不同的编程语言来实 现、有可能布在了几千台服务器,横跨多个不同的数据中心,也就意味着这种架构形式也会存在一些问 题:

  • 如何快速发现问题?

  • 如何判断故障影响范围?

  • 如何梳理服务依赖以及依赖的合理性?

  • 如何分析链路性能问题以及实时容量规划?

分布式链路追踪(Distributed Tracing),就是将一次分布式请求还原成调用链路,进行日志记 录,性能监控并将一次分布式请求的调用情况集中展示。比如各个服务节点上的耗时、请求具体到达哪 台机器上、每个服务节点的请求状态等等。

常见的链路追踪技术有下面这些:

  • cat 由大众点评开源,基于Java开发的实时应用监控平台,包括实时应用监控,业务监控 。 集成 方案是通过代码埋点的方式来实现监控,比如: 拦截器,过滤器等。 对代码的侵入性很大,集成 成本较高。风险较大。

  • zipkin 由Twitter公司开源,开放源代码分布式的跟踪系统,用于收集服务的定时数据,以解决微 服务架构中的延迟问题,包括:数据的收集、存储、查找和展现。该产品结合spring-cloud-sleuth 使用较为简单, 集成很方便, 但是功能较简单。

  • pinpoint Pinpoint是韩国人开源的基于字节码注入的调用链分析,以及应用监控分析工具。特点 是支持多种插件,UI功能强大,接入端无代码侵入。

  • skywalking SkyWalking是本土开源的基于字节码注入的调用链分析,以及应用监控分析工具。特点是支持多 种插件,UI功能较强,接入端无代码侵入。目前已加入Apache孵化器。

  • Sleuth SpringCloud 提供的分布式系统中链路追踪解决方案。

注意:SpringCloud alibaba技术栈中并没有提供自己的链路追踪技术的,我们可以采用Sleuth + Zinkin来做链路追踪解决方案

Sleuth入门

Sleuth介绍

SpringCloud Sleuth主要功能就是在分布式系统中提供追踪解决方案。它大量借用了Google Dapper的设计, 先来了解一下Sleuth中的术语和相关概念。

  • Trace 由一组Trace Id相同的Span串联形成一个树状结构。为了实现请求跟踪,当请求到达分布式系统的 入口端点时,只需要服务跟踪框架为该请求创建一个唯一的标识(即TraceId),同时在分布式系 统内部流转的时候,框架始终保持传递该唯一值,直到整个请求的返回。那么我们就可以使用该唯 一标识将所有的请求串联起来,形成一条完整的请求链路。

  • Span 代表了一组基本的工作单元。为了统计各处理单元的延迟,当请求到达各个服务组件的时 候,也通过一个唯一标识(SpanId)来标记它的开始、具体过程和结束。通过SpanId的开始和结 束时间戳,就能统计该span的调用时间,除此之外,我们还可以获取如事件的名称。请求信息等 元数据。

  • Annotation 用它记录一段时间内的事件,内部使用的重要注释: cs(Client Send)客户端发出请求,开始一个请求的生命 sr(Server Received)服务端接受到请求开始进行处理, sr-cs = 网络延迟(服务调用的时间) ss(Server Send)服务端处理完毕准备发送到客户端,ss - sr = 服务器上的请求处理时间 cr(Client Reveived)客户端接受到服务端的响应,请求结束。 cr - sr = 请求的总时间

Sleuth入门

微服务名称, traceId, spanid,是否将链路的追踪结果输出到第三方平台 [api-gateway,3977125f73391553,3977125f73391553,false] [service-order,3977125f73391553,57547b5bf71f8242,false] [service-product,3977125f73391553,449f5b3f3ef8d5c5,false] 接下来通过之前的项目案例整合Sleuth,完成入门案例的编写。引入Sleuth依赖

<!--链路追踪 Sleuth-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-sleuth</artifactId>
</dependency>

启动微服务,调用之后,我们可以在控制台观察到sleuth的日志输出

其中5399d5cb061971bd 是TraceId, 5399d5cb061971bd 是SpanId,依次调用有一个全局的 TraceId,将调用链路串起来。仔细分析每个微服务的日志,不难看出请求的具体过程。 查看日志文件并不是一个很好的方法,当微服务越来越多日志文件也会越来越多,通过Zipkin可以 将日志聚合,并进行可视化展示和全文检索。

8.---》Zipkin的集成-->

8.1----》ZipKin介绍

Zipkin 是 Twitter 的一个开源项目,它基于Google Dapper实现,它致力于收集服务的定时数据, 以解决微服务架构中的延迟问题,包括数据的收集、存储、查找和展现。 我们可以使用它来收集各个服务器上请求链路的跟踪数据,并通过它提供的REST API接口来辅助我 们查询跟踪数据以实现对分布式系统的监控程序,从而及时地发现系统中出现的延迟升高问题并找出系 统性能瓶颈的根源。 除了面向开发的 API 接口之外,它也提供了方便的UI组件来帮助我们直观的搜索跟踪信息和分析请 求链路明细,比如:可以查询某段时间内各用户请求的处理时间等。 Zipkin 提供了可插拔数据存储方式:In-Memory、MySql、Cassandra 以及 Elasticsearch。

上图展示了 Zipkin 的基础架构,它主要由 4 个核心组件构成:

  • Collector:收集器组件,它主要用于处理从外部系统发送过来的跟踪信息,将这些信息转换为 Zipkin内部处理的 Span 格式,以支持后续的存储、分析、展示等功能。

  • Storage:存储组件,它主要对处理收集器接收到的跟踪信息,默认会将这些信息存储在内存中, 我们也可以修改此存储策略,通过使用其他存储组件将跟踪信息存储到数据库中。

  • RESTful API:API 组件,它主要用来提供外部访问接口。比如给客户端展示跟踪信息,或是外接 系统访问以实现监控等。

  • Web UI:UI 组件, 基于API组件实现的上层应用。通过UI组件用户可以方便而有直观地查询和分 析跟踪信息。

  • Zipkin分为两端,一个是 Zipkin服务端,一个是 Zipkin客户端,客户端也就是微服务的应用。 客户端会 配置服务端的 URL 地址,一旦发生服务间的调用的时候,会被配置在微服务里面的 Sleuth 的监听器监 听,并生成相应的 Trace 和 Span 信息发送给服务端

8.2--》LInux ZipKin服务端安装II

docker run -d -p 9411:9411 --network net-zmall --name zipkin --restart always openzipkin/zipkin

8.3---》Zipkin客户端集成

ZipKin客户端和Sleuth的集成非常简单,只需要在微服务中添加其依赖和配置即可。

第1步:在每zmall-common 模块上添加依赖

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-zipkin</artifactId>
</dependency>

8.3.2---》第2步:添加配置

spring:
  zipkin:
    base-url: http://zmall-server:9411/  #zipkin server的请求地址
    discoveryClientEnabled: false #让nacos把它当成一个URL,而不要当做服务名
  sleuth:
    sampler:
      probability: 1.0  #采样的百分比

8.3.3--》第3步: 访问微服务

在boostart.yml 中配置nacos的信息(可以避免在启动时报错)

spring:
  application:
    name: zmall-gateway 同resource 文件夹下的application.name: 名字即可
    
  cloud:
    nacos:
      config:
        server-addr: zmall-server:80 # nacos的服务端地址
        file-extension: yml # 配置文件格式
        extension-configs[0]:
          data-id: zmall-common.yml
          group: DEFAULT_GROUP
          refresh: true
  profiles:
    active: dev # 环境标识

order.zmall.com/order/prod?pid=733

8.3.4--》第4步: 访问zipkin的UI界面,观察效果

8.4.5---》第5步:点击其中一条记录show,可观察一次访问的详细线路。

Zipkin Server默认会将追踪数据信息保存到内存,但这种方式不适合生产环境。Zipkin支持将追踪 数据持久化到mysql数据库或elasticsearch中。

ZipKin数据持久化

扩展内容1 使用mysql实现数据持久化

第1步: 创建mysql数据环境

CREATE TABLE IF NOT EXISTS zipkin_spans (
        `trace_id_high` BIGINT NOT NULL DEFAULT 0 COMMENT 'If non zero, this
        means the trace uses 128 bit traceIds instead of 64 bit',
        `trace_id` BIGINT NOT NULL,
        `id` BIGINT NOT NULL,
        `name` VARCHAR ( 255 ) NOT NULL,
        `parent_id` BIGINT,
        `debug` BIT ( 1 ),
        `start_ts` BIGINT COMMENT 'Span.timestamp(): epoch micros used for endTs query and to implement TTL',
        `duration` BIGINT COMMENT 'Span.duration(): micros used for minDuration and maxDuration query' 
    ) ENGINE = INNODB ROW_FORMAT = COMPRESSED CHARACTER 
    SET = utf8 COLLATE utf8_general_ci;
ALTER TABLE zipkin_spans ADD UNIQUE KEY ( `trace_id_high`, `trace_id`, `id` ) 
COMMENT 'ignore insert on duplicate';
ALTER TABLE zipkin_spans ADD INDEX ( `trace_id_high`, `trace_id`, `id` ) 
COMMENT 'for joining with zipkin_annotations';
ALTER TABLE zipkin_spans ADD INDEX ( `trace_id_high`, `trace_id` ) 
COMMENT 'forgetTracesByIds';
ALTER TABLE zipkin_spans ADD INDEX ( `name` ) 
COMMENT 'for getTraces and getSpanNames';
ALTER TABLE zipkin_spans ADD INDEX ( `start_ts` ) 
COMMENT 'for getTraces ordering and range';
CREATE TABLE IF NOT EXISTS zipkin_annotations (
        `trace_id_high` BIGINT NOT NULL DEFAULT 0 COMMENT 'If non zero, this
        means the trace uses 128 bit traceIds instead of 64 bit',
        `trace_id` BIGINT NOT NULL COMMENT 'coincides with
        zipkin_spans.trace_id',
        `span_id` BIGINT NOT NULL COMMENT 'coincides with zipkin_spans.id',
        `a_key` VARCHAR ( 255 ) NOT NULL COMMENT 'BinaryAnnotation.key or Annotation.value if type == -1',
        `a_value` BLOB COMMENT 'BinaryAnnotation.value(), which must be smaller than 64KB',
        `a_type` INT NOT NULL COMMENT 'BinaryAnnotation.type() or -1 if Annotation',
        `a_timestamp` BIGINT COMMENT 'Used to implement TTL;
SET = utf8 COLLATE utf8_general_ci;
ALTER TABLE zipkin_annotations ADD UNIQUE KEY ( `trace_id_high`, `trace_id`, `span_id`, `a_key`, `a_timestamp` ) 
COMMENT 'Ignore insert on duplicate';
ALTER TABLE zipkin_annotations ADD INDEX ( `trace_id_high`, `trace_id`, `span_id` ) 
COMMENT 'for joining with zipkin_spans';
ALTER TABLE zipkin_annotations ADD INDEX ( `trace_id_high`, `trace_id` ) 
COMMENT 'for getTraces/ByIds';
ALTER TABLE zipkin_annotations ADD INDEX ( `endpoint_service_name` ) 
COMMENT 'for getTraces and getServiceNames';
​
ALTER TABLE zipkin_annotations ADD INDEX(`a_type`) COMMENT 'for getTraces';
ALTER TABLE zipkin_annotations ADD INDEX(`a_key`) COMMENT 'for getTraces';
ALTER TABLE zipkin_annotations ADD INDEX(`trace_id`, `span_id`, `a_key`)
COMMENT 'for dependencies job';
CREATE TABLE IF NOT EXISTS zipkin_dependencies (
`day` DATE NOT NULL,
`parent` VARCHAR(255) NOT NULL,
`child` VARCHAR(255) NOT NULL,
`call_count` BIGINT
) ENGINE=InnoDB ROW_FORMAT=COMPRESSED CHARACTER SET=utf8 COLLATE
utf8_general_ci;
ALTER TABLE zipkin_dependencies ADD UNIQUE KEY(`day`, `parent`, `child`);
    Annotation.timestamp or zipkin_spans.timestamp',
    `endpoint_ipv4` INT COMMENT 'Null when Binary/Annotation.endpoint is null',
    `endpoint_ipv6` BINARY ( 16 ) COMMENT 'Null when Binary/Annotation.endpoint is null, or no IPv6 address',
    `endpoint_port` SMALLINT COMMENT 'Null when Binary/Annotation.endpoint is null',
    `endpoint_service_name` VARCHAR ( 255 ) COMMENT 'Null when
    Binary/Annotation.endpoint is null' 
) ENGINE = INNODB ROW_FORMAT = COMPRESSED CHARACTER 
 

第2步: 在启动ZipKin Server的时候,指定数据保存的mysql的信息

java -jar zipkin-server-2.12.9-exec.jar --STORAGE_TYPE=mysql --MYSQL_HOST=127.0.0.1 --MYSQL_TCP_PORT=3306 --MYSQL_DB=shop --MYSQL_USER=root --MYSQL_PASS=sasa

使用elasticsearch实现数据持久化

第1步: 下载elasticsearch 下载地址:Elasticsearch 6.8.4 | Elastic 第2步: 启动elasticsearch

第3步: 在启动ZipKin Server的时候,指定数据保存的elasticsearch的信息

java -jar zipkin-server-2.12.9-exec.jar --STORAGE_TYPE=elasticsearch --ESHOST=localhost:9200

spring session实战

spring-boot整合spring-session的自动配置可谓是开箱即用,极其简洁和方便。这篇文章即介绍spring-boot整合spring-session,这里只介绍基于RedisSession的实战。

9.1---》安装redis

docker run -itd --name redis01 -p 6379:6379 \
-v /data/redis/conf/redis.conf:/etc/redis/redis.conf \
-v /data/redis/data:/data \
--privileged=true --restart=always \
--network net-kugo redis \
redis-server /etc/redis/redis.conf

9.1redis.conf

bind 0.0.0.0 充许远程访问

requirepass sasa 使用了密码

daemonize no 后台运行

9.2--》导入依赖

引入spring-session的pom配置,由于spring-boot包含spring-session的starter模块,所以pom中依赖:(

Lettuce是一个高性能基于Java编写的Redis驱动框架,底层集成了Project Reactor提供天然的反应式编程,通信框架集成了Netty使用了非阻塞IO5.x版本之后融合了JDK1.8的异步编程特性,在保证高性能的同时提供了十分丰富易用的

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
该项目是采用目前比较流行的SpringBoot/SpringCloud构建微服务项目,项目叫 《果然新鲜》,实现一套串联的微服务项目。完全符合一线城市微服务的需求,对学习微服务架构,有非常大的帮助,该项目涵盖从微服务需求讨论、数据库设计、技术选型、互联网安全架构、整合SpringCloud各自组件、分布式基础设施等实现一套完整的微服务解决方案。 项目使用分布式微服务框架,涉及后台管理员服务、地址服务、物流服务、广告服务、品服务、品类别服务、品牌服务、订单服务 、购物车服务、首页频道服务、公告服务、留言服务、搜索服务、会员服务等。  系统架构图   SpringBoot+SpringCloud+SSM构建微服务项目使用SpringCloud Eureka作为注册中心,实现服务治理使用Zuul网关框架管理服务请求入口使用Ribbon实现本地负载均衡器和Feign HTTP客户端调用工具使用Hystrix服务保护框架(服务降级、隔离、熔断、限流)使用消息总线Stream RabbitMQ和 Kafka微服务API接口安全控制和单点登录系统CAS+JWT+OAuth2.0分布式基础设施构建分布式任务调度平台XXL-JOB分布式日志采集系统ELK分布式事务解决方案LCN分布式锁解决方案Zookeeper、Redis分布式配置中心(携程Apollo)高并发分布式全局ID生成(雪花算法)分布式Session框架Spring-Session分布式服务追踪与调用链Zipkin项目运营与部署环境分布式设施环境,统一采用Docker安装使用jenkins+docker+k8s实现自动部署微服务API管理ApiSwagger使用GitLab代码管理(GitHub  GitEE)统一采用第三方云数据库使用七牛云服务器对静态资源实现加速 开发环境要求JDK统一要求:JDK1.8Maven统一管理依赖 统一采用Docker环境部署编码统一采用UTF-8开发工具IDEA 或者 Eclipse 
### 回答1: Vue和SpringCloud是两个独立的技术,分别用于前端和后端开发。在一个项目中,Vue通常用于构建前端界面和实现交互逻辑,而SpringCloud用于实现后端的业务逻辑和系统架构。 Vue是一个前端框架,它的特点是轻量级、灵活和易学习,非常适合开发单页面应用。Vue使用组件化的思想,将一个页面分解为多个独立的组件,每个组件负责不同的功能,从而实现页面的高复用性和可维护性。在项目中,可以使用Vue来实现品列表、购物车、订单管理等功能页面。 SpringCloud是一个微服务框架,它提供了一系列的服务组件和工具,用于快速开发、部署和管理分布式系统。SpringCloud基于Spring Boot,可以轻松地与其他Spring组件集成,如Spring MVC、Spring Data等。在项目中,可以使用SpringCloud来实现用户管理、品管理、订单管理等后端服务。 关于项目的源码,一般来说,前端和后端的源码是分开的。前端的源码主要是基于Vue进行开发,通常包含HTML、CSS、JavaScript等文件。而后端的源码主要是基于SpringCloud进行开发,通常包含Java代码、配置文件等。 前端的源码主要用于构建用户界面和实现页面交互逻辑。它通过调用后端的接口获取数据,并将数据展示给用户。用户在前端界面上的操作会触发相应的事件,前端通过调用后端的接口来处理这些事件。 后端的源码主要用于实现业务逻辑和系统架构。它通过定义接口、编写业务逻辑和调用后台数据库等方式来处理请求。这些请求可以来自前端,也可以来自其他后端服务。 总之,Vue和SpringCloud项目中常用的技术,用于实现前端和后端的功能。项目的源码通常分为前端和后端两部分,前端主要基于Vue开发,后端主要基于SpringCloud开发。 ### 回答2: Vue springcloud 项目源码是一个基于 Vue.js 和 Spring Cloud 架构开发的项目的代码,它提供了一个完整的平台的功能。 Vue.js 是一个流行的前端框架,通过使用它,开发人员可以轻松地构建用户界面。Vue.js 对数据的双向绑定和组件化的开发方式,使得开发人员能够高效地开发出动态和可交互的用户界面。 Spring Cloud 是一个微服务架构的解决方案,它提供了一套完整的解决方案来构建分布式系统。通过使用 Spring Cloud,开发人员可以轻松实现服务注册与发现、负载均衡、熔断器等功能,从而简化了分布式系统的开发和部署。 这个项目源码结合了 Vue.js 和 Spring Cloud 的优点,提供了一个高可扩展性、易于维护的平台。它包含了用户注册、登录、品浏览、购物车管理、订单管理、支付等常见的功能。开发者可以根据实际需求对其进行定制和扩展。 该项目源码还提供了一套完整的开发文档和示例,开发人员可以根据文档来了解项目的整体架构和各个模块的功能实现细节,从而快速上手并进行二次开发。 总之,Vue springcloud 项目源码是一个基于 Vue.js 和 Spring Cloud 架构开发的项目的代码,提供了一个完整的平台的功能,并附带了详细的开发文档和示例,方便开发人员进行二次开发和定制。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值