使用eureka服务注册中心,搭建一个简单的服务端注册服务,客户端去调用服务使用的案例。
数据库:SQLServer 2014
持久层框架: 采用 Mybatis plus。Mybatis-Plus(简称MP)是一个 Mybatis 的增强工具,在 Mybatis 的基础上只做增强不做改变, 为简化开发、提高效率而生。
API接口文档:swagger。可以自动为你的业务代码生成restfut
风格的api
,而且还提供相应的测试界面,自动显示json
格式的响应。大大方便了后台开发人员与前端的沟通与联调成本。
开始创建项目
点击 next
@SpringBootApplication
@EnableDiscoveryClient // 添加次注解,使其能够注册到注册中心
public class MyUserService2Application {
public static void main(String[] args) {
SpringApplication.run(MyUserService2Application.class, args);
}
}
配置 application.properties
#注册服务中心地址
eureka.client.service-url.defaultZone=http://peer1:8201/eureka/
#端口号
server.port=8207
#服务器名称
spring.application.name=MyUserService-2
#不使用主机名来定义注册中心的地址,而使用IP地址的形式,如果设置了eureka.instance.ip-address 属性,则使用该属性配置的IP,否则自动获取除环路IP外的第一个IP地址
eureka.instance.prefer-ip-address=true
eureka.instance.ip-address=192.168.41.24
eureka.instance.instance-id=192.168.41.24
依次启动 注册中心 Eureka、MyUservice-2,即可看到该服务已经注册到注册服务中心.
添加连接驱动
<!-- 连接驱动 -->
<dependency>
<groupId>com.microsoft.sqlserver</groupId>
<artifactId>mssql-jdbc</artifactId>
<scope>runtime</scope>
</dependency>
数据库连接池
<!-- druid数据库连接池 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.6</version>
</dependency>
引入MyBatis Plus
<!-- 引入mybatis plus -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatisplus-spring-boot-starter</artifactId>
<version>1.0.5</version>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus</artifactId>
<version>2.1.9</version>
</dependency>
引入 swagger ui
<!-- swagger接口测试 -->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>2.8.0</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>2.8.0</version>
</dependency>
返回json采用 alibaba的fastjson
<!-- https://mvnrepository.com/artifact/com.alibaba/fastjson -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.45</version>
</dependency>
添加相关配置
#JDBC 配置
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.driver-class-name=com.microsoft.sqlserver.jdbc.SQLServerDriver
spring.datasource.url=jdbc:sqlserver://192.118.11.11:1433;DatabaseName=TESTDB
spring.datasource.username=sa
spring.datasource.password=123789
#连接池
spring.datasource.druid.validation-query-timeout=20
spring.datasource.druid.query-timeout=20
# 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙
spring.datasource.druid.filters=stat,wall,log4j,slf4jlog
spring.datasource.druid.logSlowSql=true
#mybatis
mybatis-plus.mapper-locations=classpath:/mapper/*Mapper.xml
#实体扫描,多个package用逗号或者分号分隔
mybatis-plus.type-aliases-package=com.baojian.zhang.entity
#mybatis-plus.type-enums-package=com.baojian.pda.api.enum
#主键类型 0:"数据库ID自增", 1:"用户输入ID",2:"全局唯一ID (数字类型唯一ID)", 3:"全局唯一ID UUID";
mybatis-plus.global-config.id-type=5
#字段策略 0:"忽略判断",1:"非 NULL 判断"),2:"非空判断"
mybatis-plus.global-config.field-strategy=2
#驼峰下划线转换
mybatis-plus.global-config.db-column-underline=true
#刷新mapper 调试神器
mybatis-plus.global-config.refresh-mapper=true
#数据库大写下划线转换
#mybatis-plus.global-config.capital-mode=true
mybatis-plus.configuration.map-underscore-to-camel-case=true
mybatis-plus.configuration.cache-enabled=false
#逻辑删除配置
mybatis-plus.global-config.logic-delete-value=1
mybatis-plus.global-config.logic-not-delete-value=0
mybatis-plus.global-config.sql-injector=com.baomidou.mybatisplus.mapper.LogicSqlInjector
mybatis-plus.global-config.meta-object-handler=com.baojian.zhang.mybatis.plus.MyMetaObjectHandler
添加 MybatisPlusConfig
package com.baojian.zhang.config;
import com.baomidou.mybatisplus.incrementer.H2KeyGenerator;
import com.baomidou.mybatisplus.incrementer.IKeyGenerator;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import com.baomidou.mybatisplus.plugins.PaginationInterceptor;
import com.baomidou.mybatisplus.plugins.PerformanceInterceptor;
@Configuration
@MapperScan("com.baojian.zhang.dao")
public class MybatisPlusConfig {
/**
* mybatis-plus SQL执行效率插件【生产环境可以关闭】
*/
@Bean
public PerformanceInterceptor performanceInterceptor() {
return new PerformanceInterceptor();
}
/**
* 分页插件
*/
@Bean
public PaginationInterceptor paginationInterceptor() {
return new PaginationInterceptor();
}
/**
* 注入主键生成器
*/
@Bean
public IKeyGenerator keyGenerator() {
return new H2KeyGenerator();
}
}
采用 mybatis plus的代码生成器
package com.baojian.zhang.mybatis.plus;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.config.DataSourceConfig;
import com.baomidou.mybatisplus.generator.config.GlobalConfig;
import com.baomidou.mybatisplus.generator.config.PackageConfig;
import com.baomidou.mybatisplus.generator.config.StrategyConfig;
import com.baomidou.mybatisplus.generator.config.rules.DbType;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
/**
*
* 功能:采用 mybatis plus的代码生成器<br>
* 作者:张tt<br>
* 时间:2018年6月19日<br>
* 版本:1.0<br>
*
*/
public class GeneratorServiceEntity {
public static void main(String[] args) {
String packageName = "com.baojian.zhang";
boolean serviceNameStartWithI = false;// user -> UserService, 设置成true:
// user -> IUserService
// 需要生成的表
// String[] tableNames = new String[] { "bj_aliyun_oss",
// "bj_api_record", "bj_article", "bj_article_data",
// "bj_article_like", "bj_blog", "bj_blog_comment", "bj_blog_like",
// "bj_blog_push", "bj_blog_recommend",
// "bj_category", "bj_feed_back", "bj_memo", "bj_newflash", "bj_push",
// "bj_schedule", "bj_schedule_remind",
// "bj_user", "bj_user_collection", "bj_user_count", "bj_user_friend",
// "bj_user_login", "bj_user_target",
// "sys_office" };
String[] tableNames = new String[] { "bj_article" };
generateByTables(serviceNameStartWithI, packageName, tableNames);
}
private static void generateByTables(boolean serviceNameStartWithI, String packageName, String... tableNames) {
GlobalConfig config = new GlobalConfig();
config.setActiveRecord(false)
.setAuthor("张tt")
.setOutputDir("d:\\mybatisPlus")
.setFileOverride(true)
.setEnableCache(false)
.setServiceName("%sService")
.setControllerName("%sController")
.setMapperName("%sDao")
.setXmlName("%sMapper");
DataSourceConfig dataSourceConfig = new DataSourceConfig();
dataSourceConfig.setDbType(DbType.SQL_SERVER)
.setUrl("jdbc:sqlserver://192.111.11.11:1433;DatabaseName=TESTDB")
.setUsername("sa")
.setPassword("123789")
.setDriverName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
StrategyConfig strategyConfig = new StrategyConfig();
strategyConfig.setCapitalMode(true)
.setEntityLombokModel(false)
.setDbColumnUnderline(true)
.setNaming(NamingStrategy.underline_to_camel)
.setInclude(tableNames)
.setSuperEntityClass("com.baojian.zhang.entity.BaseEntity")
// .setSuperServiceClass("com.baojian.pda.service.BaseService")
// .setSuperServiceImplClass("com.baojian.pda.service.impl.BaseServiceImpl")
.setSuperEntityColumns(new String[] { "id", "create_date", "update_date", "remark" });
new AutoGenerator().setGlobalConfig(config).setDataSource(dataSourceConfig).setStrategy(strategyConfig)
.setPackageInfo(new PackageConfig()
.setParent(packageName)
.setController("controller")
.setEntity("entity")
.setMapper("dao")
.setXml("mapper"))
.execute();
}
}
package com.baojian.zhang.mybatis.plus;
import com.baojian.zhang.MyUserService2Application;
import com.baomidou.mybatisplus.mapper.MetaObjectHandler;
import java.util.Date;
import org.apache.ibatis.reflection.MetaObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
/**
* 注入公共字段自动填充,任选注入方式即可
*/
@Component
public class MyMetaObjectHandler extends MetaObjectHandler {
protected final static Logger logger = LoggerFactory.getLogger(MyUserService2Application.class);
@Override
public void insertFill(MetaObject metaObject) {
logger.debug("新增的时候干点不可描述的事情");
Date date = new Date();
// 设置创建时间
setFieldValByName("createDate", date, metaObject);
// 设置更新时间
setFieldValByName("updateDate", date, metaObject);
}
@Override
public void updateFill(MetaObject metaObject) {
logger.debug("更新的时候干点不可描述的事情");
Date date = new Date();
// 设置更新时间
setFieldValByName("updateDate", date, metaObject);
}
}
设置公共字段
package com.baojian.zhang.entity;
import java.io.Serializable;
import java.util.Date;
import com.baomidou.mybatisplus.annotations.TableField;
import com.baomidou.mybatisplus.enums.FieldFill;
public class BaseEntity implements Serializable {
/**
*
*/
private static final long serialVersionUID = 1L;
protected String id;
protected String remark; // 备注
@TableField(fill = FieldFill.INSERT)
protected Date createDate; // 创建日期
@TableField(fill = FieldFill.INSERT_UPDATE)
protected Date updateDate; // 更新日期
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getRemark() {
return remark;
}
public void setRemark(String remark) {
this.remark = remark;
}
public Date getCreateDate() {
return createDate;
}
public void setCreateDate(Date createDate) {
this.createDate = createDate;
}
public Date getUpdateDate() {
return updateDate;
}
public void setUpdateDate(Date updateDate) {
this.updateDate = updateDate;
}
}
运行 main 方法 生成代码
配置swagger config
package com.baojian.zhang.config;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.util.StopWatch;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
/**
*
* 功能:swagger配置类<br>
* 作者:张tt<br>
* 时间:2018年6月19日<br>
* 版本:1.0<br>
*
*/
@Configuration
public class SwaggerConfig {
private final Logger log = LoggerFactory.getLogger(SwaggerConfig.class);
@Bean
public Docket createRestApi() {
log.info("正在启动swagger......");
StopWatch watch = new StopWatch();
watch.start();
Docket docket = new Docket(DocumentationType.SWAGGER_2).apiInfo(apiInfo()).select()
.apis(RequestHandlerSelectors.basePackage("com.baojian.zhang.controller"))
.paths(PathSelectors.any()).build();
watch.stop();
log.info("swagger已启动,用时{}ms", watch.getTotalTimeMillis());
return docket;
}
private ApiInfo apiInfo() {
return new ApiInfoBuilder().title("测试接口文档").description("XX有限公司")
.termsOfServiceUrl("http://www.baidu.com").version("1.0.1").build();
}
}
使其具有 swagger 功能
package com.baojian.zhang;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import springfox.documentation.swagger2.annotations.EnableSwagger2;
@SpringBootApplication
@EnableDiscoveryClient
@EnableSwagger2 // 使其具有Swagger 功能
public class MyUserService2Application {
public static void main(String[] args) {
SpringApplication.run(MyUserService2Application.class, args);
}
}
编写 controller 测试接口
package com.baojian.zhang.controller;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import com.baojian.zhang.base.BaseVO;
import com.baojian.zhang.entity.BjArticle;
import com.baojian.zhang.service.BjArticleService;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.baomidou.mybatisplus.plugins.Page;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
/**
*
* 功能: 公告相关api接口<br>
* 作者:张tt<br>
* 时间:2018年06月19日<br>
* 版本:1.0<br>
*
*/
@RestController
@RequestMapping("/api/v1/message")
@Api(value = "/api/v1/message", description = "消息模块相关api")
public class APIMessageController {
@Autowired
private BjArticleService bjArticleService;
@RequestMapping(value = "/getArticleDetail", method = RequestMethod.GET)
@ResponseBody
@ApiOperation(value = "获取公告详情", notes = "获取公告详情", response = BaseVO.class)
@ApiImplicitParams({
@ApiImplicitParam(paramType="query",name="sign",value="哈哈",required=false,dataType="Boolean")
})
public BaseVO<Map<String,String>> getArticleDetail(
@RequestParam(value = "article", required = true) @ApiParam(name = "article", value = "公告编号", required = true) String article,
@RequestParam(value = "sign", required = true) String sign) {
// 测试通过编号获取
BjArticle bjArticle = bjArticleService.selectById("941607772838039553");
System.out.println(bjArticle.toString());
Map<String,String> map = new HashMap<String,String>();
map.put("title", bjArticle.getTitle());
// 构建返回参数
BaseVO<Map<String,String>> response = new BaseVO<Map<String,String>>();
response.setCode(1);
response.setMessage("获取公告详情成功!");
response.setData(map);
return response;
}
}
启动项目