1 概述
学习主流开源微服务项目,以 lengleng / pig模版,我们自己动手搭建一套微服务架构。我们目标不仅仅会使用相关组件,同时深入研究下组件的内部结构和运行原理。
1 微服务架构搭建
我们搭建微服务过程:
- micro-register注册服务:使用组件nacos
- micro-gateway网关服务:gateway
- micro-auth认证服务:springsecurity OAuth2
- micro-common通过模块:
- micro-common-bom:micro依赖管理
- micro-common-core:核心模块
- micro-common-datasource:多数据源配置
- micro-common-feign:服务调用,openfeign
- micro-common-job:分布式定时任务,xxl-job
- micro-common-log:日志
- micro-common-mybatis:mybatis配置
- micro-common-seata:分布式事务管理
- micro-common-security:安全配置
- micro-common-swagger:API文档
- micro-common-xss:防止xss注入
- micro-upms业务模块:
- micro-visual:可视化模块
1.1 导入数据库
- 第一步:在自己的mysql数据库新建数据库,库名自定义,但是要与下面执行的sql数据库对应;
- 第二步:找到下载的pig项目根目录下db下的4个sql文件执行,完成数据导入。
sql文件截图如下1.1-1所示:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UI1LouUN-1680236140435)(/Users/gaogzhen/Desktop/截屏2023-03-31 11.02.53-micro-db-sql.png)]
navicat连接数据库如下1.1-2所示:
1.2 创建maven工程
idea创建maven工程,把pig中的pom.xml内容拷贝过来,做适当修改。搭建项目一步一步来,需要用到那些依赖,配置就引入那些如下:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.gaogzhen</groupId>
<artifactId>micro</artifactId>
<name>${project.artifactId}</name>
<version>1.0.0</version>
<packaging>pom</packaging>
<modules>
<module>micro-common</module>
<module>micro-register</module>
</modules>
<properties>
<spring-boot.version>2.7.10</spring-boot.version>
<spring-cloud.version>2021.0.6</spring-cloud.version>
<spring-cloud-alibaba.version>2021.0.5.0</spring-cloud-alibaba.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
<!-- 以下依赖 全局所有的模块都会引入 -->
<dependencies>
<!--Lombok-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<scope>provided</scope>
</dependency>
<!--测试依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<!--micro 公共版本定义-->
<dependency>
<groupId>com.gaogzhen</groupId>
<artifactId>micro-common-bom</artifactId>
<version>${project.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- spring boot 依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${spring-boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- spring cloud 依赖 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- spring cloud alibaba 依赖 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>${spring-cloud-alibaba.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<finalName>${project.name}</finalName>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
<pluginManagement>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>${spring-boot.version}</version>
<configuration>
<finalName>${project.build.finalName}</finalName>
<layers>
<enabled>true</enabled>
</layers>
</configuration>
</plugin>
</plugins>
</pluginManagement>
</build>
</project>
- micro公共版本管理,需要我们在micro-common-bom的pom.xml中进行配置,下面common模块讲解。
- 自定义的部分对应好就可以,没必要和原项目一致。
1.2 创建micro-common模块
micro项目下添加micro-common子模块,micro-common公共模块下创建功能子模块,目前就是搭个架子,如下图1.2-1所示:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-G0nhBof0-1680236140436)(/Users/gaogzhen/Desktop/截屏2023-03-31 11.12.51-micro-comon-architecture.png)]
这里对springboot bom做些简单说明:
在 Spring Boot 中,BOM(Bill of Materials)是一种特殊的依赖项,用于管理项目中其他依赖项的版本号。
Spring Boot BOM 是一个 POM 文件,列出了一个经过筛选的依赖项集合及其版本号,这些依赖项已知能够很好地协同工作。通过将 BOM 导入项目中,您可以避免版本冲突,并确保所有依赖项能够无缝协作。
要在项目中使用 Spring Boot BOM,您需要将其作为依赖项包含在项目的 POM 文件中,如下所示:
phpCopy code
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.6.3</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
这将导入 Spring Boot BOM 版本 2.6.3,其中包括常见依赖项(如 Spring Framework、Tomcat 和 Jackson)的版本号。然后,您可以在项目中使用这些依赖项,而无需指定它们的版本号,因为它们将由 BOM 管理。
总的来说,使用 Spring Boot BOM 可以简化项目的依赖管理,并确保所有依赖项能够正确地协同工作。
- bom为了方便统一配置管理依赖jar包,本质就是pom文件;
- bom提供方,维护使用jar版本;使用方使用jar包不需要指定版本;
- 使用方如需其他jar包版本,可以加上verson版本号。
2 micro-register模块
2.1 nacos源码化运行原因
micro-register模块就是集成nacos本地编译运行,为什么要源码化运行而不是直接运行nacos服务端可执行程序呢?
- 方便开发过程使用
如果从 Spring Cloud Netflix 体系迁移到 Spring Cloud Alibaba 技术体系,明显的感受是整个体系得到简化。 Nacos 承担整个 Spring Cloud 的服务发现、配置管理部分的实现。 是整个开发过程中强依赖,启动微服务业务要去检查 Nacos Server 是否已经启动,解压安装的方式变的非常不便。
如果把 Nacos Server 作为整个微服务框架的一部分直接 Main 启动,是不是更加方便便利?
- UI 个性定制化
- 若以解压运行方式,修改 UI 几乎不可能。可以下载 Nacos 源码继续修改 然后重新打包运行。 非常的不方便
git clone https://github.com/alibaba/nacos.git
cd nacos/
mvn -Prelease-nacos -Dmaven.test.skip=true clean install -U
ls -al distribution/target/
// change the $version to your actual path
cd distribution/target/nacos-server-$version/nacos/bin
- 若以源码方式运行,可以试试的调整 UI 然后 build 看到效果。
- 保证 Server & Client 保持一致
- pig 作为微服务开源项目,更新迭代速度非常快。每个版本依赖的 Nacos Client 版本都可能发生变化,这就意味着对应的 Nacos Server 版本也要对应升级,这需要用户自行下载升级成本很高。
- Nacos 具有良好小版本向下兼容性,但是大版本功能变化挺大,比如 1.2 、1.3 权限的变更。所以建议大家在实际开发过程中保持版本一致。
- 若以源码运行的方式,可以很好的解决此问题。
2.2 本地编译运行
关于nacos源码化运行集成为微服务中单独服务运行,参考 nacos server 源码运行实现
下面展示我们修改的地方:
- 修改application.yml中关于数据库连接配置,注释掉spring boot admin,如下所示:
server:
port: 8848 #如何修改 pig-register 启动端口 >: https://t.cn/A6XGvTdb
tomcat:
basedir: logs
error:
include-message: always
db:
num: 1
user: ${MYSQL_USER:root}
password: ${MYSQL_PWD:root1234}
url:
0: jdbc:mysql://${MYSQL_HOST:mysql-server}:${MYSQL_PORT:3306}/${MYSQL_DB:micro_config}?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=GMT%2B8&nullCatalogMeansCurrent=true&allowPublicKeyRetrieval=true
pool.config.connectionTimeout: 30000
nacos:
core:
auth:
server:
identity:
key: serverIdentity
value: security
plugin.nacos.token.secret.key: SecretKey012345678901234567890123456789012345678901234567890123456789
system.type: nacos
security:
ignore:
urls: /actuator/**,/,/error,/**/*.css,/**/*.js,/**/*.html,/**/*.map,/**/*.svg,/**/*.png,/**/*.ico,/console-fe/public/**,/v1/auth/**,/v1/console/health/**,/actuator/**,/v1/console/server/**
spring:
datasource:
platform: mysql #这个过期属性不能修改,nacos 代码对此有硬编码
security:
enabled: true
# boot: # 接入 spring boot admin
# admin:
# client:
# url: http://pig-monitor:5001
# username: pig
# password: pig
# instance:
# service-host-type: ip
application:
name: @project.artifactId@
main:
allow-circular-references: true
useAddressServer: true
management:
endpoints:
web:
exposure:
include: '*'
metrics:
export:
influx:
enabled: false
elastic:
enabled: false
3 nacos运行测试
启动测试,如下图idea3-1截图:
nacos web控制台如下3-1所示:
下面我们会创建些测试项目,进而讲解一些nacos的底层原理。
结语
如果小伙伴什么问题或者指教,欢迎交流。
❓QQ:806797785
⭐️源代码仓库地址:https://gitee.com/gaogzhen/micro
参考地址:
[1] lengleng /pig
[2]Nacos官网