基於容器微服務的PaaS雲平臺設計(一) 實現容器微服務和持續集成

版權聲明:本文爲博主原創文章,歡迎轉載,轉載請註明做者、原文超連接 ,博主地址:http://www.cnblogs.com/SuperXJ/前端

 

前言:關於什麼是容器微服務PaaS和容器微服務PaaS的優劣,我找了下這篇不錯能夠參考 http://www.sohu.com/a/152360962_198222。本文致力於一步一步構建一個最簡單的基於容器的微服務的PaaS雲平臺,先從簡單的核心功能開始,慢慢深刻所有主要功能和加入高可用和容錯等非功能設計,爭取作到麻雀雖小,五臟俱全。本連載的整體技術架構路線是微服務、PaaS平臺和devops,這應該(至少目標)是一個完整的Paas雲平臺解決方案,最終目標是實現自動化、智能化開發測試部署和運維(例如經過AI實現運維智能化,故障自動處理、處理策略機器學習,不管運維設備規模如何增加,每一個領域的運維只須要2-3我的)。微服務決定採用spring cloud,平臺架構採用docker、kubernetes、zabbix、ansible、elk、openshift、SDS(沒想好實現到什麼程度,先列着吧),devops採用robot、jenkins等,不少內容我也沒想好想明白,邊寫變作邊補充邊修改吧,回頭補一張整體架構圖更直觀,不足和錯誤之處也請批評。                                                               java

 

第一篇主要寫一下最核心的cloud spring微服務實現、容器部署和jenkins持續集成,用最簡單的例子把一個微服務架構設計實現,和微服務的自動化集成部署到容器流程跑通。linux

1、微服務

採用spring cloud實現微服務,包括eureka server(用於微服務註冊發現心跳等) 、eureka client(用戶實現微服務) 、feign(用於微服務的Load Balance)、zuul(服務網關,用戶入口、過濾器),另外還有Kafka、配置中心、斷路、服務容錯、限流等等模塊,因爲不是最基礎的,因此後文再說。程序員

基礎環境:window7 、jdk1.7 、IntelliJ IDEA 本機IP 192.168.1.109 (簡單說明一下,個人實驗環境就是一臺4G內存的筆記本,安裝的win7,而後在裏面建了一個centos7的虛機IP爲192.168.1.110,win7主要用戶微服務IDEA環境的程序編寫編譯,centos主要用於devops和docker相關的運行)web

 

1.一、建立eureka server (前面詳細一點描述,後面的都簡單說明)spring

EurekaApplication.java中加入以下代碼,申明這是一個eureka server:docker

import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
@EnableEurekaServer

 

Pom.xml中加入:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka-server</artifactId>
</dependency>

 

資源文件 application.properties中加入以下代碼,申明eureka server信息,包括服務端口、主機名、有不本身不註冊本身、服務URL:
server.port=8761
eureka.instance.hostname=localhost
eureka.client.registerWithEureka=false
eureka.client.fetchRegistry=false
eureka.client.serviceUrl.defaultZone=http://${eureka.instance.hostname}:${server.port}/eureka/

 

OK,eureka服務端建立完畢,編譯運行後,能夠啓動 http://192.168.1.109:8761 查看shell

能夠看到這個時候,尚未instances,也就是尚未微服務註冊。數據庫

 

1.二、建立eureka client 並完成註冊(eureka client實現微服務,真實應用中裏面放入程序邏輯和數據庫訪問並對外提供接口,注意服務須要是無狀態)windows

前面和建立eureka差很少,建好以後在主程序中加入:

import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestParam;
@SpringBootApplication
//重要:申明這是一個eureka client
@EnableEurekaClient
@RestController

public class DemoApplication {
//從配置文件中讀取server.port,從URL中讀取關鍵字MicroServiceA,返回前端this MicroServiceA port is 8762
@Value("${server.port}")
String port;
@RequestMapping("/MicroServiceA")
public String home() {
return "this MicroServiceA port is:" +port;
}
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}

 

配置文件: 申明server地址,微服務名稱和端口
eureka.client.serviceUrl.defaultZone=http://192.168.1.109:8761/eureka/
spring.application.name=MicroService_A
server.port=8762

 

完成打開http://192.168.1.109:8762/MicroServiceA,顯示

而後刷新一下eureka server註冊中心http://192.168.1.109:8761,看看微服務是否註冊成功了。

看到了application中有了一個剛纔建立的微服務 MICROSERVICE_A。

 

1.3 建立feign微服務負載均衡

 一、建立工程的時候加入feign和eureka server依賴

程序入口處加入@EnableFeignClients 開啓feign服務
二、配置文件
eureka.client.serviceUrl.defaultZone=http://192.168.1.109:8761/eureka/
spring.application.name=Feign_Service
server.port=8764
三、增長並定義一個接口
@FeignClient(value = "MicroService_A")    //表面調用的是微服務MicroService_A。
public interface SchedualServiceHi {
@RequestMapping(value = "/MicroServiceA",method = RequestMethod.GET)); //URL傳入的對象是 MicroServiceA
}

 

將前面建立的eureka client 啓動兩次,端口爲8762和8763,這兩個client造成了一個最小集羣,經過feign調度,作負載均衡。

輸入 http://192.168.1.109:8764/MicroServiceA 屢次刷新

結果會交替出現 this MicroServiceA port is:8762 、this MicroServiceA port is:8763 表面feign負載均衡策略生效。

 

1.4 建立zuul

一、 main中加入

import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.cloud.netflix.zuul.EnableZuulProxy;
import org.springframework.context.annotation.Bean;
@EnableZuulProxy //申明是一個zuul服務網關
@EnableEurekaClient

 

二、配置文件中加入

eureka.client.serviceUrl.defaultZone=http://192.168.1.109:8761/eureka/   //向eureka server註冊
spring.application.name=zuul_service
server.port=8765
//定義了兩個服務 apia和apib ,對用戶暴露了這兩個服務。
zuul.routes.apia.path=/apia/**
zuul.routes.apia.serviceId=MicroServiceA
zuul.routes.apib.path=/apib/**
zuul.routes.apib.serviceId=Feign_Service

3 、啓動zuul服務,同時確保以前的eureka client 和 fenign都已經啓動並在註冊中心註冊,以下圖:

 

4 、最終用戶訪問 http://192.168.1.109:8765/apia/MicroServiceA ,即首先到服務網關zuul,而後zuul將用戶請求轉到微服務MicroServiceA,而後微服務MicroServiceA返回用戶結果,以下圖:

服務網關沒有作集羣部署,若是作集羣部署,建議前面能夠加上F5或者HAPROXY作負載均衡。

 

2、微服務在Docker容器部署

基礎環境:centos7 、jdk1.8 docker1.12.5(centos7自帶docker,怎麼安裝不說了)、maven3.0 本機IP 192.168.1.110 ,docker 須要啓動。關閉selinux和iptables、

 

2.1 將上面的eureka server容器化

        建立工程,將上面win7 eurekaserver工程整個目錄直接copy到centos /root/下

  其中pom.xml文件參考上面eureka server,惟一不一樣是加入插件docker-maven-plugin和配置以下(有說明),其餘都同樣就不累述了。

<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>0.4.3</version>
<configuration>
<imageName>${docker.image.prefix}/${project.artifactId}</imageName>   //docker image name
<dockerDirectory>src/main/docker</dockerDirectory>                                  //dockerfile path
<resources>
<resource>
<targetPath>/</targetPath>
<directory>${project.build.directory}</directory>
<include>${project.build.finalName}.jar</include>
</resource>
</resources>
</configuration>
</plugin>

 

2.2 構建可執行文件

  • 運行 mvn package ,會生成以下jar包

確認一下是否OK,運行 java -jar docker_eureka_server-0.0.1-SNAPSHOT.jar,在192.168.1.109 的windows 上輸入http://192.168.1.110:8761/ 會顯示出eureka_server的主頁面以下圖,說明構建成功:

 

2.3 docker中運行jar包

一、建立vi src/main/docker/dockerfile內容以下

FROM frolvlad/alpine-oraclejdk8:slim

VOLUME /tmp //docker中建立tmp

ADD eureka-server-0.0.1-SNAPSHOT.jar app.jar

#RUN bash -c 'touch /app.jar'

ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"] //執行app.jar

EXPOSE 8761 //docker服務端口

 

二、運行docker build -t xiong:rureka docker 或者 mvn package docker:build 建立鏡像,以下圖(爲了規範命名,我將前面工程名重建了):

3運行三、容器 docker run -p 8761:8761 0 -d xiong:reruka 將容器的8761端口映射到linux主機的8761端口

四、測試一下 http://192.168.1.100:8761 顯示了eureka server的主頁,表示一個eureka server容器運行成功(實際生產中,建議一個容器中運行一個進程或者說一個微服務)

 

三 、CI

利用jenkins作持續集成,實驗環境仍是上面的centos,jdk1.7 、svn server,關閉iptabls和selinux,IP 192.168.1.110

3.1 首先安裝jenkins,很簡單,增長一個jenkins的YUM源,而後yum -y install jenkins,修改端口爲8080、啓動 service jenkins start,修改成開機自啓動, 訪問 http://192.168.1.110:8080,輸入admin和密碼(因爲我不知道默認密碼,作了密碼重置),顯示以下:

 

3.2 配置svn

一、jenkins中安裝svn相關插件

二、建立版本庫svnadmin create /root/svnrepos

三、配置用戶名密碼權限等,不累述

四、將上一節的 eurekaserver整個工程目錄加入 svn: svn import /root/eurekaserver/ file:///root/svnrepos/eurekaserver/ -m svneureka.out

五、啓動svn svnserve -d -r /root/svn/repos

六、測試一下,在win7上svn客戶端上輸入地址 svn://192.168.1.110,會自動將centos下eurekaserver工程目錄下載到win7中,證實svn OK.

 

3.三、利用jenkins 實現持續集成eurekaserver工程,每次svn提交代碼時就會自動集成和並部署docker微服務。

一、訪問http://192.168.1.110:8080 jenkins主頁新增一個svn的插件,而後新建任務,選擇自由風格,取名爲resukaserver,配置源爲SVN,這裏有一個坑,會報錯unable to access to repository,解決方法可參考

http://blog.csdn.net/benkaoya/article/details/48683269 ,大概思路就是在Jenkins所在服務器訪問一次SVN版本庫並保存身份認證信息。

3.3.1構建中增長svn和 Execute shell內容以下,同時增長自動任務,每次提交代碼時候進行集成和部署:

注意:一、默認是jenkins用戶,因此須要加上環境變量。 二、docker須要root用戶運行。

 

測試一下,jenkins上點擊馬上構建,結果以下:

說明:有個報錯,須要將原來的eurekaservicer kill掉再運行新編譯的,懶得改了。知道就行。

自動構建和部署完成,訪問 http://192.168.1.110:8761 確認微服務啓動成功。

至此,只要程序員在svn中commit了新的代碼,本程序就會自動編譯並運行該微服務並啓動對外提供服務。

 

 

未完待續………

相關文章
相關標籤/搜索