0201nacos源码化集成-服务注册发现-pig-开源项目学习

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服务端可执行程序呢?

  1. 方便开发过程使用

如果从 Spring Cloud Netflix 体系迁移到 Spring Cloud Alibaba 技术体系,明显的感受是整个体系得到简化。 Nacos 承担整个 Spring Cloud 的服务发现、配置管理部分的实现。 是整个开发过程中强依赖,启动微服务业务要去检查 Nacos Server 是否已经启动,解压安装的方式变的非常不便。

如果把 Nacos Server 作为整个微服务框架的一部分直接 Main 启动,是不是更加方便便利?

  1. 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 看到效果。
  1. 保证 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官网

[3]微服务中使用Maven BOM来管理你的服务版本

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

gaog2zh

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值