我用 Mac M1 玩转 Spring Cloud
我的开源 Spring Cloud 项目 PassJava
可以在 Windows 上正常运行,最近不是换 Mac M1了么,想把这个项目在 M1 上跑起来,毕竟我的那台 Windows 用起来发烫,是该体验下 M1 的性能了。
因为 M1
的兼容性不好,所以在从 0 开始跑这个项目的遇到了很多问题,比如 MySQL 工具经常打不开,前端 Vue 项目起不来,所以专门针对这些疑难杂症,我也做好了记录,相信对使用 M1 的同学有帮助。
我把后端、前端、小程序都上传到同一个仓库里面了,大家可以通过 github 或 码云访问。地址如下:
Github: https://github.com/Jackson0714/PassJava-Platform
码云:https://gitee.com/jayh2018/PassJava-Platform
配套教程:www.passjava.cn
整体的架构图如下图所示:

本文主要内容如下:

一、配置 Nacos
Nacos 作为配置中心和注册中心,是必须要启动的。
1.1 下载地址
1.1.1 省心方案
和 PassJava 项目配套使用的 Nacos 软件地址如下,各个配置项已经在 Nacos 中配置好了,省时省力。
链接: https://pan.baidu.com/s/16gddwQGbV4Lh92rI86PVpg
提取码: mjt6
解压密码:passjava
启动方式也在压缩包的根目录下。
当然这里面的配置项,比如 MySQL、Redis、OSS 都是我自己的账号和密码,你需要改成你自己的~
1.1.2 DIY 方案
如果你想全部自己配置一遍 Nacos,深度学习 Nacos 怎么玩的,可以参考这篇 Nacos 配置教程:
Nacos 官网下载地址:
https://github.com/alibaba/nacos/releases
最新版是 2.0.0-bugfix,我下载后,启动成功了,但是无法访问 Nacos 后台,怀疑是本地环境有问题,所以换了一个低版本的 1.4.1,可以正常工作。另外我之前在 windows 机器上使用的 1.2.1 的版本,拷贝到 Mac 上也能正常运行。

1.2 启动 Nacos
进入 nacos 根目录,执行命令:
sh startup.sh -m standalone
执行后的结果如下图所示:
看到 nacos is starting withi standalone 就表示启动成功。注意:启动成功不代表正常运行。

接下来访问 nacos 的后台管理系统:
http://127.0.0.1:8848/nacos/#/login

账号和密码都是 nacos
。
1.3 添加命名空间
添加 7 个微服务的命名空间:

新建命名空间时需要填写的字段:

1.4 添加 question 微服务配置
在配置列表添加几个微服务的配置,目前保证 question 微服务和 thirdparty 微服务有配置即可。
如下图所示,添加三个配置项:数据源,mybatis 配置,其他配置。详细的配置参数参照这篇来配置:

1.5 添加 thirdparty 微服务配置
主要是配置阿里云 OSS,用来保存图片的。配置如下图所示,key 需要大家到自己登陆到阿里云并申请 OSS 才能获取到。参照这篇《SpringCloud整合OSS对象存储》
。

二、安装 Docker
参考:
[](M1 运行 Docker)http://http😕/old.passjava.cn/#/05.%E5%AE%89%E8%A3%85%E9%83%A8%E7%BD%B2%E7%AF%87/09.M1%E8%BF%90%E8%A1%8CDocker
如果拉取镜像时非常慢,可以配置下镜像源。
三、运行必须的镜像
2.1 下载和运行 redis 镜像
2.2 下载和运行 ZipKin 镜像
四、初始化数据
创建数据库、表、初始化数据这些工作都需要做,下载一个 MySQL 客户端还是要方便点,然后找 Mac 上好用的客户端软件,下面是安装软件的艰辛历程。
4.1 安装 Mac 版 MySQL
首先需要安装 mac 版的 MySQL,下载地址:
https://dev.mysql.com/downloads/mysql/
选择第一个就可以了,官网已经提示该版本兼容 Mac M1
Packages for Catalina (10.15) are compatible with Big Sur (11)

下载后点击安装,安装成功后,到系统偏好配置里面找到 MySQL,并单击打开。

可以看到运行的 MySQL 实例是 MySQL 8.0.23,且默认开机运行。
![]
2.2 安装 Mac 版图形化 MySQL 界面
2.2.1 Workbench 在 M1 上不能运行
2021.04,我试过安装 workbench,不能运行。
2021.11.28,我试过最新的 workbench,可以正常运行。

2.2.2 Squel Pro 在 M1 上不能运行
2021.04 安装 Squel Pro 后,切换数据库的时候程序崩溃。

2.2.3 Navicat
经过上面两个软件的崩溃后,我最后还是下载了试用版的 Navicat,可以免费用 14 天,对于初始化数据足够了。
下载地址:
http://www.navicat.com.cn/download/navicat-for-mysql
下载 macOS 的最新版 15,它是兼容 M1 芯片的。

然后需要执行三个 SQL 文件,文件我已经上传到仓库上了,
/passjava-platform/data/sql

依次执行上面的三个文件后,会生成 6 个数据库,一个系统数据库,五个业务数据库。

三、启动微服务
主要启动 4 个核心服务:网关微服务
、题目微服务
、第三方微服务
、系统管理微服务
。
架构图如下所示:

目前这几个微服务已经整合了 Nacos、OpenFeign、Gateway、统一异常处理、链路追踪,Redis 等。
启动都是基于 IDEA 开发工具直接启动的,所以需要下载 IDEA。
3.1 下载安装 IDEA
我安装的 IDEA 是旗舰版 2020.3 的,试用版 30 天。大家可以下载免费的社区版 Community,功能上也能满足。
性能非常快,我的 Windows 的配置:ThinkPad、 32 G 内存、1T 固态硬盘,启动一个微服务需要 10 秒以上。而 Mac 只需要 3 秒。
官网下载地址:
https://www.jetbrains.com/idea/download/#section=mac

3.2 启动系统管理服务
我们的后台框架是用的人人框架,主要的功能就是后台的登陆、系统管理功能、所以必须启动 renren-fast
服务才能使用后台管理。
大家可以启动 RenrenApplication 这个 Service,启动成功后,会提示以下信息:

renren-fast 服务暴露的端口是 8080,但是这个端口对前端是不可见的,前端 API 都是走网关的 8060 端口。将前端的请求转发到 renren-fast 的8060 端口,比如登陆请求。注意:一定要初始化完数据才能启动成功。
3.3 启动网关
网关微服务没有什么特殊要求,我都配置好了,直接启动就好了。另外如果遇到端口被占用的情况,可以通过如下命令解决:
lsof -i:8060
kill -9 <进程 id>
网关微服务暴露的端口是 8060,启动后如下图所示:

3.4 启动题目服务
题目服务是核心模块,很多实战案例都是基于这个模块进行讲解的。启动服务之前,需要配置数据库 MySQL 的连接。
3.4.1 配置数据库连接
文件路径:/passjava-question/src/main/resources/application.yml
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/passjava_qms?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=GMT
username: root
password: xxx
另外我们也可以通过 nacos 来配置:

3.4.2 启动题目服务
IDEA 工具中直接启动就可以了,暴露的端口是 11000,启动后如下图所示:

3.4.3 测试题目服务
用 postman 测试网关+题目微服务是否正常工作:

由于我的数据库中是有数据的,所以会返回很多数据,大家后面可自行添加数据。
3.5 启动第三方服务
这个第三方不是指另外一方的服务,而是我把与第三方中间件交互的服务都归在这个服务里面了,比如对阿里云 OSS(对象存储) 的操作。
这个服务的名字叫做:passjava-thirdparty
。另外需要注意,OSS 需要大家到阿里云官网申请,有免费额度哦~配置方式可以参照这篇:《SpringCloud整合OSS对象存储》
启动成功后,如下图所示:

四、启动 Admin 后台
Admin 管理后台的技术选型还是用的 Vue,所以需要使用 npm 工具来安装依赖。
4.1 安装 npm、nvm
使用 homebrew 安装 npm
brew install npm

使用 homebrew 安装 nvm
brew install nvm

4.2 切换镜像源
默认的 npm 使用的是官方的镜像源,我们切换为国内的淘宝镜像源。
npm install -g cnpm --registry=https://registry.npm.taobao.org --verbose

4.3 安装 node_module
仓库里面并没有将依赖包一起上传,因为依赖包太大了,所以可在本地通过如下命令安装依赖包,这个是一次性的,后面不需要再执行。
进入到 passjava-platform/passjava-portal 目录,执行如下命令来安装依赖:
cnpm install

启动前端portal
npm run dev
报错,提示 Node Sass 不兼容当前的系统:
Node Sass does not yet support your current environment: OS X Unsupported architecture (arm64) with Unsupported runtime (88)

根据网上提供的解决方案,要先卸载 Node Saas
cnpm uninstall node-sass
但是又提示 chromedriver 安装失败(当前操作系统不兼容),根据网上的解决方案,单独安装,但依旧提示 64 位系统不兼容,于是我把 package.json 文件中的 "chromedriver": "2.27.2" 删掉了,问题迎刃而解!最新的代码已删除该依赖项配置。
先删除之前安装 node_modules
rm -rf ./node_modules/
再次执行卸载 node-sass 的命令:
cnpm uninstall node-sass
卸载成功后,安装 node-sass
cnpm install node-sass --unsafe-perm --save-dev

重新安装依赖
cnpm install

4.4 启动后台
在根目录执行如下命令就可以启动后台了:
npm run dev
启动成功后,会自动打开浏览器,访问的地址是 http://localhost:8081

4.5 登陆后台
账号密码都是 admin,输入验证码即可登录。注意:如果验证码没有出现,说明 RenrenApplication 微服务有异常,请查看 IDEA 中打印出的 log。
登录后台界面如下图所示:

4.6 添加题目分类
首先需要给题目进行分类,在后台点击新增类型,如下图所示:

注意:上传图片前需要启动 thirdparty 微服务,且 OSS 配置正确。
4.7 添加面试题

五、其他
5.1 未适配的镜像
我的开源项目中要用 Elasticsearch 和 Kibana 需要运行在 docker 上,目前这些镜像在 M1 上还未适配。

5.2 前端小程序
小程序的开发和测试在这里也不演示了, M1 上开发小程序完全没问题~
5.2 未添加的中间件
因本篇只是出于核心功能的演示,所以还有些中间件未提及,比如配置 Redis、链路追踪等,这些功能不影响 M1 上使用 Spring Cloud,所以会放在后续的文章中做进一步说明。
其他报错
前端 cnpm install 报错
Mac 上 node.js 的版本太高,v17.0.1,需要降级。升级和降级参考这个 https://www.cnblogs.com/jackson0714/p/node.html。
我降级为 v15.3.0,然后修改 /etc/profile,修改 NODE_HOME 的路径为新的 node 的安装路径。
sudo npm install n -g
sudo n 15.3.0

$ vim /etc/profile
添加内容
#set node path
export NODE_HOME=/usr/local/bin/node
export PATH=$NODE_HOME/bin:$PATH
使 profile 生效
source /etc/profile
node -v
mybatis 分页插件问题
page 为 null,报空指针异常
result = page.setRecords(list);
排查发现是接口方法中,传参没有传
IPage<QuestionEntity> page
数据库返回的数据,字段为下划线的值为空
解决方案:设置这个配置
mybatis-plus.configuration.map-underscore-to-camel-case=true