SpringBoot快速搭建微服务框架详细教程前⾔:
SpringBoot是为了简化Spring应⽤的创建、运⾏、调试、部署等⽽出现的,使⽤它可以做到专注于Spring应⽤的开发,⽽⽆需过多关注XML的配置。简单来说,它提供了⼀堆依赖打包,并已经按照使⽤习惯解决了依赖问题---习惯⼤于约定。
Spring Boot默认使⽤tomcat作为服务器,使⽤logback提供⽇志记录。
Spring Boot的主要优点:
为所有Spring开发者更快的⼊门
开箱即⽤,提供各种默认配置来简化项⽬配置
内嵌式容器简化Web项⽬
没有冗余代码⽣成和XML配置的要求
技术栈:
Java 8
Maven
Spring-boot
Mybatis
Redis
Lombok
Swagger2
Jenkins
SonarQuber
1、使⽤Maven构建项⽬
1.1 通过 SPRING INITIALIZR ⼯具⽣产基础项⽬
  初始化相应信息后,下载压缩包。解压完成后,⽤IDEA打开项⽬,项⽬的⽬录结构:
springboot框架的作用总体流程:
1. 访问:start.spring.io/
2. 选择构建⼯具Maven Project、Spring Boot版本1.
3.2以及⼀些⼯程基本信息
3. 点击Generate Project下载项⽬压缩包
解压项⽬包,并⽤IDE以Maven项⽬导⼊,以IntelliJ IDEA 14为例:
1. 菜单中选择File–>New–>Project from
2. 选择解压后的项⽬⽂件夹,点击OK
3. 点击Import project from external model并选择Maven,点击Next到底为⽌。
4. 若你的环境有多个版本的JDK,注意到选择Java SDK的时候请选择Java 7以上的版本
1.2 导⼊Spring-boot 相关依赖
  项⽬初始化时,相关依赖如下:
spring-boot-starters:核⼼模块,包括⾃动配置⽀持、⽇志和YAML
spring-boot-starter-test:测试模块,包括JUnit、Hamcrest、Mockito
spring-boot-devtools:⽤于设置热部署
<dependency>  <groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>  <groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!--热部署-->
<dependency>  <groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
</dependency>
  这⾥我们需要引⼊Web模块,需要添加:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
1.3 启动项⽬
  添加⾸页控制层:
@RestController
public class IndexController {
@RequestMapping("index")
public String index() {
return "hello world!";
}
}
  运⾏DemoApplication中的main⽅法,启动服务:
2、整合Mybatis
2.1 项⽬依赖
引⼊连接mysql的必要依赖mysql-connector-java
引⼊整合MyBatis的核⼼依赖mybatis-spring-boot-starter
引⼊tk.mybatis 依赖,实现对实体类的增删改查的代码
引⼊pagerhelper 依赖,实现分页功能 
<dependency>
<groupId&batis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.0</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.43</version>
</dependency>
<dependency>
<groupId&batis</groupId>
<artifactId>mapper-spring-boot-starter</artifactId>
<version>1.1.3</version>
</dependency>
<!--pagehelper-->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>1.1.2</version>
</dependency>
2.2 项⽬配置
 修改resources 下的application.properties⽂件:
spring.datasource.url=jdbc:mysql://localhost:3306/test
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.sql.jdbc.Driver
#实体类扫描包
#l⽂件扫描⽬录
mybatis.mapper-locations=classpath:mapper/*.xml
#驼峰命名
#tkmapper ⼯具类
mapper.mappers=com.Jaycekon.demo.util.MyMapper
<-empty=false
mapper.identity=MYSQL
pagehelper.helperDialect=mysql
pagehelper.supportMethodsArguments=true
pagehelper.params=count=countSql
2.3 单元测试
  创建实体类,我们引⼊Lombok相关依赖,⽤于避免数据Get Set⽅法的重复创建: <dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.16.18</version>
<scope>provided</scope>
</dependency>
  实体类最终的代码如下:
@Data
@NoArgsConstructor
@AllArgsConstructor
@Accessors(chain = true)
public class User {
private int id;
private String username;
private String idCard;
private String phone;
private String password;
}
  可以看出,在添加了Lombok 之后,我们的Java 实体类代码简洁了很多。
  接下来,我们需要创建UserMapper 数据库处理类。由于MyMapper 已经帮我们实现了基本的CRUD操作,因此我们这⾥并不需要再重写操作,我可以先⼀个根据⽤户名查的⽅法:@Mapper
public interface UserMapper extends MyMapper<User> {
@Select("select * from user where username=#{username}")
User selectByName(String username);
}
  MyMapper 类位于util ⽬录下:
public interface MyMapper<T> extends Mapper<T>, MySqlMapper<T> {
}
  这⾥需要注意,MyMapper 与我们的实体类Mapper 不能放在同⼀个⽬录。
  测试类:
@RunWith(SpringRunner.class)
@SpringBootTest
@MapperScan("com.Jaycekon.demo.mapper")
public class UserMapperTest {
@Autowired
private UserMapper mapper;
@Test
public void testInset() {
User user = new User(1, "Jaycekon","1234","1234","123");
int i = mapper.insert(user);
Assert.assertNotEquals(0, i);
}
@Test
public void testSelect(){
User user = mapper.selectByName("Jaycekon");
Assert.assertNotEquals(null,user);
}
}
3、整合Redis
3.1 相关依赖
  Spring Boot提供的数据访问框架Spring Data Redis基于Jedis。可以通过引⼊ spring-boot-starter-redis 来配置依赖关系。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-redis</artifactId>
</dependency>
3.2 Redis 配置
1、Spring-boot 连接单机版Redis 的配置如下:
# REDIS (RedisProperties)
# Redis数据库索引(默认为0)
# Redis服务器地址
# Redis服务器连接端⼝
# Redis服务器连接密码(默认为空)
# 连接池最⼤连接数(使⽤负值表⽰没有限制)
# 连接池最⼤阻塞等待时间(使⽤负值表⽰没有限制)
# 连接池中的最⼤空闲连接
# 连接池中的最⼩空闲连接
# 连接超时时间(毫秒)
2、Spriig-boot 连接Sentinel 哨兵集配置:
# REDIS (RedisProperties)
# Redis数据库索引(默认为0)
# Redis服务器地址
#dis.host=localhost
# Redis服务器连接端⼝
#dis.port=6379
# Redis服务器连接密码(默认为空)
# 连接池最⼤连接数(使⽤负值表⽰没有限制)
# 连接池最⼤阻塞等待时间(使⽤负值表⽰没有限制)
# 连接池中的最⼤空闲连接
# 连接池中的最⼩空闲连接
# 连接超时时间(毫秒)
#哨兵监听redis server名称
#哨兵的配置列表
3.3 Redis 操作⼯具类
  1、StringRedisTemplate ⼯具类
    StringRedisTemplate ⼯具类可以解决字符串级别的Redis操作。在写好配置后,可以直接通过Autowried 就可以注⼊对象。
@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(Application.class)
public class ApplicationTests {
@Autowired
private StringRedisTemplate stringRedisTemplate;
@Test
public void test() throws Exception {
// 保存字符串
stringRedisTemplate.opsForValue().set("aaa", "111");
Assert.assertEquals("111", stringRedisTemplate.opsForValue().get("aaa"));
}
}
  2、RedisTemplate<Object,Object> ⼯具类
    可以处理⼤部分的序列化操作,在这⾥我封装了⼀个简化Redis⼯具类,后续可以继续优化。
@Component
public class RedisComponent {
@Autowired
//操作字符串的template,StringRedisTemplate是RedisTemplate的⼀个⼦集
private StringRedisTemplate stringRedisTemplate;
private Logger logger = Logger(RedisComponent.class);
@Autowired
/
/ RedisTemplate,可以进⾏所有的操作
private RedisTemplate<Object, Object> redisTemplate;
public void set(String key, String value) {
ValueOperations<String, String> ops = this.stringRedisTemplate.opsForValue();
boolean bExistent = this.stringRedisTemplate.hasKey(key);
if (bExistent) {
logger.info("this key is bExistent!");
} else {
ops.set(key, value);
}
}
public String get(String key) {
return this.stringRedisTemplate.opsForValue().get(key);
}
public void del(String key) {
this.stringRedisTemplate.delete(key);
}
public void sentinelSet(String key, Object object) {
redisTemplate.opsForValue().set(key, JSONString(object));
}
public String sentinelGet(String key) {
return String.valueOf(redisTemplate.opsForValue().get(key));
}
}
4、整合Swagger2
4.1 添加Swagger2 依赖:
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>2.7.0</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>2.7.0</version>
</dependency>
4.2 创建Swagger2 配置类:
在Application.java 同级创建⼀个Swagger2 的配置类:
@Configuration
@EnableSwagger2
public class Swagger2 {
@Bean
public Docket webApi() {
return new Docket(DocumentationType.SWAGGER_2)
.
groupName("DemoAPI接⼝⽂档")
.apiInfo(apiInfo())
.select()
.apis(RequestHandlerSelectors.basePackage("com.ller"))
.paths(PathSelectors.any()).build();
}
/**
swagger2使⽤说明:
@Api:⽤在类上,说明该类的作⽤
@ApiOperation:⽤在⽅法上,说明⽅法的作⽤
@ApiIgnore:使⽤该注解忽略这个API
@ApiImplicitParams:⽤在⽅法上包含⼀组参数说明
@ApiImplicitParam:⽤在@ApiImplicitParams注解中,指定⼀个请求参数的各个⽅⾯
paramType:参数放在哪个地⽅
header-->请求参数的获取:@RequestHeader
query-->请求参数的获取:@RequestParam
path(⽤于restful接⼝)-->请求参数的获取:@PathVariable
body(不常⽤)
form(不常⽤)
name:参数名
dataType:参数类型
required:参数是否必须传
value:参数的意思
defaultValue:参数的默认值
@ApiResponses:⽤于表⽰⼀组响应
@ApiResponse:⽤在@ApiResponses中,⼀般⽤于表达⼀个错误的响应信息
code:数字,例如400
message:信息,例如"请求参数没填好"
response:抛出异常的类
@ApiModel:描述⼀个Model的信息(这种⼀般⽤在post创建的时候,使⽤@RequestBody这样的场景,请求参数⽆法使⽤@ApiImplicitParam注解进⾏描述的时候) @ApiModelProperty:描述⼀个model的属性
*/
private ApiInfo apiInfo() {
return new ApiInfoBuilder()
.title("Demo使⽤Swagger2构建RESTful APIs")
.description("打卡服务")
.contact(new Contact("Jaycekon", "petstore.swagger.io/v2/swagger.json", "jaycekon@163"))
.version("1.0")
.build();
}
}
4.3 在需要⽣成Api 的接⼝添加注解:
@Api(tags = "测试⽤例")
@RestController
@RequestMapping(value="/users") // 通过这⾥配置使下⾯的映射都在/users下,可去除
public class UserController {
@ApiOperation(value="获取⽤户列表", notes="")
@RequestMapping(value={""}, method= RequestMethod.GET)
public List<User> getUserList() {
return new ArrayList<>();
}
@ApiOperation(value="创建⽤户", notes="根据User对象创建⽤户")
@ApiImplicitParam(name = "user", value = "⽤户详细实体user", required = true, dataType = "User")
@RequestMapping(value="", method=RequestMethod.POST)
public String postUser(@RequestBody User user) {
return "success";
}
@ApiOperation(value="获取⽤户详细信息", notes="根据url的id来获取⽤户详细信息")
@ApiImplicitParam(name = "id", value = "⽤户ID", required = true, dataType = "Long")
@RequestMapping(value="/{id}", method=RequestMethod.GET)
public User getUser(@PathVariable Long id) {
return new User();
}
@ApiOperation(value="更新⽤户详细信息", notes="根据url的id来指定更新对象,并根据传过来的user信息来更新⽤户详细信息")
@ApiImplicitParams({
@ApiImplicitParam(name = "id", value = "⽤户ID", required = true, dataType = "Long"),
@ApiImplicitParam(name = "user", value = "⽤户详细实体user", required = true, dataType = "User")
})
@RequestMapping(value="/{id}", method=RequestMethod.PUT)
public String putUser(@PathVariable Long id, @RequestBody User user) {
return "success";
}
@ApiOperation(value="删除⽤户", notes="根据url的id来指定删除对象")
@ApiImplicitParam(name = "id", value = "⽤户ID", required = true, dataType = "Long")
@RequestMapping(value="/{id}", method=RequestMethod.DELETE)
public String deleteUser(@PathVariable Long id) {
return "success";
}
}
就能看到前⽂所展⽰的RESTful API的页⾯。我们可以再点开具体的API请求,以POST类型的/users请求为例,可到上述代码中我们配置的Notes信息以及参数user的描述信息,如下图所⽰。
4、接⼊Jenkins&SonarQube
    项⽬框架搭建好后,我们可以通Jenkins 进⾏项⽬的⾃动发版,以及SonarQube 进⾏代码质量检测。在接⼊钱,我们需要将项⽬打包成war包,需要进⾏以下修改:
1、修改项⽬打包类型:
<groupId>com.Jaycekon</groupId>
<artifactId>demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>war</packaging>
2、修改Application.java ⽂件:
@SpringBootApplication
public class DemoApplication extends SpringBootServletInitializer {
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
return application.sources(DemoApplication.class);
}
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
在我的上⼀篇博客,哆啦A梦的传送门,已经讲解了⼀些基本配置⽅法,这⾥为⼤家讲解⼀下,接⼊SonarQube 进⾏代码质量检测的配置(需要本地安装SonarQube服务)。
⾸先需要在MetaData 中,加⼊SonarQube 的项⽬名(新建的命名):

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。