天天看點

微服務架構-基于SpringCloudAlibaba的微服務架構

什麼微服務?

        微服務是一種經過良好架構設計的分布式架構方案,微服務架構特征:

  • 單一職責:微服務拆分力度更小,每一個服務都對應唯一的業務能力,做到單一職責,避免重複業務開發。
  • 面向服務:微服務需要對外暴露業務接口,實作跨服務調用。
  • 隔離性強:服務調用做好隔離、容錯、降級、避免出現級聯問題

        微服務架構的設計主要是為了實作高内聚、低耦合。

單體架構:

簡介:

        單體架構指的是将業務的所有功能集中在一個項目中開發,打成一個包部署。該架構适用于簡易項目,例如:學生管理系統

微服務架構-基于SpringCloudAlibaba的微服務架構
微服務架構-基于SpringCloudAlibaba的微服務架構

優點:

  • 架構相對簡單
  • 部署成本低

缺點:

  • 耦合度高

分布式架構:

簡介:

        分布式架構指的是根據業務功能對系統進行拆分,每個業務子產品作為獨立項目開發,稱為一個服務。該架構适用于大型項目開發,例如京東、淘寶等

        例如商城項目,其中有訂單子產品、使用者功能、商品功能、支付功能四大子產品,通過分布式架構就可以按照業務拆分為四個獨立的項目,每個獨立的功能都作為一個項目來建立 

微服務架構-基于SpringCloudAlibaba的微服務架構
微服務架構-基于SpringCloudAlibaba的微服務架構

優點:

  • 降低服務耦合
  • 有利于服務更新拓展

缺點:

  • 架構複雜,運維、監控、部署難度提高

微服務技術學習路線

微服務架構-基于SpringCloudAlibaba的微服務架構
微服務架構-基于SpringCloudAlibaba的微服務架構
微服務架構-基于SpringCloudAlibaba的微服務架構

微服務技術對比

        微服務這種方案需要技術架構來落地,全球的網際網路公司都在積極嘗試自己的微服務落地技術,在國内最知名的就是SpringCloud和阿裡巴巴的Dubbo         

微服務架構-基于SpringCloudAlibaba的微服務架構

 認識 SpringCloud

         SpringCloud 是目前國内使用最廣泛的微服務架構,其中內建了各種微服務功能元件(服務歐注冊發現、服務遠端調用、服務鍊路監控、統一配置管理、統一網關路由、流控、降級、保護),并基于SpringBoot實作了這些元件的自動裝配,進而提供了良好的開箱即用的體驗:

微服務架構-基于SpringCloudAlibaba的微服務架構

        SpringCloud 中文網;​​https://www.springcloud.cc/​​

SpringCloud與SpringBoot的版本相容性關系如下:

SpringCloud版本 SpringBoot版本
2020.0.x aka llford 2.4.x
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

注意:版本不一緻,将會導緻代碼報錯,甚至無法啟動。

服務的拆分及遠端調用

服務拆分注意事項

        服務拆分,也就是一個單體架構,按照功能子產品進行拆分,變成多個服務。例如:XX商城管理系統中有訂單模式、使用者功能、商品功能、支付功能四大子產品,将這四個子產品拆分位四個服務,如下圖所示:

拆分前的單體架構:

微服務架構-基于SpringCloudAlibaba的微服務架構

拆分後的分布式結構:

微服務架構-基于SpringCloudAlibaba的微服務架構

        例如:現在有一個需求是查詢訂單,同時将訂單中關聯的使用者資訊、商品資訊都擷取到,傳統的單體架構模式,是在訂單Controller中定義一個函數去查訂單,然後在訂單資料擷取使用者id,然後再通過使用者id查詢使用者表擷取對應的使用者資訊。得到商品id以後,根據商品id查詢商品表對應的資料,而這些功能全部都寫在了訂單子產品中,這種做法是完全違背了微服務的原則。 

        微服務拆分的目的,就是維持單一原則,一個服務隻做與自己相關的事。

        訂單子產品就隻做訂單業務,而不操作使用者和商品。

在進行拆分時,需要注意以下幾點

  • 不用微服務,不要重複開發相同業務。
  • 微服務資料獨立,不要通路其它微服務的資料庫。
  • 微服務可以将自己的業務暴露為接口,供其它微服務遠端調用。
微服務架構-基于SpringCloudAlibaba的微服務架構

        如果在微服務模式下, 想在操作訂單時,查詢到使用者和商品相關的資料,這個時候就需要微服務提前将自己的業務暴露為接口,供其它微服務調用。

服務拆分Demo

項目名稱為:cloud-demo

項目結構:

微服務架構-基于SpringCloudAlibaba的微服務架構
微服務架構-基于SpringCloudAlibaba的微服務架構

該示例項目所需的sql如下:

微服務架構-基于SpringCloudAlibaba的微服務架構

cloud-order.sql 中的資料如下: 

微服務架構-基于SpringCloudAlibaba的微服務架構

cloud-user.sql 中的資料如下: 

微服務架構-基于SpringCloudAlibaba的微服務架構

修改yml配置檔案中的資料庫秘密以後,分别啟動OrderApplication和UserApplication兩個微服務, 如下截圖:

微服務架構-基于SpringCloudAlibaba的微服務架構

訂單通路位址:http://localhost:8080/order/101

微服務架構-基于SpringCloudAlibaba的微服務架構

使用者通路位址:http://localhost:8081/user/1

微服務架構-基于SpringCloudAlibaba的微服務架構

該示例項目就完全遵循微服務拆分的原則,遵循單一職責,每個服務做不同的事,并且資料庫也做了分離,每個服務都有一個獨立的資料庫。

        目前, 該示例隻是做了資料庫獨立和服務拆分,并沒有實作微服務之間遠端調用的功能,如果想實作根據訂單id查詢訂單資料的同時,把訂單所屬的使用者資訊查詢出來并傳回出去,就需要完成微服務之間遠端調用的功能,如下截圖:

微服務架構-基于SpringCloudAlibaba的微服務架構

隻能是在訂單子產品中向使用者子產品發起遠端調用,然後将查詢到的資料進行組合,返給用戶端。

微服務架構-基于SpringCloudAlibaba的微服務架構

微服務遠端調用-查詢訂單具體實作步驟:

1、注冊RestTemplate

        在order-service的OrderApplication中注冊RestTemplate 

/**
     * 微服務之間遠端調用
     * 建立RestTemplate并注入Spring容器
     * @return
     */
    @Bean
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }      
微服務架構-基于SpringCloudAlibaba的微服務架構

2、然後在OrderService中通過 RestTemplate 發送http請求,擷取使用者資料,組拼資料以後傳回

package cn.itcast.order.service;

import cn.itcast.order.mapper.OrderMapper;
import cn.itcast.order.pojo.Order;
import cn.itcast.order.pojo.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;

@Service
public class OrderService {

    @Autowired
    private OrderMapper orderMapper;

    @Autowired
    private RestTemplate restTemplate;

    public Order queryOrderById(Long orderId) {
        // 1.查詢訂單
        Order order = orderMapper.findById(orderId);

        // ================== 通過RestTemplate 發起http請求,查詢使用者資料
        String url = "http://localhost:8081/user/"+order.getUserId();
        /*
        getForObject 表示發送get請求,并且将傳回資料封裝成對象
         發送http請求,實作遠端調用
         */
        User user = restTemplate.getForObject(url, User.class);

        order.setUser(user);

        // 4.傳回
        return order;
    }
}      
微服務架構-基于SpringCloudAlibaba的微服務架構

3、然後重新開機order-service中的OrderApplication服務,浏覽器通路:http://localhost:8080/order/101         測試是否可以實作微服務之間的遠端調用

微服務架構-基于SpringCloudAlibaba的微服務架構

為什麼要用微服務?

怎麼使用微服務?