1. 程式人生 > >Spring Boot總結(九):構建高效能的服務平臺

Spring Boot總結(九):構建高效能的服務平臺

使用Spring Cloud開發的微服務,其獨立而有相對隔離的特性,與Docker的理念有異曲同工之妙,所以使用Docker來發布微服務,能夠發揮其更大的優勢,並且可以非常輕易的構建一個高效能和高可用的服務平臺;

Docker是一個開源的應用容器引擎,可以為應用系統建立一個可移植的獨立自主的容器。容器執行在Linux的作業系統上,相當於一個虛擬機器,但是Docker相比於虛擬機器具有非常明顯的優勢,它不僅啟動很快,而且佔用資源很少,所以非常適合用來發布微服務。Docker將是未來用來發布服務的重要工具,許多雲服務提供商已經提供了對Docker的全力支援;

如果想要將應用釋出在Docker上,首先需要在Docker中建立應用的映象,然後就可以使用Docker命令來執行應用。

9.1 使用Docker

使用Docker可以很方便的建立和管理映象,以及管理已經生成的和正在執行的容器;

【映象】

映象是一種檔案儲存方式,可以把許多檔案做成一個映象,例如一個作業系統做成GHOST映象,用來重灌作業系統,把一個光碟檔案做成一個ISO映象,等等。

【容器】

容器是映象執行的一個例項,執行一個映象,就會生成一個容器。容器生成之後,就可以在容器中管理應用系統了;

Docker 是一個開源工具,它可以讓建立和管理 Linux 容器變得簡單。容器就像是輕量級的虛擬機器,並且可以以毫秒級的速度來啟動或停止。Docker 幫助系統管理員和程式設計師在容器中開發應用程式,並且可以擴充套件到成千上萬的節點。

容器和 VM(虛擬機器)的主要區別是,容器提供了基於程序的隔離,而虛擬機器提供了資源的完全隔離。虛擬機器可能需要一分鐘來啟動,而容器只需要一秒鐘或更短。容器使用宿主作業系統的核心,而虛擬機器使用獨立的核心。

Docker 的侷限性之一是,它只能用在 64 的作業系統上。

1. Docker安裝

在Linux上安裝Docker要求64位系統,並且核心版本在3.10以上。如果使用CentOS,則使用CentOS 7.0可以符合要求;

【檢視Linux的核心版本】

#uname -r

編寫如下內容到docker.repo中,以方便yum能夠找到Docker引擎:

http://blog.csdn.net/yuan_cheerleaders/article/details/51480077

【啟動Docker】

# service docker start

【檢視Docker版本資訊】

# docker -v

2. Docker常用命令

Docker啟動之後,就可以使用Docker來建立和管理映象了,下列指令可以測試執行一個已經存在的映象,它將會生成一個容器並且啟動它,然後執行java -version指令,最後停止執行的容器;

# docker run --name java8 -it java:8 java  -version

執行上面的指令將啟動一個包含Java:8映象的容器,如果本地沒有這個Java:8映象,將會從遠端的映象伺服器中下載一個符合版本號的映象,執行Java的執行列印其資訊,然後退出容器。

現在在系統中,存在一個命令為Java8的映象和一個處於停止狀態的容器。可以使用Docker的一些指令來管理映象和容器。

  1. docker pull [name]            獲取映象(相當於下載)
  2. docker images                  顯示Docker映象列表
  3. docker inspect [映象ID]          獲取映象的詳細資訊
  4. docker search [關鍵詞]            查詢關鍵詞映象列表
  5. docker ps -a                       檢視Docker後臺程序
  6. docker rmi [映象標籤/映象ID]                刪除映象
  7. docker cp [file] [容器ID]:/etc/                  複製檔案到容器指定位置
  8. docker rm [容器ID]                                     刪除容器
  9. docker commit -m "description..." -a "author" [容器ID] [New id]基於已有容器建立新的映象
  10. docker run -it ubuntu /bin/bash                使用映象建立一個容器,並在其中執行bash應用(-t 分配一個偽終端,-i 讓容器標準輸入保持開啟)
  11. docker create -it [映象]            新建一個容器
  12. docker start [容器ID]               執行處於終止狀態的容器
  13. docker run -d ubuntu [命令]             後臺執行容器
  14. docker logs [容器ID]                          檢視容器輸出資訊
  15. docker stop [-t|--time[=10]] [容器ID]              終止容器,預設等待10s
  16. docker kill [容器ID]                                               直接強制終止容器
  17. docker ps -a(檢視所有容器,包括已經停止執行的) -q                                                                 檢視處於終止狀態的容器
  18. docker restart [容器ID]                                       重啟一個容器
  19. docker exec -ti [容器ID] /bin/bash          進入到建立容器中執行互動命令
  20. docker save -o name.tar ubuntu:14.04            存出鏡像到本地為name.tar
  21. docker load --input name.tar                              匯入映象儲存檔案到本地映象庫
  22. docker export [容器ID] > name.tar                  匯出停止或執行中的容器到檔案中去
  23. cat name.tar | sudo docker import - test/ubuntu:v1.0            匯入容器匯出的檔案成為映象

3. 使用Docker釋出服務

首先執行如下命令停掉CentOS 的防火牆:

#systemctl stop firewalld.service   停止firewall

#systemctl disable firewalld.service   禁止firewall開機啟動

首先將各個模組的配置檔案中有localhost的改為安裝了Docker服務的Linux伺服器的IP地址

將整個工程打包,mvn clean package

打包完成之後,可以將jar檔案和各個模組中建立映象的指令碼Dockerfile上傳到安裝有Docker服務的Linux伺服器上。可以在Linux伺服器上為各個模組建立一個目錄,分別存放各個模組的jar和Dockerfile檔案;

Docker是建立映象的一個指令碼檔案,指令碼首先匯入java:8的映象,最後使用Java來執行jar

切換到Dockerfile所在目錄,使用#docker build -t xx . 來建立映象;

使用#docker images可以檢視已經建立和存在的映象;

【執行映象】

該指令設定服務在後臺執行,並將容器的內部埠8888對映到外部埠8888,容器的名字改為config

#docker run --name config -d -p 8888:8888 config

只有在第一次執行服務的時候,才需要使用上面的指令,因為它同時會生成一個容器,所以以後需要執行服務的時候,只要直接啟動容器即可;

【檢視正在執行的容器】

#docker ps

【檢視正在執行的容器中服務的執行情況】

例如:檢視config容器的輸出日誌

#docker logs -f config

【停止容器】

#docker stop 容器名稱

【啟動容器】

#docker start config

對各個模組都單獨容器來進行上面類似的操作;

9.2 建立和管理一個高效能的服務體系

使用Docker釋出服務之後,可以使用其他的一些服務管理工具來構建高效能和高可用的服務平臺。上面建立的映象可以很方便的使用docker-compose來管理;

docker-compose工具是一個Docker容器管理工具集,可以很方便的用來建立和重建容器,執行啟動和停止容器等管理操作,以及檢視整個服務體系的執行情況和輸出日誌等。

使用docker-compose工具,只需要一條指令就能夠啟動整個分散式服務體系;

1. 安裝docker-compose

首先,安裝docker-compose工具,使用下列指令下載已經編譯的docker-compose:

該指令將會下載docker-compose可執行檔案,並儲存在/usr/local/bin中

curl -L https://github.com/docker/compose/releases/download/1.1.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose

賦予任何使用者可執行許可權:

chmod +x /usr/local/bin/docker-compose

【檢視版本號是否安裝成功】

# docker -compose --version

2. docker-compose常用指令

  • build(構建yml中某個服務的映象) 
    如上,web這個服務是依賴於映象build的。在本地 也存在Dockerfile檔案。 
    可以使用docker-compose build來構建服務的映象。
  • ps(檢視已經啟動的服務狀態)
  • kill(停止某個服務)
  • logs(可以檢視某個服務的log)
  • port(列印繫結的public port)
  • pull(pull服務映象)
  • up(啟動yml定義的所有服務)
  • stop(停止yml中定義的所有服務)
  • start(啟動被停止的yml中的所有服務)
  • kill(強行停止yml中定義的所有服務)
  • rm(刪除yml中定義的所有服務)
  • restart(重啟yml中定義的所有服務)
  • scale(擴充套件某個服務的個數,可以向上或向下)
  • migrate-to-labels(這個沒有實際嘗試。根據介紹是將服務從1.2遷移到1.3帶labels的版本。docker之前不支援label)
  • version(檢視compose的版本)

3. 使用docker-compose管理服務

使用docker-compose.yml配置將一些高可用的微服務,通過links連線成為一個整體,這樣就可以通過docker-compose統一管理,並且可以在執行的過程中,動態設定服務的負載均衡例項,從而建立一個高效能的服務平臺:

容器名

         image:  指定映象名稱

         ports:  設定容器的內部和外部埠

         links:用來指定一個服務需要依賴的其他服務列表

【在docker-compose.yml檔案所在位置,執行如下的命令】

建立如模板所設定的容器,一個一個地建立映象的容器,然後啟動相應的服務

#docker-compose up

上面指令只有未建立容器,即第一次執行的時候,才需要這樣執行。當從控制檯中退出的時候,會同時停止已經啟動的服務,除非上面指令加上了-d引數。生成容器之後,就可以使用如下的指令來啟動整個服務體系;

#docker-compose start

在服務執行過程中,如果啟動指令碼中未設定服務的外部視窗,如服務data,可以使用如下的命令指定服務的個數,這個指令將會線上增加一個容器,並將其自動納入負載均衡管理中。

#docker -compose scale data=2

【負載均衡】

負載均衡是Spring Cloud 工具集中一個元件Ribbon的功能,這是一個內建了可拔插、可定製的負載均衡元件,它主要具備如下複雜均衡規則:

  1. 簡單輪詢規則
  2. 加權時間響應規則;
  3. 區域感知輪詢規則;
  4. 隨機規則;

Spring Cloud預設啟用Ribbon的負載均衡功能,也可以在工程的配置中增加如下配置,明確自定啟用Ribbon的功能;

ribbon:

         eureka:

                   enabled:true

使用docker-compose,很容易的建立一個高可用和高效能的服務平臺,它不但容易管理,而且服務啟動速度很快,更加難能可貴的是,它能夠動態調整負載均衡配置,實現服務的線上可拔插功能,並且具有自我修復故障的能力。當然,這些功能和效能優勢與Spring Cloud的支援是分不開的;

圖:微服務高可用服務體系結構圖

9.3 使用Docker的其他負載均衡實施方法

Docker還可以和其他工具配合使用,配置各種負載均衡服務,搭建高效能的服務平臺,例如Docker跟Nginx、Haproxy、Kubernetes等工具配合使用,都能設計出高效能和高可用的負載均衡服務。

1. 使用Nginx與Docker構建負載均衡服務

最簡單的莫過於使用Nginx來作為負載均衡服務,連線分佈於不同機器上的由Docker釋出的服務。如下程式碼是一個非常簡單的Nginx負載均衡配置:

server{

         listene 80;

         server_name 192.168.1.10;

         location  /{

                   proxy_pass  http://blance;

}

}

upstream balance{

         server 192.168.1.11;

         server 192.168.1.12;

}

這個簡單的配置是將Nginx安裝在一臺機器上,對外提供服務,它使用負載均衡的機制,將實際使用的服務分佈於其他兩臺機器上。

2. 阿里雲的負載均衡設計例項

在阿里雲的負載均衡設計中,使用Nginx和Docker配置的一個可以動態擴容的負載均衡的樣例,這也許能夠給我們一些參考和啟示;

如下程式碼使用docker-compose的模板,配置了兩個Nginx和兩個Tomcat,並且每個Tomcat都執行兩個容器。

nginx:

         image:’nginx:lastest’

         labels:

                   aliyun.routing.port_80:’http://ngtomcat’

                   aliyun.scale:’2’

資料參考:

https://yq.aliyun.com/articles/6816#3

9.4 小結

使用Docker的執行速度非常流暢,這是虛擬機器無法比擬的。

使用Docker來發布和管理服務將是未來的發展趨勢,此外,Docker還可以跟其他的複雜均衡工具配合使用,以搭建一個高效能和高可用的服務平臺。

相關推薦

Spring Boot總結構建高效能服務平臺

使用Spring Cloud開發的微服務,其獨立而有相對隔離的特性,與Docker的理念有異曲同工之妙,所以使用Docker來發布微服務,能夠發揮其更大的優勢,並且可以非常輕易的構建一個高效能和高可用的服務平臺; Docker

java基礎學習總結深入理解Java泛型

一、什麼是泛型         “泛型” 意味著編寫的程式碼可以被不同型別的物件所重用。泛型的提出是為了編寫重用性更好的程式碼。泛型的本質是引數化型別,也就是說所操作的資料型別被指定為一個引數。 比如常見的集合類 LinkedList: publi

Spring Boot學習使用@SpringBootTest註解進行單元測試

一、簡介 專案中經常會遇到需要單元測試的情況,那麼SpringBoot如何實現這種需求,使用@SpringBootTest註解可以執行環境,測試後臺程式碼。 二、環境準備 eclipse + maven + Spring Boot 三、程式碼示例 pom.xml

Spring體系總結BeanDefinition

1、BeanDefinition簡介 BeanDefiniton是一個介面,繼承自AttributeAccessor和BeanMetadataElement兩個介面,這兩個介面主要是為了“訪問物件相關屬性”和“獲取元資料相關資訊”。BeanDefinition的主要定義物件

Spring boot入門SpringBoot整合結合AdminLTE(Freemarker),利用generate自動生成程式碼,利用DataTable和PageHelper進行分頁顯示

  關於SpringBoot和PageHelper,前篇部落格已經介紹過Spring boot入門(二):Spring boot整合MySql,Mybatis和PageHelper外掛,前篇部落格大致講述了SpringBoot如何整合Mybatis和Pagehelper,但是沒有做出實際的範例,本篇部落格是連

Spring Boot 入門 自動化配置實現

自動化配置實現 我們在上章編寫入門案例的時候,我們使用的是Spring Mvc 作為我們的表現層框架,但是我們都知道我們要使用Spring Mvc 我們就需要在web.xml檔案中配置Spring Mvc 的前端控制器DispatcherServlet。但是我們

Spring Boot學習Spring Boot日誌管理

講Spring Boot日誌管理前,先看看目前有哪些常用的日誌框架吧。 我們熟悉的應該有:log4j,  log4j2,  logback,  slf4j, 還有不太熟悉的,JUL,  JCL, Jboss-logging... 具體的資料可以百度看一下。 這些日誌

Struts2學習總結資料驗證

在Struts2框架中,可以實現客戶端驗證和伺服器驗證; 伺服器驗證分為兩種方式:   一,程式設計實現驗證      在之前的,已經對ActionSupport進行了瞭解。知道了ActionSupport類實現了Vaildateable介面,但對vaildate()方法的

spring boot學習06Redis 實現資料快取和 Session 共享

前言 前面我們學習了redis的基本使用,我們知道redis最常用的應用場景,就是資料快取和session共享,Spring Boot 針對這兩個場景都做了一些優化,讓我們在實際專案中使用非常的方便。 資料快取 使用 Redis 做為資料快取

機器學習總結梯度消失vanishing gradient與梯度爆炸exploding gradient問題

(1)梯度不穩定問題: 什麼是梯度不穩定問題:深度神經網路中的梯度不穩定性,前面層中的梯度或會消失,或會爆炸。 原因:前面層上的梯度是來自於後面層上梯度的乘乘積。當存在過多的層次時,就出現了內在本質

Spring Boot學習定時任務

一、簡介 專案中經常會遇到使用定時任務的情況,那麼SpringBoot如何實現這種需求呢,還是簡潔到要命。 二、環境準備 eclipse + maven + Spring Boot 三、程式碼示例 pom.xml檔案不用特殊引入依賴包,保持一般初始化就可以,如下

Spring Boot學習mybatis + druid + 多資料來源自動切換

一、簡介 閒言碎語不多說:專案中要用到多資料來源分別管理資料,主資料來源儲存正式資料,從資料來源儲存預載入的資料並完成預校驗。 二、環境準備 eclipse + maven + Spring Boot + mybatis + oracle 三、程式碼改造 pom

linux裝置驅動歸納總結1.platform匯流排的裝置和驅動

linux裝置驅動歸納總結(九):1.platform匯流排的裝置和驅動 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 這一節可

linux裝置驅動歸納總結1.platform裝置驅動

http://blog.chinaunix.net/uid-25014876-id-111745.html 這一節可以理解是第八章的延伸,從這節開始介紹platform裝置驅動。 一、什麼是paltform匯流排 一個現實的linux裝置和驅

Spring boot 總結1---Spring-boot-starter-**依賴包說明

1. spring-boot-starter 是Spring Boot的核心啟動器,包含了自動配置、日誌和YAML。 2. spring-boot-starter-amqp 通過spring-rabbit來支援AMQP協議(Advanced Message Queuing P

Spring Boot學習Spring Boot 與快取

快取,我們應該已經很熟悉了。那麼今天就來學習一下Spring Boot中怎麼使用快取。 1、說起快取,先來了解下JSR107 首先什麼是JSR?         JSR是Java Specification Requests 的縮寫 ,Java規範請求,故名思議提交

Spring boot 入門集成 Shiro 實現登陸認證和權限管理

orm ger eal ehcache hash 業務邏輯 2個 時間 prot 本文是接著上篇博客寫的:Spring boot 入門(三):SpringBoot 集成結合 AdminLTE(Freemarker),利用 generate 自動生成代碼,利用 DataT

Spring Boot 入門整合Redis哨兵模式,實現Mybatis二級快取

本片文章續《Spring Boot 入門(九):整合Quartz定時任務》。本文主要基於redis實現了mybatis二級快取。較redis快取,mybaits自帶快取存在缺點(自行谷歌)。本文是基於docker安裝redis主從模式。 1.redis安裝 (1)首先安裝redis叢集模式,建立redis目錄

Spring Boot 入門十三整合Hasor的Dataway模組,幹掉後臺,自動配置介面

終於出湖北了,封閉2個月,家裡沒電腦,感覺好久沒自主擼程式碼啊啊啊啊啊啊啊啊啊啊啊啊啊。 連線上篇文章Spring Boot 入門(十二):報表匯出,對比poi、jxl和esayExcel的效率,繼續從入門到入坑。 dataWay剛剛開源,具體介紹可以去官網看https://www.hasor.net/web

從零搭建Spring Boot腳手架2增加通用的功能

![](https://img2020.cnblogs.com/other/1739473/202008/1739473-20200806093905433-1262434332.png) ## 1. 前言 今天開始搭建我們的**kono Spring Boot**腳手架,首先會整合**Spring MV