spring cloud(三) 服务的调用与提供

使用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,即可看到该服务已经注册到注册服务中心.

 

添加连接驱动

扫描二维码关注公众号,回复: 2201782 查看本文章
<!-- 连接驱动 -->
        <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;
	}
}

启动项目


猜你喜欢

转载自blog.csdn.net/qq_38789941/article/details/80706795
今日推荐