<ul id="qxxfc"><fieldset id="qxxfc"><tr id="qxxfc"></tr></fieldset></ul>


      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)用。謝謝大家。

      友情鏈接
      ioDraw流程圖
      API參考文檔
      OK工具箱
      云服務(wù)器優(yōu)惠
      阿里云優(yōu)惠券
      騰訊云優(yōu)惠券
      京東云優(yōu)惠券
      站點(diǎn)信息
      問(wèn)題反饋
      郵箱:[email protected]
      QQ群:637538335
      關(guān)注微信

        <ul id="qxxfc"><fieldset id="qxxfc"><tr id="qxxfc"></tr></fieldset></ul>
          少妇性l交大片免费观看 | 一区二区日韩国产 | 亚洲永久视频 | 国产亚洲精品久 | 三上悠亚禁欲snis986在线 | 久久33| 又粗又长又硬爽死我了视频 | 无码视频一区在线观看 | 动漫理伦片在线版观看 | 一区二区爱|