聚合支付项目(一)
一、基本環(huán)境搭建
這里使用jdk8+maven3.6+mysql5.5
1、創(chuàng)建基本工程:
其中common公共模塊pom文件導(dǎo)入如下:
<?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><artifactId>shanjupay-common</artifactId><dependencies><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-api</artifactId></dependency><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId></dependency><dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><scope>provided</scope></dependency><dependency><groupId>commons-lang</groupId><artifactId>commons-lang</artifactId></dependency><dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger2</artifactId></dependency><dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger-ui</artifactId></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><configuration><skip>true</skip><finalName>${project.name}</finalName></configuration></plugin><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><configuration><source>1.8</source><target>1.8</target><compilerArguments><bootclasspath>${java.home}/lib/rt.jar;${java.home}/lib/jce.jar</bootclasspath></compilerArguments></configuration></plugin></plugins></build> </project>項目父模塊pom文件如下:
<?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.shanjupay</groupId><artifactId>shanjupay</artifactId><packaging>pom</packaging><version>1.0-SNAPSHOT</version><modules><module>shanjupay-common</module></modules><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.1.3.RELEASE</version></parent><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding><java.version>1.8</java.version><org.projectlombok.version>1.18.0</org.projectlombok.version><org.mapstruct.version>1.3.0.Final</org.mapstruct.version></properties><dependencyManagement><dependencies><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-alibaba-dependencies</artifactId><version>2.1.0.RELEASE</version><type>pom</type><scope>import</scope></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>Greenwich.RELEASE</version><type>pom</type><scope>import</scope></dependency><dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger2</artifactId><version>2.9.2</version></dependency><dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger-ui</artifactId><version>2.9.2</version></dependency><dependency><groupId>org.springframework.security</groupId><artifactId>spring-security-jwt</artifactId><version>1.0.9.RELEASE</version></dependency><dependency><groupId>org.springframework.security.oauth.boot</groupId><artifactId>spring-security-oauth2-autoconfigure</artifactId><version>2.1.3.RELEASE</version></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>${org.projectlombok.version}</version></dependency><dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-starter</artifactId><version>1.1.16</version></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.11</version></dependency><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.1.0</version></dependency><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-extension</artifactId><version>3.1.0</version></dependency><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-generator</artifactId><version>3.1.0</version></dependency><dependency><groupId>org.mybatis</groupId><artifactId>mybatis-typehandlers-jsr310</artifactId><version>1.0.2</version></dependency><dependency><groupId>commons-lang</groupId><artifactId>commons-lang</artifactId><version>2.6</version></dependency><dependency><groupId>org.mapstruct</groupId><artifactId>mapstruct-jdk8</artifactId><version>${org.mapstruct.version}</version></dependency><dependency><groupId>com.google.guava</groupId><artifactId>guava</artifactId><version>25.0-jre</version></dependency><dependency><groupId>com.google.code.gson</groupId><artifactId>gson</artifactId><version>2.8.2</version></dependency><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.47</version></dependency><dependency><groupId>org.apache.shardingsphere</groupId><artifactId>sharding-jdbc-spring-boot-starter</artifactId><version>4.0.0-RC1</version></dependency><dependency><groupId>com.alipay.sdk</groupId><artifactId>alipay-sdk-java</artifactId><version>3.7.73.ALL</version></dependency><dependency><groupId>com.github.tedzhdz</groupId><artifactId>wxpay-sdk</artifactId><version>3.0.10</version></dependency><dependency><groupId>com.github.binarywang</groupId><artifactId>weixin-java-pay</artifactId><version>3.4.0</version></dependency><dependency><groupId>com.qiniu</groupId><artifactId>qiniu-java-sdk</artifactId><version>7.2.25</version></dependency><dependency><groupId>com.squareup.okhttp3</groupId><artifactId>okhttp</artifactId><version>3.9.1</version></dependency><dependency><groupId>org.apache.rocketmq</groupId><artifactId>rocketmq-spring-boot-starter</artifactId><version>2.0.2</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId><version>2.1.3.RELEASE</version></dependency></dependencies> </dependencyManagement><build><finalName>${project.name}</finalName><resources><resource><directory>src/main/resources</directory><filtering>true</filtering><includes><include>**/*</include></includes></resource><resource><directory>src/main/java</directory><includes><include>**/*.xml</include></includes></resource></resources><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><configuration><source>1.8</source><target>1.8</target></configuration></plugin><plugin><artifactId>maven-resources-plugin</artifactId><configuration><encoding>utf-8</encoding><useDefaultDelimiters>true</useDefaultDelimiters></configuration></plugin></plugins></build></project>安裝lombok插件
二、搭建商戶平臺模塊:
?
搭建以下幾個服務(wù):
這里說明下三者的關(guān)系
提供外部訪問接口(controller):shanjupay-merchant-application
暴露給shanjupay-merchant-application調(diào)用的service層:shanjupay-merchant-api
真正的去實現(xiàn)業(yè)務(wù)邏輯(serviceImpl+dao+entity):shanjupay-merchant-service
controller層通過dubbo去調(diào)用service的接口(service的實現(xiàn)就不會暴露)
數(shù)據(jù)庫導(dǎo)入
搭建上面的三個服務(wù):
1、shanjupay-merchant-application
pom文件:
bootstrap.yml文件(bootstrap.yml配置比application.yml先加載)
server:port: 57010 #啟動端口 命令行注入max-http-header-size: 100KBnacos:server:addr: 127.0.0.1:8848spring:application:name: merchant-applicationmain:allow-bean-definition-overriding: true # Spring Boot 2.1 需要設(shè)定cloud:nacos:discovery:server-addr: ${nacos.server.addr} #調(diào)用上面的nacos地址namespace: eeaa8bff-98c3-4222-ae95-dd92275ec758 #命名空間cluster-name: DEFAULTconfig:server-addr: ${nacos.server.addr} # 配置中心地址file-extension: yamlnamespace: eeaa8bff-98c3-4222-ae95-dd92275ec758 # 命令行注入group: SHANJUPAY_GROUP # 聚合支付業(yè)務(wù)組ext-config:-refresh: truedata-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: 30MBdubbo:scan:# dubbo 服務(wù)掃描基準包base-packages: com.shanjupayprotocol:# dubbo 協(xié)議name: dubboport: 20891registry:address: nacos://127.0.0.1:8848application:qos:port: 22310 # dubbo qos端口配置 命令行注入consumer:check: falsetimeout: 3000retries: -1logging:config:classpath: log4j2.xml #日志記錄地址在Nacos中添加spring-boot-http.yaml配置,Group:COMMON_GROUP 這里統(tǒng)一使用dev命名空間
在resources目錄下添加log4j2配置文件:log4j2.xml log4j2是log4j的改進版本,性能比log4j要高,通常日志配置文件在開發(fā)可以調(diào)整日志級別,輸出詳細的日志 來跟蹤程序的執(zhí)行。
<?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--><Root level="INFO" includeLocation="true"><AppenderRef ref="AsyncAppender"/><AppenderRef ref="Console"/></Root></Loggers> </Configuration>2、shanjupay-merchant (里面包含service、api兩個模塊)
2.1、shanjupay-merchant-api模塊:
pom文件:
<?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><artifactId>shanjupay-merchant-api</artifactId><dependencies><dependency><groupId>com.shanjupay</groupId><artifactId>shanjupay-common</artifactId><version>1.0-SNAPSHOT</version></dependency></dependencies></project>2.2、service模塊
pom文件:
<?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><artifactId>shanjupay-merchant-service</artifactId><dependencies><dependency><groupId>com.shanjupay</groupId><artifactId>shanjupay-merchant-api</artifactId><version>1.0-SNAPSHOT</version></dependency><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId></dependency><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-dubbo</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><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><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>加上上面的log4j2.xml
bootstrap.yml文件:
server:port: 56040 #啟動端口 命令行注入max-http-header-size: 100KBnacos:server:addr: 127.0.0.1:8848spring:application:name: merchant-servicemain:allow-bean-definition-overriding: true # Spring Boot 2.1 需要設(shè)定cloud:nacos:discovery:server-addr: ${nacos.server.addr}namespace: eeaa8bff-98c3-4222-ae95-dd92275ec758cluster-name: DEFAULTconfig:server-addr: ${nacos.server.addr} # 配置中心地址file-extension: yamlnamespace: eeaa8bff-98c3-4222-ae95-dd92275ec758 # 命令行注入group: SHANJUPAY_GROUP # 聚合支付業(yè)務(wù)組ext-config:-refresh: truedata-id: spring-boot-http.yaml # spring boot http配置group: COMMON_GROUP # 通用配置組-refresh: truedata-id: spring-boot-starter-druid.yaml # spring boot starter druid配置group: COMMON_GROUP # 通用配置組-refresh: truedata-id: spring-boot-mybatis-plus.yaml # spring boot mybatisplus配置group: COMMON_GROUP # 通用配置組#SpringMVC上傳文件配置servlet:multipart:#默認支持文件上傳.enabled: true#支持文件寫入磁盤.file-size-threshold: 0# 上傳文件的臨時目錄location:# 最大支持文件大小max-file-size: 1MB# 最大支持請求大小max-request-size: 30MBdubbo:scan:# dubbo 服務(wù)掃描基準包base-packages: com.shanjupayprotocol:# dubbo 協(xié)議name: dubboport: 20890registry:address: nacos://127.0.0.1:8848application:qos:port: 22240 # dubbo qos端口配置 命令行注入consumer:check: falsetimeout: 3000retries: -1logging:config:classpath: log4j2.xml生成對應(yīng)的entity、mapper
在nacos中新建連接池Druid配置:spring-boot-starter-druid.yaml,Group為:COMMON_GROUP
spring:datasource:type: com.alibaba.druid.pool.DruidDataSourcedriver‐class‐name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://127.0.0.1:3306/shanjupay_merchant_service?useSSL=false&useUnicode=true&serverTimezone=GMT%2B8username: rootpassword: 123456druid:initial‐size: 5min‐idle: 5max‐active: 20max‐wait: 60000time‐between‐eviction‐runs‐millis: 60000min‐evictable‐idle‐time‐millis: 300000validation‐query: SELECT 1 FROM DUALtest‐while‐idle: truetest‐on‐borrow: truetest‐on‐return: falsepool‐prepared‐statements: truemax‐pool‐prepared‐statement‐per‐connection‐size: 20filter:stat:slow‐sql‐millis: 1log‐slow‐sql: truefilters: config,stat,wall,log4j2web‐stat‐filter:enabled: trueurl‐pattern: /*exclusions: "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*"session‐stat‐enable: falsesession‐stat‐max‐count: 1000principal‐cookie‐name: adminprincipal‐session‐name: adminprofile‐enable: truestat‐view‐servlet:enabled: trueurl‐pattern: /druid/*allow: 127.0.0.1,192.168.163.1deny: 192.168.211.1reset‐enable: falselogin‐password: adminlogin‐username: adminaop‐patterns: com.shanjupay.*.service.*在nacos中添加配置:spring-boot-mybatis-plus.yaml,Group為:COMMON_GROUP
?
?添加分頁和性能分析插件:MybatisPlusCon?g
?
?
?
編寫一個簡單例子測試流程
package com.shanjupay.merchant.api.dto;import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data;import java.io.Serializable;@Data @ApiModel(value = "MerchantDTO", description = "商戶信息") public class MerchantDTO implements Serializable {@ApiModelProperty("商戶id")private Long id;@ApiModelProperty("企業(yè)名稱")private String merchantName;@ApiModelProperty("企業(yè)編號")private Long merchantNo;@ApiModelProperty("企業(yè)地址")private String merchantAddress;@ApiModelProperty("行業(yè)類型")private String merchantType;@ApiModelProperty("營業(yè)執(zhí)照")private String businessLicensesImg;@ApiModelProperty("法人身份證正面")private String idCardFrontImg;@ApiModelProperty("法人身份證反面")private String idCardAfterImg;@ApiModelProperty("聯(lián)系人")private String username;@ApiModelProperty("密碼")private String password;@ApiModelProperty("手機號,關(guān)聯(lián)統(tǒng)一賬號")private String mobile;@ApiModelProperty("聯(lián)系人地址")private String contactsAddress;@ApiModelProperty("審核狀態(tài),0‐未申請,1‐已申請待審核,2‐審核通過,3‐審核拒絕")private String auditStatus;@ApiModelProperty("租戶ID")private Long tenantId; }啟動服務(wù)測試:
成功
去nacos哪里看:
這里的項目主要是自己復(fù)習(xí)看,很多細節(jié)沒說清楚
集成swgger2
在shanjupay-merchant-application工程的con?g包中添加一個Swagger配置類
?
. 添加SpringMVC配置類:WebMvcCon?g,讓外部可直接訪問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 {@Overridepublic 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/");// registry.addResourceHandler("/test/dove/*.jpeg").addResourceLocations("file:D:\\");} }重啟,在需要使用swagger2的服務(wù)加上@EnableSwagger2注解即可使用(Swagger2回去找啟動了@EnableSwagger2且使用了注解的接口等)http://localhost:57010/swagger-ui.html
總結(jié)
1、該系統(tǒng)是自己為復(fù)習(xí)看,會有些模糊,細節(jié)沒說清楚。
2、本文主要可以學(xué)習(xí)的知識點:
- 2.1:日志系統(tǒng)log4j2的搭建
- 2.2:對外restful(springcloud)對內(nèi)rpc(dubbo)的基本使用(將controller、service、serviceImpl+entity+mapper層分不同服務(wù))
- 2.3:集成swagger2
- 2.4:nacos的注冊中心、配置中心基本使用
3、雖說該系統(tǒng)寫了部分實戰(zhàn)內(nèi)容,但為了更加系統(tǒng),還是會對日志搭建、swagger2集成、nacos配置中心的使用進行其他文章的分析。
日志搭建:https://mp.csdn.net/console/editor/html/108536129
swagger2集成:https://blog.csdn.net/qq_35599414/article/details/108539906
nacos配置中心的具體使用:
4、本文中遇到的一些錯誤:
- nacos的配置信息要導(dǎo)出到mysql時要用mysql5.6以上版本
- 當模塊的maven依賴加載不了時可以將<dependencyManagement>先刪除后等加載好了再加上去
- serviceImpl如果要用dubbo調(diào)用時要用 org.apache.dubbo.config.annotation.Service進行@Service的注解注入,在獲取service對象時用@Reference注解獲取
- 使用mysql5.7時建立連接時要加上:useSSL=false&serverTimezone = GMT%2B8? 不然會報錯
- 好了似乎就這幾個需要注意的
5、下面會對該系統(tǒng)進行進一步記錄
?
?
總結(jié)
- 上一篇: Python语法-1-变量、输出、Lis
- 下一篇: 微信小程序的一些基本知识,微信小程序开发