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("rocketmq.consumer.groupName")privateStringgroupName;@Value("{rocketmq.consumer.groupName}") private String groupName; @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 - remoteuser[remote_user [time_local] “KaTeX parse error: Double superscript at position 11: request"' '̲status bodybytessent"body_bytes_sent "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 - remoteuser[remote_user [time_local] “KaTeX parse error: Double superscript at position 12: request" ' '̲status bodybytessent"body_bytes_sent "http_referer” ’ ‘"httpuseragent"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 $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集 互聯網架構優惠券系統實戰
互聯網架構優惠券系統實戰總結

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章