spring cloud/mesos:在mesos上運行spring cloud config配置服務

之前已經說明如何在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:123456}@localhost:8761/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:123456}@${eureka.peer01.host}:${eureka.peer01.port}/eureka/
      replicasZone: http://${eureka.username:zcg}:${eureka.password:123456}@${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: 8888

security:
  user:
    name: zcg
    password: 123456

注意:此處默認激活的是native配置,只做開發使用,後面會通過mesos環境變量開啓其他配置。


docker/Dockerfile:

#使用daocloud的java8鏡像
FROM daocloud.io/library/java:8
#鏡像創建人
MAINTAINER zcg
#附加捲
VOLUME /tmp
#添加jar包
ADD config-1.0.0-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":1,
    "mem":256,
    "instances":1,
    "container":{
        "type":"DOCKER",
        "docker":{
            "network":"BRIDGE",
            "image":"172.16.120.136:31000/config",
            "portMappings":[
                {
                    "containerPort":0,
                    "hostPort":31888,
                    "servicePort":0,
                    "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":0,
            "gracePeriodSeconds":300,
            "intervalSeconds":60,
            "timeoutSeconds":20,
            "maxConsecutiveFailures":3
        }
    ]
}

配置詳解:

"portMappings":[
                {
                    "containerPort":0,
                    "hostPort":0,
                    "servicePort":0,
                    "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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章