文章目录
- 前言
- 一、环境准备
- 软件要求
- 配置操作
- 二、拉取框架
- 三、模块搭建
- ·SDK模块
- ·SDK-Cloud 模块
- ·common模块
- ·API模块
前言
我们知道,微服务架构是把项目里的每一个功能元素独立出来,再对这些功能元素进行动态组合。这样的优点在于:节省调用资源,使之成为可独立升级的代码块。
微服务把服务拆分成一个个模块,使得其界限相对明显,从而实现项目的可理解性、可测试性以及可观测性,同时降低项目解耦(高内聚,低耦合)的复杂性。
随着系统复杂度的提升,以及对系统扩展性的要求越来越高,微服务化是一个很好的方向。
本期我们就为大家详细讲解一下微服务框架的搭建过程。我们将结合神州数码云基地的微服务相关项目,手把手教大家搭建自己第一个微服务。
一、环境准备
软件要求
这里主要讲的是构建微服务框架时的前期准备工作,主要是环境的准备。包括了 JDK 的版本、IEDA 的版本和Maven 的版本等。
- JDK 1.8
- IEDA 2019(推荐)
- Maven 3.5.x(推荐)
- nacos 1.1.3(推荐)
在这里要注意一点,IDEA 版本与 Maven 的版本需要进行适配。
如 IDEA2019.1 与 Maven3.5.x 系列的适配度较高,Maven 的版本不宜太高。
这样的话在 IDEA的ieda.log 里可能会报" Unable to create injector "的错。直接导致不能拉取框架或者 Maven 的 Plugins 下载报错等问题。
配置操作
这里主要讲的是一些配置的相关操作,包括了 Maven 的 settings.xml 配置、IDEA 的 settings 配置以及 Nacos的配置等。
- Maven 的 settings.xml 配置:
框架在云基地的 nexus3 私服上面,需要在这上面进行拉取 ⬇
<?xml version="1.0" encoding="UTF-8"?>
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd">
<localRepository>你的本地仓库路径</localRepository>
<pluginGroups></pluginGroups>
<proxies></proxies>
<servers>
<server>
<id>DCone</id>
<username>你的ITCODE</username>
<password>你的密码</password>
</server>
</servers>
<mirrors>
<mirror>
<id>DCone</id>
<mirrorOf>*</mirrorOf>
<url>https://nexus.dev.wh.digitalchina.com/repository/maven-public/</url>
</mirror>
</mirrors>
<profiles>
<profile>
<id>DCone</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<repositories>
<repository>
<id>DCone</id>
<url>https://nexus.dev.wh.digitalchina.com/repository/maven-public/</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
</repositories>
</profile>
<profile>
<id>jdk-1.8</id>
<activation>
<activeByDefault>true</activeByDefault>
<jdk>1.8</jdk>
</activation>
<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion>
</properties>
</profile>
</profiles>
</settings>
- Nacos 的配置
1、安装 Nacos
基础框架使用 Nacos 为注册中心,所以第一步就是安装 Nacos 注册中心。
官方安装文档:https://nacos.io/zh-cn/docs/quick-start.html
下载对应的安装包:https://github.com/alibaba/nacos/releases
推荐下载1.3.1版本的,1.3.2启动报错,然后解压Linux:
$ unzip nacos-server-$version.zip
#或者
$ tar -xvf nacos-server-$version.tar.gz
$ cd nacos/bin
2、Linux/Unix/Mac 运行
启动/关闭命令(standalone 代表着单机模式运行,非集群模式):
$ sh startup.sh -m standalone
$ sh shutdown.sh
# 后台运行
$ nohup startup.sh -m standalone &
# 如果您使用的是ubuntu系统,或者运行脚本报错提示[[符号找不到,可尝试如下运行:
$ bash startup.sh -m standalone
3、Windows 运行
启动/关闭命令:
$ cmd startup.cmd
$ cmd shutdown.cmd
或者双击 startup.cmd/shutdown.cmd 运行文件。
· Windows 后台运行的方法
在 nacos/bin 目录创建一个 nacosStartUp.vbs 文件,右键编辑:
CreateObject("WScript.Shell").Run "startup.cmd",0,FALSE
关闭也是同理,在 nacos/bin 目录创建 nacosShutDowm.vbs:
CreateObject("WScript.Shell").Run "shutdowm.cmd",0,FALSE
双击 nacosStartUp.vbs 文件启动 nacos 注册中心;
双击 nacosShutDowm.vbs 关闭 nacos 注册中心;
安装启动后,访问地址http://127.0.0.1:8848/nacos,账号密码均默认为nacos;
启动成功之后,就说明这个注册中心已经搭建好了。
4、1.3.2版本出错解决办法
- 问题一:db.num is null --数据库有问题
- 解决办法:mysql 新建库:nacos,字符集:utf8 ,排序规则:utf8_general_ci;
nacos/conf/nacos-mysql.sql 文件里的 sql 脚本执行到本机数据库的 nacos 库中;
nacos/conf/application.properties 里修改配置;
#*************** Config Module Related Configurations ***************#
### If use MySQL as datasource:
spring.datasource.platform=mysql
### Count of DB:
db.num=1
### Connect URL of DB:
db.url.0=jdbc:mysql://127.0.0.1:3306/nacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC
db.user=root
db.password=123456
- 问题二:unable to start web server --无法启动内置的 tomcat
- 解决办法:将 nacos/target/nacos-server.jar 拷贝到自己的 tomcat 目录下启动。
IDEA 的 settings 配置:
二、拉取框架
框架的拉取主要是通过引入在云基地的 Nacos 注册中心。
其地址在 Maven 文件夹下的 conf 文件夹中,文件名为 settings.xml,推荐使用 IED 打开(如 VsCode )。具体的本地文件路径和镜像地址、仓库地址如下图2-1、2-2和2-3所示:
三、模块搭建
·SDK模块
SDK 模块的内容不需要继承父模块的内容,所以不需要暴露框架的 parent 标签。
但是每个模块的 pom.xml 都必须要有自己的 groupId 坐标,因为删除了 parent 标签,所以需要自己手动加入 groupId 和 artifactId。
同时在SDK 模块中引入 lombok 依赖和 swagger 注解,方便写请求体和返回体的类。具体可参考图3-1与3-2所示:
·SDK-Cloud 模块
SDK-Cloud 模块是内部模块,所以保留 parent 标签。
它的作用主要是暴露给内部的其它服务去调用。且由于模块的引用方式是层层引用的,所以 SDK-Cloud 模块需要引用 SDK 模块。
同时,无论子模块中是否继承了父模块的依赖,都需要在父模块的 dependencies 中 对子模块的版本进行声明,表明子模块的版本跟随的是项目版本,使得两者版本保持一致,便于管理。具体可参考图3-3所示:
同时,在每个新建的子模块中都需要声明该模块引用上一层的模块。
比如 sdk-cloud 模块引用的就是 SDK 模块,写在 Dependencies 中即可。具体可参考图3-4所示:
在 SDK-Cloud 模块中,需要对 Feign 做一些配置,Feign 是微服务之间进行远程调用的重要组件。
一般而言,哪个服务需要用到 Feign 哪个服务就会去写 Feign。
具体操作是在 SDK-Cloud的 resources 下注入 Spring factories 文件,来声明 Feign 的配置在其它模块也能够生效。具体可参考图3-5所示:
·common模块
common 模块是整个服务的核心,主要对数据进行处理,与业务的逻辑无关。作为内部的核心模块,依然保留 parent 标签,且需要引用上一层模块,在这里就不赘述了。
下面展示一下它的目录结构,具体如图3-6所示:
其中 PersonMapper 是作为接口,直接继承封装好的框架内容(BaseMapper),泛型是 Person 类。
将主要的作用是对数据库进行持久化操作,有直接针对数据库的一些代码。具体如图3-7所示:
而 Person 作为数据库表的实体类,主要的作用是定义字段,自动生成 getter 和 setter,再加入 swagger 注解进行声明以及生成 setter 时返回类。具体如图3-8所示:
·API模块
程序的入口(启动类)写在 API 模块中,Java 程序的入口是 main 函数,Spring Boot 的配置文件也写在该模块中。
由于项目采用的是多模块的方式,在启动类中声明 Service 注解或者 Component 注解,表明该类为 Spring 容器中的一个组件。
注意在多模块的项目中,包扫描( basePackages)的作用是在指定的路径下,扫描到 Service 注解(或 Component 注解)所修饰的类,注入到 spring 容器中。具体如图3-9所示:
在 API 模块中还需要声明与 Mybatis 有关的注解,在包扫描中指定 mapper 的路径(在 common 模块中)。具体如图3-10所示:
项目直接使用 main 函数作为程序的入口,但是由于框架对启动类做了一定程度上的封装,所以选择 extends 直接继承框架。具体如图3-11所示:
由于框架中使用 Discovery 模块后,在启动类中会存在一些问题,所以选择在 Nacos 配置中心使用 Spring Cloud的一个组件。
该组件的配置文件名为 bootstrap.yml,其被执行的优先级稍高于启动类,该文件对 Nacos 的一些配置做了封装。
一般的 SpringBoot 项目启动后只需要通过端口去访问,在本项目中还需加入变量前缀,该 yml 文件中还包含了mysq l数据库一些性能调优的信息。
至此,服务的框架基本搭建完毕。
以上就是微服务框架搭建的内容,感兴趣的宝子们,赶紧去试试吧~