1.2闪聚支付 第1章 讲义-项目介绍与环境搭建_黑马闪聚支付项目配置文件-程序员宅基地

技术标签: java  项目笔记  

1.2 闪聚支付 第1章 讲义-开发环境搭建

服务端搭建

开发工具配置

服务端工程使用IntellijIDEA开发,IDEA开发环境配置如下:

1、首先配置JDK

在这里插入图片描述
在这里插入图片描述

2、配置maven环境

安装maven3.3.9,过程略。

关于maven仓库有以下配置方法:

(1)已经有私服地址可在setting.xml中配置私服地址
<!--在setting.xml中<servers>段增加-->
<server>
	<id>maven‐releases</id>
	<username>私服账号</username>
	<password>私服密码</password>
</server>
<server>
	<id>maven‐snapshots</id>
	<username>私服账号</username>
	<password>私服密码</password>
</server>

<!--在<mirrors>添加-->
<mirror>
	<id>nexus</id>
	<mirrorOf>*</mirrorOf>
	<url>私服地址</url>
</mirror>
(2)从中央仓库下载

不作任何配置,maven自行从中央仓库下载,也可使用阿里官网Maven库:

<mirror>
	<id>alimaven</id>
	<name>aliyun maven</name>
	<url>http://maven.aliyun.com/nexus/content/groups/public</url>
	<mirrorOf>central</mirrorOf>
</mirror>
(3)使用本地仓库

本教程使用本地仓库配置。在maven的setting.xml文件中配置本地仓库的路径,路径位置不要使用中文,配置例子如下:
在这里插入图片描述
在IDEA中选择setting.xml文件,自动找到本地仓库目录 ,如下图:
在这里插入图片描述

3、配置编码

在这里插入图片描述

4、配置快捷键

IDEA可以集成Eclipse的快捷键
在这里插入图片描述
如需自定义则点击“copy”复制一份进行修改

5、自动导入包 快捷方式

idea可以自动优化导入包,但是有多个同名的类调用不同的包,必须自己手动 Alt+Enter 设置

设置idea导入包
在这里插入图片描述

6、代码模板

自定义自己的代码模板
在这里插入图片描述

7、提示忽略大小写

默认IDEA的提示是区分大小写的,这里设置为提示忽略大小写
在这里插入图片描述

8、Lombok

Lombok是一个实用的java工具,使用它可以消除java代码的臃肿,Lombok提供一系列的注解,使用这些注解可以不用定义getter/setter、equals、构造方法等,它会在编译时在字节码文件自动生成这些通用的方法,简化开发人员的工作。

项目官方地址:https://www.projectlombok.org/

比如上节创建的UserTest模型,@Data 注解可以自动生成getter/setter方法, @ToString 生成tostring方法。

使用方法:

① 在项目中添加Lombok的依赖

作用:项目在编译时根据Lombok注解生成通用方法,依赖如下:

<dependency>
	<groupId>org.projectlombok</groupId>
	<artifactId>lombok</artifactId>
</dependency>
② 在IDEA开发工具中添加Lombok插件

作用:使用IDEA开发时根据Lombok注解生成通用方法,不报错。
在这里插入图片描述
在这里插入图片描述

9、配置虚拟机内存

修改idea64.exe.vmoptions(64位电脑选择此文件)

一个例子,电脑内存8G,设置如下:

-Xms1024m -Xmx4096m -XX:MaxPermSize=1024m -XX:ReservedCodeCacheSize=1024m

Nacos服务发现与配置中心

微服务开发需要构建服务发现中心、配置中心,本项目采用Nacos来实现。

详见 Nacos服务发现与配置中心管理

Mybatis Plus

本项目数据库使用 mysql-community-5.7,请自行安装MySQL数据库。

本项目持久层采用Mybatis Plus作为技术构架,Mybatis Plus是在Mybatis基础上作了很好的封装,方便系统开发。

学习Mybatis Plus详见 Mybatis-Plus介绍

导入基础工程

将基础工程导入IDEA,如下是基础工程结构图:
在这里插入图片描述

工程名 说明
shanjupay 闪聚支付父工程
shanjupay-common 项目通用工程包括:常用工具类和分页信息封装VO等

导入项目初始SQL

使用客户端连接MySQL,执行 shanjupay-init.sql ,执行脚本自动创建数据库并导入初始数据。

数据库清单如下:

数据库名称 数据内容
shanjupay_merchant_service 用户中心数据
shanjupay_transaction 交易服务数据库

备注:数据库、表中的字段以及表关系会在后续开发过程中随用随讲。

搭建项目服务

本节搭建如下项目工程:

服务名 职责
商户平台应用(shanjupay-merchant-application) 为前端提供商户管理功能
商户服务API(shanjupay-merchant-api) 定义商户服务提供的接口
商户服务(shanjupay-merchant-service) 实现商户服务的所有接口

三个工程在架构中的位置如下:
在这里插入图片描述

搭建商户平台应用工程

在基础工程的基础上创建商户平台应用工程。

1、选中shanjupay工程,右键选择新建Module
在这里插入图片描述
2、选择Maven和JDK1.8
在这里插入图片描述
3、填写ArtifactId: shanjupay-merchant-application,设置Modoule Name:shanjupay-merchant-application
在这里插入图片描述
在这里插入图片描述
4、点击Fininsh完成创建

5、添加依赖,完善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">
    <parent>
        <artifactId>shanjupay</artifactId>
        <groupId>com.shanjupay</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.shanjupay</groupId>
    <artifactId>shanjupay-merchant-application</artifactId>

    <dependencies>
        <!-- Nacos配置中心 -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
        </dependency>

        <!-- Nacos注册中心 -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>

        <!-- Dubbo启动器 -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-dubbo</artifactId>
        </dependency>

        <!-- Web启动器  -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <!-- Spring Boot启动器 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
            <exclusions>
                <!--与log4j4日志冲突,去除 -->
                <exclusion>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-logging</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

        <!-- log4j4启动器 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-log4j2</artifactId>
        </dependency>

        <!-- 注释处理器 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-configuration-processor</artifactId>
            <optional>true</optional>
        </dependency>

        <!-- 健康检查,运维相关 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>

        <!-- 测试启动器 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <!-- Swagger依赖 -->
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger2</artifactId>
        </dependency>

    </dependencies>
</project>

6、配置bootstrap.yml

server:
  port: 57010 #启动端口 命令行注入
  max-http-header-size: 100KB

nacos:
  server:
    addr: 127.0.0.1:8848

spring:
  application:
    name: merchant-application
  main:
    allow-bean-definition-overriding: true # Spring Boot 2.1 需要设定
  cloud:
    nacos:
      discovery:
        server-addr: ${
    nacos.server.addr}
        namespace: 2aac6f5e-f974-464c-8261-ce06c0566687  #在nacos上新建的空间
        cluster-name: DEFAULT
      config:
        server-addr: ${
    nacos.server.addr} # 配置中心地址
        file-extension: yaml
        namespace: 2aac6f5e-f974-464c-8261-ce06c0566687 # 命令行注入
        group: SHANJUPAY_GROUP # 聚合支付业务组
        ext-config:
        -
          refresh: true
          data-id: spring-boot-http.yaml # spring boot http配置
          group: COMMON_GROUP # 通用配置组
  #SpringMVC上传文件配置
  servlet:
    multipart:
      #默认支持文件上传.
      enabled: true
      #支持文件写入磁盘.
      file-size-threshold: 0
      # 上传文件的临时目录
      location:
      # 最大支持文件大小
      max-file-size: 1MB
      # 最大支持请求大小
      max-request-size: 30MB

dubbo:
  scan:
    # dubbo 服务扫描基准包
    base-packages: com.shanjupay
  protocol:
    # dubbo 协议
    name: dubbo
    port: 20891
  registry:
    address: nacos://127.0.0.1:8848
  application:
    qos:
      port: 22310 # dubbo qos端口配置  命令行注入
  consumer:
    check: false
    timeout: 3000
    retries: -1

logging:
  config: classpath:log4j2.xml

7.、 在Nacos中添加spring-boot-http.yaml配置,Group:COMMON_GROUP,这里统一使用dev命名空间,没有此命名空间则在nacos中创建。

#HTTP格式配置
spring:
  http:
    encoding:
      charset: utf-8
      force: true
      enabled: true
  messages:
    encoding: UTF-8
#tomcat头信息(用户ip和访问协议)及访问路径配置
server:
  tomcat:
    remote-ip-header: x-forwarded-for   #头信息
    protocol-header: x-forwarded-proto
  servlet:
    context-path: /    #[请求路径]
  use-forward-headers: true

#服务监控与管理配置,运维相关
management:
  endpoints:
    web:
      exposure:
        include: refresh,health,info,env

Nacos配置页面如下所示:
在这里插入图片描述
8、在Nacos中添加merchant-application.yaml配置,Group:SHANJUPAY_GROUP

#覆盖访问路径
server:
  servlet:
    context-path: /merchant
#启用Swagger
swagger:
  enable: true

Nacos配置页面如下所示:
在这里插入图片描述
9、在resources目录下添加log4j2配置文件:log4j2.xml

log4j2是log4j的改进版本,性能比log4j要高,通常日志配置文件在开发可以调整日志级别,输出详细的日志来跟踪程序的执行。

<?xml version="1.0" encoding="UTF-8"?>
<Configuration monitorInterval="180" packages="">
    <properties>
        <property name="prjname">${project.name}</property>
        <property name="logdir">logs</property>
        <property name="PATTERN">[${project.name}][${env:SERVER_PORT}] %date{YYYY-MM-dd HH:mm:ss,SSS} %highlight{%level}
            [%thread][%file:%line] - %msg%n%throwable
        </property>
    </properties>
    <Appenders>
        <Console name="Console" target="SYSTEM_OUT">
            <PatternLayout pattern="${PATTERN}"/>
        </Console>

        <RollingFile name="ErrorAppender" fileName="${logdir}/${prjname}_error.log"
                     filePattern="${logdir}/$${date:yyyy-MM-dd}/${prjname}_error.%d{yyyy-MM-dd-HH}.log" append="true">
            <PatternLayout pattern="${PATTERN}"/>
            <ThresholdFilter level="ERROR" onMatch="ACCEPT" onMismatch="DENY"/>
            <Policies>
                <TimeBasedTriggeringPolicy interval="1" modulate="true"/>
            </Policies>
        </RollingFile>

        <RollingFile name="DebugAppender" fileName="${logdir}/${prjname}_info.log"
                     filePattern="${logdir}/$${date:yyyy-MM-dd}/${prjname}_info.%d{yyyy-MM-dd-HH}.log" append="true">
            <PatternLayout pattern="${PATTERN}"/>
            <ThresholdFilter level="DEBUG" onMatch="ACCEPT" onMismatch="DENY"/>
            <Policies>
                <TimeBasedTriggeringPolicy interval="1" modulate="true"/>
            </Policies>
        </RollingFile>

        <!--异步appender-->
        <Async name="AsyncAppender" includeLocation="true">
            <AppenderRef ref="ErrorAppender"/>
            <AppenderRef ref="DebugAppender"/>
        </Async>
    </Appenders>

    <Loggers>
        <!--过滤掉spring和mybatis的一些无用的debug信息-->
        <logger name="org.springframework" level="INFO">
        </logger>
        <logger name="org.mybatis" level="INFO">
        </logger>
        <logger name="springfox" level="INFO">
        </logger>
        <logger name="org.apache.http" level="INFO">
        </logger>
        <logger name="com.alibaba.nacos" level="WARN">
        </logger>

        <!--OFF   0-->
        <!--FATAL   100-->
        <!--ERROR   200-->
        <!--WARN   300-->
        <!--INFO   400-->
        <!--DEBUG   500-->
        <!--TRACE   600-->
        <!--ALL   Integer.MAX_VALUE-->
        <!--日志等级:INFO可以手动改动-->
        <Root level="INFO" includeLocation="true">
            <AppenderRef ref="AsyncAppender"/>
            <AppenderRef ref="Console"/>
        </Root>
    </Loggers>
</Configuration>

10、添加启动类

  1. 添加包:com.shanjupay.merchant
  2. 新建启动类:MerchantApplicationBootstrap
package com.shanjupay.merchant;
//merchant 表示商户
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

@SpringBootApplication
@EnableDiscoveryClient
public class MerchantApplicationBootstrap {
    
    public static void main(String[] args) {
    
        SpringApplication.run(MerchantApplicationBootstrap.class, args);
    }
}

11、启动服务
在这里插入图片描述
访问http://localhost:8848/nacos nacos服务列表,发现shanjupay-merchant-application服务已注册到nacos中。
在这里插入图片描述

搭建商户服务工程

在基础工程的基础上创建商户服务工程,商户服务工程包括接口和接口实现两个子工程。

1、按上述步骤创建商户服务工程 shanjupay-merchant

2、在 shanjupay-merchant 下创建 shanjupay-merchant-api ,选中shanjupay-merchant工程右键–>New–>Module,填写artifactId和Module Name:shanjupay-merchant-api
在这里插入图片描述
在这里插入图片描述

3、在 shanjupay-merchant 下创建 shanjupay-merchant-service ,选中 shanjupay-merchant 工程右键–>New–>Module,填写artifactId和Module Name:shanjupay-merchant-service
在这里插入图片描述
在这里插入图片描述
4、两个工程创建成功后,项目整体目录结构如下所示:
在这里插入图片描述
5、完善pom.xml,

shanjupay-merchant-api 模块依赖如下:

<?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">
    <parent>
        <artifactId>shanjupay-merchant</artifactId>
        <groupId>com.shanjupay</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.shanjupay</groupId>
    <artifactId>shanjupay-merchant-api</artifactId>
    <dependencies>
        <dependency>
            <groupId>com.shanjupay</groupId>
            <artifactId>shanjupay-common</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
    </dependencies>
</project>

shanjupay-merchant-service 模块依赖

<?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">
    <parent>
        <artifactId>shanjupay-merchant</artifactId>
        <groupId>com.shanjupay</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.shanjupay</groupId>
    <artifactId>shanjupay-merchant-service</artifactId>
    <dependencies>
        <!--nacos配置中心-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
        </dependency>
        <!--nacos注册中心-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
        <!--dubbo启动器-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-dubbo</artifactId>
        </dependency>
        <!--web启动器-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!--Spring Boot启动器-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
            <exclusions>
                <exclusion>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-logging</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
        </dependency>

        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-generator</artifactId>
        </dependency>

        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis-typehandlers-jsr310</artifactId>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
        <!--log4j4启动器-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-log4j2</artifactId>
        </dependency>
        <!--注释处理器-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-configuration-processor</artifactId>
            <optional>true</optional>
        </dependency>
        <!--健康检查,运维相关-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <!--测试启动器-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <!-- 对象池 -->
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-pool2</artifactId>
        </dependency>
        <dependency>
            <groupId>org.mapstruct</groupId>
            <artifactId>mapstruct-jdk8</artifactId>
        </dependency>
        <dependency>
            <groupId>org.mapstruct</groupId>
            <artifactId>mapstruct-processor</artifactId>
            <version>${org.mapstruct.version}</version>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>${org.projectlombok.version}</version>
        </dependency>
    </dependencies>
</project>

6、在resources目录下添加日志配置文件:log4j2.xml

7、在resources目录下添加配置文件:bootstrap.yml,将下边配置中namespace的ID替换为之前创建的dev命名空间的ID

bootstrap.yml内容如下

server:
  port: 56040 #启动端口 命令行注入

nacos:
  server:
    addr: 127.0.0.1:8848

spring:
  application:
    name: merchant-service
  main:
    allow-bean-definition-overriding: true # Spring Boot 2.1 需要设定
  cloud:
    nacos:
      discovery:
        server-addr: ${
    nacos.server.addr}
        namespace: 2aac6f5e-f974-464c-8261-ce06c0566687
        cluster-name: DEFAULT
      config:
        server-addr: ${
    nacos.server.addr} # 配置中心地址
        file-extension: yaml
        namespace: 2aac6f5e-f974-464c-8261-ce06c0566687 # 命令行注入
        group: SHANJUPAY_GROUP # 聚合支付业务组
        ext-config:
        -                     # -   此处不不能删除              
          refresh: true
          data-id: spring-boot-http.yaml # spring boot http配置
          group: COMMON_GROUP # 通用配置组

dubbo:
  scan:
    # dubbo 服务扫描基准包
    base-packages: com.shanjupay
  protocol:
    # dubbo 协议
    name: dubbo
    port: 20890
  registry:
    address: nacos://127.0.0.1:8848
  application:
    qos:
      port: 22240 # dubbo qos端口配置  命令行注入
  consumer:
    check: false
    timeout: 90000
    retries: -1

logging:
  config: classpath:log4j2.xml

8、在Nacos中添加merchant-service.yaml配置,Group:SHANJUPAY_GROUP

#覆盖spring-boot-http.yaml的项目
server:
  servlet:
    context-path: /merchant-service

在这里插入图片描述
9、添加商户中心服务启动类

package com.shanjupay.merchant;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class MerchantBootstrap {
    

    public static void main(String[] args) {
    
        SpringApplication.run(MerchantBootstrap.class,args);
    }
}
工程测试

通过一个案例“根据Id查询商户”的开发去熟悉项目架构的基本开发方法。

生成代码

使用mp的自动生成工程生成entity、mapper等文件。

1、修改生成类中的数据库链接,连接shanjupay_merchant_service数据库

// 商户服务
dataSourceConfig.setUrl("jdbc:mysql://127.0.0.1:3306/shanjupay_merchant_service?serverTimezone=Asia/Shanghai");

2、设置包路径

// 生成包配置
PackageConfig packageConfig = new PackageConfig();
packageConfig.setParent("com.shanjupay");

3、运行生成类,输入模块名:merchant
在这里插入图片描述
生成成功:
在这里插入图片描述
将生成的entity、mapper拷贝到shanjupay-merchant-service工程

Mybatis-Plus配置
配置连接池Druid

1、在nacos中新建连接池Druid配置:spring-boot-starter-druid.yaml,Group为:COMMON_GROUP,内容如下:

spring:
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/oauth?useUnicode=true
    username: root
    password: root
    druid:
      initial-size: 5
      min-idle: 5
      max-active: 20
      max-wait: 60000
      time-between-eviction-runs-millis: 60000
      min-evictable-idle-time-millis: 300000
      validation-query: SELECT 1 FROM DUAL
      test-while-idle: true
      test-on-borrow: true
      test-on-return: false
      pool-prepared-statements: true
      max-pool-prepared-statement-per-connection-size: 20
      filter:
        stat:
          slow-sql-millis: 1
          log-slow-sql: true
      filters: config,stat,wall,log4j2
      web-stat-filter:
        enabled: true
        url-pattern: /*
        exclusions: "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*"
        session-stat-enable: false
        session-stat-max-count: 1000
        principal-cookie-name: admin
        principal-session-name: admin
        profile-enable: true
      stat-view-servlet:
        enabled: true
        url-pattern: /druid/*
        allow: 127.0.0.1,192.168.163.1
        deny: 192.168.1.73
        reset-enable: false
        login-password: admin
        login-username: admin
      aop-patterns: com.shanjupay.*.service.*

在这里插入图片描述
2、在nacos的配置列表商户服务中覆盖部分配置(数据库名和用户名密码):merchant-service.yaml

# 覆盖spring‐boot‐starter‐druid.yaml的项目
spring:
  datasource:
    url: jdbc:mysql://127.0.0.1:3306/shanjupay_merchant_service?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&useSSL=false
    username: root
    password: root

在这里插入图片描述
3、应用配置到商户服务shanjupay-merchant-service项目中:bootstrap.yml

	ext-config:
		- 
		  refresh: true
		  data-id: spring-boot-starter-druid.yaml # spring boot starter druid配置
		  group: COMMON_GROUP # 通用配置组

在这里插入图片描述

配置Mybatis-Plus

1、在nacos中添加配置:spring-boot-mybatis-plus.yaml,Group为:COMMON_GROUP

mybatis-plus:
  configuration:
    cache-enabled: false
    map-underscore-to-camel-case: true
  global-config:
    id-type: 0
    field-strategy: 0
    db-column-underline: true
    refresh-mapper: true
  type-aliases-package: com.shanjupay.user.entity
  mapper-locations: classpath:com/shanjupay/*/mapper/*.xml 

在这里插入图片描述
2、在nacos的配置列表的商户服务覆盖部分Mybatis-Plus配置:merchant-service.yaml

# 覆盖spring‐boot‐mybatis‐plus.yaml的项目
mybatis-plus:
  type-aliases-package: com.shanjupay.merchant.entity
  mapper-locations: classpath:com/shanjupay/*/mapper/*.xml  

在这里插入图片描述
3、应用配置到本地项目中:bootstrap.yml

	ext-config:
        -
          refresh: true
          data-id: spring-boot-mybatis-plus.yaml # spring boot mybatisplus配置
          group: COMMON_GROUP # 通用配置组

在这里插入图片描述
4、在shanjupay-merchant-service工程中添加分页和性能分析插件:MybatisPlusConfig

package com.shanjupay.merchant.config;

import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor;
import com.baomidou.mybatisplus.extension.plugins.PerformanceInterceptor;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * @author Administrator
 * @version 1.0
 * Mybatis‐Plus 配置
 **/
@Configuration
@MapperScan("com.shanjupay.**.mapper")
public class MybatisPlusConfig {
    

    /**
     * 分页插件,自动识别数据库类型
     */
    @Bean
    public PaginationInterceptor paginationInterceptor() {
    
        return new PaginationInterceptor();
    }

    /**
     * 启用性能分析插件
     */
    @Bean
    public PerformanceInterceptor performanceInterceptor(){
    
        return new PerformanceInterceptor();
    }
}
创建接口

在shanjupay-merchant-api工程下新建商户接口:MerchantService

package com.shanjupay.merchant.api;

import com.shanjupay.merchant.api.dto.MerchantDTO;

public interface MerchantService {
    

    //根据 id查询商户  返回值类型为自定义MerchantDTO 
    //主要原因:保证MerchantDTO作为数据库表字段一一对应关系
    //简单理解为:service接口于dao层接口不同
    public MerchantDTO queryMerchantById(Long id);
}

注意:DTO类型的对象作为service层传输的对象。

在shanjupay-merchant-api工程 定义MerchantDTO

package com.shanjupay.merchant.api.dto;

import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

import java.io.Serializable;

/**
 * @author Administrator
 * @version 1.0
 **/
@ApiModel(value = "MerchantDTO", description = "商户信息")
@Data
public class MerchantDTO implements Serializable {
    

    @ApiModelProperty("商户id")
    private Long id;

    @ApiModelProperty("企业名称")
    private String merchantName;

    @ApiModelProperty("企业编号")
    private String merchantNo;

    @ApiModelProperty("企业地址")
    private String merchantAddress;

    @ApiModelProperty("行业类型")
    private String merchantType;

    @ApiModelProperty("营业执照")
    private String businessLicensesImg;

    @ApiModelProperty("法人身份证正面")
    private String idCardFrontImg;

    @ApiModelProperty("法人身份证反面")
    private String idCardAfterImg;

    @ApiModelProperty("联系人")
    private String username;

    @ApiModelProperty("密码")
    private String password;

    @ApiModelProperty("手机号,关联统一账号")
    private String mobile;

    @ApiModelProperty("联系人地址")
    private String contactsAddress;

    @ApiModelProperty("审核状态,0-未申请,1-已申请待审核,2-审核通过,3-审核拒绝")
    private String auditStatus;

    @ApiModelProperty("租户ID")
    private Long tenantId;
}

@ApiModel@ApiModelProperty 是Swagger注解后边会学习。

创建接口实现

在shanjupay-merchant-service下新建商户接口实现类:MerchantServiceImpl,并添加新建商户测试方法

本方法从shanjupay_merchant_service数据库的merchant查询数据。

package com.shanjupay.merchant.service;

import com.shanjupay.merchant.api.MerchantService;
import com.shanjupay.merchant.api.dto.MerchantDTO;
import com.shanjupay.merchant.entity.Merchant;
import com.shanjupay.merchant.mapper.MerchantMapper;
import org.springframework.beans.factory.annotation.Autowired;

/**
 * Created by Administrator.
 */
注意导包.dubbo.config.annotation.Service;
@org.apache.dubbo.config.annotation.Service
public class MerchantServiceImpl implements MerchantService {
    

    @Autowired
    MerchantMapper merchantMapper;

    /**
     * 根据id查询商户信息
     */
    @Override
    public MerchantDTO queryMerchantById(Long id) {
    
        Merchant merchant = merchantMapper.selectById(id);
        MerchantDTO merchantDTO = new MerchantDTO();
        merchantDTO.setId(merchant.getId());
        merchantDTO.setMerchantName(merchant.getMerchantName());
        //设置其他属性....
        return merchantDTO;
    }
}
应用层

在shanjupay-merchant-application下添加如下pom依赖:

<!--商户服务API-->
<dependency>
    <groupId>com.shanjupay</groupId>
    <artifactId>shanjupay-merchant-api</artifactId>
    <version>1.0-SNAPSHOT</version>
</dependency>

在shanjupay-merchant-application下新建商户Controller:MerchantController,并调用商户中心服务提供的新建商户接口

package com.shanjupay.merchant.controller;

import com.shanjupay.merchant.api.MerchantService;
import com.shanjupay.merchant.api.dto.MerchantDTO;
import org.apache.dubbo.config.annotation.Reference;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class MerchantController {
    
    //注意导入包:import org.apache.dubbo.config.annotation.Reference;
    @Reference
    private MerchantService merchantService;
+
    @GetMapping("/merchants/{id}")
    public MerchantDTO queryMerchantById(@PathVariable("id") Long id) {
    
        MerchantDTO merchantDTO = merchantService.queryMerchantById(id);
        return merchantDTO;
    }
}

1、启动商户平台应用和商户服务
在这里插入图片描述
2、访问 .,测试根据id查询商户

如果merchant表没有数据可手动添加后再行测试。如下结果:
在这里插入图片描述

接口相关工具

API接口文档利器:Swagger

Swagger介绍

Swagger 是一个规范和完整的框架,用于生成、描述、调用和可视化 RESTful 风格的 Web 服务(https://swagger.io/)。 它的主要作用是:

  1. 使得前后端分离开发更加方便,有利于团队协作
  2. 接口的文档在线自动生成,降低后端开发人员编写接口文档的负担
  3. 功能测试

Spring已经将Swagger纳入自身的标准,建立了Spring-swagger项目,现在叫Springfox。通过在项目中引入Springfox ,即可非常简单快捷的使用Swagger。

SpringBoot集成Swagger

1、在shanjupay-common项目中添加依赖,只需要在shanjupay-common中进行配置即可,因为其他微服务工程都直接或间接依赖shanjupay-common。

<!-- Swagger依赖 -->
<dependency>
    <groupId>io.springfox</groupId>
    <artifactId>springfox-swagger2</artifactId>
</dependency>

<dependency>
    <groupId>io.springfox</groupId>
    <artifactId>springfox-swagger-ui</artifactId>
</dependency>

2、在shanjupay-merchant-application工程的config包中添加一个Swagger配置类

package com.shanjupay.merchant.config;

import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.Contact;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;

@Configuration
@ConditionalOnProperty(prefix = "swagger", value = {
    "enable"}, havingValue = "true")
@EnableSwagger2
public class SwaggerConfiguration {
    

    @Bean
    public Docket buildDocket() {
    
        return new Docket(DocumentationType.SWAGGER_2)
                .apiInfo(buildApiInfo())
                .select()
                // 要扫描的API(Controller)基础包
                .apis(RequestHandlerSelectors.basePackage("com.shanjupay.merchant.controller"))
                .paths(PathSelectors.any())
                .build();
    }

    /**
     * @param
     * @return springfox.documentation.service.ApiInfo
     * @Title: 构建API基本信息
     * @methodName: buildApiInfo
     */
    private ApiInfo buildApiInfo() {
    
        Contact contact = new Contact("开发者", "", "");
        return new ApiInfoBuilder()
                .title("闪聚支付-商户应用API文档")
                .description("")
                .contact(contact)
                .version("1.0.0").build();
    }
}

3、添加SpringMVC配置类:WebMvcConfig,让外部可直接访问Swagger文档[放行]

package com.shanjupay.merchant.config;

import org.springframework.stereotype.Component;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Component
public class WebMvcConfig implements WebMvcConfigurer {
    
    /**
     * 添加静态资源文件,外部可以直接访问地址
     */
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
    
        registry.addResourceHandler("/**").addResourceLocations("classpath:/static/");

        registry.addResourceHandler("swagger-ui.html")
                .addResourceLocations("classpath:/META-INF/resources/");

        registry.addResourceHandler("/webjars/**")
                .addResourceLocations("classpath:/META-INF/resources/webjars/");
    }
}
Swagger常用注解

在Java类中添加Swagger的注解即可生成Swagger接口文档,常用Swagger注解如下:

  • @Api :修饰整个类,描述Controller的作用 @ApiOperation:描述一个类的一个方法,或者说一个接口
  • @ApiParam :单个参数的描述信息
  • @ApiModel :用对象来接收参数
  • @ApiModelProperty :用对象接收参数时,描述对象的一个字段
  • @ApiResponse :HTTP响应其中1个描述
  • @ApiResponses:HTTP响应整体描述
  • @ApiIgnore :使用该注解忽略这个API
  • @ApiError :发生错误返回的信息
  • @ApiImplicitParam :一个请求参数
  • @ApiImplicitParams :多个请求参数的描述信息

@ApiImplicitParam 属性:
在这里插入图片描述
上边的属性后边编写程序时用到哪个我再详细讲解,下边写一个swagger的简单例子,我们在MerchantController中添加Swagger注解,代码如下所示:

package com.shanjupay.merchant.controller;

import com.shanjupay.merchant.api.MerchantService;
import com.shanjupay.merchant.api.dto.MerchantDTO;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiOperation;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * @author Administrator
 * @version 1.0
 **/
@RestController
@Api(value = "商户平台应用接口", tags = "商户平台应用接口", description = "商户平台应用接口")
public class MerchantController {
    

    @org.apache.dubbo.config.annotation.Reference
    MerchantService merchantService;

    @ApiOperation(value = "根据id查询商户信息")
    @GetMapping("/merchants/{id}")
    public MerchantDTO queryMerchantById(@PathVariable("id") Long id) {
    

        MerchantDTO merchantDTO = merchantService.queryMerchantById(id);
        return merchantDTO;
    }

    @ApiOperation("测试")
    @GetMapping(path = "/hello")
    public String hello() {
    
        return "hello";
    }

    @ApiOperation("测试")
    @ApiImplicitParam(name = "name", value = "姓名", required = true, dataType = "string")
    @PostMapping(value = "/hi")
    public String hi(String name) {
    
        return "hi," + name;
    }
}
Swagger测试

1、启动商户应用和商户中心服务,访问:http://localhost:57010/merchant/swagger-ui.html
在这里插入图片描述
2、点击其中任意一项即可打开接口详情,如下图所示:
在这里插入图片描述
3、点击“Try it out”开始测试,并录入参数信息,然后点击“Execute"发送请求,执行测试返回结果:“hi,李四”
在这里插入图片描述
在这里插入图片描述
Swagger生成API文档的工作原理:

  1. shanjupay-merchant-application启动时会扫描到SwaggerConfiguration类
  2. 在此类中指定了扫描包路径com.shanjupay.merchant.controller,会找到在此包下及子包下标记有 @RestController 注解的controller类
  3. 根据controller类中的Swagger注解生成API文档

接口调试利器Postman

Postman是一款功能强大的http接口测试工具,使用Postman可以完成http各种请求的功能测试。作为服务器端开发人员,当一个业务功能开发完毕后,应该用Postman进行功能测试。

1、请自行在本机安装Postman

2、新建集合(建议一个微服务新建一个对应的集合):闪聚支付-商户应用
在这里插入图片描述
3、在闪聚支付-商户应用集合中新建请求,并录入请求信息
在这里插入图片描述
在这里插入图片描述
填写新建商户接口地址和请求类型后,点击Send发送请求:
在这里插入图片描述
小技巧:每个测试都可以进行保存(Ctrl+S),以便于后续使用。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/guan1843036360/article/details/124441098

智能推荐

python箭头符号怎么打_python – 用箭头标记matplotlib直方图bin-程序员宅基地

文章浏览阅读1.2k次。您可以使用注释添加箭头:import pandas as pdimport matplotlib.pyplot as plt#import seaborn as snsimport numpy as npfig,ax = plt.subplots()series = pd.Series(np.random.normal(0,1000))series.plot(kind='hist',bins=50..._python右箭头怎么打出来

python数据滤波_python实现滤波-程序员宅基地

文章浏览阅读1.1k次。Python+OpenCV基础教程2:平滑图像学习模糊/平滑图像,消除噪点。图片等可到源码处下载。1、目标2、教程滤波与模糊推荐大家先阅读:番外篇:卷积基础(图片边框),有助于理解卷积和滤波的概念。关于滤波和模糊,很多人分不清,我来给大家理理(虽说如此,我后面也会混着用,,ԾㅂԾ,,):它们都属于卷积,不同滤波方法之间只是卷积...文章初商2019-08-04484浏览量深度学习第18讲:CNN经..._python 血氧滤波

Python 拆分文件路径(/父路径/文件名/后缀名)_python分割路径和文件名-程序员宅基地

文章浏览阅读1.4k次。Python 拆分文件路径(/父路径/文件名/后缀名)_python分割路径和文件名

移动边缘计算MEC学习笔记_移动设备和边缘设备的区别-程序员宅基地

文章浏览阅读6.4k次,点赞12次,收藏101次。移动边缘计算是指在移动网络边缘部署计算和存储资源,为移动网络提供 IT 服务环境和云计算能力,从而为用户提供超低时延和高带宽的网络服务解决方案。计算卸载是指终端设备将部分或全部计算任务交给云计算环境处理的技术,以解决移动设备在资源存储、计算性能以及能效等方面存在的不足。..._移动设备和边缘设备的区别

Verilog 对assign和always的一点理解-程序员宅基地

文章浏览阅读1.3k次。assign 用于描述组合逻辑always@(敏感事件列表) 用于描述时序逻辑敏感事件 上升沿 posedge,下降沿 negedge,或电平敏感事件列表中可以包含多个敏感事件,但不可以同时包括电平敏感事件和边沿敏感事件,也不可以同时包括同一个信号的上升沿和下降沿,这两个事件可以合并为一个电平敏感事件。在新的verilog2001中“,”和“or”都可以用来分割敏感事..._assign能描述时序逻辑吗

Javascript 获取数组长度, 对象成员个数, 字符串数_js对象元素个数-程序员宅基地

文章浏览阅读8.7k次。1.应用场景获取数组长度, 对象成员个数, 字符串数. 2.学习/操作 TBD 3.问题/补充 TBD 4.参考https://www.cnblogs.com/sunnywindycloudy/p/7382226.html //js获取数组长度,对象成员个数、字符串数 后续补充......_js对象元素个数

随便推点

那些“不顾一切”要搞开源的人,现在怎样了?-程序员宅基地

文章浏览阅读1.6k次。开源,不好做,无论是在过去还是现在。过去 20 年间,无数顶尖技术人“冲锋陷阵”,打开了中国开源的大门。还记得彼时“中国 Linux 第一人”宫敏博士用手提肩背,将 20 盒装有 80G ..._开源创业 潜力股 英雄帖,在 10+ 投资人面前秀出你的实力

Linux USB 详解_usbdev_do_ioctl-程序员宅基地

文章浏览阅读1w次。To understand all the Linux-USB framework, youll use these resources: * This source code. "make pdfdocs", "usb.pdf" for host side "gadget.pdf" for peripheral side * The_usbdev_do_ioctl

推荐开源项目:LogMe - 实时日志管理和分析工具-程序员宅基地

文章浏览阅读302次,点赞3次,收藏6次。推荐开源项目:LogMe - 实时日志管理和分析工具项目地址:https://gitcode.com/BNMetrics/logme项目简介LogMe 是一个强大且易用的日志管理与分析平台,它提供了实时查看、搜索、过滤和聚合日志的能力,帮助开发者和运维人员快速定位问题,优化系统性能。这个开源项目旨在简化日志处理流程,让复杂的数据变得简单易读。技术分析架构设计LogMe 基于微服务架构,...

React + TypeScript + antd 常见开发场景_angular12+typescript+antd-程序员宅基地

文章浏览阅读844次。React + TypeScript + antd 的一些常见开发场景,例如: :时间戳转格式、禁用的表单、删除多选表格、文字内容、筛选对象、自封装表格、模态框、步骤条、搜索框、Tree 树、封装axios、CSS滚动样式、Tree、Form、简单 Form、表格、Button、_angular12+typescript+antd

bzoj3924: [Zjoi2015]幻想乡战略游戏(动态点分治 + 欧拉序ST表求LCA)-程序员宅基地

文章浏览阅读181次。题目:题解:大坑啊,来自巨佬的题解 https://www.cnblogs.com/bztMinamoto/p/9489473.html题意转化后就是求带权的重心,考虑暴力的做法:设原树的树根 rtrtrt,sumrtsum_{rt}sumrt​为 rt的所有子树的点权的和,disrtdis_{rt}disrt​为rt子树的点到 rtrtrt 的距离和(题目就是要求disdisdis最小的那...

c语言计算两个大数相加,C语言计算大数相加的方法-程序员宅基地

文章浏览阅读2k次,点赞3次,收藏5次。本文实例为大家分享了C语言计算大数相加的具体代码,供大家参考,具体内容如下问题描述输入两个整数a和b,输出这两个整数的和。a和b都不超过100位。算法描述由于a和b都比较大,所以不能直接使用语言中的标准数据类型来存储。对于这种问题,一般使用数组来处理。定义一个数组A,A[0]用于存储a的个位,A[1]用于存储a的十位,依此类推。同样可以用一个数组B来存储b。计算c=a+b的时候,首先将A[..._c语言两个很大的数相加