创建微服务工程

使用sofast框架进行微服务开发有两种模式:

  • 使用源码工程进行开发【不再推荐使用】
  • 基于so-fast-cloud-dependencies依赖管理进行开发【推荐】

基于so-fast-cloud-dependencies依赖开发

不需要下载工程源码框架,直接创建工程并添加maven依赖,即可轻松使用sofast框架进行微服务开发。

配置maven依赖

在maven配置文件settings.xml中添加私服认证配置

<server>
  <id>sofast-proxy</id>
  <username>ntt-read</username>
  <password>(Nttdata)</password>
</server>
创建工程

使用intellij idea创建一个maven工程,例如:dependtestDemo

image-20210617191154376

Maven依赖
<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.example</groupId>
    <artifactId>demo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>demo</name>
    <description>Demo project for Spring Boot</description>
    <properties>
        <java.version>1.8</java.version>
    </properties>

   <!-- 配置sofast 依赖管理 -->
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>com.sofast.cloud</groupId>
                <artifactId>so-fast-cloud-dependencies</artifactId>
                <version>2.2.0.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <dependencies>
          <!-- rest api开发依赖包 -->
        <dependency>
            <groupId>com.sofast.cloud</groupId>
            <artifactId>so-fast-web-starter</artifactId>
        </dependency>
    </dependencies>

    <!-- maven插件配置 -->
    <build>
        <resources>
            <resource>
                <directory>src/main/resources</directory>
                <filtering>true</filtering>
            </resource>
        </resources>

        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.2</version>
                <configuration>
                    <source>${java.version}</source>
                    <target>${java.version}</target>
                    <encoding>UTF-8</encoding>
                </configuration>
            </plugin>
        </plugins>
    </build>


    <!-- 环境区分 -->
    <profiles>
        <profile>
            <id>dev</id>
            <activation>
                <activeByDefault>true</activeByDefault>
            </activation>
            <properties>
                <profileActive>dev</profileActive>
            </properties>
        </profile>
        <profile>
            <id>test</id>
            <properties>
                <profileActive>test</profileActive>
            </properties>
        </profile>
        <profile>
            <id>prod</id>
            <properties>
                <profileActive>prod</profileActive>
            </properties>
        </profile>
    </profiles>

    <!--指定代理私服镜像-->
    <repositories>
        <repository>
            <id>sofast-proxy</id>
            <url>http://101.133.164.217:8091/repository/maven-public/</url>
            <snapshots>
                <enabled>true</enabled>
                <!--快照更新策略-->
                <updatePolicy>always</updatePolicy>
            </snapshots>
        </repository>
    </repositories>

</project>
配置hosts

在开发时,为了防止因服务器IP变更而导致maven私服地址变化,特意通过hosts配置了IP和私有域名的映射。

配置如下(hosts文件位置:linux在/etc/hosts;windowns在C:¥¥Windows¥System32¥drivers¥etc¥hosts

101.133.164.217 so-fast
101.133.164.217 sofast.com
101.133.164.217 maven.sofast

然而,现在域名服务商在逐步禁止私有域名的使用,因此,后续版本我们将取消hosts配置,直接使用IP地址的方式, 开发人员遇到无法访问时,可将pom.xml中的sofast-proxy标签对应的域名换成上述的ip地址。

新建启动文件

创建启动文件XxxApplication.java

/**
 * xx业务服务
 * @Description: TODO
 * @Date : 2021/6/17 18:53 PM
 * @Author : NCIT
 */
@EnableSwagger2
@EnableSolFeign
@EnableDiscoveryClient
@SpringBootApplication(exclude = DruidDataSourceAutoConfigure.class)
public class XxxApplication {
    public static void main(String[] args) {
        SpringApplication.run(XxxApplication.class, args);
    }
}

@EnableSwagger2 表示要启用swagger api,swagger的扫描路径需要在bootstrap.yml中进行配置

@EnableSolFeign 表示要启用Feign,默认扫描路径为「com.sofast.cloud」,如果自定义包路径,请配置basePackages参数

@EnableDiscoveryClient:服务发现客户端

@SpringBootApplication(exclude = DruidDataSourceAutoConfigure.class) 表示不使用默认的Druid数据源加载,启用sofast框架自定义动态数据源配置

常规微服务需要同时开启以上4个注解。

注意:sofast中使用的orm框架为mybatis-plus,默认的mapper接口扫描路径为:@MapperScan({"com.sofast.cloud..mapper."}),如果自定义开发时,创建了其他前缀包名,请在启动文件配置自定义MapperScan路径,包名规划请尽可能遵守sofast框架规范,减少参数设置

开发

创建目录结构以及开发,请参照开发规范,并推荐使用代码生成器直接进行通用代码框架生成,详细请参照下一章节代码生成器

配置文件
│   │   └── resources
│   │       ├── application-dev.yml   
│   │       ├── application-test.yml  
│   │       ├── application-prod.yml   
│   │       ├── banner.txt
│   │       ├── bootstrap.yml
│   │       ├── i18n
│   │       │   ├── messages.properties
│   │       │   └── messages_zh_CN.properties
│   │       ├── logback.xml

resources目录下需要包含以下资源相关文件

application-xxx.yml是各环境的自定义配置,需要开发者自行修改(目前所有配置文件均迁移到nacos配置中心)

bootstrap.yml是通用配置文件,一般情况无需修改

i18n是国际化资源文件

logback.xml是日志打印配置文件

添加bootstrap.yml配置文件【必要文件】

# 修改为自己服务的端口号
server:
  port: 9044
spring:
  application:
    name: @artifactId@
  profiles:
    active: @profileActive@

  cloud:
    nacos:
      discovery:
        # 服务注册地址
        server-addr: ${NACOS_HOST:localhost}:${NACOS_PORT:8848}
        group: SO_FAST_GROUP
      config:
        # 配置中心地址
        server-addr: ${spring.cloud.nacos.discovery.server-addr}
        # 配置文件格式
        file-extension: yml
        # 共享配置
        group: SO_FAST_GROUP
        shared-configs[0]:
          data-id: application-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}
          group: SO_FAST_GROUP
          refresh: true

#swagger配置(修改为自己的包名)
swagger:
  basePackage: com.sofast.cloud.test.demo

# 利用info端点,加入版本等信息(需要在pom中配置一下信息才可以使用)
#info:
#  versin: @project.version@
#  name: @project.artifactId@
#  group: @project.groupId@
#  description: @project.description@
#  #还可以自定义信息
#  author: NCIT.1SOL

下面对application-dev.yml 配置详细介绍:

########### 本地开发用环境 ###############

# 数据源配置
spring:
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource
    driverClassName: com.mysql.cj.jdbc.Driver
    druid:
      webStatFilter:
        enabled: true
        exclusions: "*.js,*.woff,*.woff2,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*,/v2/api-docs,/swagger*,/error_404"
      statViewServlet:
        enabled: true
        # 设置白名单,不填则允许所有访问
        allow:
        url-pattern: /druid/*
        # 控制台管理用户名和密码
        login-username: sofast
        login-password: sofast

    dynamic:
      druid:
        # 初始连接数
        initialSize: 5
        # 最小连接池数量
        minIdle: 10
        # 最大连接池数量
        maxActive: 20
        # 配置获取连接等待超时的时间
        maxWait: 60000
        # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
        timeBetweenEvictionRunsMillis: 60000
        # 配置一个连接在池中最小生存的时间,单位是毫秒
        minEvictableIdleTimeMillis: 300000
        # 配置一个连接在池中最大生存的时间,单位是毫秒
        maxEvictableIdleTimeMillis: 900000
        # 配置检测连接是否有效
        validationQuery: SELECT 1 FROM DUAL
        testWhileIdle: true
        testOnBorrow: false
        testOnReturn: false
      filter:
        stat:
          enabled: true
          # 慢SQL记录
          log-slow-sql: true
          slow-sql-millis: 1000
          merge-sql: true
        wall:
          config:
            multi-statement-allow: true
      datasource:
        # 主库数据源
        master:
          url: jdbc:mysql://ncit.media.com:3306/tenant-sf-system?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
          username: ENC(ZXWwnvHQB6JFW3vLii1p4U1VlYUuENL1szoreuhoqaAbmEKSDbtzqk7OHoimwWkDWJOtqzVx78eEg0wAmCuVRg==)
          password: ENC(XwwjMe4aUDTGR/OfIh5PXHvWlSDI7zVinVUNu3Wgjl0nUvcWarN1WnG/zmXIVifjd/v8yi33Mo0pytU2o7222w==)
        # 从库数据源

  redis:
    # 地址
    host: ncit.media.com
    port: 6379
    # 密码
    password: Ncit2017
    # 连接超时时间
    timeout: 15s
    jedis:
      pool:
        # 连接池中的最小空闲连接
        min-idle: 3
        # 连接池中的最大空闲连接
        max-idle: 10
        # 连接池的最大数据库连接数
        max-active: 50
        # #连接池最大阻塞等待时间(使用负值表示没有限制)
        max-wait: -1ms
    database: 6

  # 服务模块
  devtools:
  restart:
    # 热部署开关
    enabled: true

#mybatis-plus配置
mybatis-plus:
  # 自定义xml文件路径
  mapper-locations: classpath*:mapper/**/*Mapper.xml
  # MyBaits 别名包扫描路径,通过该属性可以给包中的类注册别名,注册后在 Mapper 对应的 XML 文件中可以直接使用类名,而不用使用全限定的类名(即 XML 中调用的时候不用包含包名)
  type-aliases-package: com.sofast.cloud.**.entity, com.sofast.cloud.**.domain.**
  # mybatis执行器 该执行器类型会复用预处理语句(PreparedStatement)
  executor-type: reuse

  # 控制台打印sql
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

  global-config:
    #是否控制台 print mybatis-plus 的 LOGO
    banner: false

    db-config:
      select-strategy: not_null
      # 逻辑删除配置
      logic-delete-value: 1
      logic-not-delete-value: 0
      logic-delete-field: deleteFlg


#安全配置
sofast:
  log:
    operator:
      # 配置审计日志的拦截范围
      types: insert,update,delete

# 防止XSS攻击
xss:
  # 过滤开关
  enabled: false
  # 排除链接(多个用逗号分隔)
  excludes:
  # 匹配链接
  urlPatterns: /*

数据库、redis请修改为自己的服务器地址

mybatis-plus的配置,也请根据自己的包路径进行对应修改

启动服务

在启动服务之前,请先保证nacos已经正确运行。

直接使用IDE启动为服务,或者使用maven打包后,使用命令启动服务,观察nacos中服务是否注册成功。

通过该链接http://localhost:9044/doc.html 可以查看swagger api doc。

常见问题

1.关于数据源

sofast框架默认使用动态数据源插件,因此在启动类上,我们需要排除默认的DruidDataSourceAutoConfigure配置类,而使用动态数据源插件携带的配置类;在配置文件中,必须按照动态数据源的配置方式,配置jdbc连接,否则启动会报错。

如果该微服务中不需要连接数据库和redis,那么请在pom.xml文件中将数据库依赖包排除。例如:

<dependency>
    <groupId>com.sofast.cloud</groupId>
    <artifactId>so-fast-web-starter</artifactId>
    <exclusions>
        <!-- 排除数据库 -->
        <exclusion>
            <groupId>com.sofast.cloud</groupId>
            <artifactId>so-fast-mybatis-starter</artifactId>
        </exclusion>
        <!-- 排除数据库 -->
        <exclusion>
            <groupId>com.sofast.cloud</groupId>
            <artifactId>so-fast-ds-starter</artifactId>
        </exclusion>
        <!-- 排除redis -->
        <exclusion>
            <groupId>com.sofast.cloud</groupId>
            <artifactId>so-fast-redis-starter</artifactId>
        </exclusion>
    </exclusions>
</dependency>

2.关于微服务路由配置

微服务开发完成后,需要通过网关进行统一转发访问,生产环境不允许直接暴露微服务端口;但是在本地开发时,可以直接访问微服务api。

不通过网关代理,在微服务中是无法获取token及用户信息的,因此只能作为本机开发调试使用。

测试和生产环境,需要在gateway中配置动态路由,才可以通过网关来访问微服务,动态路由的配置可以参考网关中的示例。

3.关于审计日志

sofast框架默认提供了审计日志模块,通过数据库来记录日志信息,如果要使用该功能,那么需要在需要记录日志的方法上添加如下注解:

@LogOperator(title = "请填写方法的描述信息", type = Constants.SELECT_OPERATOR)

该注解有两个必填参数,一个title,是描述这个方法是做什么的,一个type,是标示这个方法的类别(类别有6种:增删改查,上传和下载)

4.关于swagger

sofast框架默认提供swagger api doc,需要在启动类上加入注解@EnableSwagger2,以及在bootstrap.yml文件中配置扫描的包路径

#swagger配置(修改为自己的包名)
swagger:
  basePackage: com.sofast.cloud.test.demo

服务启动后,通过http://ip:port/doc.html 地址就可以访问swagger

Copyright © 2020. 恩梯梯数据(中国)信息技术有限公司. all right reserved,powered by Gitbook该文件修订时间: 2022-04-27 13:59:30

results matching ""

    No results matching ""