基于SpringBoot的微服务与“头文件”

有C编程经验的同学应该对头文件都很熟悉,Java中的package也起到了类似的功能。当系统被拆分为多个微服务时,我们需要将各服务共用的class,和interface抽出来组成一个jar包,这样既简化了微服务系统的开发,又有利于系统的扩展。

本文使用User微服务来进行示例说明,文中所使用的java版本为1.8.0_40,gradle版本为2.10

1.创建api.jar

api.jar即系统各微服务共用的jar包。
首先创建一个基于gradle的java工程,具体方法见《springboot+gradle 构建多模块项目》
创建好的项目结构如下:
这里写图片描述

接下来修改根目录下的build.gradle,

buildscript {
    repositories {
        mavenLocal()
        maven { url "http://maven.aliyun.com/nexus/content/groups/public" }
        maven { url "http://repo.spring.io/snapshot" }
        maven { url "http://repo.spring.io/milestone" }
        jcenter()
    }
    dependencies {
        classpath('com.github.jengelman.gradle.plugins:shadow:1.2.4')
    }
}

apply plugin: 'idea'
apply plugin: 'java'
apply plugin: 'maven'
apply plugin: 'com.github.johnrengelman.shadow'

group = 'com.formularoom'
archivesBaseName = 'api'
version = '1.0.0'

jar {
    baseName = archivesBaseName
}

shadowJar {
    baseName = archivesBaseName
    classifier = null
    version = version
}

// JVM 版本号要求
sourceCompatibility = 1.8
targetCompatibility = 1.8

// java编译的时候缺省状态下会因为中文字符而失败
[compileJava,compileTestJava,javadoc]*.options*.encoding = 'UTF-8'

ext {
    lombokVer = '1.16.8'
    libPath =  "file:" + new File(rootProject.rootDir, '../Libs').getAbsolutePath().toString()
}

repositories {
    mavenLocal()
    maven { url "http://maven.aliyun.com/nexus/content/groups/public" }
    maven { url "http://nexus.mvnsearch.org/content/repositories/releases/" }
    maven { url "http://nexus.mvnsearch.org/content/repositories/snapshots/" }
    mavenCentral()
    jcenter()
    maven { url "http://repo.spring.io/snapshot" }
    maven { url "http://repo.spring.io/milestone" }
    maven { url 'http://maven.springframework.org/release' }
    maven { url 'http://maven.springframework.org/milestone' }
}

dependencies {
    compile(
        "org.projectlombok:lombok:$lombokVer"
    )

    testCompile(
    )
}

jar {
    manifest {
        attributes("Implementation-Title": "Gradle")
    }
}

allprojects {
    gradle.projectsEvaluated {
        tasks.withType(JavaCompile) {
            options.compilerArgs << "-Xlint:unchecked" << "-Xlint:deprecation"
        }
    }
}

uploadShadow {
    repositories.mavenDeployer {
        repository(url: libPath)
    }
}

以上配置中,第一个需要注意的是,引入了maven plugin,它可以给api.jar添加group和version信息,并按照中央仓库中对jar包的要求,给api.jar添加上描述信息,便于其他微服务引用。另外maven plugin提供了将jar包上传到中央仓库的task,通过它,我们可以将api.jar上传到指定的目录,如上述配置中的libPath ,就是作为中央仓库使用的目录,它与其他服务的目录关系如下图所示。
这里写图片描述

第二个需要注意的是,引入了shadow plugin,它主要是将jar包的依赖一起打包,生成一个uber-jar。uploadShadow是此plugin提供的方法,用来将jar提交到中央仓库。

2.添加user service的信息到api.jar

添加User.java,示例代码如下:

package com.formularoom.user;

import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;

@NoArgsConstructor
@Data
public class User implements Serializable {

    private long id;

    private String userName;

    private String email;

    private String password;

    private long created_at;

    private long updated_at;
}

@NoArgsConstructor和@Data是lombok提供的注解,可以帮我们生成get/set函数。

添加UserService.java

package com.formularoom.user;

import java.util.List;

public interface UserService {

    long count();

    String createUser(User user);

    String editUser(User user);

    String deleteUser(long userId);

    String resetPassword(long userId, String password);

    List<Long> getUserIdLst();

    List<User> getUserLst();

    User getUserById(long id);
}

添加完代码后,可使用intelliJ idea中所提供的gradle panel完成编译,打包,提交的动作,如下图所示,
这里写图片描述

上传完成后,Libs目录的结构如下:
这里写图片描述

至此,api.jar已完成,至于再其他项目中如何使用,会在下一篇博客中进行示例讲解。

完整的示例代码,可从此处 获取。

交流群号,255489119。


猜你喜欢

转载自blog.csdn.net/FormulaRoom/article/details/71941460