Spring Cloud Alibaba微服務架構入門最容易理解篇
微服務架構介紹
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源碼地址
//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="//maven.apache.org/POM/4.0.0"
xmlns:xsi="//www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="//maven.apache.org/POM/4.0.0 //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管理界面//localhost:8848/nacos,默認端口是8848,默認用戶密碼nacos/nacos,在dev命名空間下有網關、用戶、商品微服務配置文件,都使用shoopping組
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項目
訪問本地Sentinel控制台界面//localhost:8080/,默認端口是8080,默認用戶密碼sentinel/sentinel,由於暫時沒有做持久化功能,所以剛進來是內容是空的
微服務啟動
啟動網關、用戶、商品三個微服務,用戶微服務端口為8081,商品微服務端口為8082,網關微服務端口為8083
先不通過網關直接訪問goods微服務//localhost:8082/goods/1,走http方式調用接口
通過網關路由配置我們訪問用戶服務//localhost:8083/users/users/1 ,訪問結果正確
繼續訪問商品接口服務//localhost:8083/goods/goods/1 ,訪問結果正確
訪問商品服務調用用戶服務 //localhost:8083/goods/goods/user ,訪問結果正確
Sentinel控制台設置下限流規則,針對goods/goods/user 這個觸點鏈路進行流控設置
當我們每秒訪問在兩次內還是會訪問正常,我們連續快速按F5刷新則會出現Blocked by Sentinel: FlowException,這個是默認Sentinel返回限流提供,我們也可以實現自定義限流提示
**本人博客網站 **IT小神 www.itxiaoshen.com