(编写不易,转载请注明: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序列化等