How to Deploy Microservices on Google Cloud
Today, I'll show you how you can deploy a multi module project on GAE using Maven. Because the EAR file is not allowed, we basically wrap our microservices inside a parent module (pom).
Parent Module
The parent module has its packaging tag set to pom.
All shared configuration will be placed inside the parent pom.xml via dependencyManagement or pluginManagement.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?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>com.vedrax</groupId> | |
<name>Parent Pom</name> | |
<artifactId>parent-project</artifactId> | |
<version>1.0-SNAPSHOT</version> | |
<packaging>pom</packaging> | |
<properties> | |
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> | |
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> | |
<maven.compiler.source>1.8</maven.compiler.source> | |
<maven.compiler.target>1.8</maven.compiler.target> | |
<maven.compiler.showDeprecation>true</maven.compiler.showDeprecation> | |
<archiveClasses>true</archiveClasses> | |
<spring.boot.version>2.1.1.RELEASE</spring.boot.version> | |
<appengine.api.version>1.9.71</appengine.api.version> | |
</properties> | |
<modules> | |
<module>company-service</module> | |
<module>product-service</module> | |
<module>certification-service</module> | |
</modules> | |
<dependencyManagement> | |
<dependencies> | |
<!-- Spring boot dependency management --> | |
<dependency> | |
<groupId>org.springframework.boot</groupId> | |
<artifactId>spring-boot-dependencies</artifactId> | |
<version>${spring.boot.version}</version> | |
<type>pom</type> | |
<scope>import</scope> | |
</dependency> | |
<!-- Compile/runtime dependencies --> | |
<dependency> | |
<groupId>com.google.appengine</groupId> | |
<artifactId>appengine-api-1.0-sdk</artifactId> | |
<version>${appengine.api.version}</version> | |
</dependency> | |
<dependency> | |
<groupId>javax.servlet</groupId> | |
<artifactId>javax.servlet-api</artifactId> | |
<version>3.1.0</version> | |
</dependency> | |
<dependency> | |
<groupId>jstl</groupId> | |
<artifactId>jstl</artifactId> | |
<version>1.2</version> | |
</dependency> | |
<!-- Commons Dependencies --> | |
<dependency> | |
<groupId>org.apache.commons</groupId> | |
<artifactId>commons-lang3</artifactId> | |
<version>3.8.1</version> | |
</dependency> | |
<dependency> | |
<groupId>commons-codec</groupId> | |
<artifactId>commons-codec</artifactId> | |
<version>1.6</version> | |
</dependency> | |
<dependency> | |
<groupId>commons-validator</groupId> | |
<artifactId>commons-validator</artifactId> | |
<version>1.6</version> | |
</dependency> | |
<!-- GSON --> | |
<dependency> | |
<groupId>com.google.code.gson</groupId> | |
<artifactId>gson</artifactId> | |
<version>2.8.5</version> | |
</dependency> | |
<!-- JWT Dependency --> | |
<dependency> | |
<groupId>io.jsonwebtoken</groupId> | |
<artifactId>jjwt</artifactId> | |
<version>0.9.1</version> | |
</dependency> | |
<!-- Google Test Dependencies --> | |
<dependency> | |
<groupId>com.google.appengine</groupId> | |
<artifactId>appengine-testing</artifactId> | |
<version>${appengine.api.version}</version> | |
</dependency> | |
<dependency> | |
<groupId>com.google.appengine</groupId> | |
<artifactId>appengine-api-stubs</artifactId> | |
<version>${appengine.api.version}</version> | |
</dependency> | |
<dependency> | |
<groupId>com.google.appengine</groupId> | |
<artifactId>appengine-tools-sdk</artifactId> | |
<version>${appengine.api.version}</version> | |
</dependency> | |
<dependency> | |
<groupId>com.google.truth</groupId> | |
<artifactId>truth</artifactId> | |
<version>0.33</version> | |
</dependency> | |
</dependencies> | |
</dependencyManagement> | |
<!-- Plugin management --> | |
<build> | |
<pluginManagement> | |
<plugins> | |
<!-- compiler plugin --> | |
<plugin> | |
<groupId>org.apache.maven.plugins</groupId> | |
<artifactId>maven-compiler-plugin</artifactId> | |
<version>3.6.1</version> | |
<configuration> | |
<source>${maven.compiler.source}</source> | |
<target>${maven.compiler.target}</target> | |
<encoding>${project.build.sourceEncoding}</encoding> | |
</configuration> | |
</plugin> | |
<!-- maven war plugin --> | |
<plugin> | |
<artifactId>maven-war-plugin</artifactId> | |
<version>3.1.0</version> | |
</plugin> | |
<!-- Spring boot plugin --> | |
<plugin> | |
<groupId>org.springframework.boot</groupId> | |
<artifactId>spring-boot-maven-plugin</artifactId> | |
<version>${spring.boot.version}</version> | |
</plugin> | |
<!-- Appengine plugin --> | |
<plugin> | |
<groupId>com.google.appengine</groupId> | |
<artifactId>appengine-maven-plugin</artifactId> | |
<version>${appengine.api.version}</version> | |
</plugin> | |
</plugins> | |
</pluginManagement> | |
</build> | |
</project> |
As you probably know Maven provides the notion of aggregation by declaring submodules explicitly in the parent pom.xml. In the above configuration, I've declared 3 submodules (war).
You can create the parent project with the following cmd:
mvn archetype:generate -DgroupId=com.vedrax -DartifactId=parent-project
PS: I'll soon register an archetype to generate the configuration as presented above with the required submodules.
You can create the parent project with the following cmd:
mvn archetype:generate -DgroupId=com.vedrax -DartifactId=parent-project
PS: I'll soon register an archetype to generate the configuration as presented above with the required submodules.
Submodules
You can in the parent's directory run the following cmd:
mvn archetype:generate -DgroupId=com.vedrax -DartifactId=company-service
mvn archetype:generate -DgroupId=com.vedrax -DartifactId=product-service
mvn archetype:generate -DgroupId=com.vedrax -DartifactId=certification-service
Maven will generate for you 3 empty projects. It'll also modify the modules tag on the parent's pom.xml as below:
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<modules> | |
<module>company-service</module> | |
<module>product-service</module> | |
<module>certification-service</module> | |
</modules> |
Below is a complete example of the pom.xml as declared in the company-service :
As a bonus, you will be able to run a Spring boot project with the sample code above on GAE.
In this tutorial, we discussed the way we generate a multi modules app in GAE.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?xml version="1.0" encoding="UTF-8"?> | |
<project> | |
<modelVersion>4.0.0</modelVersion> | |
<groupId>com.vedrax.company</groupId> | |
<artifactId>company-service</artifactId> | |
<packaging>war</packaging> | |
<name>Company Service</name> | |
<parent> | |
<groupId>com.vedrax</groupId> | |
<artifactId>parent-project</artifactId> | |
<version>1.0-SNAPSHOT</version> | |
</parent> | |
<dependencies> | |
<!-- Compile/runtime dependencies --> | |
<dependency> | |
<groupId>com.google.appengine</groupId> | |
<artifactId>appengine-api-1.0-sdk</artifactId> | |
</dependency> | |
<dependency> | |
<groupId>javax.servlet</groupId> | |
<artifactId>javax.servlet-api</artifactId> | |
<scope>provided</scope> | |
</dependency> | |
<dependency> | |
<groupId>jstl</groupId> | |
<artifactId>jstl</artifactId> | |
</dependency> | |
<!-- Spring boot Dependencies --> | |
<dependency> | |
<groupId>org.springframework.boot</groupId> | |
<artifactId>spring-boot-starter-web</artifactId> | |
<!-- Exclude Tomcat so that it doesn't conflict w/ Jetty server --> | |
<exclusions> | |
<exclusion> | |
<groupId>org.springframework.boot</groupId> | |
<artifactId>spring-boot-starter-tomcat</artifactId> | |
</exclusion> | |
</exclusions> | |
</dependency> | |
<dependency> | |
<groupId>org.springframework.boot</groupId> | |
<artifactId>spring-boot-starter-security</artifactId> | |
</dependency> | |
<dependency> | |
<groupId>org.springframework.boot</groupId> | |
<artifactId>spring-boot-starter-test</artifactId> | |
<scope>test</scope> | |
</dependency> | |
<!-- Exclude any jul-to-slf4j --> | |
<dependency> | |
<groupId>org.slf4j</groupId> | |
<artifactId>jul-to-slf4j</artifactId> | |
<scope>provided</scope> | |
</dependency> | |
<!-- Commons Dependencies --> | |
<dependency> | |
<groupId>org.apache.commons</groupId> | |
<artifactId>commons-lang3</artifactId> | |
</dependency> | |
<dependency> | |
<groupId>commons-codec</groupId> | |
<artifactId>commons-codec</artifactId> | |
</dependency> | |
<dependency> | |
<groupId>commons-validator</groupId> | |
<artifactId>commons-validator</artifactId> | |
</dependency> | |
<!-- GSON --> | |
<dependency> | |
<groupId>com.google.code.gson</groupId> | |
<artifactId>gson</artifactId> | |
</dependency> | |
<!-- JWT Dependency --> | |
<dependency> | |
<groupId>io.jsonwebtoken</groupId> | |
<artifactId>jjwt</artifactId> | |
</dependency> | |
<!-- Google Test Dependencies --> | |
<dependency> | |
<groupId>com.google.appengine</groupId> | |
<artifactId>appengine-testing</artifactId> | |
<scope>test</scope> | |
</dependency> | |
<dependency> | |
<groupId>com.google.appengine</groupId> | |
<artifactId>appengine-api-stubs</artifactId> | |
<scope>test</scope> | |
</dependency> | |
<dependency> | |
<groupId>com.google.appengine</groupId> | |
<artifactId>appengine-tools-sdk</artifactId> | |
<scope>test</scope> | |
</dependency> | |
<dependency> | |
<groupId>com.google.truth</groupId> | |
<artifactId>truth</artifactId> | |
<scope>test</scope> | |
</dependency> | |
</dependencies> | |
<build> | |
<plugins> | |
<plugin> | |
<groupId>org.springframework.boot</groupId> | |
<artifactId>spring-boot-maven-plugin</artifactId> | |
</plugin> | |
<plugin> | |
<groupId>com.google.appengine</groupId> | |
<artifactId>appengine-maven-plugin</artifactId> | |
</plugin> | |
</plugins> | |
</build> | |
</project> |
As a bonus, you will be able to run a Spring boot project with the sample code above on GAE.
Conclusion
In this tutorial, we discussed the way we generate a multi modules app in GAE.
Comments
Post a Comment