Spring Cloud Consul 實現服務註冊和發現
Spring Cloud 是一個基於 Spring Boot 實現的雲應用開發工具,它為基於 JVM 的雲應用開發中涉及的配置管理、服務發現、斷路器、智慧路由、微代理、控制匯流排、全域性鎖、決策競選、分散式會話和叢集狀態管理等操作提供了一種簡單的開發方式。通過 Spring Boot 風格進行再封裝遮蔽掉了複雜的配置和實現原理,最終給開發者留出了一套簡單易懂、易部署和易維護的分散式系統開發工具包。
Spring Cloud 包含了多個子專案(針對分散式系統中涉及的多個不同開源產品),比如:Spring Cloud Config、Spring Cloud Netflix、Spring Cloud CloudFoundry、Spring Cloud AWS、Spring Cloud Security、Spring Cloud Commons、Spring Cloud Zookeeper、Spring Cloud CLI 等專案。
專案地址:https://github.com/yuezhongxin/spring-cloud-consul-sample
ASP.NET Core 2.0 & Docker & Consul 的實現:https://github.com/yuezhongxin/HelloDocker.Sample
目前的測試站點,使用 ASP.NET Core 結合 Conusl 和 Fabio 搭建的微服務叢集,因為各服務之間的通訊基於 HTTP REST 協議,所以服務的實現可以跨語言,下面我們就開發一個 Spring Boot 服務,然後使用 Spring Cloud Consul 將服務註冊到已有的叢集中。
Java 開發工具我選用的 IntelliJ IDEA(MacOS 安裝教程),目前使用很好(Color Scheme 使用系統的 Darcula,字型大小 14),Java SDK 需要額外下載安裝(我安裝的版本 10)。
因為第一次使用 IntelliJ IDEA,下面我把建立專案的過程,貼詳細一點。
首先,建立專案(選擇“Spring Initializr”,Spring Boot 專案),預設選擇 Java SDK 10:
然後填寫專案的基本資訊(Artifact 為"spring-cloud-consul-sample",其他為預設):
注:Maven 是一個專案管理和構建工具,包含三個關鍵元件:專案物件模型(POM)、依賴項管理模型、構建生命週期和階段。
Group ID 和 Artifact ID 的區別,如果把 Group ID 看作是公司,那 Artifact ID 就可以看作是公司部門,有點類似於 .NET 中的解決方案和類庫的關係,比如 Spring Cloud 專案的 Group ID 為org.springframework.cloud
,Spring Cloud Consul 的 Artifact ID 為spring-cloud-starter-consul-discovery
。
下面選擇建立 Spring Boot 專案型別(選擇 Web 依賴項):
然後填寫專案名稱和專案目錄:
然後點選“Finish”,就完成啦。
像開發 ASP.NET Core 應用程式一樣,我們需要先引用各種程式包,Spring Boot 專案也是一樣,因為使用 Maven 進行依賴管理,我們需要在pom.xml
中配置依賴關係,配置如下:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.0.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>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</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-actuator</artifactId>
<scope>compile</scope>
</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-consul-dependencies</artifactId>
<version>2.0.0.M7</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
引用spring-cloud-starter-consul-discovery
對應 Spring Cloud Consul,引用spring-boot-starter-actuator
用作健康檢查(地址/actuator/health
),另外 Actuator 還支援專案的監控和管理。
這裡再說下節點的作用:
parent
:父引用配置,會繼承父引用的配置。dependencies
:當前引用配置,如果父引用配置了,子專案會自動引用。dependencyManagement
:當然引用配置,如果父引用配置了,子專案不會自動引用,子專案只要用到的時候引用,不需要配置版本號。
然後再貼一下SpringCloudConsulSampleApplication.java
的程式碼:
package com.example.springcloudconsulsample;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.client.discovery.DiscoveryClient;
@EnableDiscoveryClient
@RestController
@SpringBootApplication
public class SpringCloudConsulSampleApplication {
@Autowired
private DiscoveryClient discoveryClient;
/**
* 獲取所有服務
*/
@RequestMapping("/services")
public Object services() {
return discoveryClient.getServices();
}
@RequestMapping("/home")
public String home() {
return "Hello World";
}
public static void main(String[] args) {
SpringApplication.run(SpringCloudConsulSampleApplication.class, args);
}
}
增加@EnableDiscoveryClient
註解,專案啟動的時候,會註冊當前 Spring Boot 服務。
在使用 ASP.NET Core 註冊服務的時候,配置資訊會填寫在程式碼中(如服務名稱和埠等,當然也可以在配置檔案),然後使用 Consul 元件註冊服務(呼叫 Consul HTTP REST)。
Spring Cloud Consul 註冊服務的話,需要新增配置檔案(Spring Boot 專案資原始檔在 resources 目錄下)。
application.properties
中新增配置:
spring.application.name=spring-boot-service
然後新增application.yml
配置檔案:
debug: true
server:
port: 24543
spring:
cloud:
consul:
host: 127.0.0.1
port: 8500
discovery:
register: true
hostname: 10.9.10.215
serviceName: ${spring.application.name}
healthCheckPath: /actuator/health
healthCheckInterval: 15s
tags: urlprefix-/${spring.application.name}
instanceId: ${spring.application.name}:${vcap.application.instance_id:${spring.application.instance_id:${random.value}}}
上面配置需要再詳細說明說明下:
debug
配置是否除錯模式,如果打包釋出的話,需要設定為false
。server.port
配置的是 Spring Boot 服務的埠。spring.cloud.consul.host/port
配置的是本地 Consul 的地址和埠(Server 節點和 Client 節點都可以),Spring Cloud Consul 會呼叫 Consul HTTP REST 介面,進行服務註冊。spring.cloud.consul.discovery.true
配置啟動是否註冊服務,spring.cloud.consul.discovery.hostname
配置 Spring Boot 服務的主機地址,也可以不進行配置,預設本機地址。spring.cloud.consul.discovery.serviceName
配置 Consul 註冊的服務名稱,${spring.application.name}
變數是我們上面application.properties
配置檔案中新增的配置。spring.cloud.consul.discovery.healthCheckPath
配置 Consul 健康檢查地址,Actuator 元件幫我們進行了實現,所以我們不需要額外的實現,地址在服務啟動的時候,列印資訊裡面可以看到。spring.cloud.consul.discovery.healthCheckInterval
配置 Consul 健康檢查頻率,也就是心跳頻率。spring.cloud.consul.discovery.tags
配置 Consul 註冊服務的 Tags,設定為urlprefix-/serviceName
的格式,是自動註冊到 Fabio 叢集中。spring.cloud.consul.discovery.instanceId
配置 Consul 註冊服務 ID。
上面的工作做完之後,我們還需要在本地啟動 Consul 和 Fabio,參考:Mac OS、Ubuntu 安裝及使用 Consul
然後我們就可以直接使用 IntelliJ IDEA 除錯專案了,按Shift + F9
進行除錯。
上面說到 Actuator 的列印資訊:
2018-03-28 10:09:54.645 INFO 63482 --- [ main] s.b.a.e.w.s.WebMvcEndpointHandlerMapping : Mapped "{[/actuator/health],methods=[GET],produces=[application/vnd.spring-boot.actuator.v2+json || application/json]}" onto public java.lang.Object org.springframework.boot.actuate.endpoint.web.servlet.AbstractWebMvcEndpointHandlerMapping$OperationHandler.handle(javax.servlet.http.HttpServletRequest,java.util.Map<java.lang.String, java.lang.String>)
2018-03-28 10:09:54.646 INFO 63482 --- [ main] s.b.a.e.w.s.WebMvcEndpointHandlerMapping : Mapped "{[/actuator/info],methods=[GET],produces=[application/vnd.spring-boot.actuator.v2+json || application/json]}" onto public java.lang.Object org.springframework.boot.actuate.endpoint.web.servlet.AbstractWebMvcEndpointHandlerMapping$OperationHandler.handle(javax.servlet.http.HttpServletRequest,java.util.Map<java.lang.String, java.lang.String>)
2018-03-28 10:09:54.647 INFO 63482 --- [ main] s.b.a.e.w.s.WebMvcEndpointHandlerMapping : Mapped "{[/actuator],methods=[GET],produces=[application/vnd.spring-boot.actuator.v2+json || application/json]}" onto protected java.util.Map<java.lang.String, java.util.Map<java.lang.String, org.springframework.boot.actuate.endpoint.web.Link>> org.springframework.boot.actuate.endpoint.web.servlet.WebMvcEndpointHandlerMapping.links(javax.servlet.http.HttpServletRequest,javax.servlet.http.HttpServletResponse)
或者我們也可以使用 Maven 打包釋出,然後使用命令啟動服務。使用 IntelliJ IDEA 中的 Maven 進行打包,或者使用 Maven 命令打包都可以,這邊我們使用Maven 命令進行打包。
在我們安裝 IntelliJ IDEA 的時候,Maven 自動安裝了,但直接敲mvn -v
會發現命令找不到,需要我們配置一下環境變數。
我自己的 Maven 檔案目錄是/Applications/IntelliJ IDEA.app/Contents/plugins/maven/lib/maven3
,可以在 IntelliJ IDEA 的配置設定中找到,然後我們執行下面的命令:
$ chmod a+x "/Applications/IntelliJ IDEA.app/Contents/plugins/maven/lib/maven3/bin/mvn"
$ sudo chmod 777 /etc/profile
$ vi /etc/profile
# set maven path
export M2_HOME="/Applications/IntelliJ IDEA.app/Contents/plugins/maven/lib/maven3"
export PATH=$PATH:$M2_HOME/bin
$ source /etc/profile
然後檢查下 Maven 命令是否生效:
$ mvn -v
Apache Maven 3.3.9 (bb52d8502b132ec0a5a3f4c09453c07478323dc5; 2015-11-11T00:41:47+08:00)
Maven home: /Applications/IntelliJ IDEA.app/Contents/plugins/maven/lib/maven3
Java version: 10, vendor: Oracle Corporation
Java home: /Library/Java/JavaVirtualMachines/jdk-10.jdk/Contents/Home
Default locale: zh_CN_#Hans, platform encoding: UTF-8
OS name: "mac os x", version: "10.13.2", arch: "x86_64", family: "mac"
然後我們修改application.yml
中的debug:false
,使用 Maven 進行打包(目錄切換到pom.xml
平級):
$ mvn clean package -Dmaven.test.skip=true
[INFO] Scanning for projects...
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Building spring-cloud-consul-sample 0.0.1-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] --- maven-clean-plugin:3.0.0:clean (default-clean) @ spring-cloud-consul-sample ---
[INFO] Deleting /Users/xishuai/Documents/專案檔案/測試專案/spring-cloud-consul-sample/target
[INFO]
[INFO] --- maven-resources-plugin:3.0.1:resources (default-resources) @ spring-cloud-consul-sample ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] Copying 2 resources
[INFO] Copying 0 resource
[INFO]
[INFO] --- maven-compiler-plugin:3.7.0:compile (default-compile) @ spring-cloud-consul-sample ---
[INFO] Changes detected - recompiling the module!
[INFO] Compiling 1 source file to /Users/xishuai/Documents/專案檔案/測試專案/spring-cloud-consul-sample/target/classes
[INFO]
[INFO] --- maven-resources-plugin:3.0.1:testResources (default-testResources) @ spring-cloud-consul-sample ---
[INFO] Not copying test resources
[INFO]
[INFO] --- maven-compiler-plugin:3.7.0:testCompile (default-testCompile) @ spring-cloud-consul-sample ---
[INFO] Not compiling test sources
[INFO]
[INFO] --- maven-surefire-plugin:2.20.1:test (default-test) @ spring-cloud-consul-sample ---
[INFO] Tests are skipped.
[INFO]
[INFO] --- maven-jar-plugin:3.0.2:jar (default-jar) @ spring-cloud-consul-sample ---
[INFO] Building jar: /Users/xishuai/Documents/專案檔案/測試專案/spring-cloud-consul-sample/target/spring-cloud-consul-sample-0.0.1-SNAPSHOT.jar
[INFO]
[INFO] --- spring-boot-maven-plugin:2.0.0.RELEASE:repackage (default) @ spring-cloud-consul-sample ---
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 3.815 s
[INFO] Finished at: 2018-03-28T10:26:46+08:00
[INFO] Final Memory: 30M/114M
[INFO] ------------------------------------------------------------------------
生成的 jar 程式包,會在 target 目錄下,檔案為spring-cloud-consul-sample-0.0.1-SNAPSHOT.jar
(格式為專案名 + 版本號
),然後我們可以直接啟動服務了:
$ java -jar target/spring-cloud-consul-sample-0.0.1-SNAPSHOT.jar
2018-03-28 10:33:31.750 INFO 63875 --- [ main] s.c.a.AnnotationConfigApplicationContext : Refreshing org.spring[email protected]2b662a77: startup date [Wed Mar 28 10:33:31 CST 2018]; root of context hierarchy
WARNING: An illegal reflective access operation has occurred
WARNING: Illegal reflective access by org.springframework.cglib.core.ReflectUtils$1 (jar:file:/Users/xishuai/Documents/專案檔案/測試專案/spring-cloud-consul-sample/target/spring-cloud-consul-sample-0.0.1-SNAPSHOT.jar!/BOOT-INF/lib/spring-core-5.0.4.RELEASE.jar!/) to method java.lang.ClassLoader.defineClass(java.lang.String,byte[],int,int,java.security.ProtectionDomain)
WARNING: Please consider reporting this to the maintainers of org.springframework.cglib.core.ReflectUtils$1
WARNING: Use --illegal-access=warn to enable warnings of further illegal reflective access operations
WARNING: All illegal access operations will be denied in a future release
2018-03-28 10:33:31.971 INFO 63875 --- [ main] f.a.AutowiredAnnotationBeanPostProcessor : JSR-330 'javax.inject.Inject' annotation found and supported for autowiring
2018-03-28 10:33:32.015 INFO 63875 --- [ main] trationDelegate$BeanPostProcessorChecker : Bean 'configurationPropertiesRebinderAutoConfiguration' of type [org.springframework.cloud.autoconfigure.ConfigurationPropertiesRebinderAutoConfiguration$$EnhancerBySpringCGLIB$$4d45e598] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
. ____ _ __ _ _
/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
\\/ ___)| |_)| | | | | || (_| | ) ) ) )
' |____| .__|_| |_|_| |_\__, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot :: (v2.0.0.RELEASE)
檢視健康檢查是否成功:
檢視 Consul 是否服務註冊成功:
檢視 Fabio 叢集是否包含服務:
服務註冊成功之後,我們可以手動進行發現服務,或者通過 Spring Cloud Ribbon/Feign 元件進行發現,並提供負載均衡功能(類似於 Fabio 功能),後面再研究下。
參考資料:
相關推薦
Spring Cloud Consul 實現服務註冊和發現
Spring Cloud 是一個基於 Spring Boot 實現的雲應用開發工具,它為基於 JVM 的雲應用開發中涉及的配置管理、服務發現、斷路器、智慧路由、微代理、控制匯流排、全域性鎖、決策競選、分散式會話和叢集狀態管理等操作提供了一種簡單的開發方式。通過 Spring Boot 風格進行再封裝遮蔽掉了
《Spring Cloud Netflix》 -- 服務註冊和服務發現-Eureka的常用配置
cti project ica 地址 cat 清理 class ict course 一、版本的說明 Angel版本對應Spring Boot 1.2.x,可以使用Spring Boot 1.3.x; Brixton版本對應Spring Boot 1.3.x,可以使用Spr
《Spring Cloud Netflix》-- 服務註冊和服務發現-Eureka的服務認證和集群
cluster word self. app server 同步 not eat wal 一、 Eureka的服務認證 1、 服務端添加依賴 <dependency> <groupId>org.springframework.boot&
Spring Cloud 一:服務註冊與發現(Eureka)【Dalston版】
什麽是 pom 日誌 操作 prop ng- 通過 決策 target Spring Cloud簡介 Spring Cloud是一個基於Spring Boot實現的雲應用開發工具,它為基於JVM的雲應用開發中涉及的配置管理、服務發現、斷路器、智能路由、微代理、控制總線、全局
Spring Cloud(一):服務註冊與發現
足夠 負載 方案 opener 屏蔽 腳手架 更新 pin pen Spring Cloud是什麽 Spring Cloud是一系列框架的有序集合。它利用Spring Boot的開發便利性巧妙地簡化了分布式系統基礎設施的開發,如服務發現註冊、配置中心、消息總線、負載均衡、斷
spring cloud 學習之服務註冊及發現(eureka)(一)
首先,spring cloud使用的基礎是spring boot ,建立在能熟悉spring boot的基礎之上。 開發工具使用IDEA ,jdk選用8。 一、搭建eureka註冊中心 1、建立spring boot工程,eureka-server,pom.xm
Spring Cloud入門教程-服務註冊與發現
1.簡介 和Consul、Zookeeper類似,Eureka是一個用於服務註冊hefa和發現元件,分為Eureka Server 服務註冊中心和Eureka Client 客戶端。 服務消費基本過
服務註冊發現Eureka之一:Spring Cloud Eureka的服務註冊與發現
Spring Cloud簡介 Spring Cloud是一個基於Spring Boot實現的雲應用開發工具,它為基於JVM的雲應用開發中的配置管理、服務發現、斷路器、智慧路由、微代理、控制匯流排、全域性鎖、決策競選、分散式會話和叢集狀態管理等操作提供了一種簡單的開發方式。
spring cloud gateway之服務註冊與發現
轉載請標明出處: www.fangzhipeng.com 本文出自方誌朋的部落格 在之前的文章介紹了Spring Cloud Gateway的Predict(斷言)、Filter(過濾器),大家對Spring Cloud Gateway有初步的認識,其中在對服務路由轉發的這一塊,在之前的文章是採用
Spring Cloud Hystrix實現服務短路和服務降級
Spring Cloud Hystrix實現服務短路和服務降級 個人部落格 之前文章 Spring Cloud 服務註冊和發現 Spring Cloud 服務端高可用 Spring Cloud Ribbon實現負載均衡 背景 在微服務架構中,我們將系統拆分成了一個個的服務單元
.netcore consul實現服務註冊與發現-集群完整版
template 項目 通過 nts 執行 官方 測試 als zook 原文:.netcore consul實現服務註冊與發現-集群完整版 一、Consul的集群介紹 ?
springcloud consul +consul 實現服務註冊及發現
要想利用consul提供的服務實現服務的註冊與發現,我們需要建立consul cluster。在consul方案中,每個提供服務的節點上都要部署和執行consul的agent,所有執行consul agent節點的集合構成consul cluster。 consul a
Spring Cloud 的Eureka服務註冊與發現
Eureka 雲端服務發現,一個基於 REST 的服務,用於定位服務,以實現雲端中間層服務發現和故障轉移。引用[Spring Cloud中文網] 在Spring Cloud中使用Eureka來進行服務註冊與發現,通過Eureka管理各個微服務(感覺類似Zookeeper),
spring cloud(第二部)服務註冊與發現
eureka註冊中心的使用 1、啟動eureka server 1.1、引入pom,本示例使用的spring.cloud版本
Consul初探-服務註冊和發現
前言 經過上一篇的學習,現在已經來到了服務註冊發現環節;Consul 的核心功能就是服務註冊和發現,Consul 客戶端通過將自己註冊到 Consul 伺服器叢集,然後等待呼叫方去發現服務,實現代理轉發到真正的業務系統,還可以基於服務發現做負載均衡,甚至可以在客戶端請求到底服務之前進行攔截,做一些基礎性的工作
Spring Boot + Spring Cloud 實現許可權管理系統 後端篇(十八):服務註冊和發現(Consul)
什麼是 Consul Consul 是 HashiCorp 公司推出的開源工具,用於實現分散式系統的服務發現與配置。與其它分散式服務註冊與發現的方案,Consul 的方案更“一站式”,內建了服務註冊與發現框架、分佈一致性協議實現、健康檢查、Key/Value 儲存、多資料中心方案,不再需要依賴其它工具(比如
使用Spring Cloud Zookeeper實現服務的註冊和發現
Spring Cloud Zookeeper provides Apache Zookeeper integrations for Spring Boot apps through autoconfiguration and binding to the Spring En
spring-cloud微服務之路(三):服務註冊和發現之Eureka、Consul
在上一篇spring-cloud微服務之路(二):Spring Boot 我們介紹瞭如何快速的使用 Spring Boot 搭建一個微服務專案,這一篇我們演示如何分別使用 Spring Cloud Eureka 和 Spring Cloud Consul 完成
SpringBoot + Spring Cloud Consul 服務註冊和發現
![image.png](https://cdn.nlark.com/yuque/0/2020/png/359374/1595433507631-6d8b936d-72dc-4ec2-8148-15ae46e5ee12.png#align=left&display=inline&height=360&marg
Spring Cloud 服務註冊和發現
Spring Cloud 服務註冊和發現 個人部落格 搭建服務註冊中心 匯入maven依賴 <parent> <groupId>org.springframework.boot</groupId> <artifactId&