一、环境

因为本地电脑jdk环境还是1.8的,所以springboot和spring cloud alibaba选用2.x版本。

二、集成组件

Nacos:服务发现、注册中心

Gateway:网关

Openfeign:服务间远程调用组件

Seata:分布式事务

Sentinel:限流、降级、熔断组件

Rocketmq:消息中间件

三、项目搭建

开发工具IDEA

点击file->New->Project新建Maven项目

删除新建项目的src目录作为父级目录

点击file->Project Structure->Modules-> + ->New Module

依次增加子模块

order-service:订单服务

common:公共模块

gateway-service:网关模块

storage-service:库存模块

account-service:账户模块

最终项目结构模块如图

父级模块pom文件引入springboot和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.test</groupId>
    <artifactId>spring-cloud-alibaba-test</artifactId>
    <packaging>pom</packaging>
    <version>1.0-SNAPSHOT</version>
    <modules>
        <module>common</module>
        <module>gateway-service</module>
        <module>order-service</module>
        <module>storage-service</module>
        <module>account-service</module>
    </modules>

    <properties>
        <java.version>1.8</java.version>
        <spring-boot.version>2.3.12.RELEASE</spring-boot.version>
        <spring-cloud.version>Hoxton.SR12</spring-cloud.version>              <spring-cloud-alibaba.version>2.2.9.RELEASE</spring-cloud-alibaba.version>
    </properties>

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

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-resources-plugin</artifactId>
                <version>2.5</version>
                <configuration>
                    <encoding>UTF-8</encoding>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.1</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                    <encoding>UTF-8</encoding>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

四、Nacos:服务发现与注册中心

上面我们搭建了基础项目框架,接下来就引入nacos来统一治理微服务模块。

由于springboot和spring cloud alibaba使用的2.x版本,因为我这里下载的是2.2.3版本的nacos。

到官网https://nacos.io/download/release-history上下载

接着分别在order-service、gateway-service、storage-service、account-service的pom文件分别加入nacos依赖

<dependency>
    <groupId>com.alibaba.cloud</groupId>
   <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

启动nacos服务端

·因为nacos需要使用数据库,首先进入nacos的conf目录,修改配置文件application.properties,将注释掉连接数据库的配置打开

·将conf目录下的mysql-schema.sql文件导入自己本地数据库

·到nacos安装bin目录下,点击startup.cmd启动nacos服务,如果启动失败,检查自己的数据库连接是否正确,JAVA_HOME环境变量是否配置。

启动各个微服务

在order-service、gateway-service、storage-service、account-service的resource下增加各自的yml文件application.yml

启动各个服务的启动类

       

启动成功,登录之前启动的nacos服务端(http://localhost:8848/nacos)查看服务是否已注册到nacos

五、Gateway:网关

在gateway-service服务pom文件下增加依赖

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>

同时去掉spring-boot-starter-web依赖包,因为gateway的依赖包已经包含了springboot的启动包。

在gateway-service的application.yml文件增加配置

接着在order-service服务中增加一个接口测试网关服务

重启order-service和gateway-service服务测试接口,因为网关端口是8088,在浏览器输入http://localhost:8088/api/order/create

测试成功,可以看到通过统一的网关在后端跳转到了order-service服务。

六、Openfeign:远程调用组件

在本案例中,在order-service服务中分别调用storage-service和account-service服务。

在order-service服务pom文件中增加feign依赖

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

在order-service中分别增加storage-service和account-service的调用接口

接着在storage-service和account-service服务中增加controller接口,参数跟在order-service中一样

在order-service的启动类中增加注解@EnableFeignClients,yml文件增加配置

重启服务,我们测试account-service接口在order-service中被调用情况

account-service上的接口被order-service调用成功。

七、Seata:分布式事务组件

由于springboot和spring cloud使用2.x版本,这里seata使用的1.4.2版本,首先下载seata服务端(地址:https://seata.apache.org/zh-cn/docs/v1.4/download)。

下载完直接到bin目录点击seata-server.bat启动,因为本示例使用file模式,所以不用修改seata-server任何配置文件,直接启动。

order-service、storage-service、account-service的pom文件分别加入seata依赖

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-seata</artifactId>
</dependency>

   application.yml文件分别加入seata配置

   

   接下来只需添加@GlobalTransactional注解,即可保证服务间调用的事务一致性。

   

    

八、Sentinel:限流、降级、熔断组件

首选下载jar包(地址:https://github.com/alibaba/Sentinel/releases),通过Java命令启动jar包,进入控制台。本示例下载版本为1.8.6.。

order-service的pom文件增加依赖

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-alibaba-sentinel-gateway</artifactId>
</dependency>

application.yml文件增加sentinel配置

启动各个服务,访问order-service订单接口,到sentinel控制台

从控制台中可对接口进行限流、熔断。

代码中手动对调用服务接口进行降级,如在order-service中对storage-service接口降级,在order-service配置中增加配置。

九、Rocketmq:消息组件

下载地址:https://rocketmq.apache.ac.cn/download/。本示例使用版本为4.9.5。

下载后解压缩包rocketmq-all-4.9.5-bin-release.zip,进入bin目录,分别启动mqnamesrv.cmd和mqbroker.cmd,如果没有设置Java环境变量,则通过cmd窗口启动,打开一个cmd窗口:

D:\soft\jdk1.8.0_231\bin>setROCKETMQ_HOME=D:\soft\springcloud\rocketmq-all-4.9.5-bin-release

D:\soft\jdk1.8.0_231\bin>java -cp ".;D:\soft\springcloud\rocketmq-all-4.9.5-bin-release\lib\*" org.apache.rocketmq.namesrv.NamesrvStartup

再打开一个cmd窗口:

D:\soft\jdk1.8.0_231\bin>set ROCKETMQ_HOME=D:\soft\springcloud\rocketmq-all-4.9.5-bin-release

D:\soft\jdk1.8.0_231\bin>java -cp ".;D:\soft\springcloud\rocketmq-all-4.9.5-bin-release\lib\*" org.apache.rocketmq.broker.BrokerStartup -n 127.0.0.1:9876 autoCreateTopicEnable=true

本示例以order-service作为生产端,account-service作为消费端。分别在pom文件增加依赖

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-stream-rocketmq</artifactId>
</dependency>

order-service增加配置

account-service增加配置

接下来在order-service增加发送消息的代码

account-service增加接收消息的代码

启动order-service和account-service服务,访问订单创建接口,在订单创建业务里向account-service发送消息,account-service接收到order-service发送的消息。

更多推荐