微服務架構解決方案使用 spring cloud ,因爲spring cloud目前版本迭代很是快,bug也有很多,這裏以目前最新的版本 Camden.SR2 爲例。java
spring cloud netflix 是在netflix開源的一套微服務構建工具之上進行了封裝。依靠註解和自動配置便可完成經常使用的配置,從spring boot開始,spring對配置作了大量的簡化,並實現了自動化配置,能夠更快速的建立項目。git
在微服務架構中,會把一個大的單體服務拆分紅若干個功能單一的微服務。微服務的數量根據業務而定,可能會很大,這些微服務的運行狀態,以及服務之間的通訊須要一個統一的註冊中心進行管理。spring
建立一個maven工程,在 pom.xml 文件中加入spring cloud 依賴:docker
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.4.2.RELEASE</version> </parent> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka-server</artifactId> </dependency> </dependencies> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Camden.SR2</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement>
在 resources 目錄中建立 application.yml 配置文件,在配置文件內容:apache
spring: application: name: @project.artifactId@ server: port: 8000 eureka: instance: hostname: localhost client: serviceUrl: defaultZone: http://localhost:8000/eureka/ registerWithEureka: false fetchRegistry: false server: enableSelfPreservation: false
在 java 目錄中建立一個包 demo ,在包中建立啓動入口 ServiceRegistryApplication.javatomcat
@EnableEurekaServer @SpringBootApplication public class ServiceRegistryApplication { public static void main(String[] args) { SpringApplication.run(ServiceRegistryApplication.class, args); } }
運行 main 方法,啓動註冊中心。啓動完成後,訪問http://localhost:8000, 能夠打開eureka的管理頁面。
安全
複製 application.yml,重命名爲 application-docker.yml,內容不須要作修改。
修改 application.yml 中的 spring 節點爲:架構
spring: application: name: @project.artifactId@ profiles: active: @activatedProperties@
這裏增長了 profiles 的配置,在maven打包時選擇不一樣的profile,加載不一樣的配置文件app
在pom.xml文件中增長:dom
<properties> <java.version>1.8</java.version> <!-- 指定java版本 --> <!-- 鏡像前綴,推送鏡像到遠程庫時須要,這裏配置了一個阿里雲的私有庫 --> <docker.image.prefix> registry.cn-hangzhou.aliyuncs.com/ztecs </docker.image.prefix> <!-- docker鏡像的tag --> <docker.tag>demo</docker.tag> <!-- 激活的profile --> <activatedProperties></activatedProperties> </properties> <profiles> <!-- docker環境 --> <profile> <id>docker</id> <properties> <activatedProperties>docker</activatedProperties> <docker.tag>docker-demo-${project.version}</docker.tag> </properties> </profile> </profiles> <build> <defaultGoal>install</defaultGoal> <finalName>${project.artifactId}</finalName> <resources> <resource> <directory>src/main/resources</directory> <filtering>true</filtering> </resource> </resources> <plugins> <!-- 配置spring boot maven插件,把項目打包成可運行的jar包 --> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <executable>true</executable> </configuration> </plugin> <!-- 打包時跳過單元測試 --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <configuration> <skipTests>true</skipTests> </configuration> </plugin> <!-- 配置docker maven插件,綁定install生命週期,在運行maven install時生成docker鏡像 --> <plugin> <groupId>com.spotify</groupId> <artifactId>docker-maven-plugin</artifactId> <version>0.4.13</version> <executions> <execution> <phase>install</phase> <goals> <goal>build</goal> <goal>tag</goal> </goals> </execution> </executions> <configuration> <!-- 修改這裏的docker節點ip,須要打開docker節點的遠程管理端口2375, 具體如何配置能夠參照以前的docker安裝和配置的文章 --> <dockerHost>http://docker節點ip:2375</dockerHost> <imageName>${docker.image.prefix}/${project.build.finalName}</imageName> <baseImage>java</baseImage> <!-- 這裏的entryPoint定義了容器啓動時的運行命令,容器啓動時運行 java -jar 包名 , -Djava.security.egd這個配置解決tomcat8啓動時, 由於須要收集環境噪聲來生成安全隨機數致使啓動過慢的問題--> <entryPoint> ["java", "-Djava.security.egd=file:/dev/./urandom", "-jar", "/${project.build.finalName}.jar"] </entryPoint> <resources> <resource> <targetPath>/</targetPath> <directory>${project.build.directory}</directory> <include>${project.build.finalName}.jar</include> </resource> </resources> <image>${docker.image.prefix}/${project.build.finalName}</image> <newName>${docker.image.prefix}/${project.build.finalName}:${docker.tag}</newName> <forceTags>true</forceTags> <!-- 若是須要在生成鏡像時推送到遠程庫,pushImage設爲true --> <pushImage>false</pushImage> </configuration> </plugin> </plugins> </build>
選擇 docker
profile,運行 mvn install -P docker
,打包項目並生成docker鏡像,注意docker-maven-plugin中的 <entryPoint>
標籤裏的內容不能換行,不然在生成docker鏡像的時候會報錯。
運行成功後,登陸docker節點,運行 docker images
應該能夠看到剛纔打包生成的鏡像了。
運行 docker run -it IMAGE_ID
就能夠運行鏡像了。
demo源碼 spring-cloud-1.0/service-registry-demo