springCloud+docker從入門到高階
文章目錄
- 第一章 spingCloud介紹
- 第二章 架構演進和分散式系統基礎知識
- 第三章 SpringCloud核心元件註冊中心
- 第四章 服務消費者ribbon和feign實戰和註冊中心高可用
- 第五章 網際網路架構服務降級熔斷 Hystrix 實戰
- 第六章 微服務閘道器zuul開發實戰
- 第七章 分散式鏈路追蹤系統Sleuth和ZipKin實戰
- 第八章 微服務核心知識分散式配置中心Config實戰
- 第九章 微服務訊息匯流排Bus結合訊息佇列RabbitMQ實戰
- 第十章、SpringCloud課程內容上半部分總結
- 第十二章 微服務必備技能Docker容器基礎篇幅
- 第十三章 微服務高階篇幅SpringCloud和Docker整合部署
- 第十四章 課程總結和常見問題處理
第一章 spingCloud介紹
微服務的概念源於 2014 年 3 月 Martin Fowler 所寫的一篇文章“Microservices”。文中內容提到:微服務架構是一種架構模式,它提倡將單一應用程式劃分成一組小的服務,服務之間互相協調、互相配合,為使用者提供最終價值。
每個服務執行在其獨立的程式中,服務與服務間採用輕量級的通訊機制互相溝通(通常是基於 HTTP 的 RESTful API)。每個服務都圍繞著具體業務進行構建,並且能夠被獨立地部署到生產環境、類生產環境等。
另外,應儘量避免統一的、集中式的服務管理機制,對具體的一個服務而言,應根據業務上下文,選擇合適的語言、工具對其進行構建。
微服務是一種架構風格,一個大型複雜軟體應用由一個或多個微服務組成。系統中的各個微服務可被獨立部署,各個微服務之間是鬆耦合的。每個微服務僅關注於完成一件任務並很好地完成該任務。在所有情況下,每個任務代表著一個小的業務能力。
第二章 架構演進和分散式系統基礎知識
1、高可用 LVS+keepalive
1、單體應用:
開發速度慢
啟動時間長
依賴龐大
等等
2、微服務
易開發、理解和維護
獨立的部署和啟動
等
不足:
分散式系統-》分散式事務問題
需要管理多個服務-》服務治理
2、微服務核心基礎講解
簡介:講解微服務核心知識 :閘道器、服務發現註冊、配置中心、鏈路追蹤、負載均衡器、熔斷 1、閘道器:路由轉發 + 過濾器 /api/v1/pruduct/ 商品服務 /api/v1/order/ 訂單服務 /api/v1/user/ 使用者服務 2、服務註冊發現:呼叫和被呼叫方的資訊維護 3、配置中心:管理配置,動態更新 application.properties 4、鏈路追蹤:分析呼叫鏈路耗時 例子:下單-》查詢商品服務獲取商品價格-》查詢使用者資訊-》儲存資料庫 5、負載均衡器:分發負載 6、熔斷:保護自己和被呼叫方
3、常見的微服務框架
consumer: 呼叫方
provider: 被呼叫方
一個介面一般都會充當兩個角色(不是同時充當)
1、dubbo: zookeeper + dubbo + springmvc/springboot
官方地址:http://dubbo.apache.org/#!/?lang=zh-cn
配套
通訊方式:rpc
註冊中心:zookeper/redis
配置中心:diamond
2、springcloud: 全家桶+輕鬆嵌入第三方元件(Netflix 奈飛)
官網:http://projects.spring.io/spring-cloud/
配套
通訊方式:http restful
註冊中心:eruka/consul
配置中心:config
斷路器:hystrix
閘道器:zuul
分散式追蹤系統:sleuth+zipkin
學習資料:https://blog.csdn.net/zhangweiwei2020/article/details/78646252
4、微服務下電商專案基礎模組設計
簡介:微服務下電商專案基礎模組設計 分離幾個模組,課程圍繞這個基礎專案進行學習 小而精的方式學習微服務
1、使用者服務
1)使用者資訊介面
2)登入介面
2、商品服務
1)商品列表
2)商品詳情
3、訂單服務
1)我的訂單
2)下單介面
第三章 SpringCloud核心元件註冊中心
1、什麼是微服務的註冊中心
理解註冊中心:服務管理,核心是有個服務登錄檔,心跳機制動態維護
服務提供者provider: 啟動的時候向註冊中心上報自己的網路資訊
服務消費者consumer: 啟動的時候向註冊中心上報自己的網路資訊,拉取provider的相關網路資訊
為什麼要用:
微服務應用和機器越來越多,呼叫方需要知道介面的網路地址,如果靠配置檔案的方式去控制網路地址,對於動態新增機器,維護帶來很大問題
主流的註冊中心:
zookeeper、Eureka、consul、etcd 等
2、分散式應用知識CAP理論知識
CAP定理:
指的是在一個分散式系統中,Consistency(一致性)、 Availability(可用性)、Partition tolerance(分割槽容錯性),三者不可同時獲得。
一致性(C):在分散式系統中的所有資料備份,在同一時刻是否同樣的值。(所有節點在同一時間的資料完全一致,越多節點,資料同步越耗時)
可用性(A):負載過大後,叢集整體是否還能響應客戶端的讀寫請求。(服務一直可用,而且是正常響應時間)
分割槽容錯性(P):分割槽容忍性,就是高可用性,一個節點崩了,並不影響其它的節點(100個節點,掛了幾個,不影響服務,越多機器越好)
CAP理論就是說在分散式儲存系統中,最多隻能實現上面的兩點。而由於當前的網路硬體肯定會出現延遲丟包等問題,所以分割槽容忍性是我們必須需要實現的。所以我們只能在一致性和可用性之間進行權衡
3、分散式系統CAP原理常見面試題和註冊中心選擇
C A 滿足的情況下,P不能滿足的原因:
資料同步(C)需要時間,也要正常的時間內響應(A),那麼機器數量就要少,所以P就不滿足
CP 滿足的情況下,A不能滿足的原因:
資料同步(C)需要時間, 機器數量也多(P),但是同步資料需要時間,所以不能再正常時間內響應,所以A就不滿足
AP 滿足的情況下,C不能滿足的原因:
機器數量也多(P),正常的時間內響應(A),那麼資料就不能及時同步到其他節點,所以C不滿足
註冊中心選擇:
Zookeeper:CP設計,保證了一致性,叢集搭建的時候,某個節點失效,則會進行選舉行的leader,或者半數以上節點不可用,則無法提供服務,因此可用性沒法滿足
Eureka:AP原則,無主從節點,一個節點掛了,自動切換其他節點可以使用,去中心化
結論:分散式系統中P,肯定要滿足,所以只能在CA中二選一
沒有最好的選擇,最好的選擇是根據業務場景來進行架構設計
如果要求一致性,則選擇zookeeper,如金融行業
如果要去可用性,則Eureka,如電商系統
4、SpringCloud微服務核心元件Eureka介紹和閉源後影響
簡介:SpringCloud體系介紹
官方地址:http://projects.spring.io/spring-cloud/ Eureka的基礎知識–>畫圖講解互動流程,服務提供者<–>服務消費者 ; Eureka 2.x閉源後選擇 參考:https://www.jianshu.com/p/d32ae141f680 https://blog.csdn.net/zjcjava/article/details/78608892
5、服務註冊和發現Eureka Server搭建實戰
簡介:使用IDEA搭建Eureka服務中心Server端並啟動,專案基本骨架介紹
官方文件:http://cloud.spring.io/spring-cloud-netflix/single/spring-cloud-netflix.html#spring-cloud-eureka-server
第一步:建立專案
第二步: 新增註解 @EnableEurekaServer
第三步:增加配置application.yml
server:
port: 8761
eureka:
instance:
hostname: localhost
client:
宣告自己是個服務端
registerWithEureka: false
fetchRegistry: false
serviceUrl:
defaultZone: http://
e
u
r
e
k
a
.
i
n
s
t
a
n
c
e
.
h
o
s
t
n
a
m
e
:
{eureka.instance.hostname}:
eureka.instance.hostname:{server.port}/eureka/
第四步:訪問註冊中心頁面
maven地址: https://www.cnblogs.com/sword-successful/p/6408281.html
6、服務註冊和發現之Eureka Client搭建商品服務實戰
簡介:搭建用商品服務,並將服務註冊到註冊中心
1、建立一個SpirngBoot應用,增加服務註冊和發現依賴
2、模擬商品資訊,儲存在記憶體中
3、開發商品列表介面,商品詳情介面
4、配置檔案加入註冊中心地址
使用eureka客戶端 官方文件:http://cloud.spring.io/spring-cloud-netflix/single/spring-cloud-netflix.html#netflix-eureka-client-starter
7、Eureka服務註冊中心配置控制檯問題處理
簡介:講解服務註冊中心管理後臺,(後續還會細講)
問題:eureka管理後臺出現一串紅色字型:是警告,說明有服務上線率低
EMERGENCY! EUREKA MAY BE INCORRECTLY CLAIMING INSTANCES ARE UP WHEN THEY’RE NOT. RENEWALS ARE LESSER THAN THRESHOLD AND HENCE THE INSTANCES ARE NOT BEING EXPIRED JUST TO BE SAFE.
關閉檢查方法:eureka服務端配置檔案加入
server:
enable-self-preservation: false
注意:自我保護模式禁止關閉,預設是開啟狀態true
問題二:為什麼只加一個註冊中心地址,就可以註冊
By having spring-cloud-starter-netflix-eureka-client on the classpath, your application automatically registers with the Eureka Server. Configuration is required to locate the Eureka server, as shown in the following example:
第四章 服務消費者ribbon和feign實戰和註冊中心高可用
1、常用的服務間呼叫方式講解
RPC:
遠端過程呼叫,像呼叫本地服務(方法)一樣呼叫伺服器的服務
支援同步、非同步呼叫
客戶端和伺服器之間建立TCP連線,可以一次建立一個,也可以多個呼叫複用一次連結
PRC資料包小
protobuf
thrift
rpc:編解碼,序列化,連結,丟包,協議
Rest(Http):
http請求,支援多種協議和功能
開發方便成本低
http資料包大
java開發:HttpClient,URLConnection
2、微服務呼叫方式之ribbon實戰 訂單呼叫商品服務
1、建立order_service專案
2、開發偽下單介面
3、使用ribbon. (類似httpClient,URLConnection)
啟動類增加註解
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
4、根據名稱進行呼叫商品,獲取商品詳情
3、高階篇幅之Ribbon負載均衡原始碼分析實戰
1、完善下單介面
2、分析@LoadBalanced
1)首先從註冊中心獲取provider的列表
2)通過一定的策略選擇其中一個節點
3)再返回給restTemplate呼叫
4、高階篇幅之服務間呼叫之負載均衡策略調整實戰
簡介:實戰調整預設負載均衡策略實戰
自定義負載均衡策略:http://cloud.spring.io/spring-cloud-static/Finchley.RELEASE/single/spring-cloud.html#_customizing_the_ribbon_client_by_setting_properties
在配置檔案yml裡面,自定義負載均衡策略
#自定義負載均衡策略
product-service:
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule
策略選擇:
1、如果每個機器配置一樣,則建議不修改策略 (推薦)
2、如果部分機器配置強,則可以改為 WeightedResponseTimeRule
5、微服務呼叫方式之feign 實戰 訂單呼叫商品服務
Feign: 偽RPC客戶端(本質還是用http)
官方文件: https://cloud.spring.io/spring-cloud-openfeign/
1、使用feign步驟講解(新舊版本依賴名稱不一樣)
加入依賴
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
啟動類增加@EnableFeignClients
增加一個介面 並@FeignClient(name="product-service")
2、編碼實戰
3、注意點:
1、路徑
2、Http方法必須對應
3、使用requestBody,應該使用@PostMapping
4、多個引數的時候,通過@RequestParam("id") int id)方式呼叫
6、Feign核心原始碼解讀和服務呼叫方式ribbon和Feign選擇
1、ribbon和feign兩個的區別和選擇
選擇feign
預設整合了ribbon
寫起來更加思路清晰和方便
採用註解方式進行配置,配置熔斷等方式方便
2、超時配置
預設optons readtimeout是60,但是由於hystrix預設是1秒超時
#修改呼叫超時時間
feign:
client:
config:
default:
connectTimeout: 2000
readTimeout: 2000
模擬介面響應慢,執行緒睡眠新的方式
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
第五章 網際網路架構服務降級熔斷 Hystrix 實戰
1、分散式核心知識之熔斷、降級講解
簡介:系統負載過高,突發流量或者網路等各種異常情況介紹,常用的解決方案
1、熔斷:
保險絲,熔斷服務,為了防止整個系統故障,包含子和下游服務
下單服務 -》商品服務
-》使用者服務 (出現異常-》熔斷)
2、降級:
拋棄一些非核心的介面和資料
旅行箱的例子:只帶核心的物品,拋棄非核心的,等有條件的時候再去攜帶這些物品
3、熔斷和降級互相交集
相同點:
1)從可用性和可靠性觸發,為了防止系統崩潰
2)最終讓使用者體驗到的是某些功能暫時不能用
不同點
1)服務熔斷一般是下游服務故障導致的,而服務降級一般是從整體系統負荷考慮,由呼叫方控制
2、Netflix開源元件斷路器Hystrix介紹
文件地址:
https://github.com/Netflix/Hystrix
https://github.com/Netflix/Hystrix/wiki
1、什麼是Hystrix?
1)hystrix對應的中文名字是“豪豬”
2)hystrix 英[hɪst'rɪks] 美[hɪst'rɪks]
2、為什麼要用?
在一個分散式系統裡,一個服務依賴多個服務,可能存在某個服務呼叫失敗,
比如超時、異常等,如何能夠保證在一個依賴出問題的情況下,不會導致整體服務失敗,
通過Hystrix就可以解決
http://cloud.spring.io/spring-cloud-netflix/single/spring-cloud-netflix.html#_circuit_breaker_hystrix_clients
3、提供了熔斷、隔離、Fallback、cache、監控等功能
4、熔斷後怎麼處理?
出現錯誤之後可以 fallback 錯誤的處理資訊
兜底資料
3、Feign結合Hystrix斷路器開發實戰《上》
1、加入依賴
注意:網上新舊版本問題,所以要以官網為主,不然部分註解會丟失
最新版本 2.0
org.springframework.cloud
spring-cloud-starter-netflix-hystrix
2、增加註解
啟動類裡面增加註解
@EnableCircuitBreaker
註解越來越多-》 SpringCloudApplication註解
3、API介面編碼實戰
熔斷-》降級
1)最外層api使用,好比異常處理(網路異常,引數或者內部呼叫問題)
api方法上增加 @HystrixCommand(fallbackMethod = “saveOrderFail”)
編寫fallback方法實現,方法簽名一定要和api方法簽名一致(注意點!!!)
補充: 修改maven倉庫地址
pom.xml中修改
<repositories>
<repository>
<id>nexus-aliyun</id>
<name>Nexus aliyun</name>
<layout>default</layout>
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
<releases>
<enabled>true</enabled>
</releases>
</repository>
</repositories>
4、Feign結合Hystrix斷路器開發實戰《下》
1、feign結合Hystrix
1)開啟feign支援hystrix (注意,一定要開啟,舊版本預設支援,新版本預設關閉)
feign:
hystrix:
enabled: true
2)FeignClient(name=“xxx”, fallback=xxx.class ), class需要繼承當前FeignClient的類
5、熔斷降級服務異常報警通知實戰
1、加入redis依賴
org.springframework.boot
spring-boot-starter-data-redis
2、配置redis連結資訊
redis:
database: 0
host: 127.0.0.1
port: 6379
timeout: 2000
3、使用
//監控報警
String saveOrderKye = “save-order”;
String sendValue = redisTemplate.opsForValue().get(saveOrderKye);
final String ip = request.getRemoteAddr();
new Thread( ()->{
if (StringUtils.isBlank(sendValue)) {
System.out.println(“緊急簡訊,使用者下單失敗,請離開查詢原因,ip地址是=”+ip);
//傳送一個http請求,呼叫簡訊服務 TODO
redisTemplate.opsForValue().set(saveOrderKye, “save-order-fail”, 20, TimeUnit.SECONDS);
}else{
System.out.println(“已經傳送過簡訊,20秒內不重複傳送”);
}
}).start();
6、高階篇幅之深入原始碼剖析Hystrix降級策略和調整
1、檢視預設講解策略 HystrixCommandProperties
1)execution.isolation.strategy 隔離策略
THREAD 執行緒池隔離 (預設)
SEMAPHORE 訊號量
訊號量適用於介面併發量高的情況,如每秒數千次呼叫的情況,導致的執行緒開銷過高,通常只適用於非網路呼叫,執行速度快
2)execution.isolation.thread.timeoutInMilliseconds 超時時間
預設 1000毫秒
3)execution.timeout.enabled 是否開啟超時限制 (一定不要禁用)
4)execution.isolation.semaphore.maxConcurrentRequests 隔離策略為 訊號量的時候,如果達到最大併發數時,後續請求會被拒絕,預設是10
官方文件:
https://github.com/Netflix/Hystrix/wiki/Configuration#execution.isolation.strategy
2、調整策略
超時時間調整
hystrix:
command:
default:
execution:
isolation:
thread:
timeoutInMilliseconds: 4000
7、斷路器Dashboard監控儀表盤實戰
簡介:講解斷路器Dashboard基礎使用和檢視
1、加入依賴
org.springframework.cloud
spring-cloud-starter-netflix-hystrix-dashboard
org.springframework.boot
spring-boot-starter-actuator
2、啟動類增加註解
@EnableHystrixDashboard
3、配置檔案增加endpoint
management:
endpoints:
web:
exposure:
include: “*”
4、訪問入口
http://localhost:8781/hystrix
Hystrix Dashboard輸入: http://localhost:8781/actuator/hystrix.stream
參考資料
預設開啟監控配置
https://docs.spring.io/spring-boot/docs/current-SNAPSHOT/reference/htmlsingle/#boot-features-security-actuator
配置檔案類:
spring-configuration-metadata.json
8、斷路器監控儀表引數講解和模擬熔斷
簡介:講解 斷路器監控儀表盤引數和模擬熔斷
1、sse server-send-event推送到前端
資料:https://github.com/Netflix/Hystrix/wiki/Dashboard
第六章 微服務閘道器zuul開發實戰
1、微服務閘道器介紹和使用場景
1)什麼是閘道器
API Gateway,是系統的唯一對外的入口,介於客戶端和伺服器端之間的中間層,處理非業務功能 提供路由請求、鑑權、監控、快取、限流等功能
統一接入
智慧路由
AB測試、灰度測試
負載均衡、容災處理
日誌埋點(類似Nignx日誌)
流量監控
限流處理
服務降級
安全防護
鑑權處理
監控
機器網路隔離
2)主流的閘道器
zuul:是Netflix開源的微服務閘道器,和Eureka,Ribbon,Hystrix等元件配合使用,Zuul 2.0比1.0的效能提高很多
kong: 由Mashape公司開源的,基於Nginx的API gateway
nginx+lua:是一個高效能的HTTP和反向代理伺服器,lua是指令碼語言,讓Nginx執行Lua指令碼,並且高併發、非阻塞的處理各種請求
2、SpringCloud的閘道器元件zuul基本使用
簡介:講解zuul閘道器基本使用
1、加入依賴
2、啟動類加入註解 @EnableZuulProxy
預設整合斷路器 @EnableCircuitBreaker
預設訪問規則
http://gateway:port/service-id/**
例子:預設 /order-service/api/v1/order/save?user_id=2&product_id=1
自定義 /xdclass_order/api/v1/order/save?user_id=2&product_id=1
自定義路由轉發:
zuul:
routes:
order-service: /apigateway/**
環境隔離配置:
需求 :不想讓預設的服務對外暴露介面
/order-service/api/v1/order/save
配置:
zuul:
ignored-patterns:
- /*-service/api/v1/order/save
3、高階篇幅之Zuul常用問題分析和閘道器過濾器原理分析
簡介:講解Zuul閘道器原理和過濾器生命週期
1、路由名稱定義問題
路由對映重複覆蓋問題
2、Http請求頭過濾問題
3、過濾器執行順序問題 ,過濾器的order值越小,越先執行
4、共享RequestContext,上下文物件
4、自定義Zuul過濾器實現登入鑑權實戰
簡介:自定義Zuul過濾器實現登入鑑權實戰
1、新建一個filter包
2、新建一個類,實現ZuulFilter,重寫裡面的方法
3、在類頂部加註解,@Component,讓Spring掃描
5、高階篇幅之高併發情況下介面限流特技
簡介:谷歌guava框架介紹,閘道器限流使用
1、nginx層限流
2、閘道器層限流
6、Zuul微服務閘道器叢集搭建
1、nginx+lvs+keepalive
https://www.cnblogs.com/liuyisai/p/5990645.html
第七章 分散式鏈路追蹤系統Sleuth和ZipKin實戰
1、SpringCloud的鏈路追蹤元件Sleuth實戰
簡介:講解分散式鏈路追蹤元件Sleuth實戰
1、官方文件
http://cloud.spring.io/spring-cloud-static/Finchley.SR1/single/spring-cloud.html#sleuth-adding-project
2、什麼是Sleuth
一個元件,專門用於記錄鏈路資料的開源元件
[order-service,96f95a0dd81fe3ab,852ef4cfcdecabf3,false]
1、第一個值,spring.application.name的值
2、第二個值,96f95a0dd81fe3ab ,sleuth生成的一個ID,叫Trace ID,用來標識一條請求鏈路,一條請求鏈路中包含一個Trace ID,多個Span ID
3、第三個值,852ef4cfcdecabf3、spanid 基本的工作單元,獲取後設資料,如傳送一個http
4、第四個值:false,是否要將該資訊輸出到zipkin服務中來收集和展示。
3、新增依賴
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-sleuth</artifactId>
</dependency>
2、SpringCloud的鏈路追蹤元件Sleuth常見問題說明
簡介:講解分散式鏈路追蹤元件Sleuth常見問題說明
3、視覺化鏈路追蹤系統Zipkin部署
簡介:講解Zipkin的介紹和部署
1、什麼是zipkin
官網:https://zipkin.io/
大規模分散式系統的APM工具(Application Performance Management),基於Google Dapper的基礎實現,和sleuth結合可以提供視覺化web介面分析呼叫鏈路耗時情況
2、同類產品
鷹眼(EagleEye)
CAT
twitter開源zipkin,結合sleuth
Pinpoint,運用JavaAgent位元組碼增強技術
StackDriver Trace (Google)
3、開始使用
https://github.com/openzipkin/zipkin
https://zipkin.io/pages/quickstart.html
zipkin組成:Collector、Storage、Restful API、Web UI組成
4、知識擴充:OpenTracing
OpenTracing 已進入 CNCF,正在為全球的分散式追蹤,提供統一的概念和資料標準。
通過提供平臺無關、廠商無關的 API,使得開發人員能夠方便的新增(或更換)追蹤系統的實現。
http://blog.daocloud.io/cncf-3/
https://www.zhihu.com/question/27994350
https://yq.aliyun.com/articles/514488?utm_content=m_43347
4、高階篇幅之鏈路追蹤元件Zipkin+Sleuth實戰
1、文件
http://cloud.spring.io/spring-cloud-static/Finchley.SR1/single/spring-cloud.html#_sleuth_with_zipkin_via_httpsleuth收集跟蹤資訊通過http請求傳送給zipkin server,zipkinserver進行跟蹤資訊的儲存以及提供Rest API即可,Zipkin UI呼叫其API介面進行資料展示預設儲存是記憶體,可也用mysql、或者elasticsearch等儲存
2、加入依賴
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zipkin</artifactId>
</dependency>
3、文件說明:http://cloud.spring.io/spring-cloud-static/Finchley.SR1/single/spring-cloud.html#_features_2
4、配置zipkin.base-url
5、配置取樣百分閉spring.sleuth.sampler
推薦資料:
https://blog.csdn.net/jrn1012/article/details/77837710
第八章 微服務核心知識分散式配置中心Config實戰
1、微服務下的分散式配置中心
什麼是配置中心:
一句話:統一管理配置, 快速切換各個環境的配置
相關產品:
百度的disconf
地址:https://github.com/knightliao/disconf
阿里的diamand
地址:https://github.com/takeseem/diamond
springcloud的configs-server:
地址:http://cloud.spring.io/spring-cloud-config/
推薦乾貨文章:http://jm.taobao.org/2016/09/28/an-article-about-config-center/
2、SpringCloud的配置中心元件config-server實戰
1、新建專案,建立config-server
2、啟動類增加註解
@EnableConfigServer
3、使用git伺服器結合Config搭建分散式配置中心
1、預設使用git儲存配置中心
使用git伺服器,可以自己搭建gitlab伺服器
或者使用github、開源中國git、阿里雲git
794666918@qq.com
xdclass.net123
https://gitee.com/waitforxy/config_cloud.git
2、配置檔案新增配置
spring:
application:
name: config-server
#git配置
cloud:
config:
server:
git:
uri: https://gitee.com/waitforxy/config_cloud
username: 794666918@qq.com
password: xdclass.net123
#超時時間
timeout: 5
#分支
default-label: master
3、訪問方式(一定要注意語法,如果有問題,會出錯)
多種訪問路徑,可以通過啟動日誌去檢視
例子 http://localhost:9100/product-service.yml
/{name}-{profiles}.properties
/{name}-{profiles}.yml
/{name}-{profiles}.json
/{label}/{name}-{profiles}.yml
name 伺服器名稱
profile 環境名稱,開發、測試、生產
lable 倉庫分支、預設master分支
4、分散式配置中心客戶端使用實戰
官方文件:http://cloud.spring.io/spring-cloud-config/single/spring-cloud-config.html#_spring_cloud_config_client
1、加入依賴
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-client</artifactId>
</dependency>
2、修改對應服務的配置檔案,把application.yml 改為 bootstrap.yml
#指定註冊中心地址
eureka:
client:
serviceUrl:
defaultZone: http://localhost:8761/eureka/
#服務的名稱
spring:
application:
name: product-service
#指定從哪個配置中心讀取
cloud:
config:
discovery:
service-id: CONFIG-SERVER
enabled: true
profile: test
#建議用lable去區分環境,預設是lable是master分支
#label: test
注意點:
1.配置檔案要用bootstrap.yml
2.預設讀取檔名是 服務名稱
第九章 微服務訊息匯流排Bus結合訊息佇列RabbitMQ實戰
1、訊息匯流排Bus介紹和使用場景
1、什麼是訊息
一個事件,需要廣播或者單獨傳遞給某個介面
2、為什麼使用這個
配置更新了,但是其他系統不知道是否更新
2、訊息佇列和RabbitMQ基礎介紹
1、訊息佇列介紹
參考:https://www.cnblogs.com/linjiqin/p/5720865.html
2、同類產品
ActiveMQ
RocketMQ
Kafka
等
3、SpringCloud預設推薦使用RabbitMQ
4、RabbitMQ介紹
官方文件:http://www.rabbitmq.com/getstarted.html
中文文件:http://rabbitmq.mr-ping.com/
3、實戰系列使用Docker搭建RabbitMQ3.7
1、如果對Docker沒基礎,課程後續有講解Docker,可以先跳轉過去學習Docker
2、安裝步驟
1)拉取映象:docker pull rabbitmq:management
2)檢視當前映象列表:docker images
3)刪除指定映象:docker rmi IMAGE_ID (如果需要強制刪除加 -f)
4)建立容器
docker run -d --name="myrabbitmq" -p 5671:5671 -p 15672:15672 rabbitmq:management
-d: 後臺執行容器,並返回容器ID
-p: 埠對映,格式為:主機(宿主)埠:容器埠
--name="rabbitmq": 為容器指定一個名稱
3、RabbitMQ預設建立了一個 guest 使用者,密碼也是 guest, 如果訪問不了記得檢視防火牆,埠或者雲伺服器的安全組
管理後臺:http://127.0.0.1:15672
其他安裝方式:
Linux安裝:https://blog.csdn.net/qq_34021712/article/details/72567786
windows安裝:http://www.rabbitmq.com/install-windows.html
4、高階篇幅訊息匯流排整合配置中心架構流程圖
啟動
rabbitmq: docker run -d -p 5672:5672 -p 15672:15672 rabbitmq:management
rabbitmq預設是5672,所以改為5672埠
1、config-client加入依賴
<!--配置中心結合訊息佇列-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>
官方文件:http://cloud.spring.io/spring-cloud-bus/single/spring-cloud-bus.html#_bus_refresh_endpoint
文件裡面 暴露端點 management.endpoints.web.exposure.include=bus-refresh
2、在配置檔案中增加關於RabbitMQ的連線(如果是本機,則可以直接啟動,採用預設連線配置)
spring:
rabbitmq:
host: localhost
port: 5672
username: guest
password: guest
#暴露全部的監控資訊
management:
endpoints:
web:
exposure:
include: "*"
3、需要重新整理配置的地方,增加註解
@RefreshScope
4、訪問驗證 post方式:
http://localhost:8773/actuator/bus-refresh
5、微服務相關專案改造配置中心
1、git裡面新增對應專案的配置檔案,都要新增下面的配置
#服務的名稱
spring:
rabbitmq:
host: localhost
port: 5672
username: guest
password: guest
#暴露全部的監控資訊
management:
endpoints:
web:
exposure:
include: “*”
2、專案裡面新增maven依賴
org.springframework.cloud
spring-cloud-config-client
org.springframework.boot
spring-boot-starter-actuator
org.springframework.cloud
spring-cloud-starter-bus-amqp
3、修改application.properties為bootstrap.yml 並拷貝配置檔案
#指定註冊中心地址
eureka:
client:
serviceUrl:
defaultZone: http://localhost:8761/eureka/
#服務的名稱
spring:
application:
name: order-service
#指定從哪個配置中心讀取
cloud:
config:
discovery:
service-id: CONFIG-SERVER
enabled: true
profile: test
4、各個專案啟動順序
1)註冊中心
2)配置中心
3)對應的服務:商品服務、訂單服務。。。
4)啟動閘道器
第十章、SpringCloud課程內容上半部分總結
1、微服務核心知識內容回顧
1)介紹微服務的基礎知識,核心元件,CAP原理
2)SpringCloud註冊中心 Eureka
3)product-service / order-service
4) 偽RPC Ribbon / feign
5) hystrix熔斷
6) 服務閘道器介紹,zuul
7)配置中心config-server
2、微服務下半部分知識 雲伺服器和Docker容器
第十一章 阿里雲ECS伺服器介紹和網路知識講解
1、雲伺服器介紹和阿里雲伺服器ECS伺服器選購
簡介:什麼是雲伺服器及目前主要的幾個廠商介紹
1、阿里雲、騰訊雲、亞馬遜雲
阿里雲:https://www.aliyun.com/
騰訊雲:https://cloud.tencent.com/
亞馬遜雲:https://aws.amazon.com/
2、阿里雲伺服器遠端登入和常用工具
簡介:講解阿里雲伺服器登入使用和常見終端工具
1、windows工具 putty,xshell, security
參考資料:
https://jingyan.baidu.com/article/e75057f210c6dcebc91a89dd.html
https://www.jb51.net/softjc/88235.html
2、蘋果系統MAC: 通過終端登入
ssh root@ip 回車後輸入密碼
ssh root@120.25.1.38
3、可以嘗試自己通過百度進行找文件, 安裝mysql jdk nginx maven git redis elk
3、網際網路架構知識之網站部署上線基礎準備
簡介:講解應用部署到可以公網訪問需要步驟
1、一個http請求的故事
2、什麼是cname和a記錄
A記錄和CNAME只可以同時生效一個,A記錄優先
3、域名和ip的關係,DNS作用
參考資料:
https://blog.csdn.net/benbenzhuhwp/article/details/44704319
https://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=0&rsv_idx=1&ch=1&tn=98050039_dg&wd=%E4%B8%80%E4%B8%AAhttp%E8%AF%B7%E6%B1%82%E7%9A%84%E8%AF%A6%E7%BB%86%E8%BF%87%E7%A8%8B&rsv_pq=80a65c5f00005961&rsv_t=a5fcWreuJzILdSwr4gI8pFqlO7HSu5BlhjwalyVzPiV9w2L%2BKEj78pPi1Qn6Vx4wXxI&rqlang=cn&rsv_enter=1&rsv_sug3=8&rsv_sug1=8&rsv_sug7=100&sug=%25E4%25B8%2580%25E4%25B8%25AAhttp%25E8%25AF%25B7%25E6%25B1%2582%25E7%259A%2584%25E8%25AF%25A6%25E7%25BB%2586%25E8%25BF%2587%25E7%25A8%258B&rsv_n=1
4、域名購買和配置解析實戰
簡介:域名購買和配置解析實戰
1、購買域名,備案
阿里雲 備案地址:https://beian.aliyun.com/
2、購買伺服器,阿里雲,騰訊雲,亞馬遜雲aws
3、配置域名解析到伺服器
第十二章 微服務必備技能Docker容器基礎篇幅
1、微服務下的Docker介紹和使用場景
簡介:Docker介紹和使用場景
1、什麼是Dokcer
百科:一個開源的應用容器引擎,讓開發者可以打包他們的應用以及依賴包到一個可移植的容器中,然後釋出到任何流行的 Linux 機器上,也可以實現虛擬化。容器是完全使用沙箱機制,相互之間不會有任何介面;
使用go語言編寫,在LCX(linux容器)基礎上進行的封裝
簡單來說:
1)就是可以快速部署啟動應用
2)實現虛擬化,完整資源隔離
3)一次編寫,四處執行(有一定的限制,比如Docker是基於Linux 64bit的,無法在32bit的linux/Windows/unix環境下使用)
2、為什麼要用
1、提供一次性的環境,假如需要安裝Mysql,則需要安裝很多依賴庫、版本等,如果使用Docker則通過映象就可以直接啟動執行
2、快速動態擴容,使用docker部署了一個應用,可以製作成映象,然後通過Dokcer快速啟動
3、組建微服務架構,可以在一個機器上模擬出多個微服務,啟動多個應用
4、更好的資源隔離和共享
一句話:開箱即用,快速部署,可移植性強,環境隔離
2、Linux雲伺服器Centos7安裝Docker實戰
Linux Standard Base的縮寫,lsb_release命令用來顯示LSB和特定版本的相關資訊
命令: lsb_release -a
阿里雲安裝手冊:
https://help.aliyun.com/document_detail/51853.html?spm=a2c4g.11186623.6.820.RaToNY
常見問題:
https://blog.csdn.net/daluguishou/article/details/52080250
3、Docker倉庫、映象、容器核心知識講解
1、概念:
Docker 映象 - Docker images:
容器執行時的只讀模板,作業系統+軟體執行環境+使用者程式
class User{
private String userName;
private int age;
}
Docker 容器 - Docker containers:
容器包含了某個應用執行所需要的全部環境
User user = new User()
Docker 倉庫 - Docker registeries:
用來儲存映象,有公有和私有倉庫,好比Maven的中央倉庫和本地私服
映象倉庫:
(參考)配置國內映象倉庫:https://blog.csdn.net/zzy1078689276/article/details/77371782
對比物件導向的方式
Dokcer 裡面的映象 : Java裡面的類 Class
Docker 裡面的容器 : Java裡面的物件 Object
通過類建立物件,通過映象建立容器
4、Docker容器常見命令實戰
1、 常用命令(安裝部署好Dokcer後,執行的命令是docker開頭),xxx是映象名稱
搜尋映象:docker search xxx
列出當前系統存在的映象:docker images
拉取映象:docker pull xxx
xxx是具體某個映象名稱(格式 REPOSITORY:TAG)
REPOSITORY:表示映象的倉庫源,TAG:映象的標籤
執行一個容器:docker run -d --name "xdclass_mq" -p 5672:5672 -p 15672:15672 rabbitmq:management
docker run - 執行一個容器
-d 後臺執行
-p 埠對映
rabbitmq:management (格式 REPOSITORY:TAG),如果不指定tag,預設使用最新的
--name "xxx"
列舉當前執行的容器:docker ps
檢查容器內部資訊:docker inspect 容器名稱
刪除映象:docker rmi IMAGE_NAME
強制移除映象不管是否有容器使用該映象 增加 -f 引數,
停止某個容器:docker stop 容器名稱
啟動某個容器:docker start 容器名稱
移除某個容器: docker rm 容器名稱 (容器必須是停止狀態)
文件:
https://blog.csdn.net/permike/article/details/51879578
5、實戰應用之使用Docker部署Nginx伺服器
簡介:講解使用Docker部署Nginx伺服器實戰 1、獲取映象 docker run (首先會從本地找映象,如果有則直接啟動,沒有的話,從映象倉庫拉起,再啟動) docker search nignx 2、列舉 docker images 3、拉取 docker pull nignx 3、啟動 docker run -d --name “xdclass_nginx” -p 8088:80 nginx docker run -d --name “xdclass_nginx2” -p 8089:80 nginx docker run -d --name “xdclass_nginx3” -p 8090:80 nginx 4、訪問 如果是阿里雲服務,記得配置安全組,騰訊雲也需要配置,這個就是一個防火牆
6、公司中Docker映象倉庫使用講解
1、為啥要用映象倉庫
2、官方公共映象倉庫和私有映象倉庫
公共映象倉庫:
官方:https://hub.docker.com/,基於各個軟體開發或者有軟體提供商開發的
非官方:其他組織或者公司開發的映象,供大家免費試用
私有映象倉庫:
用於存放公司內部的映象,不提供給外部試用;
SpringCloud 開發了一個支付系統 -》做成一個映象 (作業系統+軟體執行環境+使用者程式)
7、高階篇幅之構建自己的映象倉庫
1、阿里雲映象倉庫:https://dev.aliyun.com/search.html
點選管理控制檯-》初次使用會提示開通,然後設定密碼
xdclass.net123
2、使用阿里雲私有映象倉庫
1)登入: docker login --username=794666918@qq.com registry.cn-shenzhen.aliyuncs.com
2) 推送本地映象:
docker tag [ImageId] registry.cn-shenzhen.aliyuncs.com/xdclass/xdclass_images:[映象版本號]
例子:
docker tag 2f415b0e9a6e registry.cn-shenzhen.aliyuncs.com/xdclass/xdclass_images:xd_rabbitmq-v1.0.2
docker push registry.cn-shenzhen.aliyuncs.com/xdclass/xdclass_images:xd_rabbitmq-v1.0.2
3)拉取映象
線上伺服器拉取映象:
docker login --username=794666918@qq.com registry.cn-shenzhen.aliyuncs.com
docker pull registry.cn-shenzhen.aliyuncs.com/xdclass/xdclass_images:xd_rabbitmq-v1.0.2
啟動容器:
docker run -d --name "xdclass_mq" -p 5672:5672 -p 15672:15672 2f415b0e9a6e
第十三章 微服務高階篇幅SpringCloud和Docker整合部署
1、高階篇幅之構建SpringBoot應用docker映象上集
簡介:使用Docker的maven外掛,構建springboot應用
官方文件:https://spring.io/guides/gs/spring-boot-docker/
1、步驟:maven裡面新增配置pom.xml
<properties>
<docker.image.prefix>xdclass</docker.image.prefix>
</properties>
<build>
<finalName>docker-demo</finalName>
<plugins>
<plugin>
<groupId>com.spotify</groupId>
<artifactId>dockerfile-maven-plugin</artifactId>
<version>1.3.6</version>
<configuration>
<repository>${docker.image.prefix}/${project.artifactId}</repository>
<buildArgs>
<JAR_FILE>target/${project.build.finalName}.jar</JAR_FILE>
</buildArgs>
</configuration>
</plugin>
</plugins>
</build>
配置講解
Spotify 的 docker-maven-plugin 外掛是用maven外掛方式構建docker映象的。
${project.build.finalName} 產出物名稱,預設為${project.artifactId}-${project.version}
2、高階篇幅之構建SpringBoot應用docker映象下集
簡介:打包SpringCloud映象並上傳私有倉庫並部署
1、建立Dockerfile,預設是根目錄,(可以修改為src/main/docker/Dockerfile,如果修則需要制定路徑)
什麼是Dockerfile : 由一系列命令和引數構成的指令碼,這些命令應用於基礎映象, 最終建立一個新的映象
FROM openjdk:8-jdk-alpine
VOLUME /tmp
ARG JAR_FILE
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java","-jar","/app.jar"]
FROM <image>:<tag> 需要一個基礎映象,可以是公共的或者是私有的, 後續構建會基於此映象,如果同一個Dockerfile中建立多個映象時,可以使用多個FROM指令
VOLUME 配置一個具有持久化功能的目錄,主機 /var/lib/docker 目錄下建立了一個臨時檔案,並連結到容器的/tmp。改步驟是可選的,如果涉及到檔案系統的應用就很有必要了。/tmp目錄用來持久化到 Docker 資料資料夾,因為 Spring Boot 使用的內嵌 Tomcat 容器預設使用/tmp作為工作目錄
ARG 設定編譯映象時加入的引數, ENV 是設定容器的環境變數
COPY : 只支援將本地檔案複製到容器 ,還有個ADD更強大但複雜點
ENTRYPOINT 容器啟動時執行的命令
EXPOSE 8080 暴露映象埠
2、構建映象
mvn install dockerfile:build
打標籤
docker tag a1b9fc71720d registry.cn-shenzhen.aliyuncs.com/xdclass/xdclass_images:docker-demo-v201808
推送到映象倉庫
docker push registry.cn-shenzhen.aliyuncs.com/xdclass/xdclass_images:docker-demo-v201808
應用伺服器拉取映象
docker pull registry.cn-shenzhen.aliyuncs.com/xdclass/xdclass_images:docker-demo-v201808
docker run -d --name xdclass_docker_demo1 -p 8099:8080 a1b9fc71720d
3、檢視啟動日誌 docker logs -f containerid
文件:https://yeasy.gitbooks.io/docker_practice/image/dockerfile/
3、實戰系列之註冊中心打包Docker映象
簡介:講解使用Docker打包註冊中心,上傳私有映象倉庫並部署
1、新增maven外掛
<properties>
<docker.image.prefix>xdclass</docker.image.prefix>
</properties>
<build>
<finalName>docker-demo</finalName>
<plugins>
<plugin>
<groupId>com.spotify</groupId>
<artifactId>dockerfile-maven-plugin</artifactId>
<version>1.3.6</version>
<configuration>
<repository>${docker.image.prefix}/${project.artifactId}</repository>
<buildArgs>
<JAR_FILE>target/${project.build.finalName}.jar</JAR_FILE>
</buildArgs>
</configuration>
</plugin>
</plugins>
</build>
2、新建Dockerfile
FROM openjdk:8-jdk-alpine
VOLUME /tmp
ARG JAR_FILE
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java","-jar","/app.jar"]
3、打包:
mvn install dockerfile:build
4、推送阿里雲映象倉庫
阿里雲映象倉庫:https://dev.aliyun.com/search.html
docker tag 062d2ddf272a registry.cn-shenzhen.aliyuncs.com/xdclass/xdclass_images:eureka-v20180825
docker push registry.cn-shenzhen.aliyuncs.com/xdclass/xdclass_images:eureka-v20180825
docker pull registry.cn-shenzhen.aliyuncs.com/xdclass/xdclass_images:eureka-v20180825
5、檢視日誌 docker logs -f containerid
4、 實戰系列之部署RabbitMQ和配置中心打包Docker映象
簡介:講解使用Docker打包配置中心,和部署RabbitMQ
1、服務地址 ssh root@47.106.120.173
部署 rabbitmq: docker run -d -p 5672:5672 -p 15672:15672 rabbitmq:management
2、推送映象
docker tag 0f636543904e registry.cn-shenzhen.aliyuncs.com/xdclass/xdclass_images:config-server-v20180825
docker push registry.cn-shenzhen.aliyuncs.com/xdclass/xdclass_images:config-server-v20180825
docker pull registry.cn-shenzhen.aliyuncs.com/xdclass/xdclass_images:config-server-v20180825
5、常見問題處理之升級雲伺服器
簡介:處理上節課出現的問題,升級伺服器注意事項
1、升級雲伺服器配置(購買配置後需要重啟機器才生效)
2、啟動完成後,需要開啟docker
指令: systemctl start docker
3、所有對外的都要經過閘道器才可以對外,應用間通訊(除非跨機房)都用內網通訊
6、實戰系列之Docker部署Redis
簡介:使用Docker安裝redis
1、搜尋映象 docker search redis
2、拉取 docker pull docker.io/redis
3、啟動 docker run --name "xd_redis" -p 6379:6379 -d 4e8db158f18d
參考:
docker run --name "xd_redis" -p 6379:6379 -d 4e8db158f18d --requirepass "123456" -v $PWD/data:/data
4、訪問redis容器裡面,進行操作
docker exec -it 295058d2b92e redis-cli
7、生產環境常見問題之配置中心訪問
簡介:講解生產環境部署常見問題,配置中心訪問路徑變化
1、配置中心訪問出錯,路徑不對
解決:修改所有的註冊中心,增加下面配置
instance:
instance-id: ${spring.cloud.client.ip-address}:${server.port}
prefer-ip-address: true
docker tag 50a12cd66210 registry.cn-shenzhen.aliyuncs.com/xdclass/xdclass_images:config-server-v20180826
8、實戰系列之打包Docker映象打包商品服務和訂單服務、閘道器
簡介:打包Docker映象部署商品服務和訂單服務、閘道器
注意:
1、maven打包構建,會觸發單元測試,部分情況可以跳過,
mvn install -Dmaven.test.skip=true dockerfile:build
2、生產環境不能用localhost 或者 127.0.0.1, 一定要用內網通訊ip (虛擬主機對映 hosts)
9、實戰系列雲伺服器部署閘道器、訂單、商品服務
簡介:雲服務部署商品服務、訂單服務、閘道器服務
1、拉取映象、啟動
訪問路徑
http://47.106.120.173:8781/api/v1/order/save?product_id=5&user_id=5
http://47.106.120.173:9000/apigateway/order/api/v1/order/save?user_id=5&product_id=3&token=232serer
第十四章 課程總結和常見問題處理
1、SpringCloud微服務常見問題和解決思路
簡介:講解SpringCloud開發實戰常見問題,及解決思路
1、技術選擇:SpringCloud全家桶,每個元件又有多個替代,改怎麼選擇
1)選擇的時候根據公司裡面團隊人員熟悉程度,降低學習成本
2)選擇社群活躍的並且文件相對較多的,怎麼判斷活躍,可以看github上程式碼提交和start數
2、雲服務選擇: 騰訊雲,阿里雲 ,遇到問題可以提交工單,有專人跟進
3、部署了應用,但是訪問不了
解決思路:
1)檢視應用啟動是否正常,如果有錯誤日誌,複製錯誤日誌去百度搜尋!!!!!!!特別重要
2)啟動正常,則先在本機使用 CURL "http://lcoalhost:8080/api/v1/user/find" 訪問對應的介面,看是否有響應
3)啟動正常,且curl有響應,則檢查是否有關閉防火牆,或者開放對應的訪問埠,開放埠才可以訪問
4)騰訊雲和阿里雲都是有安全組,類似外層防火牆,一定要去web控制檯檢查是否有開啟埠
4、內網和外網訪問,鑑權問題安全問題
1)所有應用只能通過閘道器提供對外訪問的入口
2)應用程式之間通訊,採用內網
5、程式出錯或者異常: 複製錯誤日誌去百度搜尋,網上有很多人會遇到類似的錯誤,多積累,特別強調
2、課程總結和後續技術規劃
簡介:總結SpringCloud課程和微服務後續課程規劃
1、springCloud全家桶,技術選擇和知識點特別多,一定要學會記筆記,微服務更多關注的是裡面架構和資料流轉,而不是具體的業務。
2、SpringCloud架構這些配置,一般使用一次後就不會多次修改了,進入公司主要還是開發業務,業務開發一般都用springboot,比較少讓新人搭建SpringCloud的架構
3、開發業務,無非就是CRUD,增刪改查,只不過是初級和高階的區別,封裝成通用和不通用的區別
4、微服務和容器盛行的情況下,容器編排和自動縮擴容越來越重要
相關文章
- 【更新中】DOS命令從入門到高階
- Django 自定義管理命令:從入門到高階Django
- Java 從入門到高階學習路線Java
- PHP從入門到高階你要掌握什麼?PHP
- Redis從入門到進階Redis
- .NET 入門到高階路線
- Android DataBinding 從入門到進階Android
- Android DataBinding 從入門到進階(2)Android
- Python 從入門到進階之路(三)Python
- Python 從入門到進階之路(四)Python
- Python 從入門到進階之路(五)Python
- React 從入門到進階之路(八)React
- React 從入門到進階之路(九)React
- React 從入門到進階之路(七)React
- Python 從入門到進階之路(七)Python
- Gradle外掛從入門到進階Gradle
- scala 從入門到入門+
- makefile從入門到入門
- 從入門到進階,印象筆記那些事筆記
- Java 從入門到進階之路(二十四)Java
- Java 從入門到進階之路(二十三)Java
- Java 從入門到進階之路(二十九)Java
- Java 從入門到進階之路(二十五)Java
- Java 從入門到進階之路(二十八)Java
- Python 爬蟲從入門到進階之路(十)Python爬蟲
- Python 爬蟲從入門到進階之路(十五)Python爬蟲
- Python 爬蟲從入門到進階之路(九)Python爬蟲
- Python 爬蟲從入門到進階之路(十二)Python爬蟲
- koa2 從入門到進階之路 (一)
- Python 爬蟲從入門到進階之路(十七)Python爬蟲
- Python 爬蟲從入門到進階之路(二)Python爬蟲
- Python 爬蟲從入門到進階之路(十一)Python爬蟲
- Python 爬蟲從入門到進階之路(六)Python爬蟲
- Python 爬蟲從入門到進階之路(八)Python爬蟲
- Python 爬蟲從入門到進階之路(七)Python爬蟲
- koa2 從入門到進階之路 (二)
- koa2 從入門到進階之路 (四)
- koa2 從入門到進階之路 (三)