之前已經說明如何在mesos上運作eureka服務發現,下面介紹如何在mesos上運作spring cloud config配置服務,并将配置服務注冊到eureka上。eureka用戶端注冊服務時使用主機名,也可以通過spring cloud的配置eureka.instance.prefer-ip-address: true指定使用IP位址,配置服務預設注冊到erueka上的是docker的主機名(沒有指定主機名,一般顯示的為docker容器的ID),如果配置eureka.instance.prefer-ip-address: true則顯示docker容器的IP,而這些資訊對于其他服務是沒法使用的(因為mesos不支援docker的網絡配置,除非使用docker swarm on mesos,但目前它不是成熟産品),由于通路mesos上運作docker容器使用的都是主機的IP,我們需要通過eureka.instance.ip-address屬性指定配置服務的IP。
1 建立maven項目
spring cloud使用的版本是Brixton.M5,docker-maven-plugin使用的版本是0.4.1。
<?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.szss.genisys</groupId>
<artifactId>config</artifactId>
<version>1.0.0-SNAPSHOT</version>
<packaging>jar</packaging>
<name>config</name>
<description>spring cloud config</description>
<parent>
<groupId>com.szss.genisys</groupId>
<artifactId>genisys-parent</artifactId>
<version>1.0.0-SNAPSHOT</version>
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</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>
</dependencies>
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>${docker.plugin.version}</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>build</goal>
</goals>
</execution>
</executions>
<configuration>
<imageName>${docker.image.prefix}/${project.artifactId}</imageName>
<dockerDirectory>${project.basedir}/src/main/docker</dockerDirectory>
<resources>
<resource>
<targetPath>/</targetPath>
<directory>${project.build.directory}</directory>
<include>${project.build.finalName}.jar</include>
</resource>
</resources>
</configuration>
</plugin>
</plugins>
</build>
</project>
2 建立配置服務
程式入口:
@SpringBootApplication
@EnableEurekaClient
@EnableConfigServer
public class ConfigApplication {
public static void main(String[] args) {
SpringApplication.run(ConfigApplication.class, args);
}
}
resources/bootstrap.xml:
---
spring:
profiles: native
cloud:
config:
server:
native:
search-locations: classpath:/config
eureka:
instance:
prefer-ip-address: true
metadata-map:
instanceId: ${spring.application.name}:${random.value}
client:
fetch-registry: true
register-with-eureka: true
service-url:
defaultZone: http://${eureka.username:zcg}:${eureka.password:}@localhost:/eureka/
---
spring:
profiles: mesos
cloud:
config:
server:
git:
uri: https://github.com/zhuchuangang/spring-cloud-genisys-repo.git
eureka:
instance:
prefer-ip-address: true
ip-address: ${HOST}
metadata-map:
instanceId: ${spring.application.name}:${random.value}
client:
fetch-registry: true
register-with-eureka: true
service-url:
defaultZone: http://${eureka.username:zcg}:${eureka.password:}@${eureka.peer01.host}:${eureka.peer01.port}/eureka/
replicasZone: http://${eureka.username:zcg}:${eureka.password:}@${eureka.peer02.host}:${eureka.peer02.port}/eureka/
注意:ip-address: ${HOST} 此處的配置是引用mesos的環境變量HOST,HOST的值是主機的IP位址,通過這個設定覆寫docker容器的IP位址,讓服務可以直接通過主機IP通路。eureka.peer01.host和eureka.peer01.port通過mesos環境變量指定。
resources/application.yml:
info:
name: config-service
version: ${project.version}
spring:
profiles:
active: native
application:
name: config
server:
port:
security:
user:
name: zcg
password:
注意:此處預設激活的是native配置,隻做開發使用,後面會通過mesos環境變量開啟其他配置。
docker/Dockerfile:
#使用daocloud的java8鏡像
FROM daocloud.io/library/java:
#鏡像建立人
MAINTAINER zcg
#附加卷
VOLUME /tmp
#添加jar包
ADD config--SNAPSHOT.jar app.jar
#修改jar包日期
RUN bash -c "touch app.jar"
#運作app,并指定端口号
ENTRYPOINT java -Djava.security.egd=file:/dev/./urandom -jar /app.jar --server.port=$PORT0
注意:此處沒有使用EXPOSE指定暴露端口,而是使用spring boot的程式參數server.port來設定端口号,$PORT0為mesos的環境變量,表示配置設定給容器的一組主機端口号中的第一個,這樣可以讓容器内部的端口号和主機端口号保持一緻。
3 打包鏡像
需要事先準備docker環境,進入docker指令行,在項目目錄下執行mvn package指令,打包maven項目,同時生成該程式的鏡像。
将鏡像推送到registry服務上,本過程不再累述。如何在mesos運作docker registry請參看文章http://blog.csdn.net/zhuchuangang/article/details/51286308
4 在mesos上運作配置服務
環境準備:mesos/marathon/docker的安裝和環境配置請參考http://blog.csdn.net/zhuchuangang/article/details/51043864
在marathon上執行下面代碼:
{
"id":"config",
"cpus":,
"mem":,
"instances":,
"container":{
"type":"DOCKER",
"docker":{
"network":"BRIDGE",
"image":"172.16.120.136:31000/config",
"portMappings":[
{
"containerPort":,
"hostPort":,
"servicePort":,
"protocol":"tcp",
"name":"http"
}
]
}
},
"env":{
"spring.profiles.active":"mesos",
"eureka.peer01.host":"172.16.120.137",
"eureka.peer01.port":"31761",
"eureka.peer02.host":"172.16.120.138",
"eureka.peer02.port":"31762"
},
"healthChecks":[
{
"protocol":"HTTP",
"path":"/health",
"portIndex":,
"gracePeriodSeconds":,
"intervalSeconds":,
"timeoutSeconds":,
"maxConsecutiveFailures":
}
]
}
配置詳解:
"portMappings":[
{
"containerPort":,
"hostPort":,
"servicePort":,
"protocol":"tcp",
"name":"http"
}
]
hostPort、containerPort設為0表示容器内部端口号和主機端口号保持一緻并且随機配置設定,hostPort端口号取值範圍為31000~32000。
"env":{
"spring.profiles.active":"mesos",
"eureka.peer01.host":"172.16.120.137",
"eureka.peer01.port":"31761",
"eureka.peer02.host":"172.16.120.138",
"eureka.peer02.port":"31762"
}
通過環境變量spring.profiles.active開啟application.yml檔案中mesos配置。
有關marathon端口配置請參考:http://blog.csdn.net/zhuchuangang/article/details/51167845
有關marathon限制配置請參考:http://blog.csdn.net/zhuchuangang/article/details/51147967
有關marathon健康檢查配置請參考:http://blog.csdn.net/zhuchuangang/article/details/51120177