第五十八章 数据可视化ADS层-应用数据服务开发实战
第1集 数据可视化ADS层介绍和微服务整合ClickHouse项目
简介: 数据可视化ADS层介绍和微服务整合ClickHouse项目
- 数据分层
数据分层 | 分层描述 | 数据生成计算工具 | 存储 |
---|---|---|---|
ODS | 原生数据,短链访问基本信息 | SpringBoot生成 | Kafka |
DWD | 对 ODS 层做数据清洗和规范化,新老访客标记等 | Flink | Kafka |
DWM | 对DWD数据进一步加工补齐数据,独立访客统计,操作系统/ip/城市,做宽表 | Flink | kafka |
DWS | 对DWM进行处理,多流合并,分组|聚合|开窗|统计,形成主题宽表 | Flink | ClickHouse |
ADS | 从ClickHouse中读取数据,根据需求进行筛选聚合,可视化展示 | ClickHouseSql | web可视化展示 |
- 需求
- 根据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 "=======构建脚本执行完毕====="