Rainbond 部署SpringCloud微服务架构业务实践

本文涉及的产品
云原生网关 MSE Higress,422元/月
任务调度 XXL-JOB 版免费试用,400 元额度,开发版规格
注册配置 MSE Nacos/ZooKeeper,118元/月
简介: SpringCloud架构作为目前业界使用最广的微服务架构模式,其后期运维交付问题较多。如何使用Rainbond来解决SpringCloud微服务架构在交付运维阶段的难题,本文将以实践的方式来阐述。

示例项目详情

本文档以Pig 快速开发框架为例,演示如何在Rainbond上部署一套完整的Spring Cloud项目。

Pig Microservice Architecture V2.1.0:

  • 基于 Spring Cloud Finchley 、Spring Security OAuth2 的RBAC权限管理系统
  • 基于数据驱动视图的理念封装 Element-ui,即使没有 vue 的使用经验也能快速上手
  • 提供对常见容器化支持 Docker、Kubernetes、Rancher2 支持
  • 提供 lambda 、stream api 、webflux 的生产实践

模块说明:

pig
├── pig-ui -- 前端工程[80]
├── pig-auth -- 授权服务提供[3000]
└── pig-common -- 系统公共模块
     ├── pig-common-core -- 公共工具类核心包
     ├── pig-common-log -- 日志服务
     └── pig-common-security -- 安全工具类
├── pig-config -- 配置中心[8888]
├── pig-eureka -- 服务注册与发现[8761]
├── pig-gateway -- Spring Cloud Gateway网关[9999]
└── pig-upms -- 通用用户权限管理模块
     └── pigx-upms-api -- 通用用户权限管理系统公共api模块
     └── pigx-upms-biz -- 通用用户权限管理系统业务处理模块[4000]
└── pigx-visual  -- 图形化模块
     ├── pigx-monitor -- Spring Boot Admin监控 [5001]
     └── pigx-codegen -- 图形化代码生成[5003]
     └── pigx-zipkin -- 微服务链路跟踪[5002]

上述的模块,可以分为类库与服务两类,读者可以对比自己的Spring Cloud项目:

  • 构建后产生jar包,用来实现各种功能的类的集合,即是类库,如Pig中的pig-common模块
  • 构建后产生jar包或者war包,通过 java -jar 或者tomcat等方式启动,开放某个端口提供服务的,即是服务,如Pig中的pig-eureka模块

{{% notice note %}}
只需要将服务模块在Rainbond中构建出来即可。
{{% /notice %}}

经过梳理,该项目需要构建的服务组件包括:

启动顺序 服务组件名称 运行端口 组件功能
1 pig-eureka 8761 spring cloud 服务发现注册与发现
2 pig-config 8888 spring cloud 配置中心
3 pig-gateway 9999 spring cloud 微服务网关
4 pig-auth 3000 授权服务提供
5 pig-upms-biz 4000 通用用户权限管理系统业务处理模块
6 pig-monitor 5001 Spring Boot Admin监控
7 pig-codegen 5003 图形化代码生成
8 pig-zipkin 5002 微服务链路跟踪
9 pig-ui 80 前端项目(vue项目)

部署环境说明:

部署pig,需要以下环境支持:

中间件或环境要求 版本要求 备注
JDK 1.8 强制要求版本
MySQL 5.7+ 强制要求版本
Redis 3.2 + 强制要求版本
node 8.0 + 用于运行前端项目
npm 6.0 + 用于构建前端项目

项目链接:

模块构建

新建应用,并命名为 spring-cloud

获取项目克隆/下载地址: https://gitee.com/log4j/pig.git

以pig-eureka为例,演示从源码开始构建流程:

  • spring-cloud 添加服务组件 —— 从源码开始 —— 自定义仓库:

spring-cloud-case-1.png

点击 新建服务,Rainbond会自动拉取代码,并根据代码根目录下的 pom.xml 自动将代码语言识别为 Java-maven。取消 并构建启动 选项:

spring-cloud-case-2.png

  • 点击 创建,进入服务组件未部署的页面。编辑 端口 选项卡,开放 pig-eureka 自身端口 8761

pig-eureka 需要被其它微服务组件访问以进行注册,所以打开对内服务,以便之后创建依赖关系。该组件也提供web页面,显示微服务组件的注册情况与健康情况,所以打开对外服务,以便外部访问。

spring-cloud-case-3.png

  • 编辑 构建源 选项卡,指定 pig-eureka 构建参数:

由于 Pig 本身是一个多模块的项目,所以需要指定当前服务组件构建的模块。指定的方式是在 构建运行环境设置 中的 Maven构建全局参数:clean dependency:list install -pl pig-eureka -am

{{% notice note %}}
上述的参数指定了普通的子模块构建方式,对于另一种子模块中的子模块,比如 pig-codegen 模块,参数指定的方式为: clean dependency:list install -pl pig-visual/pig-codegen -am
{{% /notice %}}

在v5.1+版本的Rainbond中,可以指定当前服务组件的启动命令。指定的方式是在 构建运行环境设置 中的 启动命令:web: java $JAVA_OPTS -Djava.security.egd=file:/dev/./urandom -jar /app/pig-eureka/target/*.jar ,命令格式与 Procfile 一致。

spring-cloud-case-4.png

  • 编辑 依赖 选项卡,指定当前服务组件依赖其它服务组件:

各个服务组件之间的依赖关系,可以在创建时指定。所有的 spring cloud 微服务组件都需要依赖 pig-eureka,以 pig-gateway为例,应添加依赖关系如下:

spring-cloud-case-5.png

  • 所有的设置完成后,即可点击 构建 ,构建完成后,服务组件将自动运行起来。
  • 将所有服务组件依次部署完成。

部署 Mysql

Pig 微服务项目需要部署 Mysql 5.7+ 作为数据源。并在代码仓库中提供了数据库初始化脚本: https://gitee.com/log4j/pig/blob/master/db/pig.sql

为了能够在数据库启动时即加载初始化脚本,制作了一份 Dockerfile:

https://github.com/dazuimao1990/percona-mysql/blob/pig/5.7/Dockerfile

FROM percona:5.7.23-stretch
LABEL creater="barnett"
ENV MYSQL_VERSION=5.7.23
ENV TZ=Asia/Shanghai
ADD docker-entrypoint.sh /run/docker-entrypoint.sh
ADD ./run/docker-entrypoint.sh /usr/local/bin/docker-entrypoint.sh
ADD ./run/mysqld.cnf /etc/mysql/percona-server.conf.d/mysqld.cnf
RUN fetchDeps=' \
        ca-certificates \
        wget \
    '; \
    sed -i 's/deb.debian.org/mirrors.ustc.edu.cn/g' /etc/apt/sources.list; \
    apt-get update; \
    apt-get install -y --no-install-recommends $fetchDeps; \
    rm -rf /var/lib/apt/lists/*; \
    wget -O /usr/local/bin/env2file -q https://github.com/barnettZQG/env2file/releases/download/v0.1/env2file-linux; \
    chmod +x /run/docker-entrypoint.sh && chmod +x /usr/local/bin/env2file; \
    apt-get purge -y --auto-remove $fetchDeps
EXPOSE 3306
VOLUME ["/var/lib/mysql", "/var/log/mysql"]
# 将代码仓库中 sql 目录下的脚本放到对应的初始化目录下
COPY sql/*.sql /docker-entrypoint-initdb.d/
# change ENTRYPOINT exec some custom command
ENTRYPOINT [ "/run/docker-entrypoint.sh" ]
CMD [ "mysqld" ]
  • spring-cloud 添加服务组件 —— 从源码开始 —— 自定义仓库:

将服务组件命名为 pig-db,并指定代码分支 pig

在代码仓库地址url的最后添加 ?dir=5.7 可以让Rainbond将构建目录指定为代码仓库根目录下的 5.7 文件夹。

spring-cloud-case-6.png

为了让数据库正常工作,并且可以被其它依赖的本数据库的应用获取连接信息,需要设置若干环境变量:

环境变量名称 环境变量值 设置位置
MYSQL_USER root 连接信息
MYSQL_HOST 127.0.0.1 连接信息
MYSQL_PORT 3306 连接信息
MYSQL_ROOT_PASSWORD mysqlpassword 连接信息
MYSQL_DATABASE pig 连接信息

通过修改 pig-config 中的配置文件,来定义多个微服务组件连接数据库的配置:

pig/pig-config/src/main/resources/config/pigx-auth-dev.yml
pig/pig-config/src/main/resources/config/pigx-upms-dev.yml  
pig/pig-config/src/main/resources/config/pigx-codegen-dev.yml
pig/pig-config/src/main/resources/config/pigx-zipkin-dev.yml.yml

修改示例如下:

# 数据源
spring:
  datasource:
    type: com.zaxxer.hikari.HikariDataSource
    driver-class-name: com.mysql.jdbc.Driver
    username: ${MYSQL_USER}
    password: ${MYSQL_ROOT_PASSWORD}
    url: jdbc:mysql://${MYSQL_HOST}:${MYSQL_PORT}/${MYSQL_DATABASE}?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=Asia/Shanghai

部署 Redis

通过Rainbond应用市场,可以直接安装 Redis 4.0.13。

该版本Redis默认提供连接信息:

spring-cloud-case-7.png

通过修改 pig-config 中的 pig/pig-config/src/main/resources/config/application-dev.yml 来定义所有服务组件连接Redis的配置:

修改示例如下:

# Spring 相关
spring:
  redis:
    password: ${REDIS_PASS}
    host: ${REDIS_HOST}

部署 pig-ui

pig-ui 是一个由nodejs语言编写的 vue项目,作为整个系统的前端静态页面。Rainbond目前已经支持源码构建 nodejs前端 项目,参考文档:NodeJS前端语言

为了便于改造项目,所以将项目 fork 了一份进行修改,代码地址:https://gitee.com/dazuimao1990/pig-ui

参照Rainbond代码支持规范,在代码根目录下添加了识别文件: nodestatic.json

{"path":"dist"}

并在代码仓库中添加了nginx配置文件: www/web.conf 用于处理代理转发:

server {
    listen       80;
    root   /app/www;
    
    location ~* ^/(code|auth|admin|gen) {
        proxy_pass http://127.0.0.1:9999;
        proxy_connect_timeout 15s;
        proxy_send_timeout 15s;
        proxy_read_timeout 15s;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

利用这份代码进行源码构建,即可完成 pig-ui 服务组件的部署。

依赖与端口梳理

服务组件名称 依赖 端口对内服务 端口对外服务
pig-ui pig-gateway off on
pig-gateway pig-eureka Redis on off
pig-monitor pig-eureka Redis off off
pig-config pig-eureka off off
pig-upms-biz pig-eureka pig-db Redis off off
pig-zipkin pig-eureka pig-db Redis off on
pig-auth pig-eureka Redis off off
pig-codegen pig-eureka pig-db Redis off off

最终成果

完成部署后,拓扑图如下:

spring-cloud-case-8.png

登陆效果:

spring-cloud-case-9.png

登陆账户密码:
admin
123456
相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
相关文章
|
4天前
|
Kubernetes 监控 Serverless
基于阿里云Serverless Kubernetes(ASK)的无服务器架构设计与实践
无服务器架构(Serverless Architecture)在云原生技术中备受关注,开发者只需专注于业务逻辑,无需管理服务器。阿里云Serverless Kubernetes(ASK)是基于Kubernetes的托管服务,提供极致弹性和按需付费能力。本文深入探讨如何使用ASK设计和实现无服务器架构,涵盖事件驱动、自动扩展、无状态设计、监控与日志及成本优化等方面,并通过图片处理服务案例展示具体实践,帮助构建高效可靠的无服务器应用。
|
4天前
|
监控 Kubernetes Cloud Native
基于阿里云容器服务Kubernetes版(ACK)的微服务架构设计与实践
本文介绍了如何基于阿里云容器服务Kubernetes版(ACK)设计和实现微服务架构。首先概述了微服务架构的优势与挑战,如模块化、可扩展性及技术多样性。接着详细描述了ACK的核心功能,包括集群管理、应用管理、网络与安全、监控与日志等。在设计基于ACK的微服务架构时,需考虑服务拆分、通信、发现与负载均衡、配置管理、监控与日志以及CI/CD等方面。通过一个电商应用案例,展示了用户服务、商品服务、订单服务和支付服务的具体部署步骤。最后总结了ACK为微服务架构提供的强大支持,帮助应对各种挑战,构建高效可靠的云原生应用。
|
17天前
|
存储 SQL 监控
转转平台IM系统架构设计与实践(二):详细设计与实现
以转转IM架构为起点,介绍IM相关组件以及组件间的关系;以IM登陆和发消息的数据流转为跑道,介绍IM静态数据结构、登陆和发消息时的动态数据变化;以IM常见问题为风景,介绍保证IM实时性、可靠性、一致性的一般方案;以高可用、高并发为终点,介绍保证IM系统稳定及性能的小技巧。
28 6
|
2月前
|
存储 缓存 关系型数据库
社交软件红包技术解密(六):微信红包系统的存储层架构演进实践
微信红包本质是小额资金在用户帐户流转,有发、抢、拆三大步骤。在这个过程中对事务有高要求,所以订单最终要基于传统的RDBMS,这方面是它的强项,最终订单的存储使用互联网行业最通用的MySQL数据库。支持事务、成熟稳定,我们的团队在MySQL上有长期技术积累。但是传统数据库的扩展性有局限,需要通过架构解决。
73 18
|
2天前
|
监控 Cloud Native Java
基于阿里云容器服务(ACK)的微服务架构设计与实践
本文介绍如何利用阿里云容器服务Kubernetes版(ACK)构建高可用、可扩展的微服务架构。通过电商平台案例,展示基于Java(Spring Boot)、Docker、Nacos等技术的开发、容器化、部署流程,涵盖服务注册、API网关、监控日志及性能优化实践,帮助企业实现云原生转型。
|
2月前
|
搜索推荐 NoSQL Java
微服务架构设计与实践:用Spring Cloud实现抖音的推荐系统
本文基于Spring Cloud实现了一个简化的抖音推荐系统,涵盖用户行为管理、视频资源管理、个性化推荐和实时数据处理四大核心功能。通过Eureka进行服务注册与发现,使用Feign实现服务间调用,并借助Redis缓存用户画像,Kafka传递用户行为数据。文章详细介绍了项目搭建、服务创建及配置过程,包括用户服务、视频服务、推荐服务和数据处理服务的开发步骤。最后,通过业务测试验证了系统的功能,并引入Resilience4j实现服务降级,确保系统在部分服务故障时仍能正常运行。此示例旨在帮助读者理解微服务架构的设计思路与实践方法。
115 17
|
2月前
|
存储 消息中间件 小程序
转转平台IM系统架构设计与实践(一):整体架构设计
本文描述了转转IM为整个平台提供的支撑能力,给出了系统的整体架构设计,分析了系统架构的特性。
79 10
|
2月前
|
负载均衡 Serverless 持续交付
云端问道9期实践教学-省心省钱的云上Serverless高可用架构
详细介绍了云上Serverless高可用架构的一键部署流程
64 10
|
2月前
|
存储 人工智能 运维
面向AI的服务器计算软硬件架构实践和创新
阿里云在新一代通用计算服务器设计中,针对处理器核心数迅速增长(2024年超100核)、超多核心带来的业务和硬件挑战、网络IO与CPU性能增速不匹配、服务器物理机型复杂等问题,推出了磐久F系列通用计算服务器。该系列服务器采用单路设计减少爆炸半径,优化散热支持600瓦TDP,并实现CIPU节点比例灵活配比及部件模块化可插拔设计,提升运维效率和客户响应速度。此外,还介绍了面向AI的服务器架构挑战与软硬件结合创新,包括内存墙问题、板级工程能力挑战以及AI Infra 2.0服务器的开放架构特点。最后,探讨了大模型高效推理中的显存优化和量化压缩技术,旨在降低部署成本并提高系统效率。
|
3月前
|
运维 监控 安全
天财商龙:云上卓越架构治理实践
天财商龙成立于1998年,专注于为餐饮企业提供信息化解决方案,涵盖点餐、收银、供应链和会员系统等。自2013年起逐步实现业务上云,与阿里云合作至今已十年。通过采用阿里云的WA体系,公司在账号管理、安全保障、监控体系和成本管控等方面进行了全面优化,提升了业务稳定性与安全性,并实现了显著的成本节约。未来,公司将持续探索智能化和全球化发展,进一步提升餐饮行业的数字化水平。