Consul 是 HashiCorp 公司推出的開源工具,用於實現分佈式系統的服務發現與配置。與其它分佈式服務註冊與發現的方案,Consul 的方案更「一站式」,內置了服務註冊與發現框架、分佈一致性協議實現、健康檢查、Key/Value 存儲、多數據中心方案,再也不須要依賴其它工具(好比 ZooKeeper 等)。使用起來也較爲簡單。Consul 使用 Go 語言編寫,所以具備自然可移植性(支持Linux、windows和Mac OS X);安裝包僅包含一個可執行文件,方便部署,與 Docker 等輕量級容器可無縫配合。java
官網(consul.io)最新版本1.8.0 提供了MacOS,Windows, Linux, 若是你不知道怎麼安裝,官方還提供了視頻。
我這裏使用docker安裝,安裝過程總結起來爲三句話:
docker search consul
docker pull consul
docker run --name consul -d -p 8600:8500 consul
沒問題的話,本機訪問http://localhost:8600則能夠打開consul自帶的管理系統,默認狀況下沒有服務註冊進來
web
項目結構以下圖
父工程pom.xmlspring
<dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-dependencies</artifactId> <version>2.2.2.RELEASE</version> <type>pom</type> <scope>import</scope> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Hoxton.SR1</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement>
服務註冊中心有了,那麼咱們來開發兩個服務提供者,這裏新建了兩個Module,端口8001和8002。兩個Module代碼相同,主要爲了演示負載使用。
docker
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <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-test</artifactId> </dependency> </dependencies>
server: port: 8001 spring: application: name: consul-student-service cloud: consul: port: 8600 host: 127.0.0.1 discovery: service-name: ${spring.application.name}
這裏我直接寫了一個測試接口放在啓動類裏。這裏我只貼了端口8001的代碼,8002代碼結構相同,只是端口不一樣。windows
@SpringBootApplication @EnableDiscoveryClient @RestController public class ConsulStudentService8001 { public static void main(String[] args) { SpringApplication.run(ConsulStudentService8001.class,args); } @GetMapping("/student/version") public String version(){ return "8001,202007222300"; } }
OK,到這一步,啓動兩個服務,不出異常的狀況下,可在註冊中心查看當前的服務實例。
app
服務註冊中心有了,服務提供者也有了,咱們再來開發一個服務消費者。
負載均衡
<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-test</artifactId> </dependency> </dependencies>
server: port: 8080 spring: application: name: consul-student-consumer cloud: consul: host: 127.0.0.1 port: 8600 discovery: service-name: ${spring.application.name} # 不須要註冊到consul中 register: false
開發RestTemplate配置類,調用REST接口時使用。框架
@Configuration public class ApplicationContextConfig { @Bean @LoadBalanced public RestTemplate restTemplate(){ return new RestTemplate(); } }
修改啓動類分佈式
@SpringBootApplication @EnableDiscoveryClient @RestController public class ConsulStudentConsumer { public static void main(String[] args) { SpringApplication.run(ConsulStudentConsumer.class,args); } @Autowired RestTemplate restTemplate; @GetMapping("/consul/student/version") public String version(){ //這裏使用服務實例名調用REST接口 return restTemplate.getForObject("http://consul-student-service/student/version",String.class); } }
OK, 這一步完成以後,能夠啓動消費者接口,刷新幾回,從返回結果上能看出來是輪訓調用服務提供者接口實例。
spring-boot