Spring Cloud中,大部分組件都有備選訪問(wèn),如注冊(cè)中心,除了常見(jiàn)的Eureka外,還有另一個(gè)常用的方案就是Consul。Consul是HashiCrop公司推出的開(kāi)源產(chǎn)品。主要提供:服務(wù)發(fā)現(xiàn)、服務(wù)隔離、服務(wù)配置等功能。
相比Eureka和zookeeper,Consul的配置更加簡(jiǎn)單,其中內(nèi)置了許多微服務(wù)常用的需求:服務(wù)發(fā)現(xiàn)與注冊(cè)、分布式一致性協(xié)議實(shí)現(xiàn)、健康檢查、鍵值對(duì)存儲(chǔ)、多數(shù)據(jù)中心等。不需要再安裝其他第三方來(lái)實(shí)現(xiàn)這些功能。
安裝
Consul是基于Go語(yǔ)言開(kāi)發(fā)的注冊(cè)中心,要使用Consul需要現(xiàn)在官網(wǎng)上下載安裝軟件。
官網(wǎng)地址:https://www.consul.io/
下載壓縮包,解壓后將consul添加到環(huán)境變量,在cmd中輸入命令
consul agent -dev
即可開(kāi)啟服務(wù),開(kāi)啟后訪問(wèn)localhost:8500就可以進(jìn)入consul的后臺(tái)管理界面
Consul使用
單節(jié)點(diǎn)服務(wù)注冊(cè)
創(chuàng)建一個(gè)provider服務(wù),添加如下依賴
對(duì)consul服務(wù)進(jìn)行配置
#服務(wù)名稱
spring.application.name=consul-provider
#服務(wù)端口號(hào)
server.port=2000
#注冊(cè)中心地址
spring.cloud.consul.host=localhost
#consul端口
spring.cloud.consul.port=8500
#consul服務(wù)名稱
spring.cloud.consul.discovery.service-name=consul-provider
之后在啟動(dòng)類上添加@EnableDiscoveryClient注解,開(kāi)啟服務(wù)發(fā)現(xiàn)
添加一個(gè)簡(jiǎn)單的測(cè)試接口
@RestController
public class HelloController {
@GetMapping("/hello")
public String hello(){
return "hello consul";
}
}
啟動(dòng)服務(wù),在consul后臺(tái)管理界面可以看到服務(wù)注冊(cè)成功
consul集群注冊(cè)
簡(jiǎn)單修改測(cè)試接口,使接口能返回服務(wù)端口號(hào)
@RestController
public class HelloController {
@Value("${server.port}")
Integer port;
@GetMapping("/hello")
public String hello(){
return "hello consul>>>"+port;
}
}
修改完成后打包項(xiàng)目,在Terminal啟動(dòng)兩個(gè)項(xiàng)目實(shí)例,分別運(yùn)行在2000端口和2001端口,再進(jìn)入consul控制臺(tái)查看,可以看到兩個(gè)服務(wù)都被注冊(cè)到了consul上,這兩個(gè)服務(wù)就是一個(gè)集群。
consul服務(wù)消費(fèi)
項(xiàng)目創(chuàng)建方法和provider服務(wù)一樣,創(chuàng)建spring boot項(xiàng)目選擇Web、Consul Discovery和Spring Boot Actuator三個(gè)依賴,并添加相關(guān)配置。
注意:避免端口重復(fù)
在啟動(dòng)類中開(kāi)啟服務(wù)發(fā)現(xiàn),并創(chuàng)建一個(gè)RestTemplate的實(shí)例
@SpringBootApplication
@EnableDiscoveryClient
public class ConsulConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(ConsulConsumerApplication.class, args);
}
@Bean
RestTemplate restTemplate(){
return new RestTemplate();
}
}
編寫測(cè)試接口調(diào)用服務(wù),注入RestTemplate和LoadBalanceCllent
通過(guò)LoadBalanceCllent實(shí)例獲取要調(diào)用的ServiceInstance,獲取成功后用
RestTemplate調(diào)用
@RestController
public class HelloController {
@Autowired
LoadBalancerClient loadBalancerClient;
@Autowired
RestTemplate restTemplate;
@GetMapping("/hello")
public void hello(){
//獲取服務(wù)信息
ServiceInstance choose = loadBalancerClient.choose("consul-provider");
System.out.println("服務(wù)地址:"+choose.getUri());
System.out.println("服務(wù)名稱:"+choose.getServiceId());
String s = restTemplate.getForObject(choose.getUri()+"/hello", String.class);
System.out.println(s);
}
}
在consul的后臺(tái)可以看到consumer服務(wù)已經(jīng)注冊(cè)到服務(wù)中心
訪問(wèn)localhost:2002/hello接口可以看到調(diào)用服務(wù)的相關(guān)信息以及服務(wù)端方法的調(diào)用結(jié)果,由于注入了LoadBalanceCllent,所以這個(gè)請(qǐng)求自帶負(fù)載均衡功能。