• 从零到一搭建基础架构(8)-业务服务接入基础架构


    一、工程结构搭建

    先回顾一下common-frame中各个maven模块的依赖的层级关系。

    业务应用在使用基础架构的时候也是按照这个层级思路进行搭建。

    搭建过程主要分为以下几个步骤:

    1. idea构建多模块工程
    2. 父pom修改
    3. 子模块依赖对应的common-frame模块并构建依赖顺序

    1.1.idea构建多模块工程

    先通过idea提供的脚手架工程,将业务服务搭建成如下结构

    springboot的多模块搭建的步骤如果有小伙伴不清楚的,由于不是本文重点,所以自行百度了

    1.2.父pom依赖修改

    1. <?xml version="1.0" encoding="UTF-8"?>
    2. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    3.         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    4.        
    5.   <!-- 修改idea新的父pom依赖的spring boot的依赖,改为commmon-frame框架中的版本。这样业务服务所有依赖都可以被common-frame和common-dependency统一管理 -->
    6.    <parent>
    7.        <groupId>com.baiyan</groupId>
    8.        <artifactId>baiyan-common</artifactId>
    9.        <version>1.0.0-SNAPSHOT</version>
    10.    </parent>
    11.    <modelVersion>4.0.0</modelVersion>
    12.    <artifactId>auth</artifactId>
    13.    <version>0.0.1-SNAPSHOT</version>
    14.    <packaging>pom</packaging>
    15.    <name>auth</name>
    16.    <description>鉴权中心</description>
    17. <!-- 业务模块定义 -->
    18.    <modules>
    19.        <module>auth-web</module>
    20.        <module>auth-service</module>
    21.        <module>auth-api</module>
    22.        <module>auth-start</module>
    23.        <module>auth-rpc</module>
    24.        <module>auth-sdk</module>
    25.    </modules>
    26. <!-- 工程内所有子模块都需要的依赖定义在此处 -->
    27.    <dependencies>
    28.        <dependency>
    29.            <groupId>org.springframework.boot</groupId>
    30.            <artifactId>spring-boot-starter-web</artifactId>
    31.        </dependency>
    32.        <dependency>
    33.            <groupId>org.projectlombok</groupId>
    34.            <artifactId>lombok</artifactId>
    35.            <optional>true</optional>
    36.        </dependency>
    37.        <dependency>
    38.            <groupId>org.springframework.boot</groupId>
    39.            <artifactId>spring-boot-starter-test</artifactId>
    40.            <scope>test</scope>
    41.        </dependency>
    42.    </dependencies>
    43. <!-- 统一定义业务模块版本。如果业务中使用的组件版本需要与common-frame中不一致,在此处统一定义组件的版本,方便全局管理 -->
    44.    <dependencyManagement>
    45.        <dependencies>
    46.            <dependency>
    47.                <groupId>com.baiyan</groupId>
    48.                <artifactId>auth-api</artifactId>
    49.                <version>${project.version}</version>
    50.            </dependency>
    51.            <dependency>
    52.                <groupId>com.baiyan</groupId>
    53.                <artifactId>auth-sdk</artifactId>
    54.                <version>${project.version}</version>
    55.            </dependency>
    56.            <dependency>
    57.                <groupId>com.baiyan</groupId>
    58.                <artifactId>auth-service</artifactId>
    59.                <version>${project.version}</version>
    60.            </dependency>
    61.            <dependency>
    62.                <groupId>com.baiyan</groupId>
    63.                <artifactId>auth-web</artifactId>
    64.                <version>${project.version}</version>
    65.            </dependency>
    66.            <dependency>
    67.                <groupId>com.baiyan</groupId>
    68.                <artifactId>auth-rpc</artifactId>
    69.                <version>${project.version}</version>
    70.            </dependency>
    71.            <dependency>
    72.                <groupId>com.baiyan</groupId>
    73.                <artifactId>auth-start</artifactId>
    74.                <version>${project.version}</version>
    75.            </dependency>
    76.        </dependencies>
    77.    </dependencyManagement>
    78.    <build>
    79.        <plugins>
    80.            <plugin>
    81.                <groupId>org.apache.maven.plugins</groupId>
    82.                <artifactId>maven-compiler-plugin</artifactId>
    83.                <version>3.5.1</version>
    84.                <configuration>
    85.                    <source>1.8</source>
    86.                    <target>1.8</target>
    87.                </configuration>
    88.            </plugin>
    89.            <plugin>
    90.                <groupId>org.apache.maven.plugins</groupId>
    91.                <artifactId>maven-source-plugin</artifactId>
    92.                <version>3.2.1</version>
    93.                <executions>
    94.                    <execution>
    95.                        <id>attach-sources</id>
    96.                        <goals>
    97.                            <goal>jar</goal>
    98.                        </goals>
    99.                    </execution>
    100.                </executions>
    101.            </plugin>
    102.        </plugins>
    103.    </build>
    104. </project>
    105. 复制代码

    1.3.子模块依赖对应的common-frame模块并构建依赖顺序

    子模块的父级依赖定义为当前父级pom

    1. <project xmlns="http://maven.apache.org/POM/4.0.0"
    2.         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    3.         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    4.   <parent>
    5.       <groupId>com.baiyan</groupId>
    6.       <artifactId>auth</artifactId>
    7.       <version>0.0.1-SNAPSHOT</version>
    8.   </parent>
    9.   <modelVersion>4.0.0</modelVersion>
    10.   <artifactId>auth-api</artifactId>
    11.   <dependencies>
    12.       <dependency>
    13.           <groupId>com.baiyan</groupId>
    14.           <artifactId>baiyan-common-api</artifactId>
    15.       </dependency>
    16.   </dependencies>
    17. </project>
    18. 复制代码

    按照common-frame的结构构建业务结构

    演示的auth服务中因为没有什么需要特殊定义与业务无关的一些工具类或者组件,所以我在演示服务里面暂时去掉了auth-base。

    到这里看过工程内容的小伙伴是不是有点疑问?

    auth-service中有一些util,为什么不把这些util抽出来放到auth-base中。这里我们需要注意一下,在service中定义的util、常量等一般是具有业务含义的,如果把它们放到auth-base中。那么按照规范我们的auth-api会依赖auth-base,那么这些业务util的逻辑就会暴露出去(比如这里用户密码的加解密逻辑),显然不合理。

    因此,业务的base包存在的场景仅限于你的工具类、常量等定义具有业务开放性。比如外部服务需要知道你的加解密逻辑,外部服务直接调用你jar包中的方法来进行数据加解密。但是这种场景相对来说还是比较少的,如果有,这些工具定义也可以被定义在api包中。

    那么如果有这种仅需要在service中使用,不需要开放给外部服务的业务无关的一些定义该如何定义呢?

    两种方式:

    1. 在service包中开一个common模块
    2. 在service包与api包中间架一层core包。

    我个人倾向于第二种方式,通过maven模块的形式进行工具类,通用定义隔离,让模块之间的职责更加清晰。但是第一种问题也不大,看大家自己抉择。

    二、各个模块配置与接入

    项目结构搭建完成之后,你只要进行一些简单的配置之后就能进行业务开发了。

    2.1.系统级别的配置

    我们通过spring所提供的多环境配置区分本地配置与线上配置。

    线上配置我们统一走nacos,因为线上的一些配置都是比较隐私的。

    1. server:
    2. port: 8889
    3. ---
    4. spring:
    5. profiles: local
    6. datasource:
    7.   type: com.alibaba.druid.pool.DruidDataSource
    8.   username: root
    9.   password: 123456
    10.   url: jdbc:mysql://localhost:3306/user?autoReconnect=true&autoReconnectForPools=true&useUnicode=true&characterEncoding=utf8&useSSL=false&allowMultiQueries=true&allowPublicKeyRetrieval=true&serverTimezone=GMT%2B8&rewriteBatchedStatements=true
    11.   driver-class-name: com.mysql.cj.jdbc.Driver
    12. logging:
    13. level:
    14.   com:
    15.     baiyan: debug
    16. mybatis:
    17. configuration:
    18.   map-underscore-to-camel-case: true
    19. mapper-locations: classpath*:mapper/*.xml
    20. # login config
    21. auth:
    22. login:
    23.   config:
    24.     captcha: false
    25.     password: true
    26.     tokenTimeout: 86400
    27. resourceApi: /api/**
    28. exclude: /api/**/api-docs
    29. # swagger config ,服务启动后可以直接访问:http://localhost:8889/swagger-ui/index.html
    30. swagger:
    31. config:
    32.   enable: true
    33.   groupName: baiyan
    34.   basePackage: com.baiyan.auth
    35.   title: 柏炎鉴权中心
    36.   description: 柏炎鉴权中心api
    37.   version: 1.0.0-SNAPSHOT
    38. # web serializable config
    39. baiyan:
    40. config:
    41.   jackson:
    42.     enable: true
    43. ---
    44. spring:
    45. profiles: prod
    46. server:
    47. port: 8883
    48. 复制代码

    2.2.增加国际化配置文件

    在resource的根目录下增加message.properties.

    演示的demo里面没有区分多语言,多语言配置只要在每个文件下增加固定的语言后缀即可。

    2.3.启动类

    启动类不用像在自己使用微服务时一样,定义很多的注解

    1. @SpringBootApplication
    2. @EnableDiscoveryClient
    3. @EnableCircuitBreaker
    4. 复制代码

    直接使用common-frame提供的注解

    1. @BaiyanApplication
    2. 复制代码

    来集成springcloud。

    后续如果有一些通用的启动类上标注的注解也可以再扩展common-frame的注解,简化业务代码。

    2.4.业务rpc模块自动配置类

    在rpc包中增加如下自动配置类

    1. @Configuration
    2. @Import(AuthFeignConfig.class)
    3. @AutoConfigureOrder(Ordered.HIGHEST_PRECEDENCE)
    4. @EnableFeignClients(basePackages = "com.baiyan.auth.rpc")
    5. public class AuthFeignClientAutoConfiguration {
    6. }
    7. 复制代码

    就可以让你的rpc被其他服务开箱即用,不需要服务调用方在启动类上再增加

    1. @EnableFeignClients(value = {"com.baiyan.auth.rpc"})
    2. 复制代码

    三、总结

    本文不涉及复杂的代码结构与思想,主要为大家介绍如何在日常的业务服务中使用common-frame。

    至此,整个基础架构的介绍都已经结束了。

    这个系列主要是想为大家介绍如何来构建起微服务的内部项目架构,抽离出通用的逻辑与配置来统一维护,让业务服务专注于业务开发。

    文章开头的demo如果你们好好研究与打磨,我相信你会有不小的收获。

    说的再多不如直接给你看代码,对吧。

    有任何问题都可以加我微信或者在文章末尾留言哦~

  • 相关阅读:
    FRP之入门篇
    Spring Boot 和 Spring Cloud: 区别与联系
    HC32L110 在 Ubuntu 下使用 J-Link 烧录
    在AndroidR user版本的设备上,如何默认打开USB调试,如何去掉USB调试确认弹窗
    想要精通算法和SQL的成长之路 - 划分字母区间
    23.Spring Cloud + Spring Boot + Mybatis + Uniapp分布式、微服务、云架构企业快速开发架构之Shell 函数
    智慧公厕:细致入微的城市贴心服务与便捷方便的生活配套
    macOS Big Sur(macos11版本)
    c++特殊类
    Linux之高级IO相关内容整理分析
  • 原文地址:https://blog.csdn.net/BASK2311/article/details/127784636