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
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/consul
中mkdir 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]