(编写不易,转载请注明:http://shihlei.iteye.com/blog/2398709)
一 概述 :
基于sring boot 创建 简单的微服务。
spring boot 版本:1.5.7.RELEASE。
二 项目组成
父项目:x.demo.springcloud
module:
1)spring-cloud-microservice:微服务项目,实现获取当前时间服务
2)spring-cloud-webfront:前端项目,根据业务调用各种微服务,这里只是获取时间。
三 Idea 创建 Spring boot工程向导使用
(一)创建父工程:
1) file- > new - > project :
2) 设置 group , artifact 等:我创建父工程,所以Type 选择 Maven Pom
3)依赖选择:暂时不需要依赖啥,统一依赖spring-boot :1.5.8
4)下一步,项目创建完成了,生成的pom 集成了spring-boot的父pom,注意,这里的packaging 我手动改成了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>x.demo.springcloud</groupId> <artifactId>spring-cloud-demo</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>spring-cloud-demo</name> <description>Demo project for Spring Boot</description> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.8.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>1.8</java.version> </properties> <dependencies> <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> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
(二)创建子工程:
1)file -> new -> module
2) 指定group ,artifact:
3) 指定下module的存放位置
4)默认生成spring boot , maven约定的项目结构:其中pom我改为集成我的父pom
<parent> <groupId>x.demo.springcloud</groupId> <artifactId>spring-cloud</artifactId> <version>1.0-SNAPSHOT</version> <relativePath>../../pom.xml</relativePath> </parent>
(三)项目结构
注:方框圈起来的暂时没用,都删掉了
四 微服务demo 开发
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>
<artifactId>spring-cloud-microservice</artifactId>
<packaging>jar</packaging>
<name>spring-cloud-microservice</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>x.demo.springcloud</groupId>
<artifactId>spring-cloud</artifactId>
<version>1.0-SNAPSHOT</version>
<relativePath>../../pom.xml</relativePath>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- utils -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</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>
</plugin>
</plugins>
</build>
</project>
(一)spring-cloud-microservice:时间微服务实现
server: port: 10001
package x.demo.springcloud.microservice;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class SpringCloudServiceApplication {
public static void main(String[] args) {
SpringApplication.run(SpringCloudServiceApplication.class, args);
}
}
package x.demo.springcloud.microservice.controller;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import org.apache.commons.lang3.StringUtils;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
/**
* rest服务
*/
@RestController
@RequestMapping("/time/v1")
public class RemoteTimeV1Controller {
private static final DateTimeFormatter DEFALUT_FORMATER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
/**
* 获取时间服务
*
* @param format 自定义格式
* @return 时间
*/
@GetMapping("/now")
public ProtocolResult<String> now(@RequestParam(name = "format", required = false) String format) {
String time;
try {
if (StringUtils.isEmpty(format)) {
time = LocalDateTime.now().format(DEFALUT_FORMATER);
} else {
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern(format);
time = LocalDateTime.now().format(dateTimeFormatter);
}
return new ProtocolResult<>(0, "success", time);
} catch (Exception e) {
return new ProtocolResult<>(-1, e.getMessage());
}
}
}
package x.demo.springcloud.microservice.controller;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@NoArgsConstructor
@AllArgsConstructor
public class ProtocolResult<T> {
//0 成功,非0 失败
private int code;
//响应提示信息
private String message;
//响应实体
private T body;
public ProtocolResult(int code, String message) {
this.code = code;
this.message = message;
}
}
package x.demo.springcloud.microservice.controller;
import static org.assertj.core.api.Assertions.assertThat;
import javax.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.web.client.TestRestTemplate;
import org.springframework.test.context.junit4.SpringRunner;
@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
@Slf4j
public class RemoteTimeV1ControllerIT {
@Resource
private TestRestTemplate restTemplate;
@Test
public void testNowNoFormat() throws Exception {
ProtocolResult<String> result = restTemplate.getForObject("/time/v1/now", ProtocolResult.class);
assertThat(result.getCode()).isEqualTo(0);
log.info("result : " + result);
}
@Test
public void testNowNoFormatYYYY() throws Exception {
ProtocolResult<String> result = restTemplate.getForObject("/time/v1/now?format=yyyy", ProtocolResult.class);
assertThat(result.getCode()).isEqualTo(0);
log.info("result : " + result);
}
}
(二)spring-cloud-webfront:一般前端业务层组装各个我服务,进行使用,这里做个简单的调用时间服务的客户端
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>x.demo.springcloud</groupId> <artifactId>spring-cloud-webfront</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>spring-cloud-webfront</name> <description>Demo project for Spring Boot</description> <parent> <groupId>x.demo.springcloud</groupId> <artifactId>spring-cloud</artifactId> <version>1.0-SNAPSHOT</version> <relativePath>../../pom.xml</relativePath> </parent> <dependencies> <!-- test --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <!-- spring --> <!-- spring boot --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- utils --> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
server: port: 20001 # 自定义配置 timeMisroService: v1: uri: http://localhost:10001/time/v1
package x.demo.springcloud.webfront;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class SpringCloudWebfrontApplication {
public static void main(String[] args) {
SpringApplication.run(SpringCloudWebfrontApplication.class, args);
}
}
package x.demo.springcloud.webfront.web;
import javax.annotation.Resource;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import x.demo.springcloud.webfront.service.TimeService;
@RestController
@RequestMapping("/time")
public class TimeController {
@Resource(name = "timeV1MicorServiceImpl")
private TimeService timeService;
@GetMapping("/now")
public String now() {
return timeService.now();
}
}
package x.demo.springcloud.webfront.service;
public interface TimeService {
/**
* 获取当前时间
* @return 当前时间,格式:yyyy-MM-dd HH:mm:ss
*/
String now();
}
package x.demo.springcloud.webfront.service.impl;
import javax.annotation.Resource;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;
import x.demo.springcloud.webfront.service.TimeService;
@Service
public class TimeV1MicroServiceImpl implements TimeService {
//时间格式
private static final String time_format = "yyyy-MM-dd HH:mm:ss";
@Value("${timeMisroService.v1.uri}")
private String timeMicroServiceV1Uri;
@Resource
private RestTemplate restTemplate;
/**
* 获取当前时间
*
* @return 当前时间,格式:yyyy-MM-dd HH:mm:ss
*/
@Override
public String now() {
ProtocolResult<String> result = restTemplate.getForObject(timeMicroServiceV1Uri + "/now", ProtocolResult.class);
return result.getBody();
}
}
package x.demo.springcloud.webfront.conf;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;
@Configuration
public class SpringConfiguration {
@Bean
public RestTemplate restTemplate(){
return new RestTemplate();
}
}
五 总结
spring boot 基于约定,免去了大部分的配置,比如spring mvc ,rest json序列化等