一,微服務簡介
1.背景分析
講微服務之前,我們先分析以下單體應用。所謂單體應用一般是基于idea/eclipse,maven等建一個工程,然後基于SpringBoot,spring,mybatis架構進行整合,接下來再寫一堆dao、mapper、service、controller,再加上一些的配置檔案,有可能還會引入redis、elasticsearch、mq等其它項目的依賴,開發好之後再将項目打包成一個jar包/war包。然後再将包扔到類似tomcat這樣的web服務中,最後部署到公司提供給你的linux伺服器上。 接下來,你針對服務提供的通路端口(例如8080端口)發起http請求,請求會由tomcat直接轉交給你的spring web元件,進行一層一層的代碼調用。對于這樣的設計一般适合企業的内部應用,通路量不大,體積比較小,5人以内的團隊即可開發和維護。但對于一些大型網際網路項目,假如需要10人以上的開發和維護團隊,僅頻繁的建立代碼分支,編寫業務功能,然後合并分支,就會出現很多代碼沖突。每次解決這些大量的代碼沖突,可能就會耗費好幾天的時間。基于這樣的背景微服務誕生了.
在微服務架構設計中,建議超出需要10人開發和維護的項目要進行系統拆分,就是把大系統拆分為很多小系統,幾個人負責一個服務這樣每個服務獨立的開發、測試和上線,代碼沖突少了,每次上線就回歸測試自己的一個服務即可,測試速度快了,上線是獨立的,隻要向後相容接口就行了,不需要跟别人等待和協調,技術架構和技術版本的更新,幾個人ok就行,成本降低,更加靈活了。
2.什麼是微服務
微服務架構(MSA)的基礎是将單個應用程式開發為一組小型獨立服務,這些獨立服務在自己的程序中運作,獨立開發和部署。如圖所示:
這些服務使用輕量級 API 通過明确定義的接口進行通信。這些服務是圍繞業務功能建構的,每項服務執行一項功能。由于它們是獨立運作的,是以可以針對各項服務進行更新、部署和擴充,以滿足對應用程式特定功能的需求。
程式中的微服務,就是将各個業務系統的共性再進行抽取,做成獨立的服務,如圖所示:
總之,微服務是分布式系統中的一種流行的架構模型,它并不是銀彈,是以,也不要寄希望于微服務構架能夠解決所有的問題。微服務架構主要解決的是如何快速地開發和部署我們的服務,這對于一個能夠适應快速開發和成長的公司是非常必要的。同時,微服務設計中有很多很不錯的想法和理念,通過學習微服務架構我們可以更快的邁向卓越。
二,SpringCloud Alibaba微服務解決方案
1.概述
Spring Cloud Alibaba 是Spring Cloud的一個子項目,緻力于提供微服務開發的一站式解決方案。此項目包含開發分布式應用微服務的必需元件,友善開發者通過 Spring Cloud 程式設計模型輕松使用這些元件來開發分布式應用服務。依托 Spring Cloud Alibaba,您隻需要添加一些注解和少量配置,就可以将 Spring Cloud 應用接入阿裡微服務解決方案,通過阿裡中間件來迅速搭建分布式應用系統。
2.核心元件分析
Spring Cloud Alibaba 預設提供了如下核心功能:
-
服務限流降級:
預設支援 WebServlet、OpenFeign、RestTemplate、Spring Cloud Gateway, RocketMQ 限流降級功能的接入,可以在運作時通過控制台實時修改限流降級規則,還支援檢視限流降級 Metrics 監控。
-
服務注冊與發現:
基于Spring Cloud 服務注冊與發現标準,借助Nacos進行實作,預設還內建了 Ribbon 的支援。
-
分布式配置管理:
基于Nacos支援分布式系統中的外部化配置,配置更改時自動重新整理。
-
消息驅動能力:
基于Spring Cloud Stream 為微服務應用建構消息驅動能力。
-
分布式事務:
使用 @GlobalTransactional 注解, 高效并且對業務零侵入地解決分布式事務問題。
-
分布式任務排程:
提供秒級、精準、高可靠、高可用的定時(基于 Cron 表達式)任務排程服務。同時提供分布式的任務執行模型,如網格任務。網格任務支援海量子任務均勻配置設定到所有 Worker上執行。
3.解決方案架構設計
基于Spring Cloud Alibaba實作的微服務,解決方案設計架構如圖所示:
三,建構SpringCloud 聚合項目并進行環境初始化
1.建立空項目
打開Idea,建立一個空項目(Empty Project)
2.項目初始化配置
第一步:配置maven環境(隻要是新的工作區,都要重新配置),注意本地庫選擇新的位置不要與其它項目共用本地庫.SpringCloud的依賴包版本與其它項目的版本包不一緻。
第二步:配置JDK編譯環境
第三步:配置項目編碼方式
3.建立聚合父工程
我們後續在建立微服務工程進行學習時,相關服務的依賴及版本的管理可以放在此工程下.
第一步:建立父工程子產品
第二步:删除工程中的src目錄(父工程不需要這個目錄),當然,留着也沒事
第三步:添加核心依賴及版本管理
在pom檔案,添加如下元素:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.cy</groupId>
<artifactId>01-sca</artifactId>
<!--建立父工程的子工程時,父工程的打包方式會自動變為pom方法-->
<packaging>pom</packaging>
<version>1.0-SNAPSHOT</version>
<!--properties中定義一些屬性元素-->
<properties>
<spring.boot.version>2.3.2.RELEASE</spring.boot.version>
</properties>
<!--maven的父工程為一個pom工程
此工程主要負責依賴版本及部分基礎依賴的管理-->
<dependencyManagement>
<dependencies>
<!--Spring Boot 依賴(此依賴中定義了SpringBoot的版本)-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${spring.boot.version}</version>
<scope>import</scope>
<type>pom</type> <!--隻有pom類型可以import-->
</dependency>
<!--Spring Cloud 依賴-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Hoxton.SR9</version>
<scope>import</scope>
<type>pom</type>
</dependency>
<!--Spring Cloud Alibaba依賴-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.2.6.RELEASE</version>
<scope>import</scope>
<type>pom</type>
</dependency>
</dependencies>
</dependencyManagement>
<!--dependencies元素中定義子工程中都需要的依賴-->
<dependencies>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<!--provided辨別隻在編譯階段有效,運作階段無效-->
<scope>provided</scope>
</dependency>
</dependencies>
</project>
其中,服務核心依賴版本可參考如下網址(涉及到一個相容性問題,不能随意指定其版本)
微服務核心依賴版本
最新版本目前無太多公司使用,存在着不确定性因數
4.建立子工程
建立需要的個數,注意都在聚合父類下