什么时候需要创建工程
在开发平台中,工程创建主要是针对服务中心中,一组相对比较独立的微服务而提供的一套工程。
针对于开发平台,主要是针对一套内部核心系统需要对外提供开放接口的时候来创建一套工程。
通过工程的创建,为逻辑相对独立的一组服务提供工程的物理隔离以及统一配置。
便于不同的开发团队开发及运维一组微服务。
创建工程
创建父工程
创建一个无父工程的maven工程,工程继承于平台的包管理工程。
<parent>
<groupId>com.houyi.saas</groupId>
<artifactId>houyi-platform</artifactId>
<version>1.4.0</version>
</parent>
packaging类型为pom,例子如下:
<groupId>com.houyi.saas.projectsample</groupId>
<artifactId>houyi-platform-project-sample</artifactId>
<description>平台服务中心子项目工程</description>
<version>1.0.0</version>
<packaging>pom</packaging>
工程再申明对平台技术组件的版本依赖
<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<java.version>8</java.version>
<houyi.platform.version>1.4.0</houyi.platform.version>
</properties>
<dependencyManagement>
<dependencies>
<!-- 平台所依赖的组件 -->
<dependency>
<groupId>com.houyi.saas</groupId>
<artifactId>common-spring-boot-starter</artifactId>
<version>${houyi.platform.version}</version>
</dependency>
<dependency>
<groupId>com.houyi.saas</groupId>
<artifactId>redis-spring-boot-starter</artifactId>
<version>${houyi.platform.version}</version>
</dependency>
<dependency>
<groupId>com.houyi.saas</groupId>
<artifactId>db-spring-boot-starter</artifactId>
<version>${houyi.platform.version}</version>
</dependency>
<dependency>
<groupId>com.houyi.saas</groupId>
<artifactId>swagger2-spring-boot-starter</artifactId>
<version>${houyi.platform.version}</version>
</dependency>
<dependency>
<groupId>com.houyi.saas</groupId>
<artifactId>log-spring-boot-starter</artifactId>
<version>${houyi.platform.version}</version>
</dependency>
<dependency>
<groupId>com.houyi.saas</groupId>
<artifactId>ribbon-spring-boot-starter</artifactId>
<version>${houyi.platform.version}</version>
</dependency>
<dependency>
<groupId>com.houyi.saas</groupId>
<artifactId>auth-client-spring-boot-starter</artifactId>
<version>${houyi.platform.version}</version>
</dependency>
<dependency>
<groupId>com.houyi.saas</groupId>
<artifactId>sentinel-spring-boot-starter</artifactId>
<version>${houyi.platform.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
创建配置子工程
在工程下创建一个maven子工程,配置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>
<groupId>com.houyi.saas.projectsample</groupId>
<artifactId>houyi-platform-project-sample</artifactId>
<version>1.0.0</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<packaging>jar</packaging>
<artifactId>project-sample-config</artifactId>
<description>配置中心</description>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
</dependencies>
</project>
在工程的src/main/resources下面创建公共配置文件:
########################## 通用配置 ##########################
# 默认开发环境
spring.profiles.active=test
##### spring-boot-actuator配置
management.endpoints.web.exposure.include=*
management.endpoint.health.show-details=always
##### ribbon配置
# 从注册中心刷新servelist的时间 默认30秒,单位ms
ribbon.ServerListRefreshInterval=15000
#请求连接的超时时间 默认1秒,单位ms
ribbon.ConnectTimeout=30000
# 请求处理的超时时间 默认1秒,单位ms
ribbon.ReadTimeout=30000
# 对所有操作请求都进行重试,不配置这个MaxAutoRetries不起作用 默认false
#ribbon.OkToRetryOnAllOperations=true
# 对当前实例的重试次数 默认0
#ribbon.MaxAutoRetries=1
# 切换实例的重试次数 默认1
ribbon.MaxAutoRetriesNextServer=0
##### feign配置
feign.sentinel.enabled=true
feign.hystrix.enabled=false
feign.okhttp.enabled=true
feign.httpclient.enabled=false
feign.client.config.feignName.connectTimeout=30000
feign.client.config.feignName.readTimeout=30000
## 开启Feign请求响应压缩
feign.compression.request.enabled=true
feign.compression.response.enabled=true
## 配置压缩文档类型及最小压缩的文档大小
feign.compression.request.mime-types=text/xml,application/xml,application/json
feign.compression.request.min-request-size=2048
##### sentinel配置
spring.cloud.sentinel.transport.dashboard=${houyi.sentinel.dashboard}
spring.cloud.sentinel.eager=true
##### druid配置
#连接池配置(通常来说,只需要修改initialSize、minIdle、maxActive
spring.datasource.druid.initial-size=50
spring.datasource.druid.max-active=500
spring.datasource.druid.min-idle=50
# 配置获取连接等待超时的时间
spring.datasource.druid.max-wait=60000
#打开PSCache,并且指定每个连接上PSCache的大小
spring.datasource.druid.pool-prepared-statements=true
spring.datasource.druid.max-pool-prepared-statement-per-connection-size=20
spring.datasource.druid.validation-query=SELECT 'x'
spring.datasource.druid.test-on-borrow=false
spring.datasource.druid.test-on-return=false
spring.datasource.druid.test-while-idle=true
#配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
spring.datasource.druid.time-between-eviction-runs-millis=60000
#配置一个连接在池中最小生存的时间,单位是毫秒
spring.datasource.druid.min-evictable-idle-time-millis=300000
spring.datasource.druid.filters=stat,wall
# WebStatFilter配置,说明请参考Druid Wiki,配置_配置WebStatFilter
#是否启用StatFilter默认值true
spring.datasource.druid.web-stat-filter.enabled=true
spring.datasource.druid.web-stat-filter.url-pattern=/*
spring.datasource.druid.web-stat-filter.exclusions="*.js , *.gif ,*.jpg ,*.png ,*.css ,*.ico , /druid/*"
spring.datasource.druid.web-stat-filter.session-stat-max-count=1000
spring.datasource.druid.web-stat-filter.profile-enable=true
spring.datasource.druid.web-stat-filter.session-stat-enable=false
# StatViewServlet配置
#展示Druid的统计信息,StatViewServlet的用途包括:1.提供监控信息展示的html页面2.提供监控信息的JSON API
#是否启用StatViewServlet默认值true
spring.datasource.druid.stat-view-servlet.enabled=true
#根据配置中的url-pattern来访问内置监控页面,如果是上面的配置,内置监控页面的首页是/druid/index.html例如:http://127.0.0.1:9000/druid/index.html
spring.datasource.druid.stat-view-servlet.url-pattern=/druid/*
#允许清空统计数据
spring.datasource.druid.stat-view-servlet.reset-enable=true
spring.datasource.druid.stat-view-servlet.login-username=admin
spring.datasource.druid.stat-view-servlet.login-password=admin
##### redis-jedis连接池配置
#最大等待时间
spring.redis.jedis.pool.max-wait=1000ms
#最小空闲数量
spring.redis.jedis.pool.min-idle=50
#最大空闲数量
spring.redis.jedis.pool.max-idle=50
#最大连接数量
spring.redis.jedis.pool.max-active=1000
##### mybatis-plus配置
#字段策略 IGNORED:"忽略判断",NOT_NULL:"非 NULL 判断"),NOT_EMPTY:"非空判断"
mybatis-plus.global-config.db-config.field-strategy=NOT_NULL
#逻辑删除配置
mybatis-plus.global-config.db-config.logic-delete-value=1
mybatis-plus.global-config.db-config.logic-not-delete-value=0
# 原生配置
mybatis-plus.configuration.map-underscore-to-camel-case=true
mybatis-plus.configuration.cache-enabled=false
在工程的src/main/resources下面创建各个环境的配置文件,以本地配置文件test为例:
########################## 统一变量配置 ##########################
##### nacos命名空间
houyi.nacos.namespace=7c551d22-56ec-4e05-8211-8145e2d060a5
houyi.nacos.server-addr=127.0.0.1:8848
##### 数据库配置
houyi.datasource.ip=saas-mysql
houyi.datasource.username=root
houyi.datasource.password=password
##### redis配置
spring.redis.host=saas-redis
spring.redis.port=6379
spring.redis.timeout=5000
##### elasticsearch配置
houyi.elasticsearch.cluster-name=saas-es
houyi.elasticsearch.cluster-nodes=127.0.0.1:9300
##### sentinel配置
houyi.sentinel.dashboard=127.0.0.1:6999
创建文档归集子工程
在工程下创建一个maven子工程,配置工程对相关包的依赖。
<!-- swagger -->
<!-- visit ui : http://ip:port/swagger-ui.html -->
<dependency>
<groupId>com.didispace</groupId>
<artifactId>swagger-butler-core</artifactId>
</dependency>
<!-- visit ui : http://ip:port/doc.html -->
<dependency>
<groupId>com.github.xiaoymin</groupId>
<artifactId>swagger-bootstrap-ui</artifactId>
</dependency>
在application.yml中配置文档API路由规则
zuul:
routes:
servicea:
path: /api-servicea/**
service-id: service-sample-a
strip-prefix: true
serviceb:
path: /api-serviceb/**
service-id: service-sample-b
strip-prefix: true
swagger:
butler:
api-docs-path: v2/api-docs
swagger-version: 2.0
auto-generate-from-zuul-routes: true
generate-routes: servicea, serviceb
创建服务子工程
在工程下创建一个maven子工程,配置工程对开发平台框架组件包的依赖以及第三方组件包的依赖,即可开始做服务开发了。
<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>
<groupId>com.houyi.saas.projectsample</groupId>
<artifactId>houyi-platform-project-sample</artifactId>
<version>1.0.0</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>service-sample-a</artifactId>
<name>service-sample-a</name>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.houyi.saas</groupId>
<artifactId>common-spring-boot-starter</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
服务工程包路径说明
在微服务开发过程中推荐使用以下目录结构:
src/main/java
com/xx/
config:建议放置配置内容
controller:微服务的控制器类目录
service:微服务的Service类目录
mapper:数据库操作类的目录
model:数据模型目录
exception: 业务异常封装
src/main/resources
mapper
xx.xml 基于mybatis开发的SQL语句
application.yml 基于springboot引入的技术组件的配置信息
bootstrap.yml 应用启动的基本配置信息
工程服务注册配置说明
在服务子工程中确认是否已包括对服务注册发现技术组件包的依赖。
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
<groupId>com.houyi.saas</groupId>
<artifactId>ribbon-spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>com.houyi.saas</groupId>
<artifactId>common-spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>com.houyi.saas.projectsample</groupId>
<artifactId>project-sample-config</artifactId>
</dependency>
<!-- spring boot 应用监控 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!-- spring cloud alibaba 更新以后,以下组件包的版本依赖说明可以删除掉 -->
<dependency>
<groupId>com.alibaba.nacos</groupId>
<artifactId>nacos-client</artifactId>
<version>0.9.0</version>
</dependency>
<dependency>
<groupId>com.alibaba.nacos</groupId>
<artifactId>nacos-api</artifactId>
<version>0.9.0</version>
</dependency>
在src/main/resources下创建springboot配置文件:
bootstrap.yml
server:
port: 12000
spring:
application:
name: develop-sample-a
cloud:
nacos:
config:
namespace: ${houyi.nacos.namespace}
server-addr: ${houyi.nacos.server-addr}
file-extension: yml
shared-dataids: common.yml
refreshable-dataids: common.yml
discovery:
namespace: ${houyi.nacos.namespace}
server-addr: ${houyi.nacos.server-addr}
在src/main/java下创建启动类com.houyi.Application.java:
package com.houyi;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.openfeign.EnableFeignClients;
@EnableFeignClients
@EnableDiscoveryClient
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
正常启动应用以后,在nacos的服务端界面中查看对应的环境中,是否有服务的注册信息。
工程服务开发配置说明
持久层相关配置
对数据库的配置
如果需要访问数据库,则在工程的application.yml文件中作如下配置:
spring:
datasource:
url: jdbc:mysql://${houyi.datasource.ip}:3306/user-center?allowPublicKeyRetrieval=true&useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&useSSL=false&zeroDateTimeBehavior=convertToNull
username: ${houyi.datasource.username}
password: ${houyi.datasource.password}
driver-class-name: com.mysql.jdbc.Driver
对mybatis组件配置
如果要使用MYBATIS组件访问数据库,则在工程的application.yml文件中作如下配置:
mybatis-plus:
mapper-locations: classpath:/mapper/*Mapper.xml
#实体扫描,多个package用逗号或者分号分隔
typeAliasesPackage: com.houyi.servicea.model
global-config:
db-config:
id-type: auto
监控SQL语句
如果需要在开发测试环境打印执行的SQL语句,创建一个JAVA类,作如下配置
package com.houyi.servicea.config;
import com.baomidou.mybatisplus.core.injector.ISqlInjector;
import com.baomidou.mybatisplus.extension.injector.LogicSqlInjector;
import com.houyi.db.config.DefaultMybatisPlusConfig;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* @Author: houyi
* @date 2018/12/10
*/
@Configuration
@MapperScan({"com.houyi.servicea.mapper*"})
public class MybatisPlusConfig extends DefaultMybatisPlusConfig {
@Bean
public ISqlInjector sqlInjector(){
return new LogicSqlInjector();
}
}
添加事务管理
在启动类上添加@EnableTransactionManagement注解即可
@EnableFeignClients
@EnableDiscoveryClient
@SpringBootApplication
@EnableTransactionManagement
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
其它配置
缓存配置
如果要使用Spring的注解,实现缓存功能,需要在工程的application.yml文件中作如下配置:
cache-manager:
configs:
- key: demodomain
second: 600
其中key为@Cacheable注解中value属性的值,如:
@ApiOperation(value = "查询")
@GetMapping("/DemoDomain/{id}")
@Cacheable(value = "demodomain", key ="#id")
public Result findUserById(@PathVariable Long id) {
log.info("查询{}",id);
DemoDomain model = demoDomainService.getById(id);
return Result.succeed(model, "查询成功");
}
对API文档输出配置
如果要输出工程的API文档,则在工程的application.yml文件中作如下配置:
houyi:
swagger:
enabled: true
title: 演示服务
description: 演示服务接口文档
version: 1.0
base-package: com.houyi.servicea.controller
网友评论