天天看點

spring cloud/mesos:在mesos上運作spring cloud config配置服務1 建立maven項目2 建立配置服務3 打包鏡像4 在mesos上運作配置服務

之前已經說明如何在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