海量数据处理商用短链接生成器平台 - 17

第五十八章 数据可视化ADS层-应用数据服务开发实战

第1集 数据可视化ADS层介绍和微服务整合ClickHouse项目

简介: 数据可视化ADS层介绍和微服务整合ClickHouse项目

  • 数据分层
数据分层分层描述数据生成计算工具存储
ODS原生数据,短链访问基本信息SpringBoot生成Kafka
DWD对 ODS 层做数据清洗和规范化,新老访客标记等FlinkKafka
DWM对DWD数据进一步加工补齐数据,独立访客统计,操作系统/ip/城市,做宽表Flinkkafka
DWS对DWM进行处理,多流合并,分组|聚合|开窗|统计,形成主题宽表FlinkClickHouse
ADS从ClickHouse中读取数据,根据需求进行筛选聚合,可视化展示ClickHouseSqlweb可视化展示
  • 需求
    • 根据web可视化报表统计需求,从ClickHouse聚合统计
    • 技术框架选择:SpringBoot + MybatisPlus +ClickHouse + Idea
  • 搭建实战
    • 添加项目pom依赖
 <dependency>
            <groupId>ru.yandex.clickhouse</groupId>
            <artifactId>clickhouse-jdbc</artifactId>
            <version>0.1.55</version>
        </dependency>


        <dependency>
            <groupId>net.class</groupId>
            <artifactId>dcloud-common</artifactId>
            <version>1.0-SNAPSHOT</version>
            <exclusions>
                <exclusion>
                        <groupId>org.apache.shardingsphere</groupId>
                        <artifactId>sharding-jdbc-spring-boot-starter</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
  • 添加配置文件和工具类
server.port=8002
spring.application.name=dcloud-data-service


#----------服务注册和发现--------------
spring.cloud.nacos.discovery.server-addr=120.79.150.146:8848
spring.cloud.nacos.discovery.username=nacos
spring.cloud.nacos.discovery.password=nacos


spring.datasource.driver-class-name=ru.yandex.clickhouse.ClickHouseDriver
spring.datasource.url=jdbc:clickhouse://120.79.150.146:8123/default
mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
logging.level.root=INFO
  • 开发启动类和包
@MapperScan("net.class.mapper")
@EnableTransactionManagement
@EnableFeignClients
@EnableDiscoveryClient
@SpringBootApplication
public class DataApplication {


    public static void main(String[] args) {
        SpringApplication.run(DataApplication.class, args);
    }


}
第2集 数据可视化服务-AlibabaCloud整合ClickHouse实战

简介: 数据可视化服务-AlibabaCloud整合ClickHouse实战

  • 基础模块开发链路走通

    • model 层,新增类 VisitStatsDO
    public class ShortLinkVisitStatsDO {
    
    
        /**
         * 窗口开始时间  Clickhouse里面会用到
         */
        String startTime;
    
    
        /**
         * 窗口结束时间
         */
        String endTime;
    
    
    /**
     * ================================================
     */
    
    
        /**
         * 短链压缩码
         */
        private String code;
    
    
        /**
         * 租户id
         */
        private Long accountNo;
    
    
    
    
        /**
         * 访问时间
         */
        private Long visitTime;
    
    
        /**
         * 站点来源,只记录域名
         */
        private String referer;
    
    
        /**
         * 1是新访客,0是老访客
         */
        private Integer isNew;
    
    
        /**
         * 唯一标识
         */
        private String udid;
    
    
        //==============RegionInfoDO==================
    
    
        /**
         * 省份
         */
        private String province;
    
    
        /**
         * 城市
         */
        private String city;
    
    
        /**
         * 运营商
         */
        private String isp;
    
    
        /**
         * 访问ip
         */
        private String ip;
    
    
    //==============DeviceInfoDO==================
    
    
        /**
         * 浏览器名称
         */
        private String browserName;
    
    
        /**
         * 操作系统
         */
        private String os;
    
    
        /**
         * 系统版本
         */
        private String osVersion;
    
    
        /**
         * 设备类型
         */
        private String deviceType;
    
    
        /**
         * 设备厂商
         */
        private String deviceManufacturer;
    
    
    //==============度量==================
    
    
        private Long uv=0L;
    
    
        private Long pv=0L;
    
    
        private Long ipCount=0L;
    
    
        private Long newUVCount=0L;
    
    
        /**
         * 时间的字符串映射,天、小时
         */
        private String dateTimeStr;
    }
    
    
    
    • mapper
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    <mapper namespace="net.xdclass.mapper.VisitStatsMapper">
    
    
        <!-- 通用查询映射结果 -->
        <resultMap id="BaseResultMap" type="net.xdclass.model.ShortLinkVisitStatsDO">
            <result column="code" property="code"/>
            <result column="referer" property="referer"/>
            <result column="is_new" property="isNew"/>
            <result column="account_no" property="accountNo"/>
    
    
            <result column="province" property="province"/>
            <result column="city" property="city"/>
            <result column="ip" property="ip"/>
            
            <result column="browser_name" property="browserName"/>
            <result column="os" property="os"/>
            <result column="device_type" property="deviceType"/>
            
            <result column="start_time" property="startTime"/>
            <result column="uv_count" property="uvCount"/>
            <result column="pv_count" property="pvCount"/>
            <result column="ip_count" property="ipCount"/>
            <result column="new_uv_count" property="newUVCount"/>
            <result column="date_time_str" property="dateTimeStr"/>
    
    
        </resultMap>
    
    
        <!-- 通用查询结果列 -->
        <sql id="Base_Column_List">
           code,referer,is_new,account_no,province,city,ip,browser_name,os,device_type,start_time
        </sql>
    
    
    
    
    </mapper>
    
    
    
    • service
    • controller
第3集 数据可视化-分页实时查看访问记录实战

简介: 数据可视化-分页实时查看访问记录实战

  • 需求
    • 实时查看访问记录(近实时-取决Flink开窗和Watermark大小)
    • 注意
      • 大部分的数据分析平台,都是有【访问时间 和 条数 限制】
      • 聚合查询,时间跨度越大,需要的分区和库表查询就越多,性能就存问题
      • 案例:https://tongji.baidu.com/web/demo/trend/latest?siteId=16847648

在这里插入图片描述

  • 编码实战
  //条数限制
  int total = request.getSize() * request.getPage();
  if(total>1000) return JsonData.buildResult(BizCodeEnum);
        


//手写分页逻辑
 @Override
    public Map<String, Object> pageVisitRecord(VisitRecordPageRequest request) {
        Long accountNo = LoginInterceptor.threadLocal.get().getAccountNo();


        Map<String, Object> data = new HashMap<>(16);


        String code = request.getCode();
        int page = request.getPage();
        int size = request.getSize();


        int count = visitStatsMapper.countTotal(code, accountNo);
        int from = (page - 1) * size;


        List<VisitStatsDO> list = visitStatsMapper.pageVisitRecord(code, accountNo, from, size);
        data.put("total", count);
        data.put("current_page", page);


        /**计算总页数*/
        int totalPage = 0;
        if (count % size == 0) {
            totalPage = count / size;
        } else {
            totalPage = count / size + 1;
        }
        data.put("total_page", totalPage);


        data.put("data", list);
        return data;
    }
    


    <!--统计总条数-->
    <select id="countTotal" resultType="java.lang.Integer">
        select count(1) from visit_stats  where  account_no=#{accountNo} and code=#{code} limit 1000
    </select>




    <!--分页查找-->
    <select id="pageVisitRecord" resultMap="BaseResultMap">
        select
        <include refid="Base_Column_List"/>
        from visit_stats where account_no=#{accountNo} and code=#{code}
        order by ts desc limit #{from},#{size}
    </select>
第4集 数据可视化- 时间范围内地区访问分布图

简介: 数据可视化- 时间范围内地区访问分布

  • 需求案例(效果图案例更好理解,大体字段类似)
    • 访问统计分布 地理位置信息图
    • UV统计是天UV,月UV是是累计,没做去重(百度统计也是未去重)
      • 有些业务统计月UV会根据月去重,有些业务是不去重
      • 如果需要做月去重,需要记录访问唯一标识udid
    • https://echarts.apache.org/v4/examples/zh/editor.html?c=effectScatter-bmap

在这里插入图片描述

在这里插入图片描述

  • 开发实战
//测试sql
select province,city,sum(pv) pv_count,sum(uv) uv_count,count( DISTINCT ip) ip_count from visit_stats
        where  account_no=693100647796441088 and code='026m8O3a' and toYYYYMMDD(start_time) 
        BETWEEN '20220303' and '20220430'
        group by province,city order by pv_count desc






@Data
public class RegionQueryRequest {
    private String code;


    private String startTime;


    private String endTime;


}


//时间先不做限制,正常需要限制
  @Override
    public List<VisitStatsDO> queryRegionVisitStatsWithDay(RegionQueryRequest request) {
        Long accountNo = LoginInterceptor.threadLocal.get().getAccountNo();


        return visitStatsMapper.queryRegionVisitStatsWithDay(request.getCode(),               request.getStartTime(), request.getEndTime(), accountNo);
    }




<!--时间范围内地区访问分布-城市级别,天级别-->
    <select id="queryRegionVisitStatsWithDay" resultMap="BaseResultMap">
        select province,city,sum(pv) pv_count,sum(uv) uv_count,count( DISTINCT ip) ip_count  from visit_stats
        where  account_no=#{accountNo} and code=#{code} and toYYYYMMDD(start_time) BETWEEN #{startTime} and #{endTime}
        group by province,city order by pv_count desc
    </select>
第5集 数据可视化-天维度访问曲线图接口实战

简介: 数据可视化-天维度访问曲线图接口实战

  • 需求
    • 性能优化的点:别一次性查询或者展示太多数据,根据需求查询
    • 比如百度统计 UV、PV、IP数等,是点击才触发

在这里插入图片描述

在这里插入图片描述

  • 开发实战
select toYYYYMMDD(start_time) date_time_str,sum(if(is_new='1', visit_stats.uv,0)) new_uv_count,
 sum(visit_stats.uv) uv_count, sum(pv) pv_count, count( DISTINCT ip) ip_count from visit_stats
 where   account_no=693100647796441088 and code='026m8O3a' and toYYYYMMDD(start_time) 
 BETWEEN '20220303' and '20220430' group by date_time_str ORDER BY date_time_str desc
 
 
 
@Data
public class VisitTrendQueryRequest {


    private String code;
    /**
     * 跨天、当天24小时、分钟级别
     */
    private String type;


    private String startTime;


    private String endTime;


}




  /**
     * 查询访问趋势,支持多天查询,支持查询当天小时级别
     *
     * @param request
     * @return
     */
    @Override
    public List<VisitStatsDO> queryVisitTrend(VisitTrendQueryRequest request) {


        Long accountNo = LoginInterceptor.threadLocal.get().getAccountNo();
        String code = request.getCode();
        String type = request.getType();


        List<VisitStatsDO> list = null;
       if (DateTimeFieldEnum.DAY.name().equalsIgnoreCase(type)) {
            list = visitStatsMapper.queryVisitTrendWithMultiDay(code, accountNo, request.getStartTime(), request.getEndTime());


        } 
                List<VisitStatsVO> visitStatsVOS = list.stream().map(obj -> beanProcess(obj)).collect(Collectors.toList());


        return visitStatsVOS;
    }






 
<!-- 多天内的访问曲线图,天基本 -->
<select id="queryVisitTrendWithMultiDay" resultMap="BaseResultMap">
        select toYYYYMMDD(start_time) date_time_str,sum(if(is_new='1', visit_stats.uv,0)) new_uv_count,
 sum(visit_stats.uv) uv_count, sum(pv) pv_count, count( DISTINCT ip) ip_count from visit_stats
 where   account_no=#{accountNo} and code=#{code} and toYYYYMMDD(start_time) BETWEEN #{startTime} and #{endTime} group by date_time_str ORDER BY date_time_str desc
</select>
第6集 数据可视化-小时-分钟维度访问曲线图接口实战

简介: 数据可视化-小时-分钟维度访问曲线图接口实战

  • 需求

    • 统计小时-分钟维度的接口
      在这里插入图片描述
  • 开发实战

//一天内的访问曲线图,小时
select toHour(start_time) date_time_str,sum(if(is_new='1', visit_stats.uv,0)) new_uv_count,
 sum(visit_stats.uv) uv_count, sum(pv) pv_count, count( DISTINCT ip) ip_count from visit_stats
 where   account_no=693100647796441088 and code='026m8O3a' and toYYYYMMDD(start_time)='20220403' 
 group by date_time_str ORDER BY date_time_str desc
 
//小时内的访问曲线图,每分钟
select toMinute(start_time) date_time_str,sum(if(is_new='1', visit_stats.uv,0)) new_uv_count,
 sum(visit_stats.uv) uv_count, sum(pv) pv_count, count( DISTINCT ip) ip_count from visit_stats
 where   account_no=693100647796441088 and code='026m8O3a' and toYYYYMMDDhhmmss(start_time)
 BETWEEN '20220403210000' and '20220403215959'
 group by date_time_str ORDER BY date_time_str desc
 
  
    <!-- 一天内的访问曲线图,小时 -->
<select id="queryVisitTrendWithHour" resultMap="BaseResultMap">
        select toHour(start_time) date_time_str,sum(if(is_new='1', visit_stats.uv,0)) new_uv_count, sum(visit_stats.uv) uv_count, sum(pv) pv_count, count( DISTINCT ip) ip_count from visit_stats
 where  account_no=#{accountNo} and code=#{code} and toYYYYMMDD(start_time)=#{startTime} group by date_time_str ORDER BY date_time_str desc
    </select>
 
 
 <!-- 小时内的访问曲线图,每分钟,如果要每5分钟,则把 toMinute 改为 toStartOfFiveMinute -->
    <select id="queryVisitTrendWithMinute" resultMap="BaseResultMap">
        select toMinute(start_time) date_time_str,sum(if(is_new='1', visit_stats.uv,0)) new_uv_count,
 sum(visit_stats.uv) uv_count, sum(pv) pv_count, count( DISTINCT ip) ip_count from visit_stats
 where   account_no=#{accountNo} and code=#{code} and toYYYYMMDDhhmmss(start_time) BETWEEN #{startTime} and #{endTime}
 group by date_time_str ORDER BY date_time_str desc
    </select>
第7集 数据可视化-Top10访问来源统计开发实战

简介:数据可视化-访问来源Top10统计开发实战

  • 需求
    • 访问来源Top10统计开发

在这里插入图片描述

  • 页面需求

在这里插入图片描述

  • 开发实战
@Data
public class BaseQueryRequest {


    private String code;
    private String startTime;
    private String endTime;


}


  /**
     * 高频访问来源
     *
     * @param request
     * @return
     */
    @Override
    public List<VisitStatsDO> queryFrequentReferer(BaseQueryRequest request) {
        Long accountNo = LoginInterceptor.threadLocal.get().getAccountNo();
        List<VisitStatsDO> list = visitStatsMapper.queryFrequentReferer(request.getCode(), accountNo, 10);


        List<VisitStatsVO> visitStatsVOS = list.stream().map(obj -> beanProcess(obj)).collect(Collectors.toList());


        return visitStatsDOS;
    }
    
    
    
    <!--高频referer查询 访问来源-->
    <select id="queryFrequentSource" resultMap="BaseResultMap">
select referer,sum(pv) pv_count from visit_stats where  account_no=#{accountNo} and code=#{code} and toYYYYMMDD(start_time) BETWEEN #{startTime} and #{endTime} 
group by referer  order by pv_count desc limit #{size}
    </select>
第8集 数据可视化-设备终端访问分布接口

简介:数据可视化-设备终端访问分布接口

  • 需求
    • 统计设备访问分布情况

在这里插入图片描述

  • 开发实战
select os,sum(pv) pv_count from visit_stats where account_no=693100647796441088 and code='026m8O3a' and toYYYYMMDD(start_time) 
 BETWEEN '20220303' and '20220430'
            group by os order by pv_count
            
select browser_name,sum(pv) pv_count from visit_stats where account_no=693100647796441088 and code='026m8O3a' and toYYYYMMDD(start_time) 
 BETWEEN '20220303' and '20220430'
            group by browser_name order by pv_count
            
select device_type,sum(pv) pv_count from visit_stats where account_no=693100647796441088 and code='026m8O3a' and toYYYYMMDD(start_time) 
 BETWEEN '20220303' and '20220430'
            group by device_type order by pv_count
            
            




<!--查询设备信息分布情况-->
    <select id="queryDeviceInfo" resultMap="BaseResultMap">


        <if test=" field=='os'">
            select os,sum(pv) pv_count from visit_stats where account_no=#{accountNo} and code=#{code} and toYYYYMMDD(start_time) BETWEEN #{startTime} and #{endTime}
            group by os order by pv_count
        </if>


        <if test=" field=='browser_name'">
            select browser_name,sum(pv) pv_count from visit_stats where account_no=#{accountNo} and code=#{code} and toYYYYMMDD(start_time) BETWEEN #{startTime} and #{endTime}
            group by browser_name order by pv_count
        </if>


        <if test=" field=='device_type'">
            select device_type,sum(pv) pv_count from visit_stats where account_no=#{accountNo} and code=#{code} and toYYYYMMDD(start_time) BETWEEN #{startTime} and #{endTime}
            group by device_type order by pv_count
        </if>


    </select>

第五十九章 短链平台-新版Gateway网关实战和避坑指南

第1集 新版Gateway网关搭建配置实战和避坑指南

简介: 新版Gateway网关搭建配置实战和避坑指南

  • 前言
    • 很多同学想比较快看到整个链路串起来
    • 那我们优先把这部分进行完成,整个大项目的核心功能基本都完成了
    • 后续代码还需要缝缝补补就行

在这里插入图片描述

  • 添加配置


    <dependencies>
        <!--网关依赖-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-gateway</artifactId>
        </dependency>


        <!-- Spring Cloud 2020 中重磅推荐的负载均衡器 Spring Cloud LoadBalancer 简称 SCL-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-loadbalancer</artifactId>
            <version>3.0.4</version>
        </dependency>




        <!--添加nacos客户端-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>




 <!--配置中心,需要需要使用配置中心,则开启-->
        <!--<dependency>-->
            <!--<groupId>com.alibaba.cloud</groupId>-->
            <!--<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>-->
        <!--</dependency>-->




        <!--坑:spring-cloud-dependencies 2020.0.0 默认不在加载bootstrap配置文件-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-bootstrap</artifactId>
        </dependency>




        <!--限流依赖-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
        </dependency>


        <!--限流持久化到nacos-->
        <dependency>
            <groupId>com.alibaba.csp</groupId>
            <artifactId>sentinel-datasource-nacos</artifactId>
        </dependency>


        <!-- 需要加 servlet包,不然配置跨域会找不到类 -->
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>4.0.1</version>
        </dependency>




    </dependencies>

避坑一

  • 配置中心bootstrap.yml不加载
  • 地址 https://docs.spring.io/spring-cloud/docs/2020.0.1/reference/htmlsingle/#config-first-bootstrap
      <!--坑:spring-cloud-dependencies 2020.0.0 默认不在加载bootstrap配置文件-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-bootstrap</artifactId>
        </dependency>

在这里插入图片描述

闭坑二

  • Spring Cloud Gateway 注册到了 Nacos 无法发现服务,报503 Service Unavailable

在这里插入图片描述

  • 添加启动类
@SpringBootApplication
@EnableDiscoveryClient
public class GatewayApplication {


    public static void main(String[] args) {
        SpringApplication.run(GatewayApplication.class, args);
    }


}
第2集 新版Gateway网关配置接入多个服务实战

简介: 新版Gateway网关路由配置接入多个服务实战

  • 路由转发配置
    gateway:
      routes: #数组形式
        - id: dcloud-link-api-service  #数据服务 路由唯一标识
          uri: lb://dcloud-link-service  #从nocas进行转发
          order: 1 #优先级,数字越小优先级越高
          predicates: #断言 配置哪个路径才转发,前端访问路径统一加上XXX-server,网关判断转发对应的服务,如果是回调业务记得修改
            - Path=/* #匹配一个路径,用于短链解析


        - id: dcloud-link-service  #数据服务 路由唯一标识
          uri: lb://dcloud-link-service  #从nocas进行转发
          order: 2 #优先级,数字越小优先级越高
          predicates: #断言 配置哪个路径才转发,前端访问路径统一加上XXX-server,网关判断转发对应的服务,如果是回调业务记得修改
            - Path=/link-server/**
          filters: #过滤器,请求在传递过程中通过过滤器修改
            - StripPrefix=1  #去掉第一层前缀,转发给后续的路径


        - id: dcloud-data-service  #数据服务 路由唯一标识
          uri: lb://dcloud-data-service  #从nocas进行转发
          order: 3 #优先级,数字越小优先级越高
          predicates: #断言 配置哪个路径才转发,前端访问路径统一加上XXX-server,网关判断转发对应的服务,如果是回调业务记得修改
            - Path=/data-server/**
          filters: #过滤器,请求在传递过程中通过过滤器修改
            - StripPrefix=1  #去掉第一层前缀,转发给后续的路径


        - id: dcloud-account-service  #用户服务 路由唯一标识
          uri: lb://dcloud-account-service  #从nocas进行转发
          order: 4 #优先级,数字越小优先级越高
          predicates: #断言 配置哪个路径才转发,前端访问路径统一加上XXX-server,网关判断转发对应的服务,如果是回调业务记得修改
            - Path=/account-server/**
          filters: #过滤器,请求在传递过程中通过过滤器修改
            - StripPrefix=1  #去掉第一层前缀,转发给后续的路径


        - id: dcloud-shop-service  #用户服务 路由唯一标识
          uri: lb://dcloud-shop-service  #从nocas进行转发
          order: 5 #优先级,数字越小优先级越高
          predicates: #断言 配置哪个路径才转发,前端访问路径统一加上XXX-server,网关判断转发对应的服务,如果是回调业务记得修改
            - Path=/shop-server/**
          filters: #过滤器,请求在传递过程中通过过滤器修改
            - StripPrefix=1  #去掉第一层前缀,转发给后续的路径




      #开启网关拉取nacos的服务
      discovery:
        locator:
          enabled: true


#设置日志级别,ERROR/WARN/INFO/DEBUG,默认是INFO以上才显示
logging:
  level:
    root: INFO
    #nacos日志问题
    com.alibaba.nacos.client.config.impl: WARN

在这里插入图片描述

第3集 前后端分离项目-跨域讲解和新版Gateway网关配置

简介: 前后端分离项目-跨域讲解和新版Gateway网关配置

  • 跨域:浏览器同源策略 1995年,同源政策由 Netscape 公司引入浏览器。目前,所有浏览器都实行这个政策。 最初,它的含义是指,A网页设置的 Cookie,B网页不能打开,除非这两个网页"同源"。所谓"同源"指的是"三个相同"

    协议相同  http https
    域名相同  www.class.net
    端口相同  80  81
    
    
    一句话:浏览器从一个域名的网页去请求另一个域名的资源时,域名、端口、协议任一不同,都是跨域
    
    
    浏览器控制台跨域提示:
    No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'null' is therefore not allowed access.
    
  • 需要解决跨域,有多种配置

    • Nginx配置
    • 业务微服务配置
    • 前端Node层渲染
    • Gateway配置
    @Configuration
    public class CorsConfig {
    
    
        @Bean
        public WebFilter corsFilter() {
            return (ServerWebExchange ctx, WebFilterChain chain) -> {
                ServerHttpRequest request = ctx.getRequest();
                if (CorsUtils.isCorsRequest(request)) {
                    HttpHeaders requestHeaders = request.getHeaders();
                    ServerHttpResponse response = ctx.getResponse();
                    HttpMethod requestMethod = requestHeaders.getAccessControlRequestMethod();
                    HttpHeaders headers = response.getHeaders();
                    headers.add(HttpHeaders.ACCESS_CONTROL_ALLOW_ORIGIN, requestHeaders.getOrigin());
                    headers.addAll(HttpHeaders.ACCESS_CONTROL_ALLOW_HEADERS,
                            requestHeaders.getAccessControlRequestHeaders());
                    if (requestMethod != null) {
                        headers.add(HttpHeaders.ACCESS_CONTROL_ALLOW_METHODS, requestMethod.name());
                    }
                    headers.add(HttpHeaders.ACCESS_CONTROL_ALLOW_CREDENTIALS, "true");
                    headers.add(HttpHeaders.ACCESS_CONTROL_EXPOSE_HEADERS, "*");
                    if (request.getMethod() == HttpMethod.OPTIONS) {
                        response.setStatusCode(HttpStatus.OK);
                        return Mono.empty();
                    }
                }
                return chain.filter(ctx);
            };
        }
    
    
    }
    
第4集 网关Gateway整合微服务链路测试实战

简介: Gateway整合微服务链路测试实战

  • 启动gateway
  • 启动微服务
  • 访问接口
    • http://localhost:8003/026m8O3a

第六十章 微服务镜像构建配置和DevOps链路讲解

1集 微服务Docker打包插件介绍和Dockerfile编写

简介:微服务Docker打包插件介绍和配置实战

  • 微服务采用容器化部署->本地推送镜像到镜像仓库->Paas容器云管理平台拉取部署

    • SpringBoot打包插件配置
    • 聚合工程pom添加全局变量
    <docker.image.prefix>dcloud</docker.image.prefix>
    
    • 每个微服务都添加依赖(服务名记得修改)
        <build>
            <finalName>dcloud-account</finalName>
            <plugins>
                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
    
    
                    <!--需要加这个,不然打包镜像找不到启动文件-->
                    <executions>
                        <execution>
                            <goals>
                                <goal>repackage</goal>
                            </goals>
                        </execution>
                    </executions>
    
    
                    <configuration>
                        <fork>true</fork>
                        <addResources>true</addResources>
    
    
                    </configuration>
                </plugin>
    
    
                <plugin>
                    <groupId>com.spotify</groupId>
                    <artifactId>dockerfile-maven-plugin</artifactId>
                    <version>1.4.10</version>
                    <configuration>
    
    
                        <repository>${docker.image.prefix}/${project.artifactId}</repository>
    
    
                        <buildArgs>
                            <JAR_FILE>target/${project.build.finalName}.jar</JAR_FILE>
                        </buildArgs>
                    </configuration>
                </plugin>
            </plugins>
        </build>
    
  • 微服务Dockerfile编写

    FROM adoptopenjdk/openjdk11:jre11u-nightly
    COPY target/dcloud-account.jar dcloud-account.jar
    ENTRYPOINT ["java","-jar","/dcloud-account.jar"]
    
第2集 商用短链平台-微服务Docker镜像打包实战和注意事项

简介:多个微服务Docker镜像打包实战

  • 多个微服务本地镜像打包

    • 步骤一:最外层 mvn clean install
    • 步骤二:去到子模块pom文件下
    mvn install -Dmaven.test.skip=true dockerfile:build
    
  • 注意点

    • 本地电脑要安装Docker,才可以构建成功,Mac、Win都是,网上搜索博文进行安装
    • 安装失败或者不想安装则不用,因为这个只是常规操作,接下去会有DevOps自动化构建链路
  • 问题点:如果发现运行的镜像不是最新的

    • 项目的路径一定不要有中文和空格
    • 建议mvn clean install 构建下项目,
    • 再把本地历史docker镜像删除,再重新构建打包镜像
第3集 多个微服务镜像本地运行链路测试

简介:多个微服务镜像本地运行链路测试

  • 本地运行docker镜像
docker run  -d --name dcloud-account -d -p 9002:9002  镜像id


docker run -d  --name dcloud-gateway -d -p 8888:8888  ef63ed47a694


docker run -d  --name dcloud-account -d -p 8001:8001  377f672117aa


docker run -d  --name dcloud-data -d -p 8002:8002  92c924874f35


docker run -d  --name dcloud-link -d -p 8003:8003  9118421aa9c9


docker run -d  --name dcloud-shop -d -p 8005:8005  db91bfbb7baa


  • 查看容器运行日志
docker logs -f 容器id
  • 大家测试的时候,可以先启动1~2个容器镜像(全部都启动需要很强大的配置)
    • 建议都在一个机器上运行,验证好后在分机器
    • 先部署网关,可以nacos查看容器ip,要同个网段内才可以访问
第4集 互联网公司的DevOps和CI-CD你知道多少呢

简介:互联网公司的DevOps和CI-CD你知道多少呢

  • 软件生命周期
    • 一个软件从零开始到最终交付:需求评审-》设计-》开发-》测试-》灰度-》上线-》版本迭代
    • 【淘宝】 为例子
      • 前期(功能简单)
        • 技术人员:老王,一人搞定所有阶段的工作
      • 中期(增加需求)
        • 技术人员:老王、老帆、大钊、Anna(测试)、冰冰(运维)
        • 不同人员完成不同的工作,等一个阶段所有工作完成再进入下一个阶段,瀑布模型
        • 上线发布,每次都要【冰冰】进行操作,一堆shell控制
      • 后期(功能多、项目多、时间少)
        • 应对快速变化需求的软件开发能力,就是敏捷开发,结合CI持续集成、CD持续部署
        • 运维人员:定义好规则,发布平台、监控平台、运维平台
        • 开发人员:根据运维人员提供的平台和定义的规则,自主完成发布上线

在这里插入图片描述

  • 什么是CICD

    • 是指持续集成、持续发布,是一套实现软件的构建测试部署的自动化流程。
  • 什么是DevOps

    • 一词是由英文 Development(开发)和 Operations (运维)组合而成
    • 一种思想,强调软件开发测试运维的一体化,减少各个部门之间的沟通成本从而实现软件的快速高质量的发布
    • DevOps与CICD紧密相关,DevOps要实现人员一体化,须要借助CICD工具来自动化整个流程
  • 通俗易懂的话

    • DevOps是 开发+测试+运维 交集
    • 以前是单一职责 现在一专多能 考虑配合提效,
    • CI/CD 多环境-构建-打包-测试-上线-监控
    • 快速迭代产品,每次代码的改动都触发校验,每刻都可进行新版本的上线
第5集 短链平台-DevOps发布链路和组件选择

简介:短链平台-发布链路和组件选择讲解

  • DevOps链路
    • 开发人员将开发代码上传到Git仓库
    • 触发Jenkins的自动代码编译并构建镜像,将镜像推送到docker仓库
    • 选择发布环境和机器,测试环境或生产环境再从docker仓库中拉取镜像部署

在这里插入图片描述

  • 容器技术:Docker

  • 镜像仓库:阿里云镜像仓库

  • CI/CD平台:Jenkins / gitlab-runner + Rancher容器管理平台

    • Rancher为DevOps工程师提供了直观的用户界面来管理他们的服务容器
    • 用户不需要深入了解Kubernetes概念就可以开始使用Rancher
  • Git仓库:开源中国Gitee

  • 云服务器:阿里云ECS

第六十一章 DevOps实战-微服务整合新版Jenkins打包实战

1集 Linux服务器容器化部署新版Jenkins实战《上》

简介:Linux服务器容器化部署新版Jenkins实战《上》

  • 什么是Jenkins

    • 是一个开源的、提供友好操作界面的持续集成(CI)工具,主要用于持续、自动的构建/测试软件项目、监控外部任务的运行,用Java语言编写,可在Tomcat等流行的servlet容器中运行,也可独立运行

    • 官方文档 https://www.jenkins.io/

  • Linux云服务器部署Jenkins

    • 在使用Jenkins自动化部署之前,首先安装Docker容器
  • 【注意】环境说明

    • 使用Docker 20.10.9版本,不要使用1.13.1版本,该版本在jenkins使用docker命令时会说找不到配置文件!

    • 云厂商:阿里云ECS服务器-CentOS7.8

    • 在安装JenKins之前要保证机子的配置要高!不建议使用虚拟机,不然卡或者缺少类库东西则麻烦

    • 课程使用的是阿里云2核4G 带宽1m的服务器,推荐使用2核8G 5m,后续在下载依赖与打包会非常吃服务器的配置,服务器部署带宽一定要高!不然推送镜像时间等待漫长

      • 可以使用阿里云按量付费方式进行购买云服务器
  • 安装Docker

    # 1.先安装yml
    yum install -y yum-utils device-mapper-persistent-data lvm2
    # 2.设置阿里云镜像
    sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
    
    
    # 3.查看可安装的docker版本
    yum list docker-ce --showduplicates | sort -r
    
    
    #4. 安装docker
    yum -y install docker-ce-20.10.10-3.el7
    
    
    #5. 查看docker版本
    docker -v
    
    
    #6. 启动docker
    systemctl start docker
    
    
    #7. 查看docker 启动状态
    systemctl status docker
    
    
    #查看端口占用命令安装
    yum install -y lsof
    

安装Jenkins

  • 创建Jenkins持久化目录
mkdir -p /root/docker/jenkins
  • 运行部署容器
 docker run -d \
  -u root \
  --name xdclass_jenkins \
  -p 9302:8080 \
  -v /root/docker/jenkins:/var/jenkins_home \
  -v /var/run/docker.sock:/var/run/docker.sock \
  -v /usr/bin/docker:/usr/bin/docker \
  jenkins/jenkins:2.319.3-lts-jdk11
  
第一行:表示将该容器在后台运行
第二行:表示使用root用户来运行容器


第三行:表示给这个容器命名,后面可以通过这个名字来管理容器
第四行:表示将主机的9302端口映射到8080端口上,后面就可以通过主机ip:9302来访问Jenkins,端口是可以更改的,根据自行需要


第五行:表示将本地/root/docker/jenkins目录映射为/var/jenkins_home目录,这就是第二步中的持久化目录。
第六、七行:表示把本地/var/run/docker.sock文件映射在容器中/var/run/docker.sock文件。这一步的目的就是为了把容器中的Jenkins可以与主机Docker进行通讯。


第八行:指定使用哪一个镜像和标签
  • 阿里云网络安全组开发端口 9302
第2集 Linux服务器容器化部署新版Jenkins实战《下》

简介:Linux服务器容器化部署新版Jenkins实战《下》

  • Jenkins安装和查看运行情况

    • docker ps来查看是否运行

    • 在浏览器输入ip+端口号,我这里是 120.79.128.42:9302 , 即可进入到Jenkins登录页面

      • 网络安全组记得开放 9302 端口
    • 获取登录Jenkins的密码, 把获取的密码复制上去

      cat /root/docker/jenkins/secrets/initialAdminPassword
      

在这里插入图片描述

  • 选择安装推荐的插件

在这里插入图片描述

  • 等待Jenkins把插件安装好即可,安装好后进入实例配置页面,点保存就可以来到Jenkins主界面了

在这里插入图片描述

  • 进入到全局工具配置设置JDK

在这里插入图片描述

在这里插入图片描述

容器内部配置JDK

  • 路径为主机Jenkins容器内部里的JAVA_HOME,也就是echo $JAVA_HOME查看JAVA_HOME路径
/opt/java/openjdk
  • 插件页面下载插件
    • Maven Integration、docker Pipeline、docker API 、docker、docker commons

在这里插入图片描述

第3集 容器化部署微服务-Docker公有+私有镜像仓库讲解

简介:容器化部署Docker公有+私有镜像仓库讲解

  • 为啥要用镜像仓库

在这里插入图片描述

  • 官方公共镜像仓库和私有镜像仓库(画图)

    • 公共镜像仓库:

      • 官方:https://hub.docker.com/,基于各个软件开发或者有软件提供商开发的
      • 非官方:其他组织或者公司开发的镜像,供大家免费试用
    • 私有镜像仓库:

      • 用于存放公司内部的镜像,不提供给外部试用;
      • 有哪些?
        • Harbor:由VMWare公司开源的容器镜像仓库,Habor是在Docker Registry上进行了相应的企业级扩展
        • Registry: 由docker官方提供的私有镜像仓库
        • 云厂商提供:阿里云、腾讯云等
  • 开通阿里云私有镜像仓库

    • 登录阿里云账号访问地址:
      • https://cr.console.aliyun.com/
    • 初次使用会提示开通
第4集 Jenkins配置Git全局访问凭证实战

简介:Jenkins配置Git全局访问凭证实战

  • Git仓库地址

  • https://gitee.com/waitforxy/dcloud-short-link

在这里插入图片描述

  • 配置Git访问凭证

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

第5集 Jenkins构建微服务脚本编写实战

简介:Jenkins构建短链平台微服务脚本编写实战

  • 脚本编写实战
    • 每个微服务建立一个Item配置

在这里插入图片描述

  • 配置实战

在这里插入图片描述

在这里插入图片描述

echo "登录阿里云镜像"
docker login --username=794666918@qq.com registry.cn-shenzhen.aliyuncs.com --password=class.net168
echo "构建dcloud-common"
cd dcloud-common
mvn install
ls -alh

在这里插入图片描述

ls -alh
cd dcloud-account
ls -alh
echo "账号服务构建开始"
mvn install -Dmaven.test.skip=true dockerfile:build
docker tag dcloud/dcloud-account:latest registry.cn-shenzhen.aliyuncs.com/xdclass-dcloud/dcloud-account:v1.1
docker push registry.cn-shenzhen.aliyuncs.com/xdclass-dcloud/dcloud-account:v1.1
mvn clean
echo "账号服务构建推送成功"
echo "=======构建脚本执行完毕====="
  • 点击应用-》保存即可
  • 多个微服务照此重复配置即可,修改构建的代码
第6集 Jenkins构建打包推送微服务镜像实战

简介:Jenkins构建打包推送微服务镜像实战

  • 进入构建环节

在这里插入图片描述

在这里插入图片描述

  • 重复打包构建多个微服务推送镜像仓库即可

在这里插入图片描述

第7集 Jenkins构建-打包-推送多个微服务实战

简介:Jenkins配置构建打包推送多个微服务实战

  • 重复上面的链路
echo "登录阿里云镜像"
docker login --username=794666918@qq.com registry.cn-shenzhen.aliyuncs.com --password=class.net168
echo "构建dcloud-common"
cd dcloud-common
mvn install
ls -alh
ls -alh
cd dcloud-gateway
ls -alh
echo "网关构建开始"
mvn install -Dmaven.test.skip=true dockerfile:build
docker tag dcloud/dcloud-gateway:latest registry.cn-shenzhen.aliyuncs.com/class-dcloud/dcloud-gateway:v1.1
docker push registry.cn-shenzhen.aliyuncs.com/xdclass-dcloud/dcloud-gateway:v1.1
mvn clean
echo "网关服务构建推送成功"
echo "=======构建脚本执行完毕====="

s.net168
echo “构建dcloud-common”
cd dcloud-common
mvn install
ls -alh


[外链图片转存中...(img-WDwsXt8i-1723437691648)]

```java
ls -alh
cd dcloud-account
ls -alh
echo "账号服务构建开始"
mvn install -Dmaven.test.skip=true dockerfile:build
docker tag dcloud/dcloud-account:latest registry.cn-shenzhen.aliyuncs.com/xdclass-dcloud/dcloud-account:v1.1
docker push registry.cn-shenzhen.aliyuncs.com/xdclass-dcloud/dcloud-account:v1.1
mvn clean
echo "账号服务构建推送成功"
echo "=======构建脚本执行完毕====="
  • 点击应用-》保存即可
  • 多个微服务照此重复配置即可,修改构建的代码
第6集 Jenkins构建打包推送微服务镜像实战

简介:Jenkins构建打包推送微服务镜像实战

  • 进入构建环节

[外链图片转存中…(img-UsqiZDCD-1723437691648)]

[外链图片转存中…(img-dOCjtiog-1723437691649)]

  • 重复打包构建多个微服务推送镜像仓库即可

[外链图片转存中…(img-XPzitk8n-1723437691649)]

第7集 Jenkins构建-打包-推送多个微服务实战

简介:Jenkins配置构建打包推送多个微服务实战

  • 重复上面的链路
echo "登录阿里云镜像"
docker login --username=794666918@qq.com registry.cn-shenzhen.aliyuncs.com --password=class.net168
echo "构建dcloud-common"
cd dcloud-common
mvn install
ls -alh
ls -alh
cd dcloud-gateway
ls -alh
echo "网关构建开始"
mvn install -Dmaven.test.skip=true dockerfile:build
docker tag dcloud/dcloud-gateway:latest registry.cn-shenzhen.aliyuncs.com/class-dcloud/dcloud-gateway:v1.1
docker push registry.cn-shenzhen.aliyuncs.com/xdclass-dcloud/dcloud-gateway:v1.1
mvn clean
echo "网关服务构建推送成功"
echo "=======构建脚本执行完毕====="
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

从零开始学习人工智能

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值