Spring Cloud Alibaba微服務架構入門最容易理解篇

itxiaoshen發表於2021-12-16

微服務架構介紹

Spring Cloud Alibaba推薦的微服務生態架構基於分層架構實現如下:

  • 接入層:最外層為LVS+Keepalived,可承受幾十萬級高併發流量洪峰,然後再通過內層的nginx叢集將客戶端請求通過負載均衡策略轉發至基於JAVA後端技術棧的Spring Cloud Gateway叢集;

  • 業務中臺層:Spring Cloud Gateway微服務通過Nacos獲取路由配置資訊和路由後端微服務提供者的發現,通過OAuth2做統一登入授權,並整合整合Sentinel針對請求做限流、熔斷、降低,基於dubbo協議的高效能RPC進行微服務呼叫或者服務聚合呼叫,而後端微服務之間呼叫也是採用dubbo協議的rpc,對於需要分散式事務服務端則通過Seata實現。

  • 技術中臺層:資料儲存層包括記憶體、資料庫、全文檢索搜尋引擎儲存層;基礎服務層提供分散式系統常見基礎元件功能;日誌採集層採用ELK

  • 系統監控層:分散式鏈路追蹤、基於容器化的監控和告警

微服務生態涉及技術點如下

Maven整合工程入門案例

shopping-demo原始碼地址
https://gitee.com/yongzhebuju/shopping

功能簡介


本示例主要對微服務使用Nacos實現配置中心讀取、服務註冊和服務發現,微服務閘道器實現路由策略並整合sentinel實現限流,微服務之間使用Dubbo高效能RPC進行呼叫。

本案例主要包含一下幾個demo模組

commons:公共服務模組,存放公共pojo實體類和微服務介面模組,比如Dubbo服務提供者介面定義、基於Open Feign遠端呼叫服務提供者介面定義等,公共模組pom可以配置一些公共引用依賴如spring-cloud-starter-alibaba-nacos-config和spring-cloud-starter-alibaba-nacos-discovery等,這樣其他微服務只需依賴公共模組即可

gateway:微服務入口閘道器模組,負責微服務路由、授權認證、微服務聚合等功能處理

users:使用者模組,提供獲取使用者介面

good:商品模組,提供商品介面,需要呼叫使用者介面

核心原始碼和配置

工程父pom檔案主要包含Spring Boot、Spring Cloud、Spring Cloud Alibaba的父依賴

<?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.itxs</groupId>
    <artifactId>shopping</artifactId>
    <packaging>pom</packaging>
    <version>1.0-SNAPSHOT</version>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.3.12.RELEASE</version>
    </parent>

    <modules>
        <module>shopping_commons</module>
        <module>shopping_goods</module>
        <module>shopping_users</module>
        <module>shopping_gateway</module>
    </modules>

    <properties>
        <java.verson>1.8</java.verson>
        <spring.cloud.verison>Hoxton.SR12</spring.cloud.verison>
        <spring.cloud.alibaba.verison>2.2.1.RELEASE</spring.cloud.alibaba.verison>
    </properties>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring.cloud.verison}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>${spring.cloud.alibaba.verison}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

</project>

微服務yml配置檔案,微服務的配置都放在Nacos配置中心,每個微服務本地配置檔案只需配置服務名稱、啟用的環境以及配置中心地址、配置副檔名、名稱空間和組即可。下面為閘道器配置檔案,其他模組配置檔案與此類似

spring:
  profiles:
    active: dev
  cloud:
    nacos:
      config:
        server-addr: localhost:8848
        file-extension: yaml
        namespace: 54c53c3a-6008-4ecc-90fe-2ffcae64b95b
        group: shopping
  application:
    name: gateway

commons 實體類和暴露獲取使用者介面服務

package com.itxs.entity;

import java.io.Serializable;

public class User implements Serializable {
    private String name;
    private Integer age;

    public User(String name, Integer age) {
        this.name = name;
        this.age = age;
    }
}
package com.itxs.service;

import com.itxs.entity.User;

public interface UserService {
    User getUser(String userId);
}

users微服務獲取使用者介面實現

package com.itxs.service;

import com.itxs.entity.User;
import org.apache.dubbo.config.annotation.Service;

@Service
public class UserServiceImpl implements UserService{
    @Override
    public User getUser(String userId) {
        System.out.println("userId:"+userId);
        return new User("zhangsan",16);
    }
}

users controller實現類,在這裡也提供http協議呼叫方式

package com.itxs.controller;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class UserController {

    @RequestMapping("/users/1")
    public String getUser(){
        return "hello users";
    }
}

goods controller

package com.itxs.controller;

import com.itxs.entity.User;
import com.itxs.service.UserService;
import org.apache.dubbo.config.annotation.Reference;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class GoodsController {

    @Reference
    UserService userService;

    @RequestMapping("/goods/1")
    public String getGoods(){
        return "hello goods";
    }

    @RequestMapping("/goods/user")
    public String getUserInfo(){
        User user = userService.getUser("a1001");
        return user.toString();
    }
}

Nacos 配置中心

啟動本地Nacos server端,訪問本地nacos管理介面http://localhost:8848/nacos,預設埠是8848,預設使用者密碼nacos/nacos,在dev名稱空間下有閘道器、使用者、商品微服務配置檔案,都使用shoopping組

image-20210822231838971

users-dev.yaml

server:
  port: 8081
spring:
  profiles:
    active: dev
  cloud:
    nacos:
      discovery:
        server-addr: 192.168.3.3:8848
        namespace: 54c53c3a-6008-4ecc-90fe-2ffcae64b95b
        group: shopping
    sentinel:
      enabled: true
      transport:
        dashboard: localhost:8888
        port: 8719
  application:
    name: users

goods-dev.yaml

server:
  port: 8082
spring:
  profiles:
    active: dev
  cloud:
    nacos:
      discovery:
        server-addr: 192.168.3.3:8848
        namespace: 54c53c3a-6008-4ecc-90fe-2ffcae64b95b
        group: shopping
    sentinel:
      enabled: true
      transport:
        dashboard: localhost:8888
        port: 8729
  application:
    name: goods

gateway-dev.yaml

server:
  port: 8083
spring:
  profiles:
    active: dev
  main:
    allow-bean-definition-overriding: true
  cloud:
    nacos:
      discovery:
        server-addr: 192.168.3.3:8848
        namespace: 54c53c3a-6008-4ecc-90fe-2ffcae64b95b
        group: shopping
    sentinel:
      enabled: true
      transport:
        dashboard: localhost:8080
        port: 8719
    gateway:
      discovery:
        locator:
          lowerCaseServiceId: true
          enabled: true
      routes:
        - id: users_route
          uri: lb://users
          predicates:
            - Path=/users/**

        - id: goods_route
          uri: lb://goods
          predicates:
            - Path=/goods/**    
  application:
    name: gateway
management:
  endpoints:
    web:
      exposure:
        include: "*"

Sentinel控制檯

通過Sentinel原始碼專案啟動Sentinel控制檯,是一個Spring Boot專案

image-20210822232421237

訪問本地Sentinel控制檯介面http://localhost:8080/,預設埠是8080,預設使用者密碼sentinel/sentinel,由於暫時沒有做持久化功能,所以剛進來是內容是空的

image-20210822232751529

微服務啟動

啟動閘道器、使用者、商品三個微服務,使用者微服務埠為8081,商品微服務埠為8082,閘道器微服務埠為8083

image-20210822233701053

先不通過閘道器直接訪問goods微服務http://localhost:8082/goods/1,走http方式呼叫介面

image-20210822235420340

通過閘道器路由配置我們訪問使用者服務http://localhost:8083/users/users/1 ,訪問結果正確

image-20210822233923040

繼續訪問商品介面服務http://localhost:8083/goods/goods/1 ,訪問結果正確

image-20210822234321581訪問商品服務呼叫使用者服務 http://localhost:8083/goods/goods/user ,訪問結果正確

image-20210822234413673

Sentinel控制檯設定下限流規則,針對goods/goods/user 這個觸點鏈路進行流控設定

image-20210822234605494

image-20210822234734339

image-20210822234755197

當我們每秒訪問在兩次內還是會訪問正常,我們連續快速按F5重新整理則會出現Blocked by Sentinel: FlowException,這個是預設Sentinel返回限流提供,我們也可以實現自定義限流提示

image-20210822234905722

**本人部落格網站 **IT小神 www.itxiaoshen.com

相關文章