Spring Cloud Alibaba入門篇

淨重21克發表於2022-05-10

學習條件

  • 瞭解web三層架構
  • 熟練應用SSM架構
  • 瞭解Maven管理工具的使用
  • 熟練使用SpringBoot,以及瞭解SpringBoot基本原理。
  • 瞭解部分術語:應用、工具、耦合、負載等

溫馨提示:注意版本問題,不復雜,就是呀呀的版本選不好,Game Over.....

沒有從入門開始寫,這點應該能入門,裝x用的文章,首次編寫,有疑問留言(看到也不想回你),沒疑問,謝謝惠顧!喜歡就點個贊!!!

什麼是微服務?談談個人理解....

  引文:單體架構是微服務架構出現之前,最經典的軟體架構型別,許多早期的專案採用的也都是單體架構。單體架構將應用程式中所有業務邏輯都編寫在同一個工程中,最終經過編譯、打包,部署在一臺伺服器上執行。

  微:體積小,簡單

  服務:功能實現。

  微服務 = 體量小,複雜程度低的功能實現模組

  微服務架構:微服務是一種全新的系統架構設計風格,每個服務只專注於做好一件事(三十六行,行行出狀元)“專業的人做專業的事”。簡單來說:就是把單體服務,拆了再拆,構建成體量小的模組,每個模組構成一個服務,多個服務的集合就是微服務架構。SpringCloud的誕生,就是來管理這些微小服務之間溝通的(不止於SpringCloud、Dubbo等)。

  面試題:見附錄

SpringCloud

  引文:“工具”指一些列功能的集合體,泛指工作時所需用的器具

  Spring Cloud 被稱為構建分散式微服務系統的“全家桶”,它並不是某一門技術,而是一系列微服務解決方案或框架的有序集合。更有效的實現開發應用管理的“工具”。

  Spring Cloud 將市面上成熟的、經過驗證的微服務框架整合起來,並通過 Spring Boot 的思想進行再封裝,遮蔽調其中複雜的配置和實現原理,最終為開發人員提供了一套簡單易懂、易部署和易維護的分散式系統開發工具包。

SpringCloud整合核心功能官網

  • Distributed/versioned configuration 分散式/版本化的配置管理
  • Service registration and discovery 服務註冊與服務發現
  • Routing 路由
  • Service-to-service calls 端到端的呼叫
  • Load balancing 負載均衡
  • Circuit Breakers 斷路器
  • Global locks 全域性鎖
  • Leadership election and cluster state 選舉與叢集狀態管理
  • Distributed messaging 分散式訊息

  SpringCloud與SprigBoot版本關係見附錄官網


 Spring Cloud 本身並不是一個拿來即可用的框架,它是一套微服務規範,這套規範共有兩代實現。
重要轉折點

  • 第一代實現: Spring Cloud Netflix,
  • 第二代實現: Spring Cloud Alibaba

2018 年 12 月12 日,Netflix 公司宣佈 Spring Cloud Netflix 系列大部分元件都進入維護模式,不再新增新特性。這嚴重地限制了 Spring Cloud 的高速發展,於是各大網際網路公司和組織開始把目光轉向 Spring Cloud 的第二代實現:Spring Cloud Alibaba。

Spring Cloud Alibaba 元件

Spring Cloud Alibaba 包含了多種開發分散式微服務系統的必需元件

  • Nacos:阿里巴巴開源產品,一個更易於構建雲原生應用的動態服務發現,配置管理和服務管理平臺。
  • Sentinel:阿里巴巴開源產品,把流量作為切入點,從流量控制,熔斷降級,系統負載保護等多個維度保護服務的穩定性。
  • RocketMQ:Apache RocketMQ 是一款基於Java 的高效能、高吞吐量的分散式訊息和流計算平臺。
  • Dubbo:Apache Dubbo 是一款高效能的 Java RPC 框架。
  • Seata:阿里巴巴開源產品,一個易於使用的高效能微服務分散式事務解決方案。
  • Alibaba Cloud OSS:阿里雲物件儲存伺服器(Object Storage Service,簡稱OSS),是阿里雲提供的海量、安全、低成本、高可靠的雲端儲存服務。
  • Alibaba Cloud Schedulerx:阿里中介軟體團隊開發的一款分散式排程產品,支援週期性的任務與固定時間點觸發任務。

【學習內容】

  Nacos 即 Dynamic Naming and Configuration Service(動態命名與配置服務)。由 Naming 前兩個字母,Configuration 前兩個字母,以及 Service 首字母組成。

  Nacos 是一個更易於構建雲原生應用的動態服務發現、配置管理 以及 服務管理平臺。

  簡單的理解:

  Nacos 就是 註冊中心 + 配置中心。即 Nacos = Eureka + Config + Bus。

  學習條件:

  為什麼要學習註冊中心?

    微服務架構,就是很多小服務的集合體,對多個服務進行單獨管理是比較麻煩。服務之間呼叫,A呼叫B,如果B因特殊需要(比如他很開心),想要頻繁更換埠或IP地址,那麼A服務中的程式碼怎麼辦?跟著重複更新....維護比較麻煩。註冊中心可以解決這一問題。

  註冊中心能幹什麼?

  

  服務註冊,服務發現是什麼東東?怎麼理解?

    簡單理解,服務提供方把自己的服務名+埠告訴了註冊中心,註冊中心,統一定義,統一管理。這一過程就是服務註冊。反之服務發現,自己能理解吧!不能就百度...

  主要功能

  1. 服務發現和服務健康監測

  2. 動態配置服務

  3. 動態DNS服務

  4. 服務及其後設資料管理

【專案簡介】

  1. 新建Maven父工程springcloud-alibaba-parent

  2. 新建子模組nacos-provider-8000

    - 提供Ctroller、Service、Mapper(略,暫定使用集合資料充當DB)

    - 提供對外介面,http://ip+埠/URI/entityInfo

  3. 新建子模組nacos-consumer_9000

    - 提供Ctroller,實現遠端呼叫nacos-provider-8000工程對外提供資料介面

  實現遠端呼叫,需要了解Http協議,請求頭,請求行,請求體,資料傳輸方式等(WEB階段Tomcat、Servlet學習)。

  遠端呼叫方式繁多(更多遠端操作方式見附錄

  為什麼要學習並使用遠端調?演示遠端呼叫

  例如:開發一款名為:智尚專屬的APP,需求定時傳送你的定位...那麼定位系統如何實現?不清楚,但是百度、高德可支援(軟體+硬體),此時我們就需要通過遠端呼叫的方式,呼叫第三方系統暴露的介面實現

新建父工程 

  • 建立Maven父工程:springcloud-nacose(不使用快捷建立-看個人習慣)

  

  

   

  • 父工程:pom依賴如下
 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <project xmlns="http://maven.apache.org/POM/4.0.0"
 3          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 4          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
 5     <modelVersion>4.0.0</modelVersion>
 6 
 7     <groupId>org.example</groupId>
 8     <artifactId>spingcloud-nacos</artifactId>
 9     <packaging>pom</packaging>
10     <version>1.0-SNAPSHOT</version>
11     <!-- 引入子模組,子模組新建後IDEA預設自動構建 -->
12     <modules>
13         <module>nacos-provider-8000</module>
14     </modules>
15 
16     <!-- 版本管理 -->
17     <properties>
18         <maven.compiler.source>8</maven.compiler.source>
19         <maven.compiler.target>8</maven.compiler.target>
20         <springbootstart.version>2.4.2</springbootstart.version>
21     </properties>
22     <!-- 依賴管理,僅管理,非匯入,子模組:按需手動匯入相關依賴,可以省略版本version -->
23     <dependencyManagement>
24         <!-- springboot 提供了N個start依賴 ,spring-boot-dependencies可以幫我們統一依賴 -->
25         <dependencies>
26             <dependency>
27                 <groupId>org.springframework.boot</groupId>
28                 <artifactId>spring-boot-dependencies</artifactId>
29                 <version>${springbootstart.version}</version>
30                 <type>pom</type>
31                 <scope>import</scope>
32             </dependency>
33             <!-- lombok元件-簡化POJO開發 -->
34             <dependency>
35                 <groupId>org.projectlombok</groupId>
36                 <artifactId>lombok</artifactId>
37                 <version>1.18.22</version>
38             </dependency>
39         </dependencies>
40     </dependencyManagement>
41 </project>

新建子模組nacos-provider-8000

  • 建立子模組:nacos-provider-8000

  

   

  • nacos-provider-8000子模組:pom依賴如下
 1 <properties>
 2     <maven.compiler.source>8</maven.compiler.source>
 3     <maven.compiler.target>8</maven.compiler.target>
 4 </properties>
 5 <dependencies>
 6     <!-- web依賴,用以可用Sring/MVC相關注解 -->
 7     <dependency>
 8         <groupId>org.springframework.boot</groupId>
 9         <artifactId>spring-boot-starter-web</artifactId>
10     </dependency>
11     <!-- lombok元件模組-便於開發POJO -->
12     <dependency>
13         <groupId>org.projectlombok</groupId>
14         <artifactId>lombok</artifactId>
15     </dependency>
16 </dependencies>

注意事項:

  1. 父工程pom中需使用<modules>標籤指向子模組(IDEA預設新建子模組時自動構建)
  2. 子模組需使用<parent>標籤引入父工程
  • src/main/java下新建包:com.nacosprovider
  • com.nacosprovider下新建SpringBoot啟動類:NacosProviderApp
1 @SpringBootApplication
2 public class NacosProviderApp {
3     public static void main(String[] args) {
4         SpringApplication.run(NacosProviderApp.class);
5     }
6 }
  • src/main/resources下新建配置檔案:application.properties ,並設定服務埠
1 #當前模nacos-provider-8000塊服務埠
2 server.port=8000
3 #當前服務應用上下文路徑:專案路徑
4 #server.servlet.context-path=/provider
  • com.nacosprovider下新建包:entity,並新增實體類EntityInfo
1 @Data
2 public class EntityInfo {
3     private String entityId;
4     private String entityInfo;
5     private String sendTime;
6 }
  • com.nacosprovider下新建包:service,並新增EntityInfoService
 1 @Service
 2 public class EntityInfoService {
 3     public EntityInfo queryEntityInfo(String entityId){
 4         EntityInfo entityInfo = new EntityInfo();
 5         entityInfo.setEntityId(entityId);
 6         // return mapper.queryEntityInfo(entityInfo);
 7         entityInfo.setSendTime("xxxx年xx月xx日 HH:mm:ss");
 8         entityInfo.setEntityInfo("Hello Nacos!");
 9         return entityInfo;
10     }
11 }
  • com.nacosprovider下新建包:controller,並新增NacosProviderController
 1 @RestController
 2 @RequestMapping("/provider")
 3 public class NacosProviderController {
 4 
 5     @Autowired
 6     private EntityInfoService entityInfoService;
 7 
 8     @GetMapping("/entityInfo/{entityId}")
 9     public EntityInfo queryEntityInfo(@PathVariable("entityId") String entityId){
10         return entityInfoService.queryEntityInfo(entityId);
11     }
12 
13 }
  • 啟動服務測試訪問/postman測試均可:http://localhost:8000/provider/entityInfo/11

實際開發中:服務提供這將編寫介面文件(API文件),說明介面呼叫規則,入參,返參等。

 新建子模組:nacos-consumer-9000

  • 新建子模組過程、配置檔案、啟動類、pom依賴(可移除lombok元件)略
  • 新建包com.nacoseconsumer.config,類BeanManagerConfig

 1 @Component
 2 class BeanManagerConfig {
 3      /**
 4       * Spring框架提供的RestTemplate類可用於在應用中呼叫rest服務
 5       */
 6     @Bean
 7     public RestTemplate getRestTemplate(){
 8         return new RestTemplate();
 9     }
10 }
  • 新建包com.nacoseconsumer.controller,類NacosConsumerController
 1 @RestController
 2 @RequestMapping("/consumer")
 3 public class NacosConsumerController {
 4      /**
 5       * Spring框架提供的RestTemplate類可用於在應用中呼叫rest服務
 6       */
 7     @Autowired
 8     private RestTemplate restTemplate;
 9      /**
10       * @Description 請求第三方遠端介面
11       * @param
12       * @return
13       */
14     @GetMapping("/entityInfo/{entityId}")
15     public String queryEntityInfo(@PathVariable("entityId") String entityId){
16         String url = "http://localhost:8000/provider/entityInfo/"+entityId;
17         ResponseEntity<String> forEntity = restTemplate.getForEntity(url, String.class);
18         return forEntity.getBody();
19     }
20 }
  • 啟動服務測試/posman訪問:http://localhost:9000/consumer/entityInfo/11

遺留問題(缺點)

  1. 手動的維護所有的服務訪問ip地址列表。
  2. 單個服務實現負載均衡需要自己搭建(keepalive+Ngix)

使用註冊中心能夠實現服務治理,服務動態擴容,以及服務呼叫的負載均衡。

Nacos入門實戰

  1. Nacos 官網(下載、文件、安裝、啟停服務*附錄
  2. 父工程新增依賴
     1 <!-- SpringCloud依賴 -->
     2 <dependency>
     3     <groupId>org.springframework.cloud</groupId>
     4     <artifactId>spring-cloud-dependencies</artifactId>
     5     <version>2020.0.1</version>
     6     <type>pom</type>
     7     <scope>import</scope>
     8 </dependency>
     9 <!-- SpringCloudAlibaba依賴 -->
    10 <dependency>
    11     <groupId>com.alibaba.cloud</groupId>
    12     <artifactId>spring-cloud-alibaba-dependencies</artifactId>
    13     <version>2021.1</version>
    14     <type>pom</type>
    15     <scope>import</scope>
    16 </dependency>
  3. nacos-provider-8000 新增pom依賴
    1 <!-- 基於SpringCloud alibaba提供的針對Nacos的元件:服務註冊與發現 -->
    2 <dependency>
    3     <groupId>com.alibaba.cloud</groupId>
    4     <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    5 </dependency>
  4. nacos-consumer-9000 新增pom依賴
    <!-- 基於SpringCloud alibaba提供的針對Nacos的元件:服務註冊與發現 -->
    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    </dependency>
    <!-- 負載均衡依賴 -->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-loadbalancer</artifactId>
    </dependency>

    說明:Spring Cloud LoadBalancer是一個客戶端負載均衡器,類似於Ribbon,但是由於Ribbon已經進入維護模式,並且Ribbon 2並不與Ribbon 1相互相容,所以Spring Cloud全家桶在Spring Cloud Commons專案中,新增了Spring cloud Loadbalancer作為新的負載均衡器,並且做了向前相容。

    Nacos內部已經整合Ribbon(負載均衡器),所以RestTemplate與Nacos整合使用時,管理RestTemplate的bean推薦使用LoadBalancer。

  5. 優化RestTmplate的bean管理,新增註解
    1 @Bean
    2 @LoadBalanced
    3 public RestTemplate getRestTemplate(){
    4     return new RestTemplate();
    5 }
  6. 更改Cotroll,使用服務名稱實現遠端呼叫(通過註冊中的服務名稱實現呼叫,擯棄維護IP、埠)
    1 @GetMapping("/entityInfo/{entityId}")
    2 public String queryEntityInfo(@PathVariable("entityId") String entityId) {
    3     String url = "http://nacos-provider/provider/entityInfo/" + entityId;
    4     System.out.println(url);
    5     ResponseEntity<String> forEntity = restTemplate.getForEntity(url, String.class);
    6     return forEntity.getBody();
    7 }

    說明:不使用註解,不使用LoadBalancer,直接改URL的IP為服務提供者的服務名稱呼叫會報錯java.net.UnknownHostException: nacos-provider

    原因:Nacos內部已經整合Ribbon(負載均衡器),RestTemplate與Nacos整合使用時,需要開啟負載均衡,因此管理RestTemplate的bean必須使用註解@LoadBalanced,表示開啟負載均衡。否則無法直接通過“服務提供者的服務名”訪問。

    2.必須使用IP訪問腫麼辦?

      可以注入LoadBalancerClient,根據服務名稱獲取ServiceInstance,再獲取IP+PORT即可,此時維護RestTemplate是就無需使用@LoadBalanced。

      可以注入DiscoveryClient (服務發現工具類),根據服務名獲取列表List<ServiceInstance>(通常服務名唯一,所以列表如果不為null長度也是1).

     1 @RestController
     2 @RequestMapping("/consumer")
     3 public class NacosConsumerController {
     4     /**
     5      * Spring框架提供的RestTemplate類可用於在應用中呼叫rest服務
     6      */
     7     @Autowired
     8     private RestTemplate restTemplate;
     9     /**
    10      * 負載均衡客戶端
    11      */
    12     @Autowired
    13     private LoadBalancerClient loadBalancerClient;
    14     /**
    15      * 服務發現客戶端
    16      */
    17     @Autowired
    18     private DiscoveryClient discoveryClient;
    19 
    20     /**
    21      * @param
    22      * @return
    23      * @Description 請求第三方遠端介面
    24      */
    25     @GetMapping("/entityInfo/{entityId}")
    26     public String queryEntityInfo(@PathVariable("entityId") String entityId) {
    27         String url = "http://nacos-provider/provider/entityInfo/" + entityId;
    28 
    29         // 使用以下方式,則需要幹掉restTemplate負載均衡註解,開啟負載均衡,Ncose中就只能通過服務名呼叫服務了
    30         // 負載均衡發現服務
    31         ServiceInstance serviceInstance = loadBalancerClient.choose("nacos-provider");
    32         String uri = "http://" + serviceInstance.getHost() + ":" + serviceInstance.getPort();
    33         url = uri + "/provider/entityInfo/" + entityId;
    34         // 註冊與發現,發現服務客戶端獲取服務
    35         List<ServiceInstance> serviceInstanceList = discoveryClient.getInstances("nacos-provider");
    36         serviceInstanceList.get(0).getPort();
    37         serviceInstanceList.get(0).getHost();
    38         serviceInstanceList.get(0).getUri();
    39 
    40         System.out.println(serviceInstanceList.get(0).getUri());
    41         ResponseEntity<String> forEntity = restTemplate.getForEntity(url, String.class);
    42         return forEntity.getBody();
    43     }
    44 }

附錄

Nacos

  1. 下載

    登入Nacos官網,登入GitHub,也可以直接進入GitHub搜尋“Nacos”

 

 

  2. 安裝

  理論上直接解壓即可,只要下對了寶寶!

  3.啟停

  啟停分為單機版(入門常規)、叢集版(高可用)

  windows命令:

1 startup.cmd -m standalone
命令說明:startup.cmd 啟動程式,雙擊或DOS命令均可(雙擊啟動請繼續看完)

引數說明:-m 模式模型,standalone 標識-單機模式啟動
雙擊啟動檔案啟動(需手動修改啟動檔案)
1 原:cluster標識叢集模式
2 set MODE="cluster"
3 修改為:standalone標識單機模式
4 set MODE="standalone"

  4.基本配置

  

單體架構VS微服務

不同點微服務架構單體架構
團隊規模 微服務架構可以將傳統模式下的單個應用,拆分為多個獨立的服務,每個微服務都可以單獨開發、部署和維護。每個服務從設計、開發到維護所需的團隊規模小,團隊管理成本小。 單體架構的應用程式通常需要一個大型團隊,圍繞一個龐大的應用程式工作,團隊管理的成本大。
資料儲存方式 不同的微服務可以使用不同的資料儲存方式,例如有的用 Redis,有的使用 MySQL。 單一架構的所有模組共享同一個公共資料庫,儲存方式相對單一。
部署方式 微服務架構中每個服務都可以獨立部署,也可以獨立於其他服務進行擴充套件。如果部署得當,基於微服務的架構可以幫助企業提高應用程式的部署效率。 採用單體架構的應用程式的每一次功能更改或 bug 修復都必須對整個應用程式重新進行部署。
開發模式 在採用微服務架構的應用程式中,不同模組可以使用不同的技術或語言進行開發,開發模式更加靈活。 在採用單體架構的應用程式中,所有模組使用的技術和語言必須相同,開發模式受限。
故障隔離 在微服務架構中,故障被隔離在單個服務中,避免系統的整體崩潰。 在單體架構中,當一個元件出現故障時,故障很可能會在程式中蔓延,導致系統全域性不可用。
專案結構 微服務架構將單個應用程式拆分為多個獨立的小型服務,每個服務都可以獨立的開發、部署和維護,每個服務都能完成一項特定的業務需求。 單體架構的應用程式,所有的業務邏輯都集中在同一個工程中。

 SpringCloud與SprigBoot版本關係

2021.0.x aka Jubilee

2.6.x

2020.0.x aka Ilford

2.4.x, 2.5.x (Starting with 2020.0.3)

Hoxton

2.2.x, 2.3.x (Starting with SR5)

Greenwich

2.1.x

Finchley

2.0.x

Edgware

1.5.x

Dalston

1.5.x

SpringCloud 對比 Dubbo

功能DubboSpringCloud
服務註冊中心 Zookeeper Eureka(主流)、Consul、zookeeper
服務呼叫方式 RPC基於Dubbo協議 REST API 基於Http協議
服務監控 Dubbo-Monitor Spring Boot Admin
熔斷器 不完善 Spring Cloud Netflix Hystrix
服務閘道器 Spring Cloud Netflix Zuul、Gateway
分散式配置 Spring Cloud Config
服務跟蹤 Spring Cloud Sleuth+Zipkin(一般)
資料流 Spring Cloud Stream
批量任務 Spring Cloud Task
資訊匯流排 Spring Cloud Bus

相關文章