2020-04-22

第一章 互联网架构Springboot优惠券分布式系统实战介绍
第1集 Springboot微服务实战高级开发岗位分析
简介:梳理三大问题,高级开发岗位需要具体哪些技能

笔记请⻅资料里面的PPT

愿景:“让编程不在难学,让技术与生活更加有趣”

第二章 与架构师会谈分布式系统

第1集 聊聊传统项目与互联网项目
简介:传统架构方式与互联网架构方式的演变过程,是什么驱动架构演变

传统公司架构特色:
用户请求==》服务器==》数据库==》返回结果传统公司遇到的问题

互联网网公司是怎么解决这些问题

第2集 小D商城功能模块梳理
简介:小D商场优惠券功能梳理,每个模块功能梳理

商场功能模块划分用户模块
会员卡
用户基础信息用户附加信息

商品模块
商品列表商品活动秒杀

订单模块
支付模块订单流水

优惠券模块
优惠券列表优惠券兑换用户优惠券

第3集 小D商场系统架构梳理
简介:基于架构体系的微服务讲解

电商体系互联网架构图

微服务的定义
微服务架构⻛格是一种将单个应用程序作为一套小型服务开发的方法,每种应用程序都在自 己的进程中运行,并与轻量级机制(通常是HTTP资源API)进行通信。 这些服务是围绕业务功能构建的,可以通过全自动部署机制独立部署。 这些服务的集中管理最少,可以用不同的编程语言编写,并使用不同的数据存储技术
微服务架构的优势
独立部署,灵活扩展资源的有效隔离
团队组织架构的调整
微服务与SOA的区别
SOA架构强调的是异构系统之间的通信和解耦合,而微服务架构强调的是系统按业务边界做 细粒度的拆分和部署

第4集 单体服务VS微服务系统
简介:帮您梳理单体服务和微服务系统的优缺点

为什么从单体服务到微服务转移
最核心的原因是单体服务出现性能瓶颈,如日访问量只有几十万的服务在单体服务可以支 持,C10K问题
服务故障隔离,保证高可用(99.99%)
微服务服务也有缺点

增加了整个解决方案的复杂度
将系统的整合点推移到了服务之间的接口,因此这些服务的接口需要进行良好的定义, 在系统中也要对服务级别达成一致,并且还需要定义其他的非功能性需求
数据一致性问题
原本采用一体性应用程序架构的系统被分解为多个小型服务时,在原本的一体性架构中 集中保存在某处的数据,在新的微服务应用中经常会改为保存在多个地方,这种改变可 能会带来维护数据一致性的挑战。
网络延迟–服务之前互调存在一定时延
增加开发复杂性
接口调用增加沟通成本需要形成文档(WIKI文档) 重复劳动

第5集 基于微服务技术选型
简介:设计先行技术方案紧随其后

微服务下的全家桶选择
微服务框架主体springboot与springMVC
SpringMVC提供了一种轻度耦合的方式来开发web应用Spring Boot实现了自动配置,降低了项目搭建的复杂度
独立运行的Spring项目
提供starter简化Maven配置 免XML复杂而冗余的设计思想
RPC调用Dubbo与SpringCloud
网络协议支持
Spring Cloud 使用 HTTP 协议的 REST API
Dubbo 支持各种通信协议(部分采用epoll的通信协议性能更高) 组件运行流程
SpringCloud,统一通过 API 网关Zuul,注册中心(Eureka),Ribbon 进行均衡负载,微服务之间通过 Feign 进行通信处理业务
提供Gateway网关,Gateway 通过 Dubbo 提供的负载均衡机制自动完成,服务注册在
ZK上面,用diamond实现配置中心持久化层选择Mysql和Redis
本地持久化选择LoadingCache(Guava包) 消息中间件选择阿里系RocketMQ
RocketMQ的消息写入内存后即返回ack,由单独的线程专⻔做刷盘的操作,所有的消息均是顺序写文件
在阿里集团被广泛应用于交易、充值、流计算、消息推送、日志流式处理、binglog分发等重

要场景

愿景:“让编程不在难学,让技术与生活更加有趣”

第三章 服务搭建与企业代码上传

第1集 springboot maven工程搭建
简介:微服务springboot服务从0开始搭建

5分钟可以做什么?springboot服务搭建maven是什么?
是一个Apache公司的开源项目,是项目构建工具。用来管理依赖手把手进行springboot maven项目搭建全过程

第2集 企业级maven聚合工程管理
简介:小D商场优惠券功能梳理,每个模块功能梳理

是什么?
项目横向拆分,每个功能模块进行了单独的开发之后,项目整合的时候就需要有一个能够整 合这些项目或者模块的工程,这就是所谓聚合工程的意义
特征?
为了方便的快速定位内容,模块所处的目录应当与其artifactId一致(Maven约定而不是硬性要求),模块所处的目录必须和模块所处的目录相一致
依赖包版本:聚合模块的版本和被聚合模块版本一致,通过父项目进行管理
企业级包管理工具,nexus包管理工具

使用maven遇到最常⻅的问题 — 包依赖冲突问题
mvndependency:tree
使用idea工具解决冲突

第3集 插件包还是服务,哪些因素必须考虑
简介:小D商场优惠券功能梳理,每个模块功能梳理

插件包
jar包就是别人已经写好的一些类,然后对这些类进行打包。可以将这些jar包引入到你的项目中,可以直接使用这些jar包中的类和属性,这些jar包一般放在lib目录下
服务
Web应用程序对外提供某些功能
区别
jar对外提供的是方法, 依赖这些发放将方法提供的内容跑在引用方的JVM方面服务是单独提供一个接口,甚至一个协议,跑在服务方的JVM上面
选择原则
工具类选择插件包,例如提供一些签名方法,一些工具类 对外服务选择独立服务
相对而言服务更加灵活,jar包需要升级版本
相对而言服务开发成本大,jar包很可能一次引用不再更新

第4集 手把手企业开发中git的使用
简介:小D商场优惠券功能梳理,每个模块功能梳理

Git是什么?
分布式版本控制系统代码管理仓库
同类型产品有哪些
Git 支持离线工作;本地提交可以稍后提交到服务器上
SVN 文件管理系统
CVS 无法保证所有更改要么全部提交或合并,要么不会发生任何改变企业级用Gitlab代码管理库,类似于Github、码云
手把手模拟企业Git代码仓库码云的使用从Git、SVN、CVS看待技术发展变更
拥抱变化才能进步

第5集 企业级Git代码提交工具使用介绍
简介:小D商场优惠券功能梳理,每个模块功能梳理

开发分支的定义
代码分支创建与合并
git本地工具Sourcetree的使用idea自带git工具的使用

愿景:“让编程不在难学,让技术与生活更加有趣”

第四章 还原互联网实际开发场景

第1集 互联网开发功能分析步骤
简介:还原互联网开发场景,完美解答从需求到实现全过程

接到需求之后莫慌,先做这几个事情再开发

基于优惠券系统的需求分析 对外接口,协议:dubbo 接口内容
优惠券列表接口 缓存跟新机制(redis缓存,每隔五分钟刷新最新的优惠券列表)、定时跟新
领取优惠券接口 生成券码,券码唯一,雪花算法
获取用户当前拥有的优惠券列表 基于用户级别做缓存优惠券核销接口 接收订单系统发来的结算信息(MQ)
互联网开发经验:
设计先行后coding原则设计时考虑后期扩展性
多方多组协作时,尽早梳理清楚对外对内接口,拟定协议

第2集 轻松掌握数据库设计实战遵守的4大公式
简介:小D商场优惠券功能数据库设计

商场功能模块数据库设计,一般企业中自己负责设计所开发功能模块的数据表 数据库设计规范和几个实战过程中必须考虑的关键点

第3集 手把手带你进行数据库设计
简介:小D商场优惠券功能数据库设计,优惠券表、用户优惠券表设计全过程

商场功能模块数据库设计,一般企业中自己负责设计所开发功能模块的数据表 商场优惠券表设计
优惠券表设计

用户优惠券表设计

第4集 springboot整合数据库连接池durid插件
简介:小D商场优惠券功能梳理,每个模块功能梳理

在可视化界面生成数据库表springboot整合durid功能实战durid后台功能讲解,配置过程

ip: 127.0.0.1
login: #登陆的账户密码user_name: root password: root
spring:
datasource:
driverClassName: com.mysql.jdbc.Driver url: jdbc:mysql://localhost:3306/shop?
autoReconnect=true&useUnicode=true&characterEncoding=UTF- 8&useSSL=false
username: root password:daniel
type: com.alibaba.druid.pool.DruidDataSource # 连接池的配置信息

初始化大小,最小等待连接数量,最大等待连接数量,最大连接数

initialSize: 1
minIdle:1
maxIdle:5
maxActive: 20

配置获取连接等待超时的时间

maxWait: 60000

配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒

timeBetweenEvictionRunsMillis: 60000

配置一个连接在池中最小生存的时间,单位是毫秒minEvictableIdleTimeMillis: 300000 validationQuery: SELECT 1 FROM DUAL testWhileIdle: true

testOnBorrow: true testOnReturn:false

打开PSCache,并且指定每个连接上PSCache的大小

poolPreparedStatements: false maxPoolPreparedStatementPerConnectionSize:20

配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall’用于防火墙

filters: stat,wall

通过connectProperties属性来打开mergeSql功能;慢SQL记录

connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000

合并多个DruidDataSource的监控数据

#spring.datasource.useGlobalDataSourceStat=true

package com.xdclass.jvm.config;

import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.support.http.StatViewServlet; import com.alibaba.druid.support.http.WebStatFilter; import org.springframework.beans.factory.annotation.Value; import
org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.boot.web.servlet.FilterRegistrationBean; import org.springframework.boot.web.servlet.ServletRegistrationBean; import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import javax.sql.DataSource; import java.util.HashMap; import java.util.Map;

@Configuration
public class DruidConfig {

@Value("${druid.login.user_name}") private StringuserName;

@Value("${druid.login.password}") private Stringpassword;

/**

  • 必须配置数据源,不然无法获取到sql监控,与sql防火墙监控
    */
    @Bean(name = “default_databaseSource”) @ConfigurationProperties(prefix = “spring.datasource”) public DataSource druidDataSource() {
    return new DruidDataSource();
    }

@Bean

public ServletRegistrationBean druidServlet() { ServletRegistrationBean servletRegistrationBean =new
ServletRegistrationBean();
servletRegistrationBean.setServlet(new StatViewServlet()); servletRegistrationBean.addUrlMappings("/druid/*"); Map<String, String> initParameters = new HashMap<>(); initParameters.put(“loginUsername”, userName);// 用户名initParameters.put(“loginPassword”, password);// 密 码initParameters.put(“resetEnable”, “false”);// 禁用HTML⻚面上
的“Reset All”功能
servletRegistrationBean.setInitParameters(initParameters); return servletRegistrationBean;
}

@Bean
public FilterRegistrationBean filterRegistrationBean() { FilterRegistrationBean filterRegistrationBean = new
FilterRegistrationBean();
filterRegistrationBean.setFilter(new WebStatFilter()); filterRegistrationBean.addUrlPatterns("/"); filterRegistrationBean.addInitParameter(“exclusions”,
"
.js,.gif,.jpg,.png,.css,.ico,/druid/"); return filterRegistrationBean;
}
}

效果图

第5集 mybatis逆向工程使用
简介:小D商场优惠券功能梳理,每个模块功能梳理

mybatis 逆 向 生 成 工 具 讲 解 mybatis逆向生成工具实战生成代码逆向工程mybatis-generator配置
引入依赖
引入generator工具类
引入配置文件generator.xml

第6集 关于功能测试Junit的使用
简介:功能测试Junit

什么是Junit
JUnit是一个Java语言的单元测试框架,可以大大缩短你的测试时间和准确度。多数Java的开发环境都已经集成了JUnit作为单元测试的工具
带你进入Junit与Springboot的整合实战
引入pom文件
代码规范之测试类编写中应该注意哪些点
Test类命名规范
Springboot场景下禁止使用Main方法进行测试

第7集 新入职第一件事—跑增删改查
简介:基于mybatis的增删改查代码

持久层框架很多,如:Mybatis、hibernate、JPA 基于mybatis的增删改查代码
增删改查实战 引入mybatis依赖
配置@MapperScan进行包扫描

第8集 基于durid查看查询效果
简介:durid查询效果查看

基于durid查看查询效果
对比有无下面的查询结果
插入数据得出结论,时间越短,UUID重复的概率越高,因为UUID生成规则和机器码(MAC 地址)有关
对比有无索引的请求差异化
10万条数据,根据code查询数据记录
没加索引15次查询里面最高时间102ms 加了索引15次查询里面最高时间4ms

第9集 springboot分层架构mapper与example讲解
简介:小D商场优惠券功能梳理,每个模块功能梳理

数据库查询example是什么?
example是mybatis-generator生成的工具包,用于构建查询语句 关于example
Example类可以用来生成一个几乎无限的where子句.
Example类包含一个内部静态类 Criteria 包含一个用 anded 组合在where子句中的条件列表. Example类包含一个 List 属性,所有内部类Criteria中的子句会用 ored组合在一起. 使用不同属性的 Criteria 类允许您生成无限类型的where子句.
创建 Criteria 对象 可以使用Example类中的 createCriteria() 或者 or() . 如果 Criteria 对象是

用 createCriteria() 创建的,它会自动为 List属性添加一个 Criteria对象 - 这使得它更容易写一个简单的where子句, 如果您不需要 or或者其他几个子句组合的话. 用 or(Criteria criteria) 方法创建 Criteria对象, 方法里的 criteria对象会被添加进 Criteria对象的列表中.
实战example的日常使用

第10集 打好基本功才能稳定前进-代码分层规范
简介:springboot代码分层规范

关于代码规范,idea里面安装Alibaba Java Coding Guidelines

代码分层的重要性
代码除了实现功能,另外一个重点就是让人看得懂,方便接手
业务分层对于代码规范是比较重要,决定着以后的代码是否可复用,是否职责清晰,边界清 晰

Web 层:主要是对访问控制进行转发,各类基本参数校验,或者不复用的业务简单处理等。
Service 层:相对具体的业务逻辑服务层
DAO 层:数据访问层,与底层 MySQL、Oracle、Hbase 进行数据交互

愿景:“让编程不在难学,让技术与生活更加有趣”

第五章 分布式系统RPC远程调用

第1集 互联网不可不知的RPC远程调用协议?
简介:RPC远程过程调用知识普及,互联网行业程序员不可不知的RPC
RPC是什么?
RPC是指远程过程调用,也就是说两台服务器A,B,一个应用部署在A服务器上,想要调用B 服务器上应用提供的函数/方法,由于不在一个内存空间,不能直接调用,需要通过网络来表 达调用的语义和传达调用的数据
RPC怎么做
连接:通过在客户端和服务器之间建立TCP连接,远程过程调用的所有交换的数据都在这个连

接里传输
寻址:A服务器上的应用怎么告诉底层的RPC框架,如何连接到B服务器(如主机或IP地址) 以及特定的端口
编码:网络协议是基于二进制的,内存中的参数的值要序列化成二进制的形式,也就是序列 化(Serialize)或编组(marshal),通过寻址和传输将序列化的二进制发送给B服务器
解码:B服务器收到请求后,需要对参数进行反序列化(序列化的逆操作),恢复为内存中的 表达方式,然后找到对应的方法(寻址的一部分)进行本地调用,然后得到返回值
处理返回值:返回值还要发送回服务器A上的应用,也要经过序列化的方式发送,服务器A接 到后,再反序列化,恢复为内存中的表达方式,交给A服务器上的应用

RPC的协议有很多,比如最早的CORBA,Java RMI,Web Service的RPC⻛格,Hessian,Thrift, 甚至Rest API

第2集 Dubbo是什么?为什么我们要用Dubbo
简介:是什么?为什么?怎么做?从学习三要素出发带你重新分析Dubbo
Dubbo是什么?
Apache Dubbo 是一个高性能,轻量级,基于Java的RPC框架。Dubbo提供三个关键功能,包括基于接口的远程调用,容错和负载平衡以及自动服务注册和发现。
Dubbo功能分析

调用功能指责
服务容器负责启动,加载,运行服务提供者
服务提供者在启动时,向注册中心注册自己提供的服务。 服务消费者在启动时,向注册中心订阅自己所需的服务。
注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于⻓连接推送变更 数据给消费者。
服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调 用失败,再选另一台调用。
软负载均衡区分于硬负载均衡(例如F5硬负均衡器),是一种基于软件实现的负载均衡
(例如:nginx负载均衡)
服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到 监控中心
map(调用id,times) map(调用id,int),防止于集装箱进行汇总再上报到注册中心
第3集 ZooKeeper是什么?
简介:是什么?为什么?怎么做?从学习三要素出发带你重新认识ZooKeeper
Zookeeper是什么?
ZooKeeper是一种集中式服务,用于维护配置信息,命名,提供分布式同步和提供组服务Zookeeper在Dubbo中的主要功能

当提供者出现断电等异常停机时,注册中心能自动删除提供者信息。 当注册中心重启时,能自动恢复注册数据,以及订阅请求。
当会话过期时,能自动恢复注册数据,以及订阅请求。
当设置<dubbo:registry check=“false” />时,记录失败注册和订阅请求,后台定时重试。

第4集 ZooKeeper的搭建
简介:手把手进行ZooKeeper在linux环境下的搭建过程
linux 用 wget ZooKeeper下载

ZooKeeper安装

配置在“conf”目录下,新建一个名为“zoo.cfg”的文件,其中内容如下:

ZooKeeper启动
sudo ./bin/zkServer.sh start

检查启动端口
netstat -an|grep 2181
参数解析
tickTime:以毫秒为单位,这个时间作为 Zookeeper 服务器之间或客户端之间维持心跳的时间间隔
dataDir:存储内存中数据库快照的位置,顾名思义就是 Zookeeper保存数据的目录,默认情 况 下 ,Zookeeper将 写 数 据 的 日 志 文 件 也 保 存 到 这 个 目 录 里clientPort:这个端口就是客户端连接 Zookeeper 服务器的端口,Zookeeper 会监听这个端口,接受客户
端的访问请求

第5集 微服务用户系统搭建
简介:基于xdclass-coupon进行用户系统的搭建
实战企业级新建项目全过程
考呗项目,项目项目名和module名称

全局搜索替换pom.xml里面的coupon关键字为user,coupon==》user

修改启动类型名称CouponAppApplication ==》UserAppApplicaiton

更新依赖,重新刷新项目以及install

从实战出发解决企业级项目搭建过程
遇到问题,解决问题,优秀的程序员不需要慌

第6集 微服务用户系统之实战获取用户信息(上)
简介:基于xdclass-coupon进行用户系统的开发
生成用户表SQL,企业级单表操作,互联网服务几乎不会用到物理外键

通过user表生成user项目反向工程

第7集 微服务用户系统之实战获取用户信息(下)
简介:基于xdclass-coupon进行用户系统的开发
验证反向工程代码
新建UserController、UserService对外提供getUserById接口服务 阿里开发者规范注释
类注释需要加@author标签和日期
方法注释需要加方法用途(自动生成的方法除外)

愿景:“让编程不在难学,让技术与生活更加有趣”

第六章 微服务远程调用系统实战

第1集 user与coupon基于dubbo协议调用梳理
简介:基于xdclass-user进行Dubbo Provider的搭建
coupon服务对user服务的RPC调用梳理user-service-api提供公共jar包
user-app实现jar包里面的接口
coupon-app调用jar包的接口不关心jar包实现user-service-api打包过程

第2集 Springboot整合Dubbo Provider的配置
简介:基于xdclass-user进行Dubbo Provider的搭建
引入pom依赖

修改配置文件

开启注解

进行@Service注解扫描 @org.apache.dubbo.config.annotation.Service
序列化传输对象
对比加入dubbo依赖和没加依赖前后的区别
dubbo跑起来了ZK连接上了
dubbo端口和http端口同时跑起来了

第3集 Springboot整合Dubbo Comsumer的配置以及注意项
简介:基于xdclass-coupon进行Dubbo Comsumer的搭建
引入user-service-api的jar包引入pom依赖

修改配置文件

开启注解

在 调 用 的 地 方 加 入 注 解 @Reference com.alibaba.dubbo.config.annotation.Reference

愿景:“让编程不在难学,让技术与生活更加有趣”

第七章 Dubbo可视化后台实战课题

第1集 Dubbo调用可视化
简介:dubbo调用可视化后台dubbo-admin搭建
Dubbo服务启动情况、存活节点情况问题如果某个节点挂了之后我们怎么知道
dubbo节点地址有哪些
如果要对某个节点关闭外部rpc调用怎么做?
Dubbo-admin搭建过程
下载dubbo-admin

build

Start

Visit

第2集 Dubbo Admin元数据上报
简介:dubbo admin的使用
修改注册中心地址和启动地址为7000 Specify registry address in
kill 8080端口,重新用nohup启动Visit
元数据上报配置,添加bean MetadataReportConfig

第3集 微服务单机实现集群部署
简介:集群部署的使用
什么是集群?

单机处理到达瓶颈的时候,你就把单机复制几份,这样就构成了一个“集群”。集群中每台服务 器就叫做这个集群的一个“节点”,所有节点构成了一个集群

单机如何搭建集群
服务对外提供的是端口,端口状态是监听状态(listen),每个服务器的对外端口可以非常多,通过反向代理进行端口映射
手把手实战多coupon和user dubbo consumer和provider的调用

第4集 Dubbo Admin的日常使用
简介:dubbo admin的使用
使用dubbo admin查看消费组和提供组节点使用dubbo admin完成后台接口测试
使用dubbo admin设置请求权重使用dubbo admin添加黑名单dubbo负载均衡策略
轮询调度算法Round Robin Scheduling
轮询调度算法的原理是每一次把来自用户的请求轮流分配给内部中的服务器,从1开 始,直到N(内部服务器个数),然后重新开始循环。算法的优点是其简洁性,它无需记录 当前所有连接的状态,所以它是一种无状态调度。
最少活跃调用数 LeastActive LoadBalance
相同活跃数的随机,活跃数指调用前后计数差。
使慢的提供者收到更少请求,因为越慢的提供者的调用前后计数差会越大

第5集 基于JVM的ShutdownHook优雅关闭
简介:shutdownHook优雅关闭讲解
服务启动端口冲突解决方案 Address already in use
修改启动端口指定server.port
lsof -i:8080/netstat -anp|grep 8080 >找到启动端口对应的服务进程pid》 kill -9执行进程pid强杀
kill -15配合ShutdownHook实现优雅关闭
kill命令 Linux 中 kill 指令负责杀死进程,其后可以紧跟一个数字,代表信号编号(Signal)

JAVA进程优雅关闭的意义
关闭 socket 链接清理临时文件
发送消息通知给订阅方,告知自己下线
各种资源的释放 jerkins钩子 ,往git提交代码==》执行了自动化构建==》服务重启实战spring实战 implements DisposableBean 优雅关闭

第6集 互联网经典面试题分析之为什么有了Http还要用dubbo
简介:还原蚂蚁金服Dubbo相关面试题
问题分析流程,面试官所问的这个问题包含的哪些知识点?
dubbo的定义(定位) rpc相对于http的优势

这个问题应该从哪些方面着手去回答
通用定义的http1.1协议的tcp报文包含无用信息,一个POST协议的格式大致如下(数据大小)

RPC封装了“服务发现”,“负载均衡”,“熔断降级”一类面向服务的高级特性,这些是http做不 到的(RPC特色)
从个人使用经验来讲RPC调用还拥有传输安全的优势,防止了Http调用的数据包篡改和流量劫持(个人经验)
技巧总结==》不经意之间测漏自己是有相关技术实战经验的开发人员

愿景:“让编程不在难学,让技术与生活更加有趣”

第八章 优惠券列表实战开发

第1集 小D商城功能优惠券列表开发
简介:小D商场优惠券功能梳理,每个模块功能梳理

优惠券列表功能梳理
设计先行,提供dubbo API接口对于用户而已==》读优惠券
对于运营人员而已==》写优惠券

第2集 优惠券列表开发
简介:优惠券列表功能开发

优惠券列表开发
获取优惠券系统接口
接口DTO与VO在开发中的规范讲解
DO( Data Object):与数据库表结构一一对应,通过DAO层向上传输数据源对象。DTO( Data Transfer Object):数据传输对象,Service或Manager向外传输的对象。VO( View Object):显示层对象,通常是Web向模板渲染引擎层传输的对象。

第3集 高级程序员必会–JMH基准测试
简介:带你从0到1认识基准测试JMH

基准测试的意义
对业务模型中的重要业务做单独的测试,获取单用户运行时的各项性能指标,为多用户并发 测试和综合场景测试等性能分析提供参考依据
举个例子 list.contain ==>set.contain ==> 布隆过滤器

JMH是什么?

JMH,即Java Microbenchmark Harness,这是专⻔用于进行代码的微基准测试的一套工具API,JMH 由 OpenJDK/Oracle 里面那群开发了 Java 编译器的大牛们所开发
JMH典型使用场景
已经找出了热点函数,而需要对热点函数进行进一步的优化时,就可以使用 JMH 对优化的效果进行定量的分析。
想定量地知道某个函数需要执行多⻓时间,以及执行时间和输入 n 的相关性
一个函数有两种不同实现(例如JSON序列化/反序列化有Jackson和Gson实现),不知道哪种实现性能更好

第4集 JMH基准测试HelloWorld
简介:带你手把手进行springboot和JMH的整合
基准测试引入pom依赖

基准测试JMH helloWorld编写
类似于mybatis-generator的配置方式 第一步配置pom依赖
第二步复制工具类
@Benchmark方法所注释的类为我们所要进行测试的类

第5集 Springboot整合JMH基准测试
简介:带你手把手进行springboot和JMH的整合

关键参数分析
warmupIterations(10)的意思是预热做10轮,
measurementIterations(10)代表正式计量测试做10轮,而每次都是先执行完预热再执行正式计量,内容都是调用标注了 @Benchmark的代码
forks(3)指的是做3轮测试,因为一次测试无法有效的代表结果,所以通过3轮测试较为全面的测试,而每一轮都是先预热,再正式计量

实战springboot整合JMH过程
对比springboot整合JMH和Main方法直接跑JMH的区别在哪里
springboot容器只被初始化一次
如果多次初始化springboot容器会造成端口被占用

第6集 数字化分析执行性能
简介:数字化分析单机执行数据

JMH结果值参看
通过druid对照接口,查看sql统计
http://localhost:8088/druid/sql.html

第7集 系统性能调优指南
简介:系统性能调优指南

http://localhost:8088/druid/sql.html
代码性能差分析思路

愿景:“让编程不在难学,让技术与生活更加有趣”

第九章 互联网高级必会之进程缓存

第1集 分析Mysql执行过程
简介:mysql执行过程分析

mysql传统关系型数据库概念
关系型数据库的一个常⻅用法是存储⻓期的报告数据,并将这些报告数据用作固定时间范围 内的聚合数据。收集聚合数据的常⻅做法是:先将各个行插入到一个报告表里面, 之后再通过扫描这些行来收集聚合数据, 并更新聚合表中⺒有的那些行。
图解剖析mysql的执行过程

第2集 良药苦口缓存的收益和成本

缓存是什么?
起源于CPU,原始意义是指访问速度比一般随机存取存储器(RAM)快的一种RAM,通常它不像系统主存那样使用DRAM技术,而使用昂贵但较快速的SRAM技术
缓存类别
CPU L1/L2/L3 Cache、Linux page Cache加速硬盘读写、浏览器缓存、堆内缓存、分布式缓存
缓存带来的回报
高速读写
缓存加速读写速度降低后端负载
后端服务器通过前端缓存降低负载: 业务端使用Redis降低后端MySQL负载等缓存带来的代价
数据不一致
缓存层和数据层有时间窗口不一致,和更新策略有关 代码维护成本
原本只需要读写MySQL就能实现功能,但加入了缓存之后就要去维护缓存的数据,增加了代码复杂度。
堆内缓存可能带来内存溢出的⻛险影响用户进程,如ehCache、loadingCache
xmx

堆内缓存一般性能更好,远程缓存需要套接字传输 用户级别缓存尽量采用远程缓存
大数据量尽量采用远程缓存,服务节点化原则

第3集 缓存怎么做?
简介:缓存怎么做,怎么加到优惠券列表里面

优惠券列表基于缓存的优化
缓存的使用,先从缓存查数据,如果查不到数据再从数据库刷数据到缓存 缓存使用流程

第4集 Google GauvaCache的使用
简介:优惠券列表堆内缓存优化

优惠券列表基于loadingCache优化
loadingCache接入

第5集 Google GuavaCache常用api
简介:Google GauvaCache常用api有哪些

loadingCache常用api讲解

第6集 Google GuavaCache实战批量优惠券ID接口
简介: Google GauvaCache实战批量优惠券ID接口

批量获取优惠券列表怎么实现?
这个常用的api常⻅怎么用guava缓存

愿景:“让编程不在难学,让技术与生活更加有趣”

第十章 实战探索Springboot定时任务机制

第1集 LoadingCache与Map的对比

简介:深度探索map与loadingCache区别

深入底层探索,为什么要用LoadingCache,不可以用Map来存放数据吗?

为什么要选择ConcurrentHashMap而不是HashMap HashMap存储底层

ConcurrentHashMap存储底层

第2集 使用springboot定时任务
简介:springboot框架整合定时任务处理数据异步更新

基于springboot的定时任务怎么做实战定时任务整合
在启动类CouponAppApplication加入注解@EnableScheduling
在所有执行任务的方法加上注解@Scheduled(cron = “0/5 * * * * ?”)

第3集 基于springboot的数据更新

简介:springboot实战优惠券列表数据异步更新

基于springboot的实战优惠券列表异步更新

第4集 使用springboot集成logback配置
简介:springboot框架整合定时任务处理数据异步更新

logback日志框架接入实战接入流程
引入xml
加入yml配置

第5集 logback日志打印规范
简介:logback日志打印规范

logback日志规范
关键字原则 ,方便通过grep查询限制大小原则
数据脱敏原则

第6集 实战springboot整合JSON
简介:springboot整合json实战

springboot整合json实战演练引入pom依赖
进行日志打印

第7集 基于JMH探索缓存的影响
简介:JMH实验对照加缓存前后的变化

JMH实验对照加缓存前后的变化实战JMH
分析JMH数字化结果

愿景:“让编程不在难学,让技术与生活更加有趣”

第十一章 内存淘汰算法读写性能原理

第1集 内存缓存淘汰算法
简介:内存缓存淘汰算法的作用

内存缓存淘汰算法是什么?

为什么要用淘汰算法有哪些淘汰算法
FIFO LRU LFU
W-Tiny-LFU
FIFO:先进先出
在这种淘汰算法中,先进入缓存的会先被淘汰命中率很低

第2集 缓存淘汰算法LRU算法
简介:精雕细刻缓存淘汰算法LRU算法

LRU算法是什么?
Least recently used,最近最少使用get
为什么要用LRU算法
根据数据的历史访问记录来进行淘汰数据,其核心思想是“如果数据最近被访问过,那么将来 被访问的几率也更高”
LRU算法原理剖析

第3集 缓存淘汰算法LFU算法
简介:缓存淘汰算法LRU算法实战

LFU算法是什么?
Least Frequently Used
为什么要用LFU算法
算法根据数据的历史访问频率来淘汰数据,其核心思想是“如果数据过去被访问多次,那么将 来被访问的频率也更高”
LFU算法原理剖析
新加入数据插入到队列尾部(因为引用计数为1)
队列中的数据被访问后,引用计数增加,队列重新排序; 当需要淘汰数据时,将已经排序的列表最后的数据块删除。

LFU的缺点
复杂度存储成本
尾部容易被淘汰

第4集 来自未来的缓存Caffine介绍
简介:来自未来的缓存Caffine

Caffine是什么?
Caffeine是一个基于Java 8的高性能,接近最佳的缓存库Caffine有什么特色?
自动将条目加载到缓存中,可选择异步加载
基于频率和新近度超过最大值时的基于大小的驱逐
自上次访问或上次写入以来测量的条目的基于时间的到期 当第一个条目的陈旧请求发生时,异步刷新
密钥自动包含在弱引用中
值自动包含在弱引用或软引用中
被驱逐(或以其他方式删除)条目的通知写入传播到外部资源
累积缓存访问统计信息
W-Tiny-LFU实现原理分析

Count-Min Sketch。基于滑动窗口的时间衰减设计机制,借助于一种简易的reset操作:每次添加一条记录到Sketch的时候,都会给一个计数器上加1,当计数器达到一个尺寸W的时候,把所有记录的Sketch数值都除以2,该reset操作可以起到衰减的作用

第5集 Caffine缓存的使用
简介:来自未来的缓存Caffine

Caffine怎么用Caffine实战环节

第6集 内存缓存对比
简介:内存缓存产品对比

内存缓存分类
从淘汰算法和并发性分析内存缓存的利弊

第7集 手把手阿里面试题LRU算法实现
简介:缓存淘汰算法LRU算法实战

LRU算法实战过程

愿景:“让编程不在难学,让技术与生活更加有趣”

第十二章 用户领取优惠券功能开发

第1集 用户领取优惠券功能梳理
简介:用户领取优惠券功能梳理

用户领券功能需求分析

第2集 雪花算法介绍
简介:雪花算法介绍

什么是雪花算法
分布式唯一ID生成策略为什么要用雪花算法
同一业务场景要全局唯一
生成速度快性能好 CPU密集型实现简单没有依赖
雪花算法生成原则和原理
使用41bit作为毫秒数,10bit作为机器的ID(5个bit是数据中心,5个bit的机器ID),12bit作 为毫秒内的流水号(意味着每个节点在每毫秒可以产生 4096个 ID),最后还有一个符号位,永远是0

类比法

第3集 用户优惠券领券开发(上)
简介:基于雪花算法,用户优惠券领券开发

基于雪花算法,用户优惠券领券开发

第4集 用户优惠券领券开发(下)
简介:基于雪花算法,用户优惠券领券开发

基于雪花算法,用户优惠券领券开发

第5集 优惠券系统对外提供Dubbo封装
简介:优惠券对外提供dubbo服务开发

优惠券对外提供dubbo服务开发

第6集 shop商城调用coupon实战
简介:shop商城调用coupon封装

shop商城调用coupon封装
dubbo引入步骤如果忘记请看第六章第3集

愿景:“让编程不在难学,让技术与生活更加有趣”

第十三章 用户优惠券列表功能开发

第1集 用户获取自己的coupon列表实战
简介: 用户获取自己的coupon列表实战

用户获取自己的coupon列表实战

第2集 用户获取coupon列表信息组装
简介:用户获取coupon列表信息组装实战

用户获取coupon列表信息组装

第3集 RPC远程调用项目调试
简介:debug调试解决用户coupon列表问题

实战debug调试解决用户coupon列表问题

第4集 shop调coupon完成用户优惠券列表功能
简介:shop调coupon完成用户优惠券列表功能

实战shop调coupon完成用户优惠券列表功能

愿景:“让编程不在难学,让技术与生活更加有趣”

第十四章 优惠券公告栏需求开发

第1集 coupon公告栏功能梳理
简介: coupon广告栏功能梳理
需求:公告栏展示最近10条用户核销优惠券功能收到需求,设计先行
公告栏展示用户用券消费
通过用户用券消费促进其他用户购买性能调优
分析数据是否落盘入库数据缓存存储方案
选择什么缓存怎么存

第2集 使用redis实现coupon公告栏分析
简介: 使用redis实现coupon公告栏分析
需求:公告栏展示最近10条用户核销优惠券功能
redis:string、hash、list、sortset key,value:json user:{“id”:{},“name”:{}} key: value list [] lpop rpush sortedSet:排行榜 获取前N条 LRU
场景分析:读多写少 只保留前N条数据,当达到N+1条进行删除 10条 1条 zrange
每次插入数据时删除最后一条数据 zadd ==>zrem

第3集 分布式Redis缓存安装
简介: redis缓存安装实战
Redis安装过程 wget apt get
wget http://download.redis.io/releases/redis-4.0.6.tar.gz

telnetredis默认端口6379看能否通远程连接redis记得关闭防火墙 bind是否已经改成了0.0.0.0

第4集 Redis sortedSet功能api讲解
简介:sortedSet功能api讲解
./redis-cli -h 127.0.0.1 -p 6379
zadd——在key对应的zset中添加一个元素
zrange——获取key对应的zset中指定范围的元素,-1表示获取所有元素zrem——删除key对应的zset中的一个元素
zrangebyscore——返回有序集key中,指定分数范围的元素列表,排行榜中运用
zrank——返回key对应的zset中指定member的排名。其中member按score值递增(从小到大); 排名以0为底,也就是说,score值最小的成员排名为0,排行榜中运用
zadd==》zrem
set是通过hashmap存储,key对应set的元素,value是空对象 sortset是怎么存储并实现排序的呢,hashmap存储,还加了一层跳跃表 跳跃表:相当于双向链表,在其基础上添加前往比当前元素大的跳转链接

第5集 手把手SpringBoot整合Redis
简介:springboot整合redis实战
引入bean redisTemplate的使用,类型于:monogoTemplate、jdbcTemplate数据库连接工具配置步骤:
引入pom依赖

编写redisTemplate类,设置redisConnectFactory 引入配置文件

第6集 SpringBoot整合sortedSet api讲解
简介: springboot整合sortedSet实现数据操作
本地连不上远程阿里云redis服务问题定位步骤在redis.conf修改配置参数
bind 改为 0.0.0.0 默认只能本机访问 (127.0.0.1) daemonize yes 默 认 非 守 护 方 式 启 动 (no) protected-mode no 默认为保护模式(yes)
启动方式为./redis-server redis.conf
关闭防火墙
sortedSet springboot数据操作类ZSetOperations
基于ZSetOperations实现redis zrange、zadd、zrem方法实战

第7集 Coupon落地方案分析
简介:Coupon落地方案分析
SortedSet是什么?
Redis 有序集合和集合一样也是string类型元素的集合,且不允许重复的成员
不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序
为甚么要用SortedSet?
有 序 key唯一性能高
集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1) coupon公告栏功能以及Api分析

主要命令Zrem、Zadd、Zrange、Zrevrange zadd myset score(timestamp) key key:需求:展示某某使用了XXX优惠券 userId_couponId1_11_21_32_31_100861_10087

第8集 手把手Coupon实现公告栏数据展示
简介: coupon广告栏功能数据展示
手把手Coupon实现公告栏数据展示 ZRange Timestamp Score
手把手Coupon实现公告栏数据维护 增、删 ZAdd、ZRem

第9集 手把手Coupon实现公告栏数据维护
简介: coupon广告栏功能数据维护
手把手Coupon实现公告栏数据维护 增、删 ZAdd、ZRem

第10集 实战组装Coupon信息提供Dubbo接口
简介:实战组装Coupon信息提供Dubbo接口
coupon公告栏信息组装
通过couponId组装coupon信息

第11集 实战Shop整合Coupon实现公告栏
简介:实战Shop整合coupon实现公告栏 测试coupon提供的dubbo接口是否连通shop调用coupon提供的接口数据

愿景:“让编程不在难学,让技术与生活更加有趣”

第十五章 剖析Jmeter系统测试功能

第1集 性能测试功能Jmeter的概述
简介: 带你了解jmeter
带你了解jmeter测试工具
Jmeter是什么?
Apache JMeter可用于测试静态和动态资源,Web动态应用程序的性能。 它可用于模拟服务器,服务器组,网络或对象上的重负载,以测试其强度或分析不同负载类型下的整体性能
同类型测试工具对比

ab -n1000 -c10 http://localhost:8080/getByCache?id=2jmeter下载

点击启动

需要配置jdk环境

第2集 Jmeter基础功能组件介绍线程组和Sampler
简介: Jmeter基础功能组件介绍
添加->threads->线程组(控制总体并发) [请求发起者]

添加-> Sampler(采样器) [请求接受者]

查看测试结果 [请求结果]

第3集 Jmeter验证Shop公告栏接口
简介: Jmeter验证Shop公告栏接口

关于服务端渲染和客户端渲染 移动互联网填写shop公告栏接口
创建线程组进行压测请求
谷歌扩展程序插件jsonViewer

第4集 Jmeter性能压测聚合报告分析
简介:Jmeter性能压测聚合报告分析
新增聚合报告:线程组->添加->监听器->聚合报告(Aggregate Report)

第5集 蚂蚁金服面试题之服务器性能指标
简介:Linux服务性能指标讲解
为什么要观察服务器性能指标

load average
为什么会有三个数字呢?它们的意思分别是1分钟、5分钟、15分钟内系统的平均负荷。当CPU完全空闲的时候,平均负荷为0,值越低系统负荷越低
值跟CPU核数相关,比如8核CPU,最高负载为8.0
grep -c ‘model name’ /proc/cpuinfo"命令,直接返回CPU的总核心数
mem
展示了当前内存的状态,total是总的内存大小,userd是已使用的,free是剩余的,buffers 是目录缓存

Task

Cpu


展示了目前的进程总数及所处状态,要注意zombie,表示僵尸进程,不为0则表示有进程出现问题

展示了当前CPU的状态,us表示用户进程占用CPU比例,sy表示内核进程占用CPU比例,id 表示空闲CPU百分比,wa表示IO等待所占用的CPU时间的百分比。wa占用超过30%则表示IO压力很大。

愿景:“让编程不在难学,让技术与生活更加有趣”

第十六章 深入理解coupon优惠券核销功能

第1集 coupon优惠券核心功能梳理
简介: coupon优惠券核心功能梳理
coupon优惠券核心功能梳理
业务步骤: 用户触发订单支付 ==》订单支付成功 ==》coupon用户券核销 ==》更新优惠券使用状态 ==》更新公告栏最新优惠流水
流程梳理

第2集 手把手coupon优惠券核销功能实战
简介:coupon优惠券核销功能实战
coupon优惠券核销功能
对于coupon系统来说核销功能的开发功能点

接入Rocketmq,梳理MQ接入消息体
处理coupon数据库更新状态为已核销状态维护公告栏数据

第3集 JMS消息服务以及运用模型
简介: JMS消息服务与消息中间件概念普及
JMS消息服务是什么?
Java消息服务(Java Message Service),提供创建,发送和读取消息的工具。它提供松耦合, 可靠和异步通信。
为什么要用JMS
1)异步:要接收消息,客户端不需要发送请求。消息将自动到达客户端2)可靠:它保证了消息的传递 shop @Async ==> (出现网络异常)coupon
运用模型
点对点模型
订阅模型

第4集 JMS常⻅概念以及消息中间件
简介: JMS常⻅概念以及消息中间件
常⻅概念
JMS提供者:连接面向消息中间件的,JMS接口的一个实现,RocketMQ,ActiveMQ,Kafka等等JMS生产者(Message Producer):生产消息的服务
JMS消费者(Message Consumer):消费消息的服务JMS消息:数据对象
JMS队列:存储待消费消息的区域
JMS主题:一种支持发送消息给多个订阅者的机制
JMS消息通常有两种类型:点对点(Point-to-Point)、发布/订阅(Publish/Subscribe)

基础编程模型
MQ中需要用的一些类
ConnectionFactory :连接工厂,JMS 用它创建连接Connection :JMS 客户端到JMS Provider 的连接Session: 一个发送或接收消息的线程Destination :消息的目的地;消息发送给谁.
MessageConsumer / MessageProducer: 消息消费者,消息生产者
JMS编程模型

常⻅消息中间件
Kafka
是由Apache软件基金会开发的一个开源流处理平台,由Scala和Java编写。Kafka是一种 高吞吐量的分布式发布订阅消息系统,它可以处理大规模的网站中的所有动作流数据(网
⻚浏览,搜索和其他用户的行动),副本集机制,实现数据冗余,保障数据尽量不丢失; 支持多个生产者和消费者
RocketMQ
阿里开源的一款的消息中间件, 纯Java开发,具有高吞吐量、高可用性、适合大规模分布式系统应用的特点, 性能强劲(零拷⻉技术),支持海量堆积, 支持指定次数和时间间隔的失败消息重发,支持consumer端tag过滤、延迟消息等,在阿里内部进行大规模使用,适合在电商,互联网金融等领域使用
RabbitMQ
在国内一些互联网公司近几年用rabbitmq也比较多一些 但是问题也是显而易⻅的,
RabbitMQ确实吞吐量会低一些,这是因为他做的实现机制比较重
3种消息中间件各有优劣,在国内使用比重相差不大,但同类型产品一般只需深刻掌握一种,并了 解不同产品的区别

第5集 RocketMQ4.x本地源码部署
简介:RocketMQ4.x本地快速部署
RocketMQ核心组件
Broker:MQ程序,接收生产的消息,提供给消费者消费的程序
Name Server:给生产和消费者提供路由信息,提供轻量级的服务发现、路由、元数据信息,可以多个部署,互相独立(比zookeeper更轻量)

安装前提条件(推荐) 64bit OS, Linux/Unix/Mac (Windows不兼容) 64bit JDK 1.8+;
快速开始 http://rocketmq.apache.org/docs/quick-start/下载安装包:http://mirror.bit.edu.cn/apache/rocketmq/4.4.0/rocketmq-all-4.4.0-source-release.zip

最新版本部署存在问题:
Please set the JAVA_HOME variable in your environment, We need java(x64)
解决:本地需要配置 JAVA_HOME 使用命令 vim ~/.bash_profile

启动nameServer

查看日志 tail -f nohup.out (结尾:The Name Server boot success. serializeType=JSON 表示启动成功)
启动broker (-n指定nameserver地址,nameserver服务端口为9876, broker默认端口 10911)

关闭nameserver broker执行的命令

使用 jps查看进程

愿景:“让编程不在难学,让技术与生活更加有趣”

第十七章 coupon优惠券核销功能实战

第1集 手把手shop接入rocketmq producer
简介:手把手shop接入rocketmq producer实战
接入消息配置接入pom依赖

配置properties

引入bean

第2集 手把手coupon接入rocketmq consumer
简介:手把手shop接入rocketmq consumer实战
接入消息配置接入pom依赖

配置properties

配置consumer消费者

import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Configuration; import java.util.List;

@Configuration
public abstract class DefaultConsumerConfigure {

private static final Logger log= LoggerFactory.getLogger(DefaultConsumerConfigure.class);

@Value(" r o c k e t m q . c o n s u m e r . g r o u p N a m e " ) p r i v a t e S t r i n g g r o u p N a m e ; @ V a l u e ( " {rocketmq.consumer.groupName}") private String groupName; @Value(" rocketmq.consumer.groupName")privateStringgroupName;@Value("{rocketmq.consumer.namesrvAddr}") private String namesrvAddr;

// 开启消费者监听服务
public void consumer(String topic, String tag) throws MQClientException {
log.info(“开启”+topic+":"+tag+"消费者 ");

DefaultMQPushConsumer consumer = new DefaultMQPushConsumer(groupName);

consumer.setNamesrvAddr(namesrvAddr);

consumer.subscribe(topic, tag);

// 开启内部类实现监听
consumer.registerMessageListener(new MessageListenerConcurrently()
{
@Override
public ConsumeConcurrentlyStatus
consumeMessage(List msgs, ConsumeConcurrentlyContext context)
{
return DefaultConsumerConfigure.this.dealBody(msgs);
}
});

consumer.start();

");
log.info("rocketmq启动成功

}

// 处理body的业务

注册监听器监听消息

import org.apache.rocketmq.client.consumer.listener.ConsumeConcurrentlyStatus; import org.apache.rocketmq.client.exception.MQClientException;
import org.apache.rocketmq.common.message.MessageExt; import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.ApplicationListener; importorg.springframework.context.annotation.Configuration;
import org.springframework.context.event.ContextRefreshedEvent;

import java.io.UnsupportedEncodingException; import java.util.List;

@Service
public class TestListener extends DefaultConsumerConfigure implements ApplicationListener {

private static final Logger log= LoggerFactory.getLogger(DefaultConsumerConfigure.class);

@Override
public void onApplicationEvent(ContextRefreshedEvent arg0) { try{
super.consumer(“TopicTest”, “Tag1”);
} catch (MQClientException e) { log.error(“消费者监听器启动失败”, e);
}
}

@Override
public ConsumeConcurrentlyStatusdealBody(Listmsgs) { int num =1;
log.info(“进入”);
for(MessageExt msg : msgs) { log.info(“第” + num + “次消息”); try {
String msgStr = new String(msg.getBody(), “utf-8”); log.info(msgStr);
} catch (UnsupportedEncodingException e) {

第3集 梳理用户下单流程coupon数据更新
简介:用户下单逻辑梳理
接入消息配置

定义shop传递给coupon的消息结构体

接口协议是一种规则,不管是http接口,dubbo接口,还是mq,都是系统间的互调,只要是系统间的互调就要协议,规范开发流程步骤可以减少出错概率
市面上的协议文档
wiki 文 档 apidoc自动文档
swagger自动生成文档

第4集 实战用户下单跟新coupon和order关联关系
简介:实战用户下单跟新coupon和order关联关系
用户下单跟新coupon和order关联关系开发
创建订单的时候处理发送mq给coupon告诉coupon和订单发送生关联取消订单的时候发送消息解除coupon和订单关联
发送关联实战

第5集 实战用户支付shop发送消息
简介:实战用户支付shop发送消息
用户支付行为调用shop发送mq通知支付发送mq实战

第6集 实战用户下单支付coupon跟新状态
简介:实战用户下单支付coupon跟新状态
用户下单==》coupon新增couponCode和order关联关系 用户支付==》coupon更新userCoupon为订单已支付状态

愿景:“让编程不在难学,让技术与生活更加有趣”

第十八章 高级工程师进阶课Nginx反向代理

第1集 从分布式集群到Nginx反向代理
简介:从分布式集群到Nginx反向代理
集群是什么?
服务器集群就是指将很多服务器集中起来一起进行同一种服务,在客户端看来就像是只有一 个服务器
为什么要集群部署?
集群可以利用多个计算机进行并行计算从而获得很高的计算速度 有效减少单点故障问题 冷备份
集群部署怎么部署?
通过服务通过域名映射到多台机器通过nginx反向代理
nginx是什么
是一个高性能的HTTP和反向代理服务器
nginx的特点
Nginx 专为性能优化而开发,性能是其最重要的考量
能经受高负载的考验,有报告表明能支持高达 50,000 个并发连接数

第2集 正向代理与反向代理
简介:正向代理与反向代理
正向代理
正向代理服务器位于客户端和服务器之间,为了向服务器获取数据,客户端要向代理服务器 发送一个请求,并指定目标服务器,代理服务器将目标服务器返回的数据转交给客户端
正向代理的案例:VPN
VPN 通俗的讲就是一种中转服务,当我们电脑接入 VPN 后,我们对外 IP 地址就会变成VPN 服务器的 公网 IP,我们请求或接受任何数据都会通过这个VPN 服务器然后传入到我们本机

反向代理
反向代理,其实客户端对代理是无感知的,因为客户端不需要任何配置就可以访问,我们只 需要将请求发送到反向代理服务器,由反向代理服务器去选择目标服务器获取数据后,在返 回给客户端,此时反向代理服务器和目标服务器对外就是一个服务器,暴露的是代理服务器 地址,隐藏了真实服务器IP地址

反向代理和正向代理的区别就是:正向代理代理客户端,反向代理代理服务器

第3集 手把手反向代理服务器Nginx安装(基于Linux服务器)
简介:反向代理服务器Nginx安装
安装编译工具及库文件

安装 PCRE

下载 Nginx,下载地址:<http://nginx.org/download/nginx-1.6.2.tar.gz

Nginx配置
创建 Nginx 运行使用的用户 www:

配置nginx.conf ,将/usr/local/webserver/nginx/conf/nginx.conf替换为以下内容

[root@danielconf]# cat /usr/local/webserver/nginx/conf/nginx.conf user wwwwww;
worker_processes auto; #设置值和CPU核心数一致
error_log /usr/local/webserver/nginx/logs/nginx_error.log crit; #日志位置和日志级别
pid /usr/local/webserver/nginx/nginx.pid;
#Specifies the value for maximum file descriptors that can be opened by this process.
worker_rlimit_nofile 65535; events
{
use epoll; worker_connections 65535;
}
http
{
include mime.types;
default_type application/octet-stream;
log_formatmain '$remote_addr - r e m o t e u s e r [ remote_user [ remoteuser[time_local] “KaTeX parse error: Double superscript at position 11: request"' '̲status b o d y b y t e s s e n t " body_bytes_sent " bodybytessent"http_referer” ’ ‘"$http_user_agent" $http_x_forwarded_for’;

#charset gb2312;

server_names_hash_bucket_size 128; client_header_buffer_size 32k; large_client_header_buffers 4 32k;

client_max_body_size 8m;

sendfile on; tcp_nopush on; keepalive_timeout 60; tcp_nodelay on;
fastcgi_connect_timeout 300;
fastcgi_send_timeout 300;
fastcgi_read_timeout 300; fastcgi_buffer_size 64k; fastcgi_buffers 4 64k; fastcgi_busy_buffers_size 128k; fastcgi_temp_file_write_size 128k; gzip on;
gzip_min_length 1k; gzip_buffers 4 16k;
gzip_http_version 1.0;
gzip_comp_level 2;
gzip_types text/plain application/x-javascript text/css application/xml;
gzip_vary on;

#limit_zone crawler KaTeX parse error: Expected 'EOF', got '#' at position 25: …mote_addr 10m; #̲下面是server虚拟主机的配…
{
#fastcgi_pass unix:/tmp/php-cgi.sock; fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php;
include fastcgi.conf;
}
location ~ ..(gif|jpg|jpeg|png|bmp|swf|ico)$
{
expires 30d; # access_logoff;
}
location ~ .
.(js|css)?$
{
expires 15d;

access_log off;

}
access_log off;
}

检查配置文件nginx.conf的正确性命令:

启动nginx

从浏览器访问我们配置的站点ip 几个常⻅命令

linux vi编辑器清空文件内容

第4集 Nginx企业级常用配置讲解
简介:Nginx企业级常用配置讲解
nginx核心配置讲解
worker_connections设置可由一个worker进程同时打开的最大连接数

upstream负载均衡列表
weigth表示权重,权重越大分配比例越大
upstream www.abc.com{ server 192.168.16.3:8080 weight=1; server 192.168.26.3:8080 weight=2; server 192.168.36.3:8080 weight=3; }
server设置访问的负载均衡处理的域名

server_name代表域名,listen代表端口location配置域名下的路径地址
可以配置一下静态文件的处理,就可以不用tomcat处理静态文件了,这个地方支持正则表达式
实战coupon项目搭建

#Proxy Settings

proxy_redirect
off;

proxy_set_header
Host
$host;

proxy_set_header
X-Real-IP
$remote_addr;

proxy_set_header
X-Forwarded-For
$proxy_add_x_forwarded_for;

80端口代表服务器默认端口http://172.16.244.151:80= http://172.16.244.151

第5集 配置shop域名反向代理
简介:从域名访问到最终定位到机器IP
从域名访问到最终定位到机器IP经历了什么什么是DNS解析?
用于将用户提供的主机名解析为ip地址
DNS解析过程 具体过程如下: ①用户主机上运行着DNS的客户端,就是我们的PC机或者手机客户端运行着DNS客户端了 ②浏览器将接收到的url中抽取出域名字段,就是访问的主机名,比如

③DNS客户机端向DNS服务器端发送一份查询报文,报文中包含着要访问的主机名字段(中间包括一些列缓存查询以及分布式DNS集群的工作) ④该DNS客户机最终会收到一份回答报文,其中包含有该主机名对应的IP地址 ⑤一旦该浏览器收到来自DNS的IP地址,就可以向该IP地址定位的HTTP服务器发起TCP 连接
DNS解析过程
本地浏览器缓存==》hosts文件==》本地DNS服务器 ==》 ISP商DNS服务器 ==》顶级域名服务器
==》跟域名服务器
得出结论,DNS解析的过程第一步会走本地缓存,那么我们可以配置一个不存在的域名进行内网/ 本地访问
配置shop.xdclass.com这个域名的hosts文件 添加配置

windows:

mac/linux:

#Specifies the value for maximum file descriptors that can be opened by this process.
worker_rlimit_nofile 65535; events
{
use epoll; worker_connections 65535;
}
http
{
include mime.types;
default_type application/octet-stream;
log_formatmain '$remote_addr - r e m o t e u s e r [ remote_user [ remoteuser[time_local] “KaTeX parse error: Double superscript at position 12: request" ' '̲status b o d y b y t e s s e n t " body_bytes_sent " bodybytessent"http_referer” ’ ‘" h t t p u s e r a g e n t " http_user_agent" httpuseragent"http_x_forwarded_for’;

#charset gb2312;

server_names_hash_bucket_size 128; client_header_buffer_size 32k; large_client_header_buffers 4 32k; client_max_body_size 8m;

sendfile on; tcp_nopush on; keepalive_timeout 60; tcp_nodelay on;
fastcgi_connect_timeout 300;
fastcgi_send_timeout 300;
fastcgi_read_timeout 300; fastcgi_buffer_size 64k; fastcgi_buffers 4 64k; fastcgi_busy_buffers_size 128k; fastcgi_temp_file_write_size 128k; gzip on;
gzip_min_length 1k; gzip_buffers 4 16k;
gzip_http_version 1.0;
gzip_comp_level 2;
gzip_types text/plain application/x-javascript text/css application/xml; gzip_vary on;

#limit_zone crawler $binary_remote_addr 10m; #下面是server虚拟主机的配置

upstream shop {
server 127.0.0.1:8097;
}

#Proxy Settings

proxy_redirect
off;

proxy_set_header
Host
$host;

proxy_set_header
X-Real-IP
$remote_addr;

proxy_set_header
X-Forwarded-For
$proxy_add_x_forwarded_for;

第6集 实战coupon服务在Linux环境部署
简介:coupon服务在linux环境部署
服务器部署过程
从git下载服务器最新代码 git clone
确定代码构建分支,如test分支表示测试环境、master分支常表示线上构建代码,如 mvn install
启动服务nohup java -jar 报名 &
从本地上传构建好的jar包到服务器直接启动
scp 本地jar包 到远程服务器 scp ==>ssh copy

愿景:“让编程不在难学,让技术与生活更加有趣”

第十九章 微服务实战总结与思考

第1集 互联网线上故障问题定位小工具
线上定位问题能力的重要性
作为互联网公司,经常会出现线上故障,如:cpu占用过高、线程数占满、服务质量下降,掌 握出现异常的时候定位问题, 解决问题的能力显得尤为重要
掌握定位问题和解决问题的思路

CPU占满出现在计算密集型程序 kill -15
做练习多实操才能信手拈来

第2集 互联网架构优惠券系统实战
互联网架构优惠券系统实战总结

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值