第一个微服务应用

2017-11-03  本文已影响1657人  sprainkle

(git上的源码:https://gitee.com/rain7564/spring_microservices_study/tree/master/first-microservice)

使用idea创建一个基于Spring Cloud的微服务应用
  1. 点击File -> New -> Project,然后出现如下弹窗:


    image.png
  2. 然后点击Next,输入一些必要信息,如下:


    image.png
  3. 点击Next,如下:


    image.png
  4. 点击Next,最后输入Project name和Project location即可,如下:


    image.png
  5. 等从远程下载项目的.zip文件并解压后,idea会自动将jar包导入,第一次创建Spring Boot项目,加载时间可能会比较久,现在可以先喝杯饮料压压惊~~~
  6. 等项目加载完,第一个微服务应用的雏形就完成了,目录结构如下:


    image.png

    标准的maven项目,我们重点关注以下几个文件:
    ① Application.java:Spring Boot工程的启动类(已被重命名),打开该文件,如下:

//该注解表明该类是项目(微服务)的启动类
@SpringBootApplication
public class Application {
    //运行该方法,会启动整个Spring Boot服务
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

② application.properties: Spring Boot项目的配置文件。该配置文件可以用来配置诸如数据源等的配置信息。该文件是properties文件,不过Spring Boot还支持另一种文件格式——application.yml,该教程所有配置文件都会使用这种文件格式来配置各种配置信息。
以后还会有一个配置文件——bootstrap.yml,后文会详讲。
虽说是配置文件,但当配置文件为空,整个项目也能跑起来。
③ .gitignore: 刚创建的项目并没有该文件,是后来加上去的,若不需要push到git,可以忽略该文件。
④ pom.xml: 写过maven工程的道友肯定对这个文件很熟悉。没错,这个微服务实际上就是一个maven工程,只是该文件中默认加入了Spring Boot的Maven插件(<plugins>标签)、从spring-boot-starter-parent继承的版本号(<parent>标签)和Spring Boot框架的启动依赖(<dependencies>标签)。

  1. 因为我们要创建的是基于Spring Cloud的微服务应用,所以需要对刚刚创建的项目进行改造,让刚刚创建的项目变成一个父项目,并创建一个子项目:
<?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>cn.study.microservice</groupId>
    <artifactId>first-microservice</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>pom</packaging>

    <name>first-microservice</name>
    <description></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>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Dalston.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>
image.png image.png image.png

点击Finish,项目加载完成后,整个工程的目录树如下:

image.png
简单说明图中部分文件/文件夹:
① license-service:刚刚新建的微服务。一个基于Spring Cloud的微服务应用,可以包含多个这样的微服务。
② LicenseServiceApplication:license-service微服务的启动类。
③ 文件夹static、templates:static存放类似.js、.jpg等静态资源,templates存放.html文件等。接下来都不涉及页面的开发,所以这两个文件夹可以删掉。
④ application.properties:配置文件。
⑤ pom.xml:pom文件。打开文件,可以看到跟刚刚创建的父工程first-microservice的pom文件类似,但是<dependencies>标签中的依赖略有不同,多了"spring-boot-starter-web"、"mysql-connector-java",这两个就是刚刚创建时勾选的"Web"、"MySQL"。也就是说需要什么依赖,可以在创建时勾选对应的jar包即可。同样你也可以直接编辑pom文件,比如添加依赖"spring-boot-starter-data-jpa"。不过一般都是直接跳过勾选,需要什么直接编辑pom文件。你可能会问,那pom文件怎么知道引用哪个版本的依赖,答案可以参考spring boot的maven配置依赖
从maven结构来看,first-microservice是license-service的父项目,所以可以对license-service项目的pom文件进行修改,去掉<build>、<properties>标签,修改<parent>标签。如下:
<?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>cn.study.microservice</groupId>
    <artifactId>license-service</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>license-service</name>
    <description></description>

    <parent>
        <groupId>cn.study.microservice</groupId>
        <artifactId>first-microservice</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </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-data-jpa</artifactId>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

</project>

可以看到<parent>引用了父项目first-microservice,license-service的pom文件继承了first-microservice的pom文件。

image.png
package cn.study.microservice.license.domain;

public class License{
    private String id;
    private String organizationId;
    private String productName;
    private String licenseType;

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getOrganizationId() {
        return organizationId;
    }

    public void setOrganizationId(String organizationId) {
        this.organizationId = organizationId;
    }

    public String getProductName() {
        return productName;
    }

    public void setProductName(String productName) {
        this.productName = productName;
    }

    public String getLicenseType() {
        return licenseType;
    }

    public void setLicenseType(String licenseType) {
        this.licenseType = licenseType;
    }

    public License withId(String id){
        this.setId( id );
        return this;
    }

    public License withOrganizationId(String organizationId){
        this.setOrganizationId(organizationId);
        return this;
    }

    public License withProductName(String productName){
        this.setProductName(productName);
        return this;
    }

    public License withLicenseType(String licenseType){
        this.setLicenseType(licenseType);
        return this;
    }
}
/**
 * 该注解相当于@ResponseBody + @Controller合在一起的作用
 * 会将request/response序列化/反序列化为JSON格式
 */
@RestController
@RequestMapping(value="v1/organizations/{organizationId}/licenses")
public class LicenseServiceController {

    @RequestMapping(value="/{licenseId}",method = RequestMethod.GET)
    public License getLicenses( @PathVariable("organizationId") String organizationId,
                                @PathVariable("licenseId") String licenseId) {
        //@PathVariable能将URL中{organizationId}、{licenseId}映射到方法的变量organizationId、licenseId
        return new License()
                .withId(licenseId)
                .withOrganizationId(organizationId)
                .withProductName("Teleco")
                .withLicenseType("Seat");
    }

    @RequestMapping(value="{licenseId}",method = RequestMethod.PUT)
    public String updateLicenses( @PathVariable("licenseId") String licenseId) {
        return String.format("This is the put");
    }

    @RequestMapping(value="{licenseId}",method = RequestMethod.POST)
    public String saveLicenses( @PathVariable("licenseId") String licenseId) {
        return String.format("This is the post");
    }

    @RequestMapping(value="{licenseId}",method = RequestMethod.DELETE)
    @ResponseStatus(HttpStatus.NO_CONTENT)
    public String deleteLicenses( @PathVariable("licenseId") String licenseId) {
        return String.format("This is the Delete");
    }

}
image.png

启动后,可在控制台看到类似下图的打印效果:


image.png

至此,第一个基于Spring Cloud的微服务应用搭建完成,这只是一个最简单的微服务应用,还没涉及到Spring Cloud的五大神兽:

下一节,将介绍第一个神兽:Netflix Eureka(服务注册与发现)。

上一篇 下一篇

猜你喜欢

热点阅读