SpringCloudAlibaba史上最全電子書(阿里雲學習中心整理)

 

Spring Cloud Alibaba》2020

本電子書內容來源於每特教育在阿里雲學習中心上架課程《精通Spring Cloud Alibaba》,主講人:餘勝軍,由開發者社區志願者黃良詩、李美儒進行整理

史上最全SpringCloudAlibaba視頻教程 百度雲(含視頻和文檔)

鏈接:https://pan.baidu.com/s/1OHX3B2Q97gn1K6wfZsURLw

密碼:00yk

SpringCloudAlibaba史上最全電子書(阿里雲學習中心整理)電子書(只包含文檔不包含視頻)

鏈接:https://pan.baidu.com/s/1uQc9-Bs7ArOqCz-_KnNc1g 

提取碼:n14n

Spring Cloud Alibaba課程說明

Spring Cloud Alibaba由每特教育|螞蟻課堂出品

該課程主要講解Spring Cloud Alibaba核心組件 Nacos(服務註冊與發現和分佈式配置中心)、Sentinel(服務保護框架)、Seata(分佈式事務解決框架)、阿里雲OSS、Alibaba Cloud SchedulerX等。

注意事項:該課程需要有一定的SpringBoot基礎知識,如果對SpringBoot不瞭解的話、可以在螞蟻課堂中學習SpringBoot基礎內容。

微服務架構演變過程

傳統單體架構——分佈式架構——SOA面向服務架構——微服務架構模式

傳統架構

傳統的架構,也就是爲單點應用,也就是大家在早期所學習的JavaEE知識SSH或者SSM架構模式,會採用分層架構模式:數據庫訪問層、業務邏輯層、控制層,從前端到後臺所有的代碼都是一個開發者去完成。

該架構模式沒有對我們業務邏輯代碼實現拆分,所有的代碼都寫入到同一個工程中裏面,適合於小公司開發團隊或者個人開發。

com.mayikt.controler---springmvc 視圖層 jsp/ftl

com.mayikt.service---業務邏輯層

com.mayikt.dao---數據庫訪問層

將項目的代碼都放入到同一個項目,部署在同一個Tomat中。

該架構模式存在哪些優缺點:

優點:開發簡單、運維簡單

缺點:該架構模式沒有對我們的業務邏輯實現拆分,所有的代碼都寫入到同一個項目中,

只適合小團隊或者個人形式開發,不適合團隊模式協同工作開發

這種架構模式最大的缺點,如果該系統一個模塊出現不可用、會導致整個系統無法使用。

應用場景:政府項目、管理系統、crm、oa適合於個人小團隊開發。

分佈式架構

分佈式架構模式是基於傳統的架構模式演變過來,將傳統的單點項目根據業務模塊實現拆分、會拆分爲會員系統、訂單系統、支付系統、秒殺系統等。 從而降低我們項目的耦合度,這種架構模式開始慢慢的適合於互聯網公司開發團隊。 

如果項目團隊人數較多需要進行項目拆分。需要把單體項目不同的系統。大型公司和大型開發團隊多用這種團隊開發的模式。

不同的系統如何連成一塊呢?需要通過域名跳轉。

會員系統:memner.mayikt.com

支付系統pay.mayikt.com

命名系統化:包含服務和視圖層

SOA面向服務架構

不同系統間的會話是如何進行綁定的呢?需要用到SSO單點登入系統。

 

SOA架構模式也稱作爲:面向服務架構模式、俗稱面向與接口開發,將共同存在的業務邏輯抽取成一個共同的服務,提供給其他的服務接口實現調用、服務與服務之間通訊採用rpc遠程調用技術。

通過SSO系統能解決代碼冗餘的問題。

服務:只是有接口 沒有控制層 沒有視圖層

com.mayikt.service

com.mayikt.dao

 

這種模式叫作SOA面向業務邏輯的開發。

SOA架構模式特點:

  1. SOA架構通訊中,採用XML方式實現通訊、在高併發下通訊過程中協議存在非常大冗餘性,所以在最後微服務架構模式中使用JSON格式替代了XML。
  2. SOA架構模式實現方案爲Web Service或者是ESB企業服務總線 底層通訊協議SOAP協議(Http+XML)實現傳輸。

 

傳統政府、銀行項目還是保留的在使用Web Service

互聯網公司肯定採用http+json形式實現運輸

基於IDEA快速構建Web Service

Web Service服務器

@WebService
public class UserService {

    @WebMethod
    public String getUser(Long id) {
        return "mayikt用戶:" + id
                ;
    }

    public static void main(String[] args) {
        Endpoint.publish("http://192.168.18.218:8089/service/UserService", new UserService());
        System.out.println("服務發佈成功");

    }
}

http://192.168.18.218:8089/service/UserService?wsdl  獲取wsdl

wsdl文件描述接口的調用地址 服務的接口 方法 參數等。

Web Service客戶端

 

public class WebServiceClient {
    public static void main(String[] args) throws ServiceException, RemoteException {
        UserServiceServiceLocator userServiceServiceLocator = new UserServiceServiceLocator();
        UserService userService = userServiceServiceLocator.getUserServicePort();
        String result = userService.getUser(10L);
        System.out.println("result:" + result);
    }
}

 

微服務架構

微服務架構產生的原因

微服務架構基於SOA架構演變過來的

在傳統的Web Service架構中有如下問題:

  1. 依賴中心化服務發現機制
  2. 使用Soap通訊協議,通常使用XML格式來序列化通訊數據,xml格式非常喜歡重,比較佔寬帶傳輸。
  3. 服務化管理和治理設施不完善

微服務架構模式

SOA架構模式存在哪些缺點:

1、採用SOAP協議實現通訊,xml傳輸非常重,效率比較低。

2、服務化管理和治理設施不夠完善

3、依賴與中心服務發現機制

4、不適合於前後分離架構模式

前端分離技術就是對我們控制層和業務層邏輯實現區分,

前端控制可以採用vue調用我們後端接口(http+json)

微服務架構基本概念

微服務架構模式是從SOA架構模式演變過來, 比SOA架構模式粒度更加精細,讓專業的人去做專業的事情(專注),目的是提高效率,每個服務與服務之間互不影響,微服務架構中

每個服務必須獨立部署、互不影響,微服務架構模式體現輕巧、輕量級、適合於互聯網公司開發模式。

微服務架構倡導應用程序設計程多個獨立、可配置、可運行和可微服務的子服務。

服務與服務通訊協議採用Http協議,使用restful風格API形式來進行通訊,數據交換格式輕量級json格式通訊,整個傳輸過程中,採用二進制,所以http協議可以跨語言平臺,並且可以和其他不同的語言進行相互的通訊,所以很多開放平臺都採用http協議接口。

微服務架構與SOA架構的不同

1.微服務架構基於 SOA架構 演變過來,繼承 SOA架構的優點,在微服務架構中去除 SOA 架構中的 ESB 企業服務總線,採用 http+json(restful)進行傳輸。

2.微服務架構比 SOA 架構粒度會更加精細,讓專業的人去做專業的事情(專注),目的提高效率,每個服務於服務之間互不影響,微服務架構中,每個服務必須獨立部署,微服務架構更加輕巧,輕量級。

3.SOA 架構中可能數據庫存儲會發生共享,微服務強調獨每個服務都是單獨數據庫,保證每個服務於服務之間互不影響。

4.項目體現特徵微服務架構比 SOA 架構更加適合與互聯網公司敏捷開發、快速迭代版本,因爲粒度非常精細。

 

ESB企業服務總線:解決多系統之間跨語言無法實現通訊的問題,對我們數據協議實現轉換,可以提供可靠的消息傳輸,第三方框架實現。

一般情況下都是採用Http+JSON格式傳輸,所以沒有必要使用ESB企業服務總線。

微服務架構產生那些問題

分佈式事務解決方案(rabbitmq/rocketmq/lcn(已經淘汰)/ Seata)

分佈式任務調度平臺(XXL-Job、阿里Scheduler)

分佈式日誌採集系統ELJ+Kafka

分佈式服務註冊中心 eureka、Zookeeper、consule、nacos等。

分佈式服務追蹤與調用鏈Zipkin等。

非常重要的概念:獨立部署、可配置、動態化

爲什麼我們要使用SpringCloud

SpringCloud並不是rpc遠程調用框架,而是一套全家桶的微服務解決框架,理念就是解決我們在微服務架構中遇到的任何問題。

服務治理:eureka

分佈式配置:config

客戶端調用工具rest/feign客戶端 rpc遠程調用

說明:阿里巴巴、騰訊、百度

注意:大家如果去一些比較大型的互聯網公司中,整個公司內部實現rpc通訊的框架、服務助治理都是內部自己研發

Rpc遠程調用框架有哪些?

Httpclient、dubbo、feign、grpc、基於netty手寫rpc

SpringCloud第一代與第二代的區別

 

SpringCloud第一代:

SpringCloud Config 分佈式配置中心

SpringCloud Netflix 核心組件

Eureka:服務治理

Hystrix:服務保護框架

Ribbon:客戶端負載均衡器

Feign:基於ribbon和hystrix的聲明式服務調用組件

Zuul: 網關組件,提供智能路由、訪問過濾等功能。

SpringCloud第二代(自己研發)和優秀的組件組合:

Spring Cloud Gateway 網關

Spring Cloud Loadbalancer 客戶端負載均衡器

Spring Cloud r4j(Resilience4J) 服務保護

Spring Cloud Alibaba Nacos 服務註冊

Spring Cloud Alibaba Nacos 分佈式配置中心

Spring Cloud Alibaba Sentinel服務保護 

SpringCloud Alibaba Seata分佈式事務解決框架

Alibaba Cloud OSS 阿里雲存儲

Alibaba Cloud SchedulerX 分佈式任務調度平臺

Alibaba Cloud SMS 分佈式短信系統

爲什麼Alibaba要推出SpringCloud組件

目的就是爲了對阿里雲的產品實現擴展。

SpringCloud與Spring Cloud Alibaba的區別

Spring Cloud Alibaba實際上對我們的SpringCloud實現了拓展組件能夠完美整合到SpringCloud rpc遠程調用整合。

1、nacos分佈式註冊中心,分佈式配置中心SpringCloudEureka+Config組合

2、目的是爲了推廣阿里雲產品,如果使用了Spring Cloud Alibaba建議最好使用Alibaba Mq rocketmq

分佈式任務調度

總結:Spring Cloud Alibaba實際上對我們的SpringCloud做拓展組件開發naoocs、setata分佈式解決框架、scheduler、Alibaba Cloud OSS等目的推廣阿里雲產品。

服務註冊與發現nacos

Nacos產生的背景

Nacos分佈式註冊與發現功能|分佈式配置中心

產生背景rpc遠程調用中,服務的url的治理

Rpc的遠程調用框架 HttpClient、gprc、dubbo、rest、openfeign等。

傳統的rpc遠程調用中存在哪些問題

1、超時的問題

2、安全的問題

3、服務與服務之間URL地址管理

在我們微服務架構通訊,服務之間依賴關係非常大,如果通過傳統的方式管理我們服務的url地址的情況下,一旦地址發生變化的情況下,還需要人工修改rpc遠程調用地址。

每個服務的url管理地址發出複雜,所以這是我們採用服務url治理技術,可以實現對我們整個實現動態服務註冊與發現、本地負載均衡、容錯等。

服務治理基本的概念

服務治理概念: 

在RPC遠程調用過程中,服務與服務之間依賴關係非常大,服務Url地址管理非常複雜,所以這時候需要對我們服務的url實現治理,通過服務治理可以實現服務註冊與發現、負載均衡、容錯等。

rpc遠程調用中,地址中 域名和端口號/調用的方法名稱:

域名和端口號/調用的方法名稱

192.168.212.110:8080/getUser

把每個服務器地址信息和端口人工存放到數據庫表中

Id  serviced           ip     端口號

Mayikt-member    192.168...   8082

Mayikt-member    192.168...   8081

基於數據庫形式實現服務url治理

缺點:維護成本非常高、沒有完全絕對實現動態智能

思考是否有更好的方案?  微服務中的註冊中心

整個微服務架構中最爲核心的肯定是 註冊中心。

註冊中心:實際就是存放我們的服務的地址信息,能夠實現動態感知。

註冊中心:Dubbo依賴Zookeeper、Eureka、Consul、Nacos、Redis、數據庫

 

服務註冊中心的概念

每次調用該服務如果地址直接寫死的話,一旦接口發生變化的情況下,這時候需要重新發布版本纔可以該接口調用地址,所以需要一個註冊中心統一管理我們的服務註冊與發現。

註冊中心:我們的服務註冊到我們註冊中心,key爲服務名稱、value爲該服務調用地址,該類型爲集合類型。Eureka、consul、zookeeper、nacos等。

服務註冊:我們生產者項目啓動的時候,會將當前服務自己的信息地址註冊到註冊中心。

服務發現: 消費者從我們的註冊中心上獲取生產者調用的地址(集合),在使用負載均衡的策略獲取集羣中某個地址實現本地rpc遠程調用。

微服務調用接口常用名詞

面試的過程:Nacos與Eureka區別、Eureka與Zookeeper

整個微服務的註冊中心實現原理

生產者:提供接口被其他服務調用

消費者:調用生產者接口實現消費

服務註冊:將當前服務地址註冊到

服務發現:

 

服務註冊原理實現:

1、生產者啓動的時候key=服務站的名稱 value ip 和端口號 註冊到我們的微服務註冊中心上。

Mayikt-member  192.168.212.110:8080

Mayikt-member  192.168.212.110:8081

 

2、註冊存放服務地址列表類型:key唯一,列表是list集合。

May<Key,List(String)>

{

Mayikt-member:["192.168.212.110.8080"]

}

 

3、我們的消費者從我們註冊中心上根據服務名稱查詢服務地址列表(集合)

Mayikt-member===["192.168.212.110.8080" "192.168.212.110.8081"]

 

4、消費者獲取到集羣列表之後,採用負載均衡器選擇一個地址實現rpc遠程調用

Nacos的基本的介紹

 

Nacos可以實現分佈式服務註冊與發現/分佈式配置中心框架。

官網的介紹: https://nacos.io/zh-cn/docs/what-is-nacos.html

Nacos的環境的準備

Nacos可以在linux/windows/Mac版本上都可以安裝

具體安裝教程地址:https://nacos.io/zh-cn/docs/quick-start.html

 

手動實現服務註冊與發現

1.實現服務註冊
發送post請求:

'http://127.0.0.1:8848/nacos/v1/ns/instance?serviceName=nacos.naming.serviceName&ip=20.18.7.10&port=8080'

2.實現服務發現

http://127.0.0.1:8848/nacos/v1/ns/instance/list?serviceName=nacos.naming.serviceName

詳細步驟操作:https://nacos.io/zh-cn/docs/quick-start.html

Nacos整合SpringCloud

Maven依賴信息

<parent>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-parent</artifactId>
     <version>2.0.0.RELEASE</version>
 </parent>
<dependencies>
    <!--  springboot 整合web組件-->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        <version>0.2.2.RELEASE</version>
    </dependency>
</dependencies>

 

創建工程,需要選擇1.8

 

之後創建生產者,其中版本最好一致,否則會產生報錯現象。

 

 

如何實現服務的註冊?

 

 

接口完成後,對會員進行註冊。

拿到配置文件,對項目命名

 

再進行代碼測試,自動實現對服務進行註冊

 

會員服務(生產者)

服務接口

@RestController
public class MemberService {
    @Value("${server.port}")
    private String serverPort;

    /**
     * 會員服務提供的接口
     *
     * @param userId
     * @return
     */
    @RequestMapping("/getUser")
    public String getUser(Integer userId) {
        return "每特教育,端口號:" + serverPort;
    }
}

配置文件

application.yml文件

spring:
  cloud:
    nacos:
      discovery:
        ###服務註冊地址
        server-addr: 127.0.0.1:8848
  application:
    name: mayikt-member
server:
  port: 8081

 

訂單服務(消費者)

訂單調用會員服務

@RestController
public class OrderService {

    @Autowired
    private RestTemplate restTemplate;
    @Autowired
    private DiscoveryClient discoveryClient;
    @Autowired
    private LoadBalancer loadBalancer;

    /**
     * 訂單調用會員服務
     *
     * @return
     */
//    @RequestMapping("/orderToMember")
//    public String orderToMember() {
//        // 從註冊中心上獲取該註冊服務列表
//        List<ServiceInstance> serviceInstanceList = discoveryClient.getInstances("mayikt-member");
//        ServiceInstance serviceInstance = serviceInstanceList.get(0);
//        URI rpcMemberUrl = serviceInstance.getUri();
//        // 使用本地rest形式實現rpc調用
//        String result = restTemplate.getForObject(rpcMemberUrl + "/getUser", String.class);
//        return "訂單調用會員獲取結果:" + result;
//    }
    @RequestMapping("/orderToMember")
    public String orderToMember() {
        // 從註冊中心上獲取該註冊服務列表
        List<ServiceInstance> serviceInstanceList = discoveryClient.getInstances("mayikt-member");
        ServiceInstance serviceInstance = loadBalancer.getSingleAddres(serviceInstanceList);
        URI rpcMemberUrl = serviceInstance.getUri();
        // 使用本地rest形式實現rpc調用
        String result = restTemplate.getForObject(rpcMemberUrl + "/getUser", String.class);
        return "訂單調用會員獲取結果:" + result;
    }
}

 

新建項目之後,第一步,根據服務名稱從 註冊中心獲取集羣列表地址

;第二步,根據列表任意選擇一個 實現本地rpc調用rest

 

 

 

 

注意:RestTeanmlate它不是SpringCloud寫的,本身Spring支持Http協議調用  實現Http 調用

負載均衡算法

public interface LoadBalancer {


    /**
     * 根據多個不同的地址 返回單個調用rpc地址
     *
     * @param serviceInstances
     * @return
     */
    ServiceInstance getSingleAddres(List<ServiceInstance> serviceInstances);
}

 

@Component
public class RotationLoadBalancer implements LoadBalancer {
    private AtomicInteger atomicInteger = new AtomicInteger(0);

    @Override
    public ServiceInstance getSingleAddres(List<ServiceInstance> serviceInstances) {
        int index = atomicInteger.incrementAndGet() % 2;
        ServiceInstance serviceInstance = serviceInstances.get(index);
        return serviceInstance;
    }
}

 

 

 

 

Rpc遠程調用設計到本地負載均衡算法

 

1、從註冊中心獲取服務集羣的列表

2、從列表選擇一個  負載均衡算法有哪些

A、一致性hash計算

B、輪訓、權重

C、隨機

 

採用什麼設計模式  策略模式

 

假設我們兩臺服務器集羣

訪問次數%集羣size

 

1%2=1

2%2=0

3%2=1

4%2=0

 

1%1=0

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章