1. 程式人生 > >基於容器微服務的PaaS雲平臺設計(一) 實現容器微服務和持續集成

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

顯示 一次 target 全部 ext neu openshift svn客戶端 enc

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

前言:關於什麽是容器微服務Paas和容器微服務pass的優劣,我找了下這篇不錯可以參考 http://www.sohu.com/a/152360962_198222。本文致力於一步一步構建一個最簡單的基於容器的微服務的Paas雲平臺,先從簡單的核心功能開始,慢慢深入全部主要功能和加入高可用和容錯等非功能設計,爭取做到麻雀雖小,五臟俱全。本連載的總體技術架構路線是微服務、paas平臺和devops,這應該(至少目標)是一個完整的Paas雲平臺解決方案。微服務決定采用spring cloud,平臺架構采用docker、kubernetes、zabbix、ansible、elk、openshift、SDS(沒想好實現到什麽程度,先列著吧),devops采用robot、jenkins等,很多內容我也沒想好想明白,邊寫變做邊補充邊修改吧,回頭補一張總體架構圖更直觀,不足和錯誤之處也請批評。                       

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

一、微服務

采用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相關的運行)

1.1、創建eureka server (前面詳細一點描述,後面的都簡單說明)

技術分享

技術分享

技術分享

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

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 查看

技術分享

可以看到這個時候,還沒有instances,也就是還沒有微服務註冊。

1.2、創建eureka client 並完成註冊(eureka client實現微服務,真實應用中裏面放入程序邏輯和數據庫訪問並對外提供接口)

前面和創建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微服務負載均衡

1、創建工程的時候加入feign和eureka server依賴

程序入口處加入@EnableFeignClients 開啟feign服務
2、配置文件
eureka.client.serviceUrl.defaultZone=http://192.168.1.109:8761/eureka/
spring.application.name=Feign_Service
server.port=8764
3、增加並定義一個接口 
@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

1、 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

2、配置文件中加入

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做負載均衡。

二、微服務在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>
<dockerDirectory>src/main/docker</dockerDirectory>
<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包

1、創建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服務端口

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

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

技術分享

4、測試一下 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

1、jenkins中安裝svn相關插件

2、創建版本庫svnadmin create /root/svnrepos

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

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

5、啟動svn svnserve -d -r /root/svn/repos

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

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

1、訪問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內容如下,同時增加自動任務,每次提交代碼時候進行集成和部署:

技術分享

技術分享

註意:1、默認是jenkins用戶,所以需要加上環境變量。 2、docker需要root用戶運行。

測試一下,jenkins上點擊立刻構建,結果如下:

技術分享

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

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

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

未完待續………

                                                  

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