Consul

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ù),添加如下依賴

consul-provider

對(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è)成功

image

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è)集群。

服務(wù)中心注冊(cè)信息

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ù)中心注冊(cè)信息

訪問(wèn)localhost:2002/hello接口可以看到調(diào)用服務(wù)的相關(guān)信息以及服務(wù)端方法的調(diào)用結(jié)果,由于注入了LoadBalanceCllent,所以這個(gè)請(qǐng)求自帶負(fù)載均衡功能。

執(zhí)行結(jié)果
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容