SpringCloud+SpringCloudAlibaba+SOA架构搭建,使用nacos注册中心,gateway网关配置

本文涉及的产品
RDS AI 助手,专业版
RDS MySQL DuckDB 分析主实例,基础系列 4核8GB
RDS MySQL DuckDB 分析主实例,集群系列 4核8GB
简介: SpringCloud+SpringCloudAlibaba+SOA架构搭建,使用nacos注册中心,gateway网关配置

版本说明

  • 代码仓库地址点击这里
  • SpringCloud版本采用目前第二排的 Hoxton.SR10 版本:

  • SpringBoot版本采用 Hoxton.SR10 版本的SpringCloud所支持的 2.3.8.RELEASE :

  • JDK和Maven采用 SpringBoot2.3.8.RELEASE 所推荐的 JDK8和Maven3.5.4(3.3+)

  • 附赠 SpringCloud-Hoxton.SR10 和 SpringBoot2.3.8.RELEASE 官方PDF文档
  • 本人博客当中有 JDK8 安装 、 MySQL5.7安装、SpringBoot项目搭建等,点击头像进入主页查看
  • 本次是由两个微服务分别是订单和支付微服务,由网关gateway经行路由

开发步骤

首先我们先来搭建一个聚合项目也就是一个空到只有 pom.xml 文件的maven项目,pom.xml文件内容

<?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>
    <!-- GAV 坐标 -->
    <groupId>code.xiaohh</groupId>
    <artifactId>cloud-alibaba-demo</artifactId>
    <version>1.0-SNAPSHOT</version>
    <!-- 打包方式 -->
    <packaging>pom</packaging>
    <properties>
        <!-- Maven 项目属性 -->
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <!-- 统一依赖管理 -->
        <spring.boot.version>2.3.8.RELEASE</spring.boot.version>
        <spring.cloud.version>Hoxton.SR10</spring.cloud.version>
        <spring.cloud.alibaba.version>2.2.5.RELEASE</spring.cloud.alibaba.version>
        <mybatisplus.version>3.4.2</mybatisplus.version>
        <lombok.version>1.18.18</lombok.version>
    </properties>
    <!-- 统一依赖管理 -->
    <dependencyManagement>
        <dependencies>
            <!-- SpringBoot 相关依赖 -->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>${spring.boot.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <!-- SpringCloud相关依赖 -->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring.cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <!-- cloud alibaba -->
            <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>
            <!-- mybatis-plus -->
            <dependency>
                <groupId>com.baomidou</groupId>
                <artifactId>mybatis-plus-boot-starter</artifactId>
                <version>${mybatisplus.version}</version>
                <exclusions>
                    <exclusion>
                        <groupId>org.mybatis.generator</groupId>
                        <artifactId>mybatis-generator</artifactId>
                    </exclusion>
                </exclusions>
            </dependency>
            <!-- lombok 相关依赖 -->
            <dependency>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
                <version>${lombok.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
</project>

然后建立一个 cloud-alibaba-common 模块作为一个统一类的管理:

然后接下来的步骤和创建maven项目一样,其中pom.xml文件:

<?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">
    <parent>
        <artifactId>cloud-alibaba-demo</artifactId>
        <groupId>code.xiaohh</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>
    <artifactId>cloud-alibaba-common</artifactId>
    <!-- 打包方式 -->
    <packaging>jar</packaging>
    <properties>
        <!-- Maven 项目属性 -->
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>
    <dependencies>
        <!-- lombok -->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
        <!-- openfeign -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>
        <!-- mybatis plus -->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
        </dependency>
        <!-- commons lang -->
        <dependency>
            <groupId>commons-lang</groupId>
            <artifactId>commons-lang</artifactId>
            <version>2.6</version>
        </dependency>
    </dependencies>
</project>

其中的代码都是一些公用的工具类,因为不想让文档过于臃肿,待会会提交到git仓库

创建 cloud-alibaba-payment 支付模块,pom.xml文件:

<?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">
    <parent>
        <artifactId>cloud-alibaba-demo</artifactId>
        <groupId>code.xiaohh</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>
    <artifactId>cloud-alibaba-payment</artifactId>
    <!-- 打包方式 -->
    <packaging>jar</packaging>
    <properties>
        <!-- Maven 项目属性 -->
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>
    <dependencies>
        <!-- 共有依赖 -->
        <dependency>
            <groupId>code.xiaohh</groupId>
            <artifactId>cloud-alibaba-common</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
        <!-- SpringMVC -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!-- 健康检查 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <!-- nacos 注册中心 -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
        <!-- nacos 配置中心 -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <!-- SpringBoot 项目编译成可执行 jar 包的插件 -->
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <executions>
                    <execution>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
</project>

bootstrap.yml:

spring:
  cloud:
    nacos:
      discovery: # 注册中心
        server-addr: 192.168.1.230:8848 #请更换成自己的nacos地址
      config: # 配置中心
        server-addr: 192.168.1.230:8848 #请更换成自己的nacos地址
        file-extension: yml # 配置中心文件的后缀

application.yml:

server:
  port: 2020 # 服务器端口号
spring:
  application:
    name: cloud-alibaba-payment # 应用名,也就是注册到注册中心的名字
  datasource: # 数据库配置
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://192.168.1.230:3306/cloud_payment?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
    username: root
    password: root
  profiles:
    active: dev # 当前处于开发环境
mybatis-plus: # mybatis plus 配置
  mapper-locations: classpath:mapper/payment/*.xml # mapper 文件配置
  type-aliases-package: code.xiaohh.cloudalibaba.common.entities # entities 的别名都在哪个包下
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl # 设置打印SQL语句

PaymentApplication.java:

package code.xiaohh.cloudalibaba.payment;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.openfeign.EnableFeignClients;
/**
 * <p>
 * 支付模块启动类
 * </p>
 *
 * @author XiaoHH
 * @version 1.0
 * @date 2021-04-10 星期六 14:53:51
 * @file PaymentApplication.java
 */
@EnableDiscoveryClient // 启用注册中心
@EnableFeignClients(basePackages = "code.xiaohh.cloudalibaba.common.feigns") // 启用远程调用
@SpringBootApplication
public class PaymentApplication {
    public static void main(String[] args) {
        // 启动支付模块
        SpringApplication.run(PaymentApplication.class, args);
        System.out.println("^V^ 支付模块启动成功 ^V^\n" +
                "/-\\ /-\\ /-\\ /-\\ /-\\ /-\\\n" +
                " X   i   a   o   H   H\n" +
                "\\-/ \\-/ \\-/ \\-/ \\-/ \\-/");
    }
}

payment数据库建库建表语句:

DROP DATABASE IF EXISTS `cloud_payment`;
CREATE DATABASE `cloud_payment`;
USE `cloud_payment`;
CREATE TABLE `payment` (
    `payment_id` BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '支付id',
    `serial` VARCHAR(50) NOT NULL COMMENT '支付流水号'
) COMMENT '支付表';

接下来的代码我们用 renren-generator 的代码生成器生成以下,其实也就是SpringBoot的SSM项目的代码,可以查看我的文章SpringBoot搭建SSM项目点击这里下载代码生成器,代码生成器步骤请自己去看人家的官方微信,首先添加在数据库当中添加一条数据看看效果:

添加成功,SQL语句也成功发送:

数据库当中:

同时我们生成订单模块的微服务,代码基本上相同,不同的地方:

application.yml数据库连接的url配置和应用名端口号(仅仅只列出了不同的地方):

server:
  port: 2030 # 服务器端口号
spring:
  application:
    name: cloud-alibaba-order # 应用名,也就是注册到注册中心的名字
  datasource:
    url: jdbc:mysql://192.168.1.230:3306/cloud_order?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai

order数据库建库建表语句:

DROP DATABASE IF EXISTS `cloud_order`;
CREATE DATABASE `cloud_order`;
USE `cloud_order`;
CREATE TABLE `order` (
    `order_id` BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '订单id',
    `order_number` VARCHAR(50) NOT NULL COMMENT '订单号'
) COMMENT '订单表';

同样用代码生成器生成代码,然后我们来到nacos服务列表,可以看到nacos服务注册是成功的

然后我们来试试注册中心,注册中心配置读取的规则如下:

${spring.application.name}-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}
# 应用名-当前环境.配置中心文件的后缀

那么根据 bootstrap.yml 和 application.yml 的配置则:

  • cloud-alibaba-order 模块的配置名为 cloud-alibaba-order-dev.yml
  • cloud-alibaba-payment 模块的配置名为 cloud-alibaba-payment-dev.yml

现在去nacos配置中心添加配置:

订单服务配置:

支付模块配置:

查看配置号的配置

重启之后可以发现两个服务分别在 8080 和 8090 启动成功

根据SpringCloud的架构图我们还需要一个服务网关来路由将请求推送到指定服务:

我们再建立一个 cloud-alibaba-gateway 来作为服务网关

pom.xml:

<?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">
    <parent>
        <artifactId>cloud-alibaba-demo</artifactId>
        <groupId>code.xiaohh</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>
    <artifactId>cloud-alibaba-gateway</artifactId>
    <!-- 打包方式 -->
    <packaging>jar</packaging>
    <properties>
        <!-- Maven 项目属性 -->
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>
    <dependencies>
        <!-- 网关服务 -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-gateway</artifactId>
        </dependency>
        <!-- nacos 注册中心 -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
        <!-- nacos 配置中心 -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <!-- SpringBoot 项目编译成可执行 jar 包的插件 -->
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <executions>
                    <execution>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
</project>

bootstrap.yml:

spring:
  cloud:
    nacos:
      discovery: # 注册中心
        server-addr: 192.168.1.230:8848 #请更换成自己的nacos地址
      config: # 配置中心
        server-addr: 192.168.1.230:8848 #请更换成自己的nacos地址
        file-extension: yml # 配置中心文件的后缀

application.yml:

server:
  port: 80 # 服务器端口号
spring:
  application:
    name: cloud-alibaba-gateway # 应用名,也就是注册到注册中心的名字
  profiles:
    active: dev # 当前处于开发环境
  cloud:
    gateway: # 网关配置
      routes: # 路由配置
        # 订单服务的路由
        - id: cloud-alibaba-order-route # 单个路由的id
          uri: lb://cloud-alibaba-order # 路由条件满足后跳转到这个服务
          predicates:
            - Path=/api/order/** # 断言,当请求url满足这个路径要求时路由
          filters:
            - RewritePath=/api/(?<segment>.*),/$\{segment} # 路径重写,确保不会404
        #支付服务的路由
        - id: cloud-alibaba-payment-route # 单个路由的id
          uri: lb://cloud-alibaba-payment # 路由条件满足后跳转到这个服务
          predicates:
            - Path=/api/payment/** # 断言,当请求url满足这个路径要求时路由
          filters:
            - RewritePath=/api/(?<segment>.*),/$\{segment} # 路径重写,确保不会404

GatewayApplication.java:

package code.xiaohh.cloudalibaba.gateway;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
/**
 * <p>
 * 网关模块启动类
 * </p>
 *
 * @author XiaoHH
 * @version 1.0
 * @date 2021-04-10 星期六 16:42:08
 * @file GatewayApplication.java
 */
@EnableDiscoveryClient
@SpringBootApplication
public class GatewayApplication {
    public static void main(String[] args) {
        // 启动网关模块
        SpringApplication.run(GatewayApplication.class, args);
        System.out.println("^V^ 网关模块启动成功 ^V^\n" +
                "/-\\ /-\\ /-\\ /-\\ /-\\ /-\\\n" +
                " X   i   a   o   H   H\n" +
                "\\-/ \\-/ \\-/ \\-/ \\-/ \\-/");
    }
}

好的,网关配置好了,现在我们来测试以下:

根据路径重写规则发送获取订单id为1的请求:

http://127.0.0.1/api/order/order/info/1

可以看到请求的是网关的80端口,并且转发到订单服务了,订单服务打印SQL语句:

再来测试支付模块:

http://127.0.0.1/api/payment/payment/info/1

同样请求成功:

支付同样的也打印了SQL语句:

微服务框架的搭建就告一段落了,其他接口自行测试哦!代码已经提交git仓库

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。 &nbsp; 相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/mysql&nbsp;
相关文章
|
6月前
|
存储 缓存 负载均衡
Gateway 网关坑我! 被这个404 问题折腾了一年?
小富分享了一个困扰团队一年多的 SpringCloud Gateway 路由 404 问题。通过日志追踪和源码分析,发现是网关在 Nacos 配置更新后未能正确清理旧的路由权重缓存,导致负载均衡时仍使用已删除的路由数据。最终通过监听路由刷新事件并手动更新缓存,成功解决了问题。
1059 125
Gateway 网关坑我! 被这个404 问题折腾了一年?
|
9月前
|
安全 网络安全 网络虚拟化
配置总部采用冗余网关与分支建立IPSec隧道示例
本文介绍了企业总部与分支间通过公网通信的组网需求及配置思路。为提高可靠性,分支网关AR5可接入两台总部网关(AR2和AR3),并建立IPSec隧道保障通信安全。配置步骤包括:1) 配置接口IP地址与静态路由;2) 定义ACL保护数据流;3) 创建IPSec安全提议;4) 配置IKE对等体;5) 创建安全策略;6) 在接口应用安全策略组。最终通过ping测试与查看隧道状态验证配置结果,确保流量安全传输。
配置总部采用冗余网关与分支建立IPSec隧道示例
|
9月前
|
数据采集 人工智能 BI
MyEMS能源管理系统后台配置-网关管理
MyEMS开源能源管理系统支持建筑、工厂等场景的电、水、气数据采集与分析,具备光伏、储能、充电桩等扩展功能。本文介绍系统后台配置中的网关管理模块,包括查看、添加、编辑、删除、导入、导出及克隆网关的操作步骤,帮助用户高效管理能源数据采集设备。
194 0
|
5月前
|
机器学习/深度学习 Kubernetes API
【Azure APIM】自建网关(self-host gateway)收集请求的Header和Body内容到日志中的办法
在Azure API Management中,通过配置trace策略可完整记录API请求的Header和Body信息。在Inbound和Outbound策略中分别使用context.Request/Response.Headers和Body.As&lt;string&gt;方法捕获数据,并写入Trace日志,便于排查与审计。
187 8
|
8月前
|
数据采集 人工智能 监控
MyEMS 开源能源管理系统后台配置指南 —— 网关管理模块详解
开源能源管控系统面向建筑、工厂等场景的开源能源管理系统,支持电、水、气等数据采集与智能分析,并提供光伏监控、储能管理等功能模块。系统具备完善的网关管理功能,包括网关查看、添加、编辑、删除及批量操作,助力用户高效实现全链路能源管理。
367 1
|
7月前
|
安全 虚拟化
Omnissa Secure Email Gateway 2.33 - 电子邮件网关
Omnissa Secure Email Gateway 2.33 - 电子邮件网关
156 0
|
11月前
|
存储 Kubernetes 安全
Nacos-Controller 2.0:使用 Nacos 高效管理你的 K8s 配置
无论是使用 Nacos-Controller 实现配置的双向同步,还是直接在应用中接入 Nacos SDK 以获得更高级的配置管理特性,都能显著提升配置管理的灵活性、安全性和可维护性。使用 Nacos,您能够更好地管理和优化您的应用配置,从而提高系统的稳定性和可靠性。
908 50
|
11月前
|
存储 人工智能 测试技术
Nacos托管LangChain应用Prompts和配置,助力你的AI助手快速进化
AI 应用开发中,总有一些让人头疼的问题:敏感信息(比如 API-KEY)怎么安全存储?模型参数需要频繁调整怎么办?Prompt 模板改来改去,每次都得重启服务,太麻烦了!别急,今天我们就来聊聊如何用 Nacos 解决这些问题。
|
存储 网络协议 Nacos
高效搭建Nacos:实现微服务的服务注册与配置中心
Nacos(Dynamic Naming and Configuration Service)是阿里巴巴开源的一款动态服务发现、配置管理和服务管理平台。它旨在帮助开发者更轻松地构建、部署和管理分布式系统,特别是在微服务架构中。
2310 81
高效搭建Nacos:实现微服务的服务注册与配置中心
|
JSON Java Nacos
SpringCloud 应用 Nacos 配置中心注解
在 Spring Cloud 应用中可以非常低成本地集成 Nacos 实现配置动态刷新,在应用程序代码中通过 Spring 官方的注解 @Value 和 @ConfigurationProperties,引用 Spring enviroment 上下文中的属性值,这种用法的最大优点是无代码层面侵入性,但也存在诸多限制,为了解决问题,提升应用接入 Nacos 配置中心的易用性,Spring Cloud Alibaba 发布一套全新的 Nacos 配置中心的注解。
1570 142

热门文章

最新文章