微服务实践1_微服务选型以及手把手部署若依微服务框架

微信公众号:[执着猿哥]
记录和分享java、springcloud等企业级编码技术知识。有问题或建议和源码,请关注公众号。

前言描述

​ 自从微服务开始,碰到越来越多甲方必须采用微服务框架,且Alibaba发布微服务组件后更要使用。 目前因为SpringCloud与SpringBoot更新迭代非常频繁,所以Alibaba版本也进行很多更新迭代。若是版本选择有问题, 会导致开发中调试兼容性占用非常多的没必要时间。

​ 所以本系列通过开源微服务框架【若依微服务】结合自身实际企业开发进行系统性梳理,好记忆不如烂笔头(__)

微架构及选型

查看SpringCloud Alibaba官网版本,选择【毕业版本依赖关系(推荐使用)】中推荐版本

微信图片_20220503124419

微信图片_20220503124835

所以选型定位:

Spring Cloud VersionSpring Cloud Alibaba VersionSpring Boot VersionNacos Version
Spring Cloud 2021.0.12021.0.1.02.6.31.4.2

目前nacos的最新版本是2.0.4, nacos server2.x 向下兼容nacos客户端。所以nacos server 选2.0.4,客户端选nacos -clien 1.4.2

查看Nacos2升级文档介绍如下

同步若依微服务源码

访问https://gitee.com/chenjinafan_admin/RuoYi-Cloud,Forked若依微服务源码。这边要思考下:如果一边修改若依源码,另外一边还需同步若依作者新增的功能,要如何实现?在分支上做二开,在master主分支上做若依同步,如果master同步功能下来,把master分支合并到master-dev 二开分支

1、通过TortoiseGit小乌龟拉取Forked

微信图片_20220503131728

2、通过TortoiseGit 创建名为:master-dev的分支做二开,点击【确定】按钮创建分支,并提交代码

微信图片_20220503131756

微信图片_20220503131825

​ 3、通过TortoiseGit 切换分支,在分支上做二开

​ 4、在仓库左上角有个刷新的图片,点击刷新

image-20220410153057375

​ 提示如下,点击【确定】同步

image-20220410154345235 image-20220410154430875

5、在仓库功能菜单栏【Pull Request】 弹出pull Request框,按如下选择,点击合并到dev分支,审核和测试通过话,合并成功

image-20220410154734119

6、 合并选择,扁平化分支,点击【接受Pull Request】 进行合并。

111111

若依 微服务版本选型分析

​ 查看 RuoYi-Cloud 根目录下的pom.xml文件可看到如下版本号

image-20220423133605242

可知道若依微服务选型如下:

​ spring-cloud的版本号是 2021.0.1,springcloudalibaba版本号是2021.1,springboot版本是2.6.6,这个跟之前的选的版本一样,但是目前若依微服务nacos客户端是2.0.4的版本,会一直报链接127.0.0.1:9848的问题(nacos2.x版本新增的grpc功能),所以我们可手动降低版本到nacos-clen1.4.2版本。先查看下官网对包介绍

com.ruoyi     
├── ruoyi-ui              // 前端框架 [80]
├── ruoyi-gateway         // 网关模块 [8080]
├── ruoyi-auth            // 认证中心 [9200]
├── ruoyi-api             // 接口模块
│       └── ruoyi-api-system                          // 系统接口
├── ruoyi-common          // 通用模块
│       └── ruoyi-common-core                         // 核心模块
│       └── ruoyi-common-datascope                    // 权限范围
│       └── ruoyi-common-datasource                   // 多数据源
│       └── ruoyi-common-log                          // 日志记录
│       └── ruoyi-common-redis                        // 缓存服务
│       └── ruoyi-common-security                     // 安全模块
│       └── ruoyi-common-swagger                      // 系统接口
├── ruoyi-modules         // 业务模块
│       └── ruoyi-system                              // 系统模块 [9201]
│       └── ruoyi-gen                                 // 代码生成 [9202]
│       └── ruoyi-job                                 // 定时任务 [9203]
│       └── ruoyi-file                                // 文件服务 [9300]
├── ruoyi-visual          // 图形化管理模块
│       └── ruoyi-visual-monitor                      // 监控中心 [9100]
├──pom.xml                // 公共依赖

打开运行基础模块(启动没有先后顺序)

  • RuoYiGatewayApplication (网关模块 必须)

  • RuoYiAuthApplication (认证模块 必须)

  • RuoYiSystemApplication (系统模块 必须)

  • RuoYiMonitorApplication (监控中心 可选)

  • RuoYiGenApplication (代码生成 可选)

  • RuoYiJobApplication (定时任务 可选)

  • RuoYFileApplication (文件服务 可选)

    集成seata分布式事务(可选配置,默认不启用)

安装软件推荐

JDK >= 1.8 (推荐1.8版本)
Mysql >= 5.7.0 (官网推荐5.7版本) 直接安装到mysql8,有问题直接适配
Redis >= 3.0  使用6.x
Maven >= 3.0
Node >= 12
nacos >= 1.1.0 (ruoyi-cloud >= 3.0.0需要下载nacos >= 2.x.x版本) 不影响,看阿里巴巴官网毕业版本,本教程使用nacos cline 1.4.2 ,nacosserver 2.0.4
sentinel >= 1.6.0 使用1.8.3

服务器centos7.8部署

提供docker部署msyql8、redis6.x nacos_server 2.0.4 脚本

mysql8

云服务器安全组开放端 10098

docker  run --name  mysq8db -p 10098:3306 -e MYSQL_ROOT_PASSWORD=qr12qga6553 -d -v /home/mysql/:/var/lib/mysql mysql:8.0 --lower_case_table_names=1
  1. -v /home/mysql/:/var/lib/mysql 把mysql8 存储路径挂载到主机/home/mysql/目录

  2. MYSQL_ROOT_PASSWORD=qr12qga6553 数据库密码,默认用户root

  3. lower_case_table_names=1 忽略大小写

  4. 使用 Navicat 链接数据库,并创建数据库【ry_config】,导入若依微服务中nacos数据库脚本:ry_config_20220114.sql,如图:

image-20220427114848504

image-20220426231932965

image-20220427115007714

nacos server 2.0.4

​ 创建临时nacos镜像,用来拷贝配置和日志目录

docker run -p 8848:8848 --name nacos24 -d nacos/nacos-server:v2.0.4

​ 创建临时nacos镜像,用来拷贝配置和日志目录

docker cp nacos24:/home/nacos/logs/ /home/nacos1
docker cp nacos24:/home/nacos/conf/ /home/nacos1
#删掉临时容器
docker stop nacos24
docker rm nacos24

​ 更改nacos数据库配置

server.port=8848
#开启数据库
db.num=1
### Connect URL of DB:
#更改数据连接参
db.url.0=jdbc:mysql://xx.xx.216.8:3361/ry-config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC
db.user.0=root
db.password.0=abaf78/

​ 启动正式nacos,其中standalone是单机模式,挂载log和conf配置目录。并验证启动是否成功:http://ip:port:8848/nacos。注意如果是云服务器都要再安全组里面开启端口:8848、9848、9849

   docker run -d\
    --name nacos24\
    -e MODE='standalone'\
     -e TZ="Asia/Shanghai"\
    -v /home/nacos1/logs:/home/nacos/logs \
    -v /home/nacos1/conf:/home/nacos/conf \
    -p 8848:8848\
    -p 9848:9848\
    -p 9849:9849\
    --restart=always \
    nacos/nacos-server:v2.0.4

redis6.2.7

​ 云服务器安全组开放63719端口

docker run   --restart always -d --name redis627    -p 63719:6379 redis:6.2.7 

若依 微服务版云服务器部署

​ 本教程先按最小化部署到云服务上: ruoyi-gateway(Api网关)、ruoyi-auth(用户认证)、ruoyi-system(用户/授权等系统模块)、 ruoyi-ui(前端PC)。采用最基础的jar包方式部署应用,并改造:使用assembly maven插件把工程配置和依赖包移除jar包,并放到外部,执行脚本的时候读取配置文件和依赖。

改造ruoyi-gateway(Api网关)工程

​ 改造涉及到ruoyi-gateway(Api网关)、ruoyi-auth(用户认证)、ruoyi-system(用户/授权等系统模块),目前按ruoyi-gateway为案例,余下都是一样的。

​ 1. 更改前pom.xml

 ```
 #如下是若依微服务自带的编辑脚本
 <build>
         <finalName>${project.artifactId}</finalName>
         <plugins>
             <plugin>
                 <groupId>org.springframework.boot</groupId>
                 <artifactId>spring-boot-maven-plugin</artifactId>
                 <executions>
                     <execution>
                         <goals>
                             <goal>repackage</goal>
                         </goals>
                     </execution>
                 </executions>
             </plugin>
         </plugins>
     </build>
     ```

#更改后的pom.xml

<!-- 打包脚本 -->
	<build>
		<finalName>${project.artifactId}</finalName>
		<extensions>
			<extension>
				<groupId>org.apache.maven.wagon</groupId>
				<artifactId>wagon-ssh</artifactId>
				<version>2.8</version>
			</extension>
		</extensions>
		<plugins>
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-compiler-plugin</artifactId>
				<configuration>
					<source>${java.version}</source>
					<target>${java.version}</target>
					<encoding>${project.build.sourceEncoding}</encoding>
				</configuration>
			</plugin>
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-jar-plugin</artifactId>
				<configuration>
                    
                     <excludes>
                        <!--注意这玩意默认从编译结果目录开始算目录结构-->
                        <exclude>bootstrap.yml</exclude>
                        <exclude>logback.xml</exclude>
                    </excludes>
					<archive>
						<!-- 生成的jar中,不要包含pom.xml和pom.properties这两个文件 -->
						<addMavenDescriptor>false</addMavenDescriptor>
						<manifest>
							<addClasspath>true</addClasspath>
							<classpathPrefix>lib/</classpathPrefix>
							<mainClass>com.ruoyi.gateway.RuoYiGatewayApplication</mainClass>
						</manifest>
					</archive>
				</configuration>
			</plugin>
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-surefire-plugin</artifactId>
				<configuration>
					<skipTests>true</skipTests>
				</configuration>
			</plugin>
			<!-- 打包范本 -->
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-assembly-plugin</artifactId>
				<configuration>
					<descriptors>
						<descriptor>${project.basedir}/src/main/assembly/package.xml</descriptor>
					</descriptors>
				</configuration>
				<executions>
					<execution>
						<id>make-assembly</id>
						<phase>package</phase>
						<goals>
							<goal>single</goal>
						</goals>
					</execution>
				</executions>
			</plugin>
		</plugins>
	</build>

mainClass: 替换成模块中 springboot启动的那个 com.ruoyi.auth.RuoYiAuthApplication

maven-assembly-plugin插件:descriptor指定打包配置文件package.xml 存放路径,把package.xml文件放在此工程目录下

image-20220503201012103

package.xml脚本中主要描述是打包操作,可以详细读下,包含:配置、依赖和执行脚本文件位置存放,以及压缩打包。

2 执行脚本编写,

​ 当前脚本再打包后都会打包压缩包里面,每个模块主要是更改 ”APP_NAME=ruoyi-auth.jar‘ 中的值。存放在:ruoyi–gateway–src–main–bin,如果bin目录没有手动创建。脚本如下

#!/bin/bash
cd ../
workdir=$(cd $(dirname $0); pwd)
#这里可替换为你自己的执行程序,其他代码无更改
APP_NAME=ruoyi-gateway.jar
HEAP_DUMP_LOG=../logs/
JAVA_OPTIONS="-server -Xrs -Xmx2g -Xms2g -Xmn512m -Xss256k -XX:+PrintGCDetails -XX:+DisableExplicitGC -XX:+UseConcMarkSweepGC -XX:+CMSParallelRemarkEnabled -XX:+UseCMSCompactAtFullCollection -XX:LargePageSizeInBytes=128m -XX:+UseFastAccessorMethods -XX:+UseCMSInitiatingOccupancyOnly -XX:CMSInitiatingOccupancyFraction=70 -XX:SurvivorRatio=8 -Xverify:none -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=${HEAP_DUMP_LOG} -Djava.net.preferIPv4Stack=true -Djava.security.egd=file:/dev/./urandom -Dfile.encoding=UTF8"
#使用说明,用来提示输入参
usage() {
 echo "Usage: sh app.sh [start|stop|restart|status]"
 exit 1
}
#查程序是否在运行
is_exist(){
pid=`ps -ef|grep $APP_NAME|grep -v grep|awk '{print $2}' `
#如果不存在返1,存在返0
if [ -z "${pid}" ]; then
return 1
else
 return 0
fi
}
#启动方法
start(){
is_exist
if [ $? -eq "0" ]; then
 echo "${APP_NAME} is already running. pid=${pid} ."
else
 nohup java ${JAVA_OPTIONS} -jar ${workdir}/${APP_NAME} >/dev/null 2>&1 &

 echo "${APP_NAME} start success"
fi
}
#停止方法
stop(){
is_exist
if [ $? -eq "0" ]; then
 kill -9 $pid
else
 echo "${APP_NAME} is not running"
fi
}
#输出运行�??????
status(){
is_exist
if [ $? -eq "0" ]; then
 echo "${APP_NAME} is running. Pid is ${pid}"
else
 echo "${APP_NAME} is NOT running."
fi
}
#重启
restart(){
stop
start
}
#根据输入参数,择执行对应方法,不输入则执行使用说
case "$1" in
"start")
 start
 ;;
"stop")
 stop
 ;;
"status")
 status
 ;;
"restart")
 restart
 ;;
*)
 usage
 ;;
esac

如上脚本执行命令如下:

 ```
 sh  app.sh  start  启动
 sh  app.sh  restart  重启
 sh  app.sh  status   查看启动状态
 ```

涉及到改造已完成,另外的模块可按一样的方法改造。最终包结构

image-20220505115836008

打包后的压缩包结构:

image-20220505134004296

部署云服务器

把目前都改造的完成的模块上传到服务器

image-20220505135409255

1.ruoyi-gateway(Api网关)

​ 进入config目录,查看logback.xml和bootstrap.yml 两个文件,logback.xml是日志配置文件保持默认即可,主要修改bootstrap.yml下配置

# Tomcat
server:
  port: 8080
# Spring
spring: 
  application:
    # 应用名称
    name: ruoyi-gateway
  profiles:
    # 环境配置
    active: dev
  main:
    allow-circular-references: true
    allow-bean-definition-overriding: true
  cloud:
    nacos:
      discovery:
        # 服务注册地址
        server-addr: 127.0.0.1:8848
      config:
        # 配置中心地址
        server-addr: 127.0.0.1:8848
        # 配置文件格式
        file-extension: yml
        # 共享配置
        shared-configs:
          - application-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}
.....
  1. 服务注册和配置地址都是:127.0.0.1:8848,这个是因为项目工程和nacos都部署在同一台服务器上,如果部署在不同服务器上,要保障nacos和项目工程都在同一个局域网能够互通。暂时不使用nacos 命名空间。

  2. 工程配置文件:ruoyi-gateway-dev.yml

  3. 共享配置文件: application- s p r i n g . p r o f i l e s . a c t i v e . {spring.profiles.active}. spring.profiles.active.{spring.cloud.nacos.config.file-extension}转化 application-dev.yml

修改ruoyi-gateway-dev.yml 关于redis、日志配置

spring:
redis:
  host: 127.0.0.1
  port: 63719
  password: 
  ...
#logging和spring同级  
logging:
config: file:config/logback.xml       

启动ruoyi-gateway

cd  /opt/cloud/ruoyi-gateway/bin
sh app.sh start 
如果执行脚本报如下错误
No such file or directory
app.sh: line 9: syntax error near unexpected token $'{\r'' 'pp.sh: line 9: usage() {

执行如下语句解决

sed -i 's/\r//g' app.sh 

进入/opt/cloud/ruoyi-gateway/logs,执行如下shell脚本,如显示如下图片,则部署成功。

tail -f info.log

image-20220505161238963

访问路径地址:http://ip:8080/swagger-ui/index.html

8080端口要云服务器安全组开放端口,才能访问

2 ruoyi-auth(用户认证)

​ 进入config目录,查看logback.xml和bootstrap.yml 两个文件,修改bootstrap.yml下nacos地址

  cloud:
    nacos:
      discovery:
        # 服务注册地址
        server-addr: 127.0.0.1:8848
      config:
        # 配置中心地址
        server-addr: 127.0.0.1:8848
        # 配置文件格式
        file-extension: yml
        # 共享配置
        shared-configs:
          - application-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}

修改ruoyi-gateway-dev.yml 关于redis、日志配置

spring:
  redis:
    host: 127.0.0.1
    port: 63719
    password: 
    ...
#logging和spring同级  
logging:
  config: file:config/logback.xml

启动ruoyi-auth

cd  /opt/cloud/ruoyi-auth/bin
sh app.sh start 

进入/opt/cloud/ruoyi-auth/logs,执行如下shell脚本,查看日志是否部署成功。

3 ruoyi-system(用户/授权等系统模块)

进入config目录,查看logback.xml和bootstrap.yml 两个文件,修改bootstrap.yml下nacos地址

  cloud:
    nacos:
      discovery:
        # 服务注册地址
        server-addr: 127.0.0.1:8848
      config:
        # 配置中心地址
        server-addr: 127.0.0.1:8848
        # 配置文件格式
        file-extension: yml
        # 共享配置
        shared-configs:
          - application-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}

修改ruoyi-system-dev.yml 关于redis、日志配置、数据库

spring:
  redis:
    host: 127.0.0.1
    port: 63719
    password: 
    ...
    
    dynamic:
      ....
        datasource:
          # 主库数据源
          master:
            driver-class-name: com.mysql.cj.jdbc.Driver
            url: jdbc:mysql://127.0.0.1:10098/ry-cloud?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
            username: root
            password: qr12qga6553
#logging和spring同级  
logging:
  config: file:config/logback.xml

​ 链接数据库,创建ry-cloud库表,把若依数据库脚本导入到数据库中 D:\open\RuoYi-Cloud\sql\ry_20210908.sql

image-20220505171508010

启动 ruoyi-system

cd  /opt/cloud/ruoyi-modules-system/bin
sh app.sh start 

进入/opt/cloud/ruoyi-modules-system/logs,执行如下shell脚本,查看日志是否部署成功。

4 ruoyi-ui(前端PC)

​ centos7.x 安装nginx

1.将nginx放到yum repro库中
 rpm -ivh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
2.使用yum安装ngnix
 yum install nginx
3.启动nginx
 systemctl stop nginx.service
4.开机启动nginx
 systemctl enable nginx.service

​ ningx默认端口80,腾讯云服务器开启端口访问

image-20220505173533538

​ 前端打包

# 打包正式环境
npm install --registry=https://registry.npm.taobao.org
npm install 
npm run build:prod

​ 构建打包成功之后,会在根目录生成 ruoyi 文件夹,里面就是构建打包好的文件。把ruoyi目录上传到服务器/usr/share/nginx/html 目录下

image-20220505222153875

​ 修改nginx 的配置文件

```shell
vi /etc/nginx/nginx.conf
#参数修改如下
....
   server {
        listen       80 default_server;
        listen       [::]:80 default_server;
        .......

        # 前端pc
          location / {
            root   /usr/share/nginx/html/ruoyi;
                        try_files $uri $uri/ /index.html;
            index  index.html index.htm;
        }

       # 转发网关地址
        location /prod-api/ {
			proxy_set_header Host $http_host;
			proxy_set_header X-Real-IP $remote_addr;
			proxy_set_header REMOTE-HOST $remote_addr;
			proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
			proxy_pass http://localhost:8080/;
		}
.......

```

重启nginx

systemctl restart  nginx.service

访问网页地址:http://ip:80/,点击登录。服务器部署都没问题,本地部署大概率都是没问题的了,

image-20220505223410880


  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值