04 | 十八般兵器:如何搭建项目所需的开发环境?

你好,我是姚秋辰。

工欲善其事,必先利其器。在你跃跃欲试想要进入实战环节前,让我先带你把实战项目需要用到的十八般兵器准备好,也就是搭建好项目的开发环境。

为了避免在项目实战环节碰到一些棘手的兼容性问题,在你开始写代码前就要约定好各个组件的安装版本,包括Java、Maven和各个中间件的版本。

我们的微服务实战项目会用到很多中间件,其中也包括了Spring Cloud的中心化组件,如Nacos、Sentinel、Zipkin和Seata等等,这些Spring Cloud组件我会放在后面的实战环节边讲解边搭建。

今天我们主要来看下集成开发环境的搭建、数据库的安装和DB脚本的导入,此外,我还会手把手带你安装几个通用的中间件。这节课要安装的工具比较多,你一定要耐心看完,不然后面的课程可能会卡壳哦。

闲话少叙,我们现在就开工吧。

环境准备

我推荐你使用Mac笔记本或者是Linux系统来编写、运行本课程的实战项目,如果你使用的是Windows系统,可以尝试做个双系统,或者用Cygwin、Ubuntu虚拟机等方式尽量模拟Linux环境的开发。一来可以学习Linux命令,二来可以尽量保持本地开发环境与线上生产环境的一致,毕竟工作中你所开发的Java程序最终还是部署在Linux服务器环境。

以下是我在本地Mac系统上的安装方式,如果你使用的是Windows系统,我也提供了相关组件的官网下载地址,相信对于程序员来说,安装软件是小菜一碟。因为安装的工具比较多,所以我建议你按照课程中介绍的顺序来安装。

Homebrew

Homebrew是Mac系统上的一款非常便利的软件安装工具,可以帮你安装大部分开发工作所需的各种工具软件。这节课中的很多工具,我们也可以使用它来安装。你可以在Homebrew的官网查看Homebrew的详细安装方法。

你可能发现在国内网络下安装Homebrew比较缓慢,这里我给你提供两种解决办法:一种是使用VPN连接,也就是我们俗称的翻墙,可以大幅提高安装速度;另一种方式是将Homebrew指向国内镜像获取安装脚本,替换镜像的命令可以在官方的安装文档中找到。

安装完成之后,你可以在命令行输入brew -v命令查看版本信息,来验证安装是否成功:

vincent@LM-SHB-40513998 ~ % brew -v
Homebrew 3.2.17
Homebrew/homebrew-core (git revision 5fbb5bcf8d9; last commit 2021-10-24)
Homebrew/homebrew-cask (git revision b08f2eff16; last commit 2021-10-24)

当Homebrew准备就绪,你就可以使用brew install命令安装所需要的软件了。在实际工作中,你可以使用清华大学或者中科大的国内镜像源,来大幅提高各软件的下载速度。

在你使用国内镜像源的时候,可能会碰到软件无法安装成功的问题,这往往是因为软件所依赖的某个工具包无法下载,你只要从日志信息中找到卡住安装流程的工具包叫什么,然后使用brew install xxx命令(xxx是工具名称)单独安装这个工具包,之后再重新安装你需要的软件就可以了。这个办法屡试不爽。

安装好Homebrew后,我们再来安装Java和Maven。

Java和Maven

这两样工具可是我们Java工程师吃饭的家伙,安装过程我就不唠叨了。为了避免兼容性的问题,你只要注意安装正确的版本就可以:

  • Java:推荐使用JDK8最新小版本或者OpenJDK16的最新小版本(我本地安装的是OpenJDK 16.0.1)。
  • Maven:推荐使用Maven 3.6或以上的版本(我本地使用3.8.1版本)。

由于国内网络访问Maven中央仓库比较慢,在编译项目的时候,你会发现下载Maven依赖项的时间会比较久,你可以修改Maven的settings.xml文件,将其默认镜像指向国内的镜像(比如阿里云镜像),这样可以大大加快依赖项下载速度。

安装完Java和Maven之后,我们再来安装集成开发工具。

IntelliJ IDEA

IntelliJ IDEA是JetBrains全家桶中的一款应用,它是目前公认最强大的Java语言开发集成环境。如果你已经受不了Eclipse的卡顿,那不妨借此机会转向IDEA的怀抱。

你可以在JetBrains的官网下载IntelliJ IDEA,IDEA的免费社区版已经足够你完成复杂的开发任务了。如果你想体验更多的产品功能特性,也可以选择购买商业版license。要是你有高校教育邮箱(edu邮箱)就更方便了,你可以使用edu邮箱注册JetBrains账号,并免费申请商业版使用权用于教学和学习。

Lombok

为了提高编程效率和代码可读性,我在实战项目中还使用了Lomkok插件自动生成代码。不过,你需要在自己的开发环境中安装Lombok插件,这样你的IDE才能识别Lomkok的注解。

在IntelliJ IDEA中安装Lombok非常简单,你只需要在IDEA的插件安装界面搜索Lomkob这款插件并安装即可,如下图所示:

如果你使用Eclipse作为开发工具,需要在Plugins界面安装Lombok插件,或者将Lombok插件的安装文件复制到Eclipse安装路径下的Plugin文件夹。不管你使用的是Eclipse还是IntelliJ IDEA,记得在装完插件后重启开发环境。

下面,我们再来安装实战项目需要用到的数据库。

MySQL和DB可视化工具

我们的实战课程采用MySQL数据库,当然,如果你在本地已经安装了MariaDB也是可以的,因为MariaDB是MySQL的作者参与制作的开源版数据库,它可以全面兼容MySQL的功能。

我本地安装的MySQL服务器版本为8.0.27,你可以使用brew命令安装最新版的MySQL,具体命令为:

brew install mysql

当然,你也可以选择从MySQL官方网站下载安装包,免费的社区版就足以满足我们实战项目的需要。

安装完成之后,我们再使用下面的命令来启动MySQL:

mysql.server start

待MySQL成功安装并启动后,我们来验证一下是否可以登录数据库。在命令行输入:

mysql -uroot -p

然后,我们使用默认的root用户登录数据库(密码默认为空),如果你可以在命令行看到以下内容,就表示数据库安装成功。

如果你还没有安装可视化DB工具,那么我推荐你使用DataGrip,它也是JetBrains全家桶的一款软件。你可以选择通过DataGrip官网下载安装包。

下载DataGrip并安装成功后,你可以在DataGrip中添加一个MySQL数据源指向本地MySQL数据库,用户名为默认的root,密码为空,JDBC URL是jdbc:mysql://localhost:3306。在添加数据源之前,我们还需要在弹窗界面上点击下载MySQL Driver:

到这里,MySQL和DataGrip就安装好了。

在开始项目实战之前,我们还需要在MySQL中执行数据库建表语句,将实战项目所需要用到的数据库表导入到MySQL。建表语句所在的SQL文件,位于Gitee项目源代码仓库下的“资源文件”目录中的“Coupon项目建表语句.sql”文件里。

你可以在数据库命令行中执行SQL文件,或者将文件内容copy到DataGrid中执行。在建表语句的第一行中,我指定了数据库名称为geekbang_coupon_db,我们在稍后的实战项目中会将这个数据库名称配置在JDBC URL中。

CREATE DATABASE IF NOT EXISTS geekbang_coupon_db;

当然,你也可以给这个数据库起一个更响亮的名字,替换掉SQL脚本中的名称geekbang_coupon_db。执行完数据库脚本后,我们再来安装实战项目所需要用到的消息中间件。

安装RabbitMQ

RabbitMQ是目前使用最广泛的消息组件之一,在后面的Spring Cloud课程中我会使用Stream组件搭配RabbitMQ发送异步消息。

你可以直接使用下面这个命令安装RabbitMQ,也可以在RabbitMQ官网下载安装包。

brew install rabbitmq

我本地安装的RabbitMQ版本是3.9.8,这里我推荐你直接安装RabbitMQ最新的稳定版本,因为某些RabbitMQ的早期版本缺少必要的插件支持,如果你已经安装了较早年代的RabbitMQ,可以趁这个机会替换成最新版。

如果你想了解RabbitMQ的更多功能特性,RabbitMQ的官网上提供的技术文档是一个很好的学习途径,你可以去看看。

在安装完成之后,你可以直接通过在命令行执行下面这条代码来启动RabbitMQ。

rabbitmq-server

如果你是使用安装包安装的话,那么你还需要将RabbitMQ的安装路径加入到PATH系统变量。成功启动后,你可以在命令行中看到RabbitMQ版本和启动成功的日志,这表示RabbitMQ后台服务已处于运行状态。

接着,我们在浏览器中打开RabbitMQ的本地操作界面http://localhost:15672/,其中的“15672”是RabbitMQ启动时的默认窗口。你可以使用默认的内置用户登录系统,用户名和密码都是guest。顺利登录后你会看到如下页面:

到这里,RabbitMQ就算是安装好了。下面,我们再来安装最后一个软件,Redis。

安装Redis

Redis是一个key-value数据库,我们在学习微服务网关的时候将会用Redis实现网关层限流。安装Redis的方式非常简单,你可以选择使用下面这条命令安装最新版Redis Brew。

brew install redis

当然,你也可以选择从Redis官网下载源码并在本地完成编译和安装。

安装完成并成功启动Redis服务后,我们可以通过命令行验证Redis是否运行正常。在命令行直接执行这条命令:

redis-cli

执行完成后,默认情况下会连接到Redis的默认地址localhost:6379,这样我们就来到了Redis控制台。

在控制台中,你可以尝试通过set命令设置一个key-value键值对,并使用get命令读取key对应的值,通过这种方式来验证Redis是否正常工作。在下面的图中,我通过set命令设置了一个key=geekbang,value=955的键值对,然后使用get命令去读取geekbang的值。

到这里,我们的工具安装就结束了,后续进入到Spring Cloud微服务实战环节的时候,我们还会用到更多的中间件,比如注册中心、微服务网关、链路追踪组件、ELK日志查询系统、分布式事务协调器等等,到时候我再带你手把手安装这些软件。

总结

今天这节课,我带你安装了编译环境、本地开发环境、MySQL数据库和一些常用的中间件,这些组件足够我们搭建起一个Spring Boot的单体应用了。

环境的安装看似简单,实则遍地是坑,很多兼容性问题就是由于组件版本导致的。我这里给你举两个兼容性问题的例子:

  1. MySQL版本:不同MySQL版本对JDBC连接串的要求是不一样的,有的版本需要你在JDBC URL中额外指定Timezone等信息。你会发现,原先得得好好的应用,某一天升级了数据库之后很可能会挂掉;
  2. Maven版本:有些Maven插件要求高版本的Maven支持,有时你会发现在一台电脑上可以编译通过的源码,换了一台电脑可能就编译失败,这很有可能是Maven版本的问题。

这些兼容性问题往往都很隐蔽,不好排查。所以呢,才有了程序员圈子里的硬梗“一定是环境问题”。那么,当你碰到一些棘手的异常情况的时候,比如某个应用在没有代码改动的情况下突然不正常了,不妨先抱着怀疑的态度,去检查一下是否有外部环境的变化,比如中间件版本、编译环境等等。

下一讲我将带你体验Spring Boot急速落地的过程,和你手把手搭建一个Spring Boot实战项目,为后面的Spring Cloud章节的学习做好前置功课。

思考题

最后,请你思考两个问题:

  1. 你在学习新技术、安装新的组件的过程中,通常都是通过什么途径来摸索的呢?在这个过程中你有哪些提升效率的小窍门(比如使用homebrew软件)可以分享吗?
  2. 你曾经碰到过最棘手的线上Bug或者兼容性问题是什么?最后又是如何被发现并解决的?我们在留言区来一场疑难Bug大Battle吧!

好啦,这节课就结束啦。欢迎你把这节课分享给更多对Spring Cloud感兴趣的朋友。我是姚秋辰,我们下节课再见!

精选留言

  • 蝴蝶

    2021-12-20 09:17:29

    我直接用的docker装了redis mysql rabbitmq,因为用的windows
  • 学无涯

    2021-12-20 09:33:43

    对于单一的技术,比如kafka, rabbitmq, clickhouse等,一般会看官方文档学习。对于涉及一个大的生态的技术,比如云原生,一般会选择买个专栏或者报个培训班快速入门(我就是报了极客时间的云原生训练营😄)
    作者回复

    阔以阔以!学习专栏是非常效率的快速入门的方式,云原生的老师是我以前ebay的同事(还给我的书写过推荐语哈哈),水平那是杠杠的

    2021-12-20 20:03:41

  • 努力努力再努力

    2022-01-04 22:30:21

    老师,安装rabbitmq那里并不是直接 rabbitmq-server 就可以打开 web管理界面的,需要先安装一下插件才可以:
    rabbitmq-plugins enable rabbitmq_management
    作者回复

    对的,同学这个提示很到位

    2022-01-06 00:06:24

  • 暮雨yl晨曦

    2021-12-20 17:07:20

    学习新技术、安装新组件,通常都是通过什么途径摸索?
    1.先从官网找文档,按照文档一步一步操作。不得不说,国外的大部分开源的技术或者组件,文档都非常全。但是国内的话,你即使按照官网文档一步一步操作,也有可能跑失败。这也是我不喜欢用国内开源组件原因之一。不过近几年好非常多了,主要是阿里贡献挺大的。
    2.google,stackoverflow,老师上节课也推荐了,这两个是个好东西。不过我正常就用google,因为google查出来的信息里,经常就包含stackoverflow了。
    3.请教前辈,我在架构技术部,组内大神多,有个部门JAVA天花板的大神,其他人也都非常厉害。不过要记住,请教别人之前,一定要带着自己的问题+思考,不要盲目的随便请教别人,不然连问题都描述不清楚,会浪费不少时间。
    作者回复

    三点都非常赞!同学应该是老司机无疑了。国内开源项目的文档建设确实很落后,就更不用说英文文档的建设了,还是需要慢慢积累

    2021-12-20 19:57:56

  • 森林

    2021-12-20 12:32:00

    建议编写一个docker compose
    作者回复

    大部分初学者使用docker的经验比较有限,所以简单应用就直接安装了。后面复杂组件比如ELK的搭建是用docker做的

    2021-12-20 19:48:42

  • 卟卟熊

    2021-12-21 16:29:53

    老师orm选型的时候为什么选择hibernate,现在mybatis才是主流啊,我理解的是mybatis面向sql编程 ,更方便优化sql,但是我觉得你选型hibernate是因为他们项目都不规范,并且很早之前项目都是重用sql造成mybatis比较香的原因,如果项目标准化开发,更多的面向service层,sql就不会那么复杂了,所以标准化项目下hibernate才是正确的选择是吧?
    作者回复

    我用的是JPA更上一层的封装,也就是spring data jpa,JPA之下才是具体orm规范实现比如hibernate。超高并发场景不建议写复杂sql,尤其是微服务场景下没有那种横跨多个domain的大sql查询,mybatis自定制sql的灵活性的优势已经没那么必要,况且orm框架也具备自定义sql的能力。

    2021-12-21 20:23:54

  • 201

    2021-12-20 10:12:27

    开发环境主用docker compose
  • Geek_039a5c

    2022-01-17 00:46:47

    搭建环境, 我花了一个礼拜。。。。 从搭建到放弃。。
    作者回复

    再扶你起来,我觉得还可以再抢救一下

    2022-01-17 21:28:05

  • Layne

    2021-12-20 09:19:21

    1.一般都是按照官方文档的简易教程来安装使用;安装过程中如果出现异常的话,会通过各大社区论坛找找是不是有类似的情况出现。也会去一些开源网站找一些运维脚本,一键部署之类的。
    2.做过一个签名排序,是利用fastjson来对json数据格式按照ASCII来进行排序,之前一直好好的,排序规则也正常。在一个老的工程中同样引入这个方法,发现不管用了,后面排查才发现是两个jar包版本不一致(吃了不少fastjson的亏),升级到最新的版本一致就OK了。
    作者回复

    fastjson!!!以前阿里系的人,没少吃过这玩意儿的亏!为了fast这一个使命真的是舍命裸奔,各种短板。现在各个json库的性能也都上来了,珍爱生命,远离fastjson吧

    2021-12-20 20:01:58

  • 杨逸林

    2021-12-27 23:20:56

    老师,为什么不用 Gradle 呢?这个做测试什么的,功能很丰富啊
    作者回复

    考虑到mvn使用比较广泛对大部分从业者没有门槛,gradle有很多公司没有普及。我们主要内容是spring cloud,项目构建工具这块大家八仙过海用自己喜欢的工具就可以

    2021-12-28 14:36:51

  • 勇敢的心

    2021-12-27 00:49:33

    老师你好,下载代码的时候提示
    error: unable to create file 4-服务容错Sentinel/middleware/Sentinel-1.8.2/sentinel-adapter/sentinel-apache-httpclient-adapter/src/main/java/com/alibaba/csp/sentinel/adapter/apache/httpclient/SentinelApacheHttpClientBuilder.java: Filename too long
    作者回复

    这个应该是windows api的问题,试试在git命令行打这个命令,然后重新下载看看是不是解决了
    git config --global core.longpaths true

    2021-12-27 21:24:24

  • 卟卟熊

    2021-12-21 19:04:01

    1、领域标准化
    优惠券下有哪些服务:
    1、用户服务
    2、优惠券模板服务
    3、优惠计算服务

    聚合(通用)服务:用户服务
    基础服务:优惠券模板服务,优惠计算服务



    商品下有哪些服务:
    1、用户服务
    2、商品模板服务
    3、商品SKU服务


    2、项目结构标准化
    1、api
    2、dao
    3、impl
    1、controller
    2、service

    分层、解耦
    dao中的entity是对象
    api中是对外暴露的接口信息,service的返回通过api定义的
    impl是业务逻辑

    总结的老师的思想,不喜勿喷
    作者回复

    我瞅见了SKU,同学以前应该做过商品域相关的服务:-)

    2021-12-21 20:27:17

  • Hello world

    2021-12-20 09:36:32

    学习新技术和安装新组件的最好方式是看官网,不过有的官网写的比较晦涩难懂,可以搭配相关博客进行学习
    作者回复

    同学这个路子非常的效率,你实际工作中应该是个fast-learner

    2021-12-20 20:13:02

  • Geek_sa5dup

    2021-12-20 07:38:51

    经典:在我这运行没事啊
    作者回复

    先重启一下,如果一次不行,那就重启两次

    2021-12-20 19:54:23

  • 一只奔跑的猪

    2022-01-12 11:52:15

    redis-cli
    Could not connect to Redis at 127.0.0.1:6379: Connection refused
    有人解决了这个问题不,我按网上教程也没有用啊
    作者回复

    看报错应该是redis服务端没启动,如果是brew装的,可以试试 brew services start redis

    2022-01-13 00:49:16

  • gevin

    2021-12-21 14:25:22

    之前用intel芯片的mac时,基本上能用docker装的服务或组件,就用docker,自从换了M1 的Mac,能用brew装的就用brew
    作者回复

    这是高手!自打使用了M1之后我已经戒掉了docker,后来知道出了支持M1的版本之后也不换了,反正也懒得当小白鼠了

    2021-12-21 20:31:56

  • 罗逸

    2021-12-20 09:51:29

    我之前用docker安装了这些软件0.0
  • 杨灿光

    2021-12-28 21:23:51

    rabbitmq用的是3.8.2应该没问题吧?
    作者回复

    3.8.2没问题的,反倒是最新版有可能有少许兼容性问题,比如某些功能插件还没升级到对应高版本

    2021-12-29 21:42:06

  • Jerry

    2021-12-27 22:52:34

    请问,我从gitee上拉取项目时不能获取到完整的目录是什么原因呢?只能拉取前四个文件夹
    作者回复

    本地git有报错信息吗?因为第五个文件夹包含了对sentinel的源码改造,所以特别的大,下载用时比较久。同学也可以试着直接download zip包,能拉下完整代码

    2021-12-28 14:29:13

  • 杨灿光

    2021-12-27 21:27:59

    请问linux是centos应该也可以的吧?
    作者回复

    那必须666啊!老铁赶紧的一键三连刷起来!

    2021-12-27 22:10:07