SpringCloud注冊中心之consul詳細講解使用方法
前言
今天我們開始學習spring cloud的又一個注冊中心consul,前面文章大概也講解了一下各個注冊中心的區(qū)別,今天我們直接開始配置consul到spring cloud。
從Springcloud官網(wǎng)Spring Cloud Consul篇章中我們可以看到官網(wǎng)對于consul的解釋
大致的意思就是Consul提供了自動化配置的方式來使我們快速的綁定Consul到我們的spring環(huán)境及集成到我們的程序,使用一些簡單的注解方式就可以為我們快速的部署大型分布式系統(tǒng),Consul為我們提供服務注冊發(fā)現(xiàn)、分布式配置及控制總線。
繼續(xù)往下查看
Quick start中我們基本了解,與zk一樣的我們需要使用@EnableDiscoveryClient注解來聲明服務發(fā)現(xiàn),配置consul的url和port分別為spring.cloud.consul.host和spring.cloud.consul.port。
A local Consul agent must be running.See the Consul agent documentation on how to run an agent. 官網(wǎng)提示我們需要運行一個consul才能使用,consul的agent分為client及server,對于我們的spring cloud而已,不管是client還是server,都是當作服務注冊中心看待即可。
1、創(chuàng)建服務提供者
我們創(chuàng)建consul的服務提供者provider-consul8001,然后引入我們的maven依賴
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <version>2.6.11</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> <version>2.6.11</version> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-consul-discovery</artifactId> </dependency> </dependencies>
consul會默認使用springboot的actuator來進行健康檢查,所以這里我們引入它的依賴
這里我之前引用錯了依賴spring-boot-actuator,注意正確的依賴應該是spring-boot-starter-actuator
創(chuàng)建我們的配置文件application.yml,并將我們的consul進行配置
server:
port: 8001
spring:
application:
name: provider
cloud:
consul:
host: 10.1.12.13
port: 8500
創(chuàng)建主啟動類ProviderConsul8001Application.class及我們的測試接口文件ProviderController.class
@SpringBootApplication @EnableDiscoveryClient public class ProviderConsul8001Application { public static void main(String[] args) { SpringApplication.run(ProviderConsul8001Application.class,args); } }
@RestController public class ProviderController { @Value("${server.port}") private String port; @GetMapping("/consul/provider/getPort") public String getPort(){ return "你請求的生產(chǎn)者的端口號為:" + port; } }
2、創(chuàng)建服務消費者
接下來我們創(chuàng)建消費者的子工程consumer-consul8002,與生產(chǎn)者一樣我們引入maven依賴
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <version>2.6.11</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> <version>2.6.11</version> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-consul-discovery</artifactId> </dependency> </dependencies>
創(chuàng)建配置文件application.yml,并進行配置
server:
port: 8002
spring:
application:
name: consumer
cloud:
consul:
port: 8500
host: 10.1.12.13
創(chuàng)建主啟動類,消費接口類,負載Ribbon的配置文件
@SpringBootApplication @EnableDiscoveryClient public class ConsumerConsul8002Application { public static void main(String[] args) { SpringApplication.run(ConsumerConsul8002Application.class,args); } }
@RestController @RequestMapping("/consumer") public class ConsumerController { @Autowired private RestTemplate loadBalancedRestTemplate; @GetMapping("/getProviderPort") public String getProviderPort(){ return loadBalancedRestTemplate.getForObject("http://provider/consul/provider/getPort",String.class); } }
@Configuration public class RibbonConfig { @Bean @LoadBalanced public RestTemplate loadBalancedRestTemplate(){ return new RestTemplate(); } }
3、測試
啟動我們的生產(chǎn)者和消費者,登錄10.1.12.13:8500進行查看是否成功注冊到我們的consul服務中。
我們發(fā)現(xiàn)服務已經(jīng)成功注入,但是出現(xiàn)了一個紅色的叉,提示At least one health check on one instance is failing。是因為我們沒有配置服務注冊到consul的地址和心跳等配置這里我們加上相應的配置之后再啟動服務。
spring:
application:
name: provider
cloud:
consul:
host: 10.1.12.13
port: 8500
discovery:
#hostname: localhost 此配置是服務注冊到consul的ip地址,因為服務部署有時候是沒有辦法確定的,所以盡量不要使用
#這里是將服務運行的ip作為注冊ip注冊到consul,consul在進行健康檢查的時候會使用,替代掉consul.discovery.hostname
prefer-ip-address: true
#service-name: ${spring.application.name} 這個是服務注冊到consul的實例名稱,部署集群的時候會出現(xiàn)相同實例名稱會被頂替
#替換service-name來進行實例名稱注入,使用名稱加ip來識別唯一性,進行集群部署防止同名頂替
instance-id: ${spring.application.name}:${spring.cloud.client.ip-address}:${server.port}
# 心跳開啟,如果不開啟心跳,注冊到consul會報錯
heartbeat:
enabled: true
consul需要進行健康檢查,所以需要服務將自己的ip進行注冊,hostname配置的是死的地址不夠靈活,使用prefer-ip-address來進行動態(tài)配置。
多個實例使用一個名稱的時候,會出現(xiàn)同名頂替,所以使用instance-id來做實例id注冊唯一性可避免,心跳需要手動開啟,不開啟心跳consul無法進行健康檢查會報錯。
重新配置后啟動項目,已經(jīng)正常注冊
這里注冊兩個provider來驗證咱們的集群,上面講到會被頂替的問題,這里同一個服務器啟動多個的時候,最好將端口號也加入來作為唯一健,這樣就不會頂替,上面錯誤那個就是因為頂替了重啟留下來的。
好了,現(xiàn)在我們項目已經(jīng)成功注冊到了consul,我們調(diào)用消費者接口進行驗證http://localhost:8002/consumer/getProviderPort
到此我們使用consul作為注冊中心就完成了。
上面注冊的失效的服務,如果不進行移除,可能會出現(xiàn)請求會轉(zhuǎn)發(fā)到異常的服務上面,因為consul不會自動移除失效的注冊列表,所以這里可以參考官網(wǎng)文檔(Deregister Service)進行手動移除。
到此這篇關(guān)于SpringCloud注冊中心之consul詳細講解使用方法的文章就介紹到這了,更多相關(guān)SpringCloud consul內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- SpringCloud中的Eureka注冊中心詳細解讀
- springcloud本地服務不注冊到注冊中心的解決方案
- SpringCloud zookeeper作為注冊中心使用介紹
- SpringCloud?Eureka服務注冊中心應用入門詳解
- SpringBoot項目改為SpringCloud項目使用nacos作為注冊中心的方法
- Java之SpringCloud nocos注冊中心講解
- 淺析SpringCloud Alibaba-Nacos 作為注冊中心示例代碼
- Springcloud-nacos實現(xiàn)配置和注冊中心的方法
- springcloud實現(xiàn)注冊中心Eureka
- SpringCloud兩種注冊中心的實現(xiàn)
相關(guān)文章
解決springboot?部署到?weblogic?中?jar?包沖突的問題
這篇文章主要介紹了springboot?部署到?weblogic?中?jar?包沖突,weblogic?也有是解決方案的,可以通過新增并配置?weblogic.xml?文件來定義哪些類需要優(yōu)先從項目工程包的?jar?包中加載,本文給大家分享解決方法,需要的朋友可以參考下2022-08-08mybatis根據(jù)表逆向自動化生成代碼的實現(xiàn)
若采用mybatis框架,數(shù)據(jù)庫新建表,手動編寫的話,需要編寫大量的實體類、mapper文件、mapper.xml文件,都是一些重復且有規(guī)律的工作。我們可以引用插件,然后做配置,自動生成這些文件,本文就來詳細的介紹一下2021-08-08spring?boot如何通過自定義注解和AOP攔截指定的請求
這篇文章主要介紹了spring?boot通過自定義注解和AOP攔截指定的請求,本文主要通過切面類和自定注解的方式,攔截指定的接口(代碼中已經(jīng)作了詳細的說明),需要的朋友可以參考下2024-06-06@RefreshScope在Quartz 觸發(fā)器類導致異常問題解決分析
這篇文章主要為大家介紹了@RefreshScope在Quartz 觸發(fā)器類導致異常問題解決分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-02-02Springboot文件上傳出現(xiàn)找不到指定系統(tǒng)路徑的解決
這篇文章主要介紹了Springboot文件上傳出現(xiàn)找不到指定系統(tǒng)路徑的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-08-08