1. 程式人生 > >springcloud+consul 單機與叢集

springcloud+consul 單機與叢集

springcloud+consul 單機與叢集

單機(dev模式)

一.consul的下載與安裝

1.consul官網(本文件包含windows與linux版本)

https://www.consul.io/downloads.html

​ 關於consul版本,其實差異不大,主要在於一些ui上的差距,我這邊用的是1.3版本。

2.下載好後直接解壓,解壓後的資料夾內,只有一個可執行的consul.exe檔案(windows系統版本,Linux系統版本的壓縮包可以在windows環境下解壓,資料夾內僅有一個consul檔案,無法執行)。

3.配置環境變數(便於在cmd視窗直接開啟,不配置的話需要在cmd視窗內進入consul.exe

檔案所在位置),在計算機的環境變數的path中新增consul.exe的位置。

4.在cmd視窗中執行

consul agent -dev

後,consul即為執行狀態可以通過ctrl+c直接退出consul,consul的預設埠位8500

5.訪問

http://localhost:8500

在這裡插入圖片描述

當出現以上狀態時,windows下的consul安裝以及啟動就成功了!

二.springcloud+sonsul的單機測試(IDE:Intellij Idea)

1.建立一個父工程,引入consul測試所需要的所有依賴

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.maxus</groupId> <
artifactId
>
consul-test</artifactId> <packaging>pom</packaging> <version>1.0-SNAPSHOT</version> <modules> <module>consul-test-server1</module> <module>consul-test-client</module> <module>consul-test-zuul</module> </modules> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.0.3.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>1.8</java.version> <spring-cloud.version>Finchley.RELEASE</spring-cloud.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> <!--consul中健康檢查需要用到actuator,不新增會check failing--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-consul-discovery</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>${spring-cloud.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> </project>

2.建立子工程,可以先建立一個作為測試。

3.配置檔案application.yml,有許多文章上面關於配置檔案的說法不一,親測不一定需要bootstrap.yml,只需要在application.yml中關於consul的配置在其他配置前面就不會有問題

spring:
  application:
    name: consul-client
  cloud:
    consul:
      host: localhost
      port: 8500
      discovery:
        service-name: consul-client #註冊在consul上面的名字,在consul的呼叫中,是通過此名字呼叫的
        register-health-check: true #健康檢查,保證服務處於啟動狀態,建議開啟
server:
  port: 8582

4.啟動類

@SpringBootApplication
@EnableDiscoveryClient //此註解為consul註冊配置
public class ConsulClientApplication {
    public static void main(String[] args) {
        SpringApplication.run(ConsulClientApplication.class, args);
    }
}

5.編寫HealthCheckController.java,當配置檔案中存在register-health-check: true時,consul會一直給所註冊的服務傳送/health請求,用以確認服務的存活。

@RestController
public class HealthCheckController {

    @GetMapping("/health")
    public String healthCheck() {
        return "health";
    }

}

6.執行springboot專案後
在這裡插入圖片描述

服務註冊成功

三.微服務的負載均衡

1.consul會對註冊在節點上的微服務做負載均衡,主要實現方式是,相同的微服務,通過更改埠進行再次註冊
在這裡插入圖片描述

在這裡插入圖片描述

這樣在註冊中心就存在兩個相同的servicer-name的微服務了

2.編寫gateway,使用zuul來隱藏這兩個微服務的實際ip,對外路由成同一的訪問方式

1.建立zuul子專案,引入依賴

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>consul-test</artifactId>
        <groupId>com.maxus</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>consul-test-zuul</artifactId>

    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-zuul</artifactId>
        </dependency>
    </dependencies>

</project>

2.配置檔案

spring:
  application:
    name: consul-zuul
  cloud:
    consul:
      host: localhost
      port: 8500
      discovery:
        service-name: consul-zuul
        register-health-check: true
server:
  port: 8583
zuul:
  routes:
    consul-client: /client/** #將`spring.application.name=consul-client`的微服務路由成訪問路徑為/client
hystrix:
  command:
    default:
      execution:
        isolation:
          thread:
            timeoutInMilliseconds: 80000

3.啟動類

@SpringBootApplication
@EnableDiscoveryClient
@EnableZuulProxy
@RefreshScope //此註解為自動重新整理配置檔案,根據需求新增
public class ZuulApplication {
    public static void main(String[] args) {
        SpringApplication.run(ZuulApplication.class, args);
    }
}

4.HealthCheckController類

@RestController
public class HealthCheckController {

    @GetMapping("/health")
    public String healthCheck() {
        return "health";
    }
}

5.啟動zuul
在這裡插入圖片描述

6.修改consul-client服務,新增PrintController

@RestController
public class PrintController {

    @Autowired
    private LoadBalancerClient loadBalancerClient;
    
    @GetMapping("/print")
    public String print() {
        ServiceInstance serviceInstance = loadBalancerClient.choose("consul-client");
        return "this is " + serviceInstance.getUri();
    }
}

7.重啟consul-client服務,通過閘道器訪問

http://localhost:8583/client/print

結果為“this is http://[計算機名稱]:8582”與"this is http://[計算機名稱]:8482"切換,其本質為輪詢,當其中一個服務請求量過大時,consul會暫時隱藏此服務。

叢集 (server模式)[基於centos6.5 linux系統,建議大家實操的時候也使用虛擬機器,至少3臺虛擬機器]

環境:

192.168.206.129

192.168.206.130

192.168.206.131

一.linux系統安裝consul,

1.將下載的對應的 consul壓縮包在windows環境解壓後,將資料夾複製到linux的/usr中,在/usr/consulmkdir data,(所有虛擬機器操作相同)

2.啟動(注意更改對應的ip)

./consul agent -server -ui -bootstrap-expect 3 -data-dir=data -node=node0 -bind=192.168.206.129 -client=0.0.0.0 -datacenter=dc1 &
./consul agent -server -ui -bootstrap-expect 3 -data-dir=data -node=node1 -bind=192.168.206.130 -client=0.0.0.0 -datacenter=dc1 &
./consul agent -server -ui -bootstrap-expect 3 -data-dir=data -node=node2 -bind=192.168.206.131 -client=0.0.0.0 -datacenter=dc1 &

對應的引數,網上資料很詳細,這裡就不解釋了

3.叢集

在192.168.206.129中執行

./consul join 192.168.206.130

在192.168.206.131中執行

./consul join 192.168.206.130

這樣就叢集成功了,檢視叢集

./consul members

在任意一臺虛擬機器中檢視結果都是相同的

./consul info

可以檢視當前node的詳細資訊

四.關於多資料中心

​ 在執行啟動命令時,都有追加-datacenter=dc1,這表明此為dc1資料中心的,若啟動一臺新的虛擬機器,並以-datacenter=dc2啟動,表明此為dc2資料中心,可以將兩個資料中心聯合起來,但是對於資料或者服務而言,沒有影響,這兩個資料中心擁有自己的gossip pool,只是利於使用者管理,如下圖所示,可以切換資料中心進行對應的配置修改
在這裡插入圖片描述

五.關於consul的優點(個人見解,歡迎補充,修正)

​ consul主要就是在一個數據中心中,其kv是相通的,由於流言協議的原因,保證了高度的一致性,可以使用kv來對註冊中心的所有微服務進行統一配置;關於負載均衡方面,通過ngnix對所有的閘道器進行反向代理,實現了閘道器的負載均衡,不論請求最終走的是哪一個閘道器,對於同一個資料中心的微服務而言,都是可以訪問到的,consul會對所有的微服務通過輪詢的方式,實現負載均衡

六.關於叢集的一些操作,推薦一篇文章,很詳細

https://blog.csdn.net/chenchong08/article/details/77885989

​ eureka的閉源,導致許多公司開始研究consul,本人也處於研究階段,歡迎各位大牛對本文進行指正,也歡迎將自己的總結共享,作者郵箱[email protected]