Consul和Kong的實(shí)踐(一)
這一篇先介紹consul集群,以及consul和應(yīng)用服務(wù)的結(jié)合使用,下一篇是和kong網(wǎng)關(guān)的結(jié)合。
<>
一.Consul的集群安裝
以其中一臺(tái)機(jī)器為例:
* mkdir /usr/local/consul? ?創(chuàng)建consul的安裝目錄
* cd /usr/local/consul
* wget
https://releases.hashicorp.com/consul/1.5.2/consul_1.5.2_linux_amd64.zip
建議大家不要直接使用我給出的下載地址,可以開(kāi)了代理下好了,再將consul壓縮包上傳到服務(wù)器或者虛擬機(jī)。官網(wǎng)下載地址:
https://www.consul.io/downloads.html <https://www.consul.io/downloads.html>?
(我是centos7.X 64位操作系統(tǒng))
* unzip?consul_1.5.2_linux_amd64.zip? ?解壓cconsul壓縮包,如果沒(méi)有unzip命名,先安裝(yum -y
install unzip)consul的壓縮包解壓以后是非常干凈的,只有一個(gè)consul的二進(jìn)制文件。
* cp consul /usr/local/bin? ? 將consul文件復(fù)制到 /usr/local/bin
目錄下面,這樣我們不管在什么目錄下都可以運(yùn)行了。
* consul version? ?老規(guī)矩,版本號(hào)測(cè)試一下。
* 下一步就是開(kāi)啟consul的server服務(wù)了,consul分為server和client兩種節(jié)點(diǎn)。我們現(xiàn)在是先搭建server集群。開(kāi)啟consul
server節(jié)點(diǎn)有兩種方式。
? ? ?1)直接運(yùn)行,控制臺(tái)可查看日志,ctrl+c可直接退出。
? ??consul agent -server -ui -bootstrap-expect=3 -data-dir=/tmp/consul
-node=node1
? ? -client=0.0.0.0 -bind=192.168.0.171 -datacenter=dc1
? ? ?2)? 后臺(tái)運(yùn)行
? ? ??? ?
?nohup?consul?agent?-server?-ui?-bootstrap-expect=3?-data-dir=/tmp/consul?-node=node1?
? ?-client=0.0.0.0?-bind=192.168.0.171
-datacenter=dc1??>/tmp/consul/nohup.out?2>&1?&
<>
? ? 簡(jiǎn)單介紹一下參數(shù)的意思:
? ? ?** -server?: 定義agent運(yùn)行在server模式
? ? ? -ui:開(kāi)啟ui管理
? ? ??-bootstrap-expect?:在一個(gè)datacenter中期望提供的server節(jié)點(diǎn)數(shù)目,當(dāng)該值提供的時(shí)候,consul一直等到達(dá) ?
??到指定sever數(shù)目的時(shí)候才會(huì)引導(dǎo)整個(gè)集群,該標(biāo)記不能和bootstrap共用
? ? ??-client:**consul服務(wù)偵聽(tīng)地址,這個(gè)地址提供HTTP、DNS、RPC等服務(wù),默認(rèn)是127.0.0.1所以不對(duì)外提供服? ???
??? ??務(wù),如果你要對(duì)外提供服務(wù)改成0.0.0.0
? ? ?如果你對(duì)更多配置有興趣,可以移步以下地址:?https://www.consul.io/docs/agent/options.html
<https://www.consul.io/docs/agent/options.html>
* 啟動(dòng)以后我們可以檢查一下端口是否監(jiān)聽(tīng):netstat -tunlp (如果nestat沒(méi)裝,可以執(zhí)行 yum -y install
net-tools)??梢钥吹?300 8301 8302以及8500和8600端口都已經(jīng)監(jiān)聽(tīng)了。
? ? ? 其中8500是ui端口,在我們集群?jiǎn)?dòng)以后,可以用ip:8500/ui 查看,8600是域名解析端口,在我的解決方案里? ? ? ? 面會(huì)使用到。
? 9.?consul members 查看成員,目前只有改節(jié)點(diǎn)。
* 在另外兩臺(tái)虛擬機(jī)或者服務(wù)器上重復(fù)以上操作,第七步命令有一些不同。
? ? ??consul agent -server -ui -bootstrap-expect=3 -data-dir=/tmp/consul
-node=node2 -client=0.0.0.0
-bind=192.168.0.155 -datacenter=dc1 -join 192.168.0.171
consul agent -server -ui -bootstrap-expect=3 -data-dir=/tmp/consul -node=node3
-client=0.0.0.0
-bind=192.168.0.169 -datacenter=dc1 -join 192.168.0.171
* consul members 此刻就可以看到有三個(gè)節(jié)點(diǎn)了
? ? ?
12.consul operator raft list-peers
? ? ?
? ??
? ? 在這里我們可以看到consul集群已經(jīng)啟動(dòng)了,自動(dòng)選舉node2節(jié)點(diǎn),也就是ip為155的這臺(tái)機(jī)器為leader,如果你 ?
??斷開(kāi)了這臺(tái)機(jī)器,集群會(huì)自動(dòng)選舉下一個(gè)leader。
13.現(xiàn)在你可以選擇選擇三臺(tái)機(jī)器的任意一臺(tái)機(jī)器的ip,訪問(wèn)ip:8500,即可以看到ui管理。(請(qǐng)注意關(guān)閉防火墻,或? ? ?
?者打開(kāi)該端口。不然其他機(jī)器上訪問(wèn)不到)
? ? ?
<>
二.Consul的架構(gòu)以及和應(yīng)用程序的結(jié)合
<>
? ? ? ?目前我們的架構(gòu)如圖:
? ?
<>
? ? ? ?我們這篇博客要達(dá)到的目的:
? ??
? ? ? ? ?
? ? ?consul提供的節(jié)點(diǎn)有兩種模式,上面我們已經(jīng)提到了,我們之前搭建的就是server,每個(gè)應(yīng)用程序application到consul
server之間,需要client的交互。你說(shuō)client和application是部署在一臺(tái)機(jī)器上面的,這是官方推薦的架構(gòu),當(dāng)然我們也可以有其他選擇,這里我采用的是這種,比較簡(jiǎn)單。(
client是一個(gè)非常輕量級(jí)的進(jìn)程.用于注冊(cè)服務(wù),運(yùn)行健康檢查和轉(zhuǎn)發(fā)對(duì)server的查詢,client無(wú)狀態(tài))
? ? ?為了做到高可用
,我們application服務(wù)本身就必須是高可用的,如圖所示,比如serviceA(文中application等于service概念)我在三臺(tái)服務(wù)器上都部署了,同時(shí)通過(guò)三個(gè)consul
client注冊(cè)了。這樣,不管是某臺(tái)consul client或者某臺(tái)service掛了,或者某臺(tái)consul
server,都不會(huì)影響到我們的使用,其實(shí)nginx也可以做到類似功能,不過(guò)在服務(wù)注冊(cè)和發(fā)現(xiàn)上面,consul更為靈活。
? ? 簡(jiǎn)單介紹了一下我的設(shè)計(jì),讓我們來(lái)繼續(xù)搭建吧:
? ? 機(jī)器有限,我就不換機(jī)器了,還是在這三臺(tái)服務(wù)器上面去部署了,這次部署consul client 我給你介紹另外一種? ? ? ? ?
方式部署,docker,其實(shí)consul server的部署也可以用docker,這個(gè)選擇自己習(xí)慣的就行。
<>
1.部署client?
? ? ??1)yum install -y docker? 如果機(jī)器已經(jīng)安裝了docker 請(qǐng)直接跳至第四步
? ? ? 2)systemctl start docker
? ? ? 3)systemctl status docker
? ? ? 4)??docker pull consul:1.5.2
? ? ? 5)docker images? 查看鏡像,可以看到已經(jīng)拉到了。
? ? ? 6)docker run --name nodeclient1 -d -p 8501:8500 ?-p 8311:8301 -p
8312:8302 -p 8601:8600? ? ? consul:1.5.2? agent ?-ui -bind=0.0.0.0
-client=0.0.0.0 ?-join 192.168.0.171? ? ? ? ? ? ? ?
? ? ? 7)consul members
? ? ? ? ??
? ? ? ?8)按照架構(gòu)圖里面還需要部署兩臺(tái),這里就不做演示了,按照上述步驟,大家可以自行部署。
?9)部署完了可以在ui界面里面看一下。
<>
2.注冊(cè)services
? ? consul提供http api的方式注冊(cè),如果是.NET
core的程序可以采用這種方式手動(dòng)去寫腳本,或者代碼去注冊(cè)。我這邊是java程序,采用的框架都是springboot,所以引用了springcloud就直接結(jié)合了consul的注冊(cè),我先介紹一下這種。
? ? 1)引用maven包??
<dependency> <groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-consul-all</artifactId>
<version>2.1.1.RELEASE</version> </dependency> <dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
<version>2.1.5.RELEASE</version> </dependency>
? ?2)配置bootstrap.yml配置文件,如果你本來(lái)項(xiàng)目是application.yml可以直接換成bootstrap.yml.
? ? ? ? 核心配置貼個(gè)圖:
? ? ? ?
spring: application: name: operating #Operating cloud: consul: host:
192.168.0.171 port: 8501 discovery: register: true hostname: 192.168.0.159
serviceName: ${spring.application.name} healthCheckPath:
/api/operating/actuator/health healthCheckInterval: 15s tags:
urlprefix-/${spring.application.name} #instanceId:
${spring.application.name}:${spring.cloud.client.ip-address}
? ? ?老規(guī)矩給大家介紹一下配置的意思:
? ? ?host:? ??? ??consul client 的ip。
? ? ?port:? ? ? ? ? ?client 的port 。正常是8500,但是我用docker部署的時(shí)候用了8501映射了容器的8500,。
? ? ?hostname:健康檢查的ip 也就是你當(dāng)前應(yīng)用的ip,其實(shí)和前面host一樣,你把a(bǔ)pplication和consul client部署? ?
? ? ? ? ? ? ? ? ? ? ? ?在同一臺(tái)機(jī)器的時(shí)候,這兩個(gè)地方可以都填127.0.0.1。
? ? ?healthCheckPath:如果你沒(méi)配置context-path,那么就是/actuator/health,我這里配置context-path,
所以? ? ? ? ? ? ? ? ? ? ? ? ?加上來(lái)了。
? ? ?tags:? ? ? ? 后期做版本管理,我會(huì)用起來(lái),現(xiàn)在無(wú)所謂。
? ? ?instanceId: consul 注冊(cè)的時(shí)候默認(rèn)是applicationName+port ,我這里將他重寫了。所以你看到我將它注釋掉? ?
? ? ? ? ? ? ? ? ? ? ? 了。?
3)啟動(dòng)springboot程序。服務(wù)注冊(cè)成功,查看ui管理
<>
三.基于consul集群架構(gòu),調(diào)用服務(wù)
現(xiàn)在我們的服務(wù)已經(jīng)注冊(cè)到了consul上面了,那么針對(duì)目前架構(gòu),我們肯定還有兩個(gè)疑惑。
1.公司服務(wù)器內(nèi)部之間的調(diào)用,比如我們已經(jīng)注冊(cè)了的rpc服務(wù)之間的調(diào)用,當(dāng)然你是Restful也所謂。
2.網(wǎng)關(guān)層面怎么調(diào)用consul。
針對(duì)第一點(diǎn),springcloud是提供部分sdk的,當(dāng)然如果你是.NET
CORE,我不太清楚是否有相關(guān)sdk,沒(méi)有也可以自己寫。我先介紹一下,你如果想實(shí)現(xiàn)自己sdk的思路。
consul任何一個(gè)節(jié)點(diǎn)都提供了
http://192.168.0.155:8500/v1/agent/services
<http://192.168.0.155:8500/v1/agent/services>? ? ? 節(jié)點(diǎn)內(nèi)部所有存活服務(wù)查詢
http://192.168.0.155:8500/v1/ <http://192.168.0.155:8500/v1/agent/services>
catalog/services <http://192.168.0.155:8500/v1/agent/services>? ? 集群內(nèi)部所有存活服務(wù)查詢
http://192.168.0.155:8500/v1/
<http://192.168.0.155:8500/v1/catalog/service/operating>agent
<http://192.168.0.155:8500/v1/agent/services>/service/
<http://192.168.0.155:8500/v1/catalog/service/operating>serviceName?
?節(jié)點(diǎn)內(nèi)部單個(gè)服務(wù)查詢?
http://192.168.0.155:8500/v1/catalog/service/
<http://192.168.0.155:8500/v1/catalog/service/operating>serviceName 集群內(nèi)部單個(gè)服務(wù)查詢
Tip:serviceName替換成你注冊(cè)的名稱
根據(jù)上述consul
api接口我們是可以拿到你注冊(cè)的service實(shí)際ip和content-path,并且還有tags,那么你還可以利用tags進(jìn)行版本控制。
那我們先來(lái)看看,springcloud替我們做了什么?
引用的包,我們已經(jīng)引用了。
直接上代碼:
public class ServerInvoke { @Autowired private LoadBalancerClient
loadBalancer; @Autowired private DiscoveryClient discoveryClient; /** * 獲取所有服務(wù)
* * @return */ private List<ServiceInstance> services(String serverName) {
return discoveryClient.getInstances(serverName); } /** * 從所有服務(wù)中選擇一個(gè)服務(wù)(輪詢) */
private ServiceInstance discover(String serverName) { return
loadBalancer.choose(serverName); } }
很明顯可以發(fā)現(xiàn)我們可以拿到服務(wù)的實(shí)際地址,如果你的服務(wù)是高可用的,會(huì)輪訓(xùn)拿到不同的地址。
<>
針對(duì)服務(wù)以jsonrpc協(xié)議內(nèi)部調(diào)用時(shí)
由于公司之前都是基于jsonrpc在調(diào)用(.NET平臺(tái))為了兼容。我寫了一個(gè)非常簡(jiǎn)單的sdk,傳到了github,如果你公司不是jsonrpc協(xié)議,你可以自己寫一個(gè),思路上面已經(jīng)給了提供,在參考一下我寫的。(草稿版)
https://github.com/xiaoxiaobanxian/discoveryrpcsdk/tree/master
<https://github.com/xiaoxiaobanxian/discoveryrpcsdk/tree/master>
<>
針對(duì)服務(wù)被外部(網(wǎng)關(guān)層調(diào)用)
? ?
?前文已經(jīng)介紹了,consul是8600端口作為域名解析的,并且consul會(huì)為你的服務(wù)提供一個(gè)域名:serviceName.service.consul。所以只需要將你的請(qǐng)求轉(zhuǎn)發(fā)到8600即可,你可以采用serviceName.service.consul/XXX來(lái)訪問(wèn)你的服務(wù),前提是已經(jīng)轉(zhuǎn)發(fā)到了consul的域名解析端口。
? ? 測(cè)試一下?dig @127.0.0.1 -p 8600 Operating.service.consul SRV? (dig命令安裝 yum
install bind-utils)
??
可以看到通過(guò)consul域名解析是沒(méi)有問(wèn)題的。
關(guān)于consul的集群安裝,client安裝和services注冊(cè)我已經(jīng)介紹完了,他們之間的調(diào)用也介紹了。下一篇文章就是介紹如何和kong網(wǎng)關(guān)結(jié)合起來(lái)。即使你不選擇Kong作為你的網(wǎng)關(guān),這篇文章也可以幫你完善你的服務(wù)注冊(cè)和發(fā)現(xiàn),以及調(diào)用。謝謝大家。
熱門工具 換一換
