架構說明
存在的問題:
- 代碼耦合,開發維護困難
- 無法針對不同模塊進行針對性優化
- 無法水平擴展
- 單點容錯率低,併發能力差
優點:
- 系統拆分實現了流量分擔,解決了併發問題
- 可以針對不同模塊進行優化
- 方便水平擴展,負載均衡,容錯率提高
缺點:
- 系統間相互獨立,會有很多重複開發工作,影響開發效率
優點:
- 將基礎服務進行了抽取,系統間相互調用,提高了代碼複用和開發效率
缺點:
-
系統間耦合度變高,調用關係錯綜複雜,難以維護
-
以前出現了什麼問題? -
服務越來越多,需要管理每個服務的地址
-
調用關係錯綜複雜,難以理清依賴關係
-
服務過多,服務狀態難以管理,無法根據服務情況動態管理
服務治理要做什麼?
- 服務註冊中心,實現服務自動註冊和發現,無需人爲記錄服務地址
- 服務自動訂閱,服務列表自動推送,服務調用透明化,無需關心依賴關係
- 動態監控服務狀態監控報告,人爲控制服務狀態
缺點:
- 服務間會有依賴關係,一旦某個環節出錯會影響較大
- 服務關係複雜,運維、測試部署困難,不符合DevOps思想
微服務
前面說的SOA,英文翻譯過來是面向服務。微服務,似乎也是服務,都是對系統進行拆分。因此兩者非常容易混淆,但其實卻有一些差別:
微服務的特點:
- 單一職責:微服務中每一個服務都對應唯一的業務能力,做到單一職責
- 微:微服務的服務拆分粒度很小,例如一個用戶管理就可以作爲一個服務。每個服務雖小,但“五臟俱全”。
- 面向服務:面向服務是說每個服務都要對外暴露Rest風格服務接口API。並不關心服務的技術實現,做到與平臺和語言無關,也不限定用什麼技術實現,只要提供Rest的接口即可。
- 自治:自治是說服務間互相獨立,互不干擾
- 團隊獨立:每個服務都是一個獨立的開發團隊,人數不能過多。
- 技術獨立:因爲是面向服務,提供Rest接口,使用什麼技術沒有別人干涉
- 前後端分離:採用前後端分離開發,提供統一Rest接口,後端不用再爲PC、移動段開發不同接口
- 數據庫分離:每個服務都使用自己的數據源
- 部署獨立,服務間雖然有調用,但要做到服務重啓不影響其它服務。有利於持續集成和持續交付。每個服務都是獨立的組件,可複用,可替換,降低耦合,易維護
架構的演變 傳統架構–>水平拆分–>垂直拆分(最早的分佈式)–>soa(dubbo)–>微服務(springCloud)
spring公司的核心產品,如圖
我們也可以到它的官網去看,百度我就不貼圖了,spring全家桶😀
項目啓動 搭建 Eureka註冊中心
爲什麼要搭建Eureka註冊中心,Eureka是Netflix開發的服務發現框架,本身是一個基於REST的服務,主要用於定位運行在AWS域中的中間層服務,以達到負載均衡和中間層服務故障轉移的目的。
Eureka Server提供服務註冊服務,各個節點啓動後,會在Eureka Server中進行註冊,這樣Eureka Server中的服務註冊表中將會存儲所有可用服務節點的信息,服務節點的信息可以在界面中直觀的看到。Eureka Server本身也是一個服務,默認情況下會自動註冊到Eureka註冊中心。,去官方可以看下對應版本號
pringCloud將它集成在其子項目spring-cloud-netflix中,以實現SpringCloud的服務發現功能。
這裏可以使用IDEA的spring的 initalizr搭建
不過也可以使用官網的快速開始來,搭建,我這裏就用官網的開始搭建
進入到這裏,點擊start.spring.io
如圖所示,最右邊呢可以換背景
添加依賴這裏我稍微改了下,這裏搭建 註冊中心服務端,所以只需要一個 Eureka Server
選錯了,點這裏可以刪除掉
鍵盤輸入Ctrl + 回車,下載下來之後,解壓,導入進去
只需要找到剛剛解壓的項目的pom.xml,點擊ok
默認下一步,就好了,初始了一個springboot的項目,springboot的一個啓動依賴,就有一堆的jar包,springboot內置了tomcat,裏面有hikari連接池,Hikari是一款非常強大,高效,並且號稱“史上最快連接池”。並且在springboot2.0之後,採用的默認數據庫連接池就是Hikari。不需要引入依賴,已經在SpringBoot中包含了。
把src目錄刪掉,因爲這裏要用到maven的拆分聚合思想,每一個模塊就可以獨立啓動
然後用到Git ,沒集成的話,不過你要去下載Git,可以按照下圖就可以了
這裏說明下等下好打開控制檯用
初始化
Git init初始化
就可以看到這個項目交給Git來管理了
點擊Git commit
這兩項也是檢查各種問題的
如果沒有輸入用戶名的話就輸入用戶名,郵箱啥的
初始工作完成了就完成了
創建eureka子模塊
eureka是一個註冊中心,服務管理
Eure可以參考這裏
爲什麼需要Eureka參考
這裏是說,要不要交給Git來管理,點擊Yes是就完事了
創建了Eureka 因爲註冊中心,不知道 他自己是註冊中心
把父工程的中的註冊中心搬到子模塊中,父工程不需要那個依賴
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
然後在子模塊的src目錄下創建SpringBoot的啓動類
Springboot默認集成 tomcat<>/font
新建一個application.properties文件,解決註冊中心啓動失敗問題
spring.application.name=eureka
# eureka 官方的端口號
server.port=8761
############### 啓動報錯就是 因爲 下面那兩個 #########################
# 獲取註冊信息 因爲本身就是 註冊中心 所以本身就不需要獲取註冊信息 這裏默認爲 true
eureka.client.fetch-registry=false
# 註冊到 eureka註冊中心去,本身就是註冊中心 不需要去註冊
eureka.client.register-with-eureka=false
啓動類加上@EnableEurekaServer
http://localhost:8761/地址欄輸入,啓動成功了
這裏可以改造下boot啓動類,這是一種固定的寫法
private static final Logger LOG = LoggerFactory.getLogger(EurekaApplication.class);
public static void main(String[] args) {
SpringApplication app = new SpringApplication(EurekaApplication.class);
Environment env = app.run(args).getEnvironment();
LOG.info("啓動成功!!");
LOG.info("Eureka地址: \thttp://127.0.0.1:{}", env.getProperty("server.port"));
}
在新建一個,logback.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<!-- 修改一下路徑 value 是日誌輸出的路徑 不要使用絕對路徑,不是每個電腦又D盤F盤什麼的 日誌輸出根據你的項目路徑輸出的-->
<property name="PATH" value="/log/adger/eureka"></property>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<!--打印 年月日 時分秒%d{yyyy-MM-dd HH:mm:ss.SSS} 高亮顯示 %highlight(%-5level) 控制檯顏色 %blue(%-50logger{50}:%-4line) 日誌信息 %msg%n</Pattern>-->
<Pattern>%d{ss.SSS} %highlight(%-5level) %blue(%-30logger{30}:%-4line) %msg%n</Pattern>
</encoder>
</appender>
<!-- 輸出級別 TRACE_FILE 輸出到文件裏面去 -->
<appender name="TRACE_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${PATH}/trace.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<FileNamePattern>${PATH}/trace.%d{yyyy-MM-dd}.%i.log</FileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>10MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
<layout>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %-50logger{50}:%-4line %green(%-8X{UUID}) %msg%n</pattern>
</layout>
</appender>
<!-- 錯誤級別 -->
<appender name="ERROR_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${PATH}/error.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<FileNamePattern>${PATH}/error.%d{yyyy-MM-dd}.%i.log</FileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>10MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
<layout>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %-50logger{50}:%-4line %green(%-8X{UUID}) %msg%n</pattern>
</layout>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>ERROR</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<root level="ERROR">
<appender-ref ref="ERROR_FILE" />
</root>
<root level="TRACE">
<appender-ref ref="TRACE_FILE" />
</root>
<root level="INFO">
<appender-ref ref="STDOUT" />
</root>
</configuration>
啓動,就可以點擊地址了
日誌輸出
這篇文章也是,斷斷續續的寫的😂