Mall--分佈式基礎篇

Touch-Air-Mall--分佈式基礎篇

  • github項目地址javascript

  • 微服務架構圖html

    image-20201209145750230

  • 項目描述前端

    • 先後分離開發,分爲內網部署和外網部署,外網就是面向公衆訪問,部署前端項目,內網部署是整個後臺的服務集羣,公衆是經過客戶端完成相應功能,好比登陸註冊等須要經過客戶端,向後臺服務 發送請求
    • 完整的請求流程:經過任意客戶端發請求來到Nginx集羣,Nginx把請求轉交給後臺服務,先將請求服務交給Api網關,Api網關爲SpringCloud GateWay,網關能夠根據當前請求,動態路由到指定的服務,例如要調用商品服務,購物車服務,仍是檢索服務,若是路由過來後,某一個服務衆多,網關會負載均衡的調用服務,當某些服務出現問題,會在網關級別對服務作統一的熔斷或者降級,使用Spring Cloud alibaba提供的Sentinel,固然網關還有其餘工能,如認證受權,是否合法,限流,限制瞬時流量,降級。當請求經過網關到達服務後,進行處理,都是Spring Boot的一個個微服務,服務與服務之間會相互調用,下訂單時調用商品服務,有些請求須要登陸之後纔會處理,因此有一個基於OAuth 2的認證中心,OAuth 2的社交登陸,整個應用的安全和權限控制用SpringSecurity來進行控制
    • 特別是這些服務要保存一些數據或緩存,緩存使用的是redis集羣,分片集羣加哨兵集羣,持久化使用的是mysql集羣。能夠讀寫分離,或分庫分表。服務與服務之間,利用消息隊列進行異步解耦,完成分佈式事務的最終一致性,RabbitMQ作消息隊列,檢索用ElasticSearch,有些服務運行期間,存取圖片視頻等,利用阿里雲對象存儲服務(OSS)。這些是整個服務關於數據存儲的解決方案
    • 項目上線後,爲了快速定位項目中可能出現的一些問題,使用ELK對日誌進行處理,用LogStash收集業務裏面各類日誌,存儲到ES中,用Kibana從ES中檢索到日誌信息,快速度定位線上問題所在
    • 在分佈式系統中,每個服務均可能部署在每一臺機器,並且服務與服務之間要相互調用,就得知道彼此都在哪裏,將全部服務註冊到服務中心,別的服務能夠經過註冊中心發現其餘服務的註冊所在位置,使用Spring Cloud Alibaba Nacos來做爲服務的註冊中心,一樣每個服務配置衆多,後來要集中管理這些配置,實現改一處配置,其餘服務都要修改掉,使用Spring Cloud Alibaba Nacos來做爲服務的配置中心,全部服務能夠動態的從配置中心中獲取配置,包括服務在調用期間可能出現的問題,好比下訂單服務調用商品服務,商品服務調用庫存服務,可能某一個鏈路出現問題,咱們要追蹤某一個調用鏈哪裏出現問題,該怎麼解決等等,使用Spring Cloud Sleuth+Zipkin 把每個服務的信息交給交給開源的Prometheus進行聚合分析,再由Grafana進行可視化展現,Altermananger實時獲得服務的報警信息,以郵件和手機短信方式通知開發運維人員
    • 提供持續繼承和持續部署,開發人員能夠將修改後的代碼提交給GitHub,運維人員經過自動化工具Jenkins Pipeline,從GitHub獲取代碼,將它打包成Docker鏡像,最後經過Kuberneters 集成整個Docker服務,將服務以Docker容器的方式運行

前期準備

docker安裝mysql

  • conf/my.cnfvue

    [mysqld]
    init_connect='SET collation_connection = utf8_unicode_ci'
    init_connect='SET NAMES utf8'
    character-set-server=utf8
    collation-server=utf8_unicode_ci
    skip-character-set-client-handshake
    skip-name-resolve
    
    [client]
    default-character-set=utf8
    
    [mysql]
    default-character-set=utf8
  • 啓動容器java

    docker run --name mysql3306  -p 3306:3306  -v /var/touchAirMallVolume/mysql/data:/var/lib/mysql  -v /var/touchAirMallVolume/mysql/conf/my.cnf:/etc/mysql/my.cnf -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7.31
    docker run --name mysql  -p 3306:3306 --restart=always -v /var/local/mysql/data:/var/lib/mysql  -v /var/local/mysql/conf/my.cnf:/etc/mysql/my.cnf -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7.31
    
    docker run -p 6379:6379 --name redis  --restart=always \
    -v /var/local/redis/data:/data \
    -v /var/local/redis/conf/redis.conf:/etc/redis/redis.conf \
    -d redis redis-server /etc/redis/redis.conf

docker安裝redis

  • conf/redis.confmysql

  • 啓動容器nginx

    docker run -p 6379:6379 --name redis6379  \
    -v /var/touchAirMallVolume/redis/data:/data \
    -v /var/touchAirMallVolume/redis/conf/redis.conf:/etc/redis/redis.conf \
    -d redis redis-server /etc/redis/redis.conf
  • 驗證redisgit

    docker exec -it redis6379 redis-cli

    image-20201203164153643

  • 默認redis是不持久化的,存在內存中github

    修改redis.conf 開啓持久化web

    vim /var/touchAirMallVolume/redis/conf/redis.conf
    
    #添加如下內容
    appendonly yes

    重啓redis容器

項目快速搭建

  • 使用人人開源項目,快速搭建先後端分離項目

    人人開源項目地址

    renren-fastrenren-fast-vuerenren-generator

  • 使用逆向工程,快速生成基本CRUD代碼

    image-20201209150125172

分佈式組件

SpringCloud Alibaba

簡介

  • Spring Cloud alibaba 爲分佈式應用開發提供了一站式解決方案。它包含開發分佈式應用程序所需的全部組件,使您能夠輕鬆地使用 Spring Cloud 開發應用程序

    使用阿里巴巴的 Spring Cloud,你只須要添加一些註釋和少許配置,就能夠將 Spring Cloud 應用程序鏈接到阿里巴巴的分佈式解決方案上,並使用阿里巴巴的中間件構建一個分佈式應用系統

特性

  • Flow control and service degradation(流量控制和服務降級)
  • Service registration and discovery(服務註冊和發現)
  • Distributed Configuration(分佈式配置)
  • Event-driven(事件驅動)
  • Message Bus(消息總線):使用 Spring Cloud Bus RocketMQ 的分佈式系統的連接節點
  • Distributed Transaction(分佈式事務 Seata)
  • Dubbo RPC

優劣勢比較

  • SpringCloud的幾大痛點:
    • SpringCloud部分組件中止維護和更新(Eureka、Hystrix等)
    • SpringCloud部分環境搭建複雜,沒有完善的可視化界面,須要大量的二次開發和定製
    • SpringCloud配置複雜、難以上手,部分配置差異難以區分和合理應用
  • SpringCloud Alibaba的優點:
    • 阿里使用過的組件經歷了考驗,性能強悍,設計合理,如今開源出來你們用成套的產品搭配完善的可視化界面給開發運維帶來了極大的便利,搭建簡單、學習曲線低
  • 結合SpringCloud Alibaba 咱們最終的技術搭配方案:
    • SpringCloud Alibaba - Nacos:註冊中心(服務發現/註冊)
    • SpringCloud Alibaba - Nacos:配置中心 (動態配置管理)
    • SpringCloud - Ribbon :負載均衡
    • SpringCloud - Feign/OpenFeign : 聲明式 HTTP 客戶端(調用遠程服務)
    • SpringCloud Alibaba - Sentinel :服務容錯(限流、降級、熔斷)
    • SpringCloud - GateWay : API網關(webflux編程模式)
    • SpringcCloud - Sleuth : 調用鏈監控
    • SpringCloud Alibaba - Seata:分佈式事務解決方案

SpringCloud Alibaba Nacos 註冊中心

簡介

  • Nacos 致力於幫助您發現、配置和管理微服務,Nacos 提供了一組簡單易用的特性集,幫助您快速實現動態服務發現、服務配置、服務元數據及流量管理

    Nacos 幫助您更敏捷和容易地構建、交付和管理微服務平臺。 Nacos 是構建以「服務」爲中心的現代應用架構 (例如微服務範式、雲原生範式) 的服務基礎設施

下載安裝

  • 官網下載地址

  • docker安裝

    docker pull nacos/nacos-server
    
    docker run --env MODE=standalone --name nacos -d -p 8848:8848 nacos/nacos-server

    測試是否安裝成功

    瀏覽器輸入:ip:8848/nacos
    登陸帳號密碼:nacos nacos

將微服務註冊到nacos中

  • 第一步:修改pom.xml文件,引入 Nacos Discovery Starter

    <!--nacos 服務註冊與發現-->
    <dependency>
    	<groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    </dependency>
  • 第二步:在微服務的yml配置文件中,配置上nacos server的地址,並指定應用名稱

    spring:
      datasource:
        username: root
        password: 123456
        url: jdbc:mysql://192.168.83.133:3306/touch_air_mall_pms
        driver-class-name: com.mysql.cj.jdbc.Driver
      cloud:
        nacos:
          discovery:
            server-addr: 192.168.83.133:8848
      application:
        name: touch-air-mall-product

    image-20201204171638379

  • 第三步:在啓動類添加註解 @EnableDiscoveryClient 開啓服務註冊與發現功能

    image-20201204171814761

  • 第四步:啓動應用,觀察nacos服務列表是否已註冊進服務中心

    注意:每個應用都應該有名字,這樣才能成功註冊進去

    image-20201204171955653

    注意:項目中部分微服務的 配置文件在nacos中,可自行修改

SpringCloud OpenFeign遠程調用

Feign聲明式遠程調用

  • Fegin是一個聲明式的HTTP客戶端,它的目的就是讓遠程調用更加簡單。Fegin提供了HTTP請求的模板,經過編寫簡單的接口和插入註解,就能夠定義好HTTP請求的參數、格式、地址等信息

  • Fegin整合了Ribbon(負載均衡)和Hystrix(服務熔斷),可讓咱們再也不須要顯示地使用這兩個組件

  • SpringCloud Fegin在NetFlix Fegin的基礎上擴展了對SpringMVC註解的支持,在其實現下,咱們只須要建立一個接口並用註解的方式來配置它,便可完成對服務提供方的接口綁定。簡化了SpringCloud Ribbon自選封裝服務調用客戶端的開發量

使用

  • 第一步:引入依賴(對應版本)

    <!--openfeign-->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-openfeign</artifactId>
        <version>2.2.3.RELEASE</version>
    </dependency>
  • 第二步:開啓feign功能

    @EnableDiscoveryClient

    image-20201207165509849

  • 第三步:聲明遠程接口

    image-20201207165430261

  • 測試

    • 正常啓動 用戶服務8000和優惠券服務7000

      image-20201207170202495

    • 優惠券服務7000宕機

      image-20201207170337167

fegin遠程調用的處理邏輯(*)

  • 一、 CouponFeignService.saveSpuBounds(spuBoundTO)
      1.一、@RequestBody 將這個對象轉爲json
      1.二、找到coupon服務,給 /coupon/spubounds/save 發送請求
           將上一步轉的json 放在請求體位置,發送請求
      1.三、對方服務收到請求,請求體裏有json數據
          @RequestBody SpuBoundsEntity spuBounds:將請求體中的json 轉爲 SpuBoundsEntity 這個類型
    二、只有json 數據模型是兼容的,雙方服務無需使用同一個to
  • 兩種不一樣的請求處理

    feign 請求的兩種寫法
     1. 讓全部請求過網關
    	1.1 @FeignClient("touch-air-mall-gateway"):給網關服務發請求
    	1.2 /api/product/skuinfo/info/{skuId}
         
     2. 直接指定具體某個微服務處理
    	2.1 @FeignClient("touch-air-mall-product"):給商品服務發請求
    	2.2 /product/skuinfo/info/{skuId}

SpringCloud Alibaba Nacos 配置中心

官方文檔示例

  • 官網文檔

  • 第一步:引入依賴

    <!--nacos 配置中心作配置管理-->
    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
    </dependency>
  • 第二步:在應用的 /src/main/resources/bootstrap.properties 配置文件中配置 Nacos Config 元數據

    bootstrap.properties文件內容會優先於 yml 文件被加載

    spring.application.name=touch-air-mall-coupon
    spring.cloud.nacos.config.server-addr=192.168.83.133

    image-20201207171409989

  • 觀察啓動類 新增配置的默認ID(默認當前應用的名稱 application name + properties

    image-20201207172543860

    image-20201207172629031

  • 測試

    • 第一次加載
    @Value("${coupon.user.name}")
        private String name;
        @Value("${coupon.user.age}")
        private int age;
        @RequestMapping("/nacos/config")
        public R testConfig(){
            return R.ok().put("name", name).put( "age", age);
        }

    image-20201207172729718

    • 在線修改 nacos 配置中心的配置

      image-20201207172845883

      必須重啓,再次請求接口

      image-20201207173002500

  • 動態獲取 加上註解 @RefreshScope

    無需重啓,動態刷新配置

    image-20201207173353758

命名空間和配置分組

  • 每一個微服務能夠建立本身的命名空間,其次可使用配置分組區分環境:dev、test、prod等
命名空間
  • 用於進行租戶粒度的配置隔離。不一樣的命名空間下,能夠存在相同的Group或Data ID的配置。NameSpace的經常使用場景之一是不一樣環境的配置的區分隔離,例如開發測試環境和生產環境的資源(如配置、服務)隔離等

    • public(保留空間):默認新增的全部配置都在public空間

    • 利用命名空間來作環境隔離:開發、測試、生產。注意:在bootstrap.properties中,配置使用哪一個命名空間image-20201208095157234

      image-20201208095211756

    • 每個微服務之間互相隔離配置,每個微服務都建立本身的命名空間,只加載本身命名空間下的全部配置

配置集
  • 全部配置的集合
配置集ID
  • 相似配置文件名

    image-20201208102509326

配置分組
  • 默認全部的配置集都屬於:DEFAULT_GROUP

    image-20201208103514818

    image-20201208103436993

同時加載多個配置集

  • 隨着服務增加,配置文件會愈來愈多,不易於維護。全部一般按類拆分紅多個配置文件

    只須要在bootstrap.properties中說明加載配置中心的哪些配置文件便可

    spring.cloud.nacos.config.extension-configs[0].data-id=datasource.yaml
    spring.cloud.nacos.config.extension-configs[0].group=dev
    spring.cloud.nacos.config.extension-configs[0].refresh=true
    spring.cloud.nacos.config.extension-configs[1].data-id=mybatis.yaml
    spring.cloud.nacos.config.extension-configs[1].group=dev
    spring.cloud.nacos.config.extension-configs[1].refresh=true
    spring.cloud.nacos.config.extension-configs[2].data-id=other.yaml
    spring.cloud.nacos.config.extension-configs[2].group=dev
    spring.cloud.nacos.config.extension-configs[2].refresh=true

    image-20201208110535615

    image-20201208110554545

    image-20201208110636690

SpringCloud GateWay網關

簡介

  • 網關做爲流量的入口,經常使用功能包括路由轉發、權限校驗、限流控制等。而SpringCloud gateway做爲SpringCloud官方推出的第二代網關框架,取代了Zuul網關

    組件 RPS(每秒處理請求)
    SpringCloud Gateway 32213.38
    Zuul 20800.13
    Linkerd 28050.76

    網關提供API全託管服務,豐富的API管理功能,輔助企業管理大規模的API,以下降管理成本和安全風險,包括協議適配、協議轉發、安全策略、防刷、流量、監控日誌等功能

    SpringCloud Gateway 旨在提供一種簡單有效的方式來對API進行路由,併爲他們提供切面,例如:安全性、監控指標和彈性等

  • 網關使用先後對比

    image-20201208113124245

    image-20201208113201925

官方文檔

核心理念

路由/斷言/過濾
  • web請求,經過一些匹配條件,定位到真正的服務節點。並在這個轉發過程的先後,進行一些精細化控制。perdicate就是咱們的匹配條件。而Filter就能夠理解爲一個無所不能的攔截器,有了這兩個元素,再加上目標uri,就能夠實現一個具體的路由了

    image-20201208134939497

    Gateway流程:客戶端向Spring Cloud Gateway發出請求。而後在Gateway Handler Mapping 中找到與請求相匹配的路由,將其發送到Gateway Web Handler

    Handler再經過指定的過濾器鏈來將請求發送到咱們實際的服務執行業務邏輯,而後返回

    過濾器之間用虛線分開是由於過濾器可能會在發送代理請求以前(「pre」)或以後(「post」)執行業務邏輯

    Filter在「pre」類型的過濾器能夠作參數校驗、權限校驗、流量監控、日誌輸出、協議轉換等,在「post」類型的過濾器中能夠作響應內容、響應頭的修改,日誌的輸出,流量監控等有很是重要的做用

網關啓動測試

  • 第一步:引入依賴

    <dependency>
    	<groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-gateway</artifactId>
    </dependency>
  • 第二步:編寫配置文件

    • application.properties 服務名稱和nacos註冊中心地址

      spring.cloud.nacos.discovery.server-addr=192.168.83.133:8848
      spring.application.name=touch-air-mall-gateway
    • 啓動類添加註解,開啓服務註冊與發現

      @EnableDiscoveryClient

    • bootstrap.properties

      #默認加載的配置文件 應用名.properties
      spring.application.name=touch-air-mall-gateway
      #配置中心地址
      spring.cloud.nacos.config.server-addr=192.168.83.133
      #命名空間
      spring.cloud.nacos.config.namespace=fa94e939-311c-427a-915a-a6c37bc403ae
      
      spring.cloud.nacos.config.extension-configs[0].data-id=touch-air-mall-gateway.yaml
      spring.cloud.nacos.config.extension-configs[0].group=DEFAULT_GROUP
      spring.cloud.nacos.config.extension-configs[0].refresh=true
    • nacos配置中心,新增命名空間 touch-air-mall-gateway ,生成的id 對應上面配置文件的namespace

      image-20201208171218166

      image-20201208171144287

    • 啓動服務,查看狀況

      image-20201208171332895

網關路由轉發測試

  • application.yml ,編寫路由規則,詳情參考官方文檔

    請求路徑帶參數:url,而且當值等於 baidu 時,轉發到百度

    ​ 當值等於 qq 時,轉發到 qq

    spring:
      cloud:
        gateway:
          routes:
            - id: test_route
              uri: https://www.baidu.com
              predicates:
                - Query=url,baidu
            - id: qq_route
              uri: https://www.qq.com
              predicates:
                - Query=url,qq
  • 重啓

    image-20201208171633308

    image-20201208171704341

對象存儲OSS

SpringCloud Alibaba-OSS

簡介

  • 對象存儲服務(Object Storage Service,OSS)是一種海量、安全、低成本、高可靠的雲儲存服務,適合存聽任意類型的文件。容量和處理能力彈性擴展,多種存儲類型供選擇,全面優化存儲成本
  • 您能夠經過本文檔提供的簡單的REST接口,在任什麼時候間、任何地點、任何互聯網設備上進行上傳和下載數據。基於OSS,您能夠搭建出各類多媒體分享網站、網盤、我的和企業數據備份等基於大規模數據的服務

使用

上傳方式

  • 1:普通上傳方式

    用戶將文件上傳至應用服務器,應用服務器拿到文件流,經過java代碼將文件流數據上傳到文件存儲服務器,流數據通過後臺一層處理,在高併發場景下,安全但性能差

    image-20201216112734303

  • 2:服務端簽名後直傳

    操做對象存儲的帳號密碼信息仍是存儲在後端服務中

    用戶/前端上傳以前先向服務器請求上傳策略,服務器利用阿里雲存儲服務的帳號密碼生成一個防僞的簽名,簽名中包含訪問OSS的受權令牌、以及具體的存儲位置等信息,返回給前端

    前端帶着這個防僞的令牌簽名和要上傳的文件,直接上傳到OSS

    image-20201216113057702

    服務器簽名後直傳

    簽名後直傳Java實現

    image-20201216164459365

    服務器端加密,前端直傳,須要配置跨域

    image-20201217101418830

基本概念

三級分類

遞歸樹形數據獲取

  • 第一步:商品三級分類實體類CategoryEntity中添加字段

    //建表忽略字段
    @TableField(exist = false)
    private List<CategoryEntity> children;
  • CategoryServiceImpl具體實現

    Java8 新特性,Stream流(前提準備)

    @Override
        public List<CategoryEntity> listWithTree() {
            // 一、查詢出全部分類
            List<CategoryEntity> categoryEntities = baseMapper.selectList(null);
            // 二、組裝成父子的樹形結構
            // 2.一、找出全部的一級分類
            // 2.二、遞歸查出子類
            List<CategoryEntity> level1Menu = categoryEntities.stream().filter(categoryEntity ->
                    categoryEntity.getParentCid() == 0
            ).map(menu-> {
                menu.setChildren(getChildrens(menu, categoryEntities));
                return menu;
            }).sorted((menu1,menu2)->{
                return (menu1.getSort()==null?0:menu1.getSort()) - (menu2.getSort()==null?0:menu2.getSort());
            }).collect(Collectors.toList());
            return level1Menu;
        }
    
        /**
         * 遞歸查找全部菜單的子菜單
         */
        public List<CategoryEntity> getChildrens(CategoryEntity root,List<CategoryEntity> all){
            List<CategoryEntity> children = all.stream().filter(categoryEntity -> {
                return categoryEntity.getParentCid().equals(root.getCatId());
            }).map(categoryEntity -> {
                categoryEntity.setChildren(getChildrens(categoryEntity, all));
                return categoryEntity;
            }).sorted((menu1,menu2)->{
                return (menu1.getSort()==null?0:menu1.getSort()) - (menu2.getSort()==null?0:menu2.getSort());
            }).collect(Collectors.toList());
            return children;
        }

配置網關路由與路徑重寫

官方文檔

Gateway Filter

MallGateway配置
  • application.yml文件

    spring:
      cloud:
        gateway:
          routes:
            - id: test_route
              uri: https://www.baidu.com
              predicates:
                - Query=url,baidu
            - id: qq_route
              uri: https://www.qq.com
              predicates:
                - Query=url,qq
            - id: admin_route
              uri: lb://renren-fast
              predicates:
                - Path= /api/**
              filters:
                - RewritePath= /api/(?<segment>/?.*),/renren-fast/$\{segment}
  • 配置說明

    注意是:admin_route

    前端項目統一請求都帶有 /api 前綴

    lb:renren-fast:LoadBalance 負載均衡

    知足predicates:http://localhost:9527/api/captcha.jpg ---> http://renren-fast:8080/api/captcha.jpg

    可是默認的請求是:http://localhost:8080/renren-fast/captcha.jpg

    使用Gateway的Filter 重寫路徑(重寫規則參考官方文檔)

網關統一配置跨域

跨域
跨域流程
  • 非簡單請求(PUT、DELETE)等,須要先發送預檢請求

    • 1:預檢請求,OPTIONS
    • 2:響應容許跨域
    • 3:發送真實請求
    • 4:響應數據

    image-20201210094713223

解決跨域
  • 第一種:使用nginx部署爲同一域

    image-20201210095127167

  • 第二種:配置當次請求容許跨域

    • 添加響應頭
      • Access-Control-Allow-Origin:支持哪些來源的請求跨域
      • Access-Control-Allow-Methods:支持哪些方法跨域
      • Access-Control-Allow-Credentials:跨域請求默認不包含cookie,設置爲true能夠包含cookie
      • Access-Control-Expose-Headers:跨域請求暴露的字段
        • CORS請求時,XMLHttpRequest對象的getResponseHeader()方法只能拿到6個基本字段:Cache-Control、Content-Language、Content-Type、Expires、Last-Modified、Pragma若是想拿到其餘字段,就必須在Access-Control-Expose-Headers裏面指定
      • Access-Control-Max-Age:代表該響應的有效時間爲多少秒。在有效時間內,瀏覽器無須爲同一請求再次發起預檢請求。請注意:瀏覽器自身維護了一個最大有效時間,若是該首部字段的值超過了最大有效時間,將不會生效
  • MallCorsConfiguration 網關服務添加跨域配置類

    @Configuration
    public class MallCorsConfiguration {
        @Bean
        public CorsWebFilter corsWebFilter(){
            UrlBasedCorsConfigurationSource urlBasedCorsConfigurationSource = new UrlBasedCorsConfigurationSource();
            CorsConfiguration corsConfiguration = new CorsConfiguration();
            //跨域配置
            corsConfiguration.addAllowedHeader("*");
            corsConfiguration.addAllowedOrigin("*");
            corsConfiguration.addAllowedMethod("*");
            corsConfiguration.setAllowCredentials(true);
    
            urlBasedCorsConfigurationSource.registerCorsConfiguration("/**",corsConfiguration);
            return new CorsWebFilter(urlBasedCorsConfigurationSource);
        }
    }

    image-20201210104828913

    注意:這裏須要註釋掉renren-fast中的跨域配置,統一由網關進行配置

樹形結構頁面展現

renren-fast-vue 快速搭建前端項目

SPU與SKU

SPU

Standard Product Unit(標準化產品單元)
  • 是商品信息聚合的最小單位,是一組可複用、易檢索的標準化信息的集合,該集合描述了一個產品的特性

SKU

Stock Keeping Unit (庫存量單位)
  • 即庫存進出計量的基本單元,能夠是以件、盒、托盤等爲單位。SKU這是對於大型連鎖超市DC(配送中心)物流管理的一個必要的方法。如今已經被引伸爲產品統一編號的簡稱,每種產品均對應有惟一的SKU號

基本屬性【規格參數】與銷售屬性

  • 每一個分類下的商品共享規格參數,與銷售屬性。只是有些商品不必定要用這個分類下所有的屬性:
    • 屬性是以三級分類組織起來的
    • 規格參數中有些是能夠提供檢索的
    • 規格參數也是基本屬性,他們具備本身的分組
    • 屬性的分組也是以三級分類組織起來的
    • 屬性名肯定的,可是值是每個商品不一樣來決定的

屬性分組-規格參數-銷售屬性-三級分類

  • 數據庫關聯關係圖

    image-20201218153129161

SPU-SKU-屬性表

  • 數據庫關聯關係圖

    image-20201218153242683

接口編寫

HTTP請求模板

WebStorm

  • File-Settings-Editor-Live Templates

    image-20201228141021336

JSR303數據校驗

JSR303

  • 給Bean添加校驗註解:javax.validation.constraints,並定義本身的message提示

  • 開啓校驗功能@Valid

    效果:校驗錯誤之後會有默認的響應

  • 給校驗的bean後緊跟一個BindingResult,就能夠得到到校驗的結果

  • 每一個方法都這樣作,太麻煩且代碼冗餘

分組校驗

    1. 給校驗註解標註什麼狀況須要進行校驗

    image-20201217171250931

    1. controller添加註解 @Validated{(AddGroup.class, UpdateGroup.class)}
    2. 默認沒有指定分組的校驗註解,在分組校驗的狀況下 不生效

自定義校驗

  • 編寫一個自定義的校驗註解

    image-20201218141235704

    能夠指定多個不一樣的校驗器,適配不一樣類型的校驗

    image-20201218141416574

  • 編寫一個自定義的校驗器

    image-20201218141449974

  • 關聯自定義的校驗器和校驗註解

全局異常處理

  • 集中處理全部異常

    @RestControllerAdvice 等價於 @ControllerAdvice和@ResponseBody
    處理全局異常並以json格式返回

    image-20201228142142467

  • x系統錯誤碼和錯誤信息定義類

      1. 錯誤碼定義規則爲5位數字

      2. 前兩位表示業務場景,最後三位表示錯誤碼

        例如:10001 10:通用 001:系統未知異常

      3. 維護錯誤碼後須要維護錯誤描述,將他們定義爲枚舉形式

        錯誤碼列表:

        10:通用

        11:商品

        12:訂單

        13:購物車

        14:物流

接口文檔地址

在線接口文檔地址

Object劃分

PO(persistant object)持久對象

  • PO就是對應數據庫中某個表中的一條記錄,多個記錄能夠用PO的集合。PO中應該不包含任何數據庫的操做

DO(Domain Object)領域對象

  • 就是從現實世界中抽象出來的有形或者無形的業務實體

TO(Transfer Object)數據傳輸對象

  • 不一樣的應用程序之間傳輸的對象

DTO(Data Transfer Object)數據傳輸對象

  • 這個概念來源於J2EE的設計模式,原來的目的是爲了EJB的分佈式應用提供粗粒度的數據實體,以減小分佈式調用的次數,從而提升分佈式調用的性能和下降網絡負載,但在這裏,泛指用於展現層與服務層之間的數據傳輸對象

VO(View Object)視圖對象

  • 一般用於業務層之間的數據傳遞,和PO同樣也是僅僅包含數據而已。但應是抽象出的業務對象,能夠和表對應,也能夠不,這根據業務的須要。用new關鍵字建立,由GC回收
  • 接收頁面傳遞來的數據,封裝對象
  • 將業務處理完成的對象,封裝成頁面要用的數據

BO(Business Object)業務對象

  • 從業務模型的角度看,見UML元件領域模型中的領域對象。封裝業務邏輯的java對象,經過調用DAO方法,結合PO、VO進行業務操做。business object:業務對象 主要做用是把業務邏輯封裝爲一個對象。這個對象能夠包括一個或多個對象。好比一個簡歷,有教育經歷、工做經歷、社會關係等等。咱們能夠把教育經歷對應一個PO,工做經歷對應一個PO,社會關係對應一個PO,創建一個簡歷的BO對象去處理簡歷,每一個BO都包含這些PO。這樣處理業務邏輯時,咱們就能夠針對BO去處理

POJO(Plain Ordinary Java Object)簡單無規則Java對象

  • 傳統意義的Java對象,就是說在一些 Object/Relation Mapping工具中,可以作到維護數據庫表記錄的persisent object 徹底符合 Java Bean 規範的純java對象,沒有增長別的屬性和方法,個人理解就是最基本的java Bean,只有屬性字段以及setter和getter方法
  • POJO 是DO/DTO/BO/VO的統稱

DAO(Data Access Object)數據訪問對象

  • 是一個sun的標準j2ee設計模式,這個模式中有個接口就是DAO,它負責持久層的操做,爲業務層接口。此對象用於訪問數據庫。一般和PO結合使用,DAO中包含了各類數據庫的操做方法。經過它的方法,結合PO對數據庫進行相關的操做,夾在業務邏輯與數據庫資源中間,配合VO,提供數據庫的CRUD操做

分佈式基礎篇總結

分佈式基礎概念

  • 微服務、註冊中心、配置中心、遠程調用、Feign、網關

基礎開發

  • SpringBoot 2.0 、SpringCloud、Mybatis-Plus、Vue組件化、阿里雲對象存儲

環境

  • VMWare、Linux、Docker、MySQL、Redis、逆向工程&人人開源

開發規範

  • 數據校驗JSR30三、全局異常處理、全局統一返回、全局跨域處理
  • 枚舉狀態、業務狀態碼、VO與TO與PO劃分、邏輯刪除
  • Lombok:@Data、@Slf4
相關文章
相關標籤/搜索