1. 程式人生 > 其它 >服務註冊中心-Consul

服務註冊中心-Consul

Consul官方文件

​ 官方文件:https://www.consul.io/docs/intro

​ 中文文件:https://www.springcloud.cc/spring-cloud-consul.html

Consul簡介

​ Consul是一套開源的分散式服務發現和配置管理系統,由HashiCorp公司用Go語言開發。

​ 提供了微服務系統中的服務治理、配置中心、控制匯流排等功能。這些功能中的每一個都可以根據需要單獨使用,也可以一起使用以構建全方位的服務網格,總之Consul提供了一種完整的服務網格解決方案。

​ 它具有很多優點。包括:基於raft協議,比較簡潔;支援健康檢查,同時支援HTTP和DNS協議;支援跨資料中心的WAN叢集;提供圖形介面;跨平臺,支援Linux、Mac、Windows。

Consul主要特點

Consul 的主要特點是:

  • 服務發現:Consul 的客戶端可以註冊一個服務,例如 apimysql,其他客戶端可以使用 Consul 來發現給定服務的提供者。使用 DNS 或 HTTP,應用程式可以輕鬆找到它們所依賴的服務。
  • 健康檢查:Consul 客戶端可以提供任意數量的健康檢查,要麼與給定的服務相關聯(“網路伺服器是否返回 200 OK”),要麼與本地節點(“記憶體利用率是否低於 90%”)相關聯。操作員可以使用此資訊來監控叢集健康狀況,並且服務發現元件可以使用它來將流量路由到不健康的主機之外。
  • KV 儲存:應用程式可以將 Consul 的分層鍵/值儲存用於多種目的,包括動態配置、功能標記、協調、領導選舉等。簡單的 HTTP API 使其易於使用。
  • 安全服務通訊:Consul 可以為服務生成和分發 TLS 證書,以建立相互的 TLS 連線。 意圖 可用於定義允許哪些服務進行通訊。可以通過實時更改意圖輕鬆管理服務分段,而不是使用複雜的網路拓撲和靜態防火牆規則。
  • 多資料中心:Consul 支援開箱即用的多個數據中心。這意味著 Consul 的使用者不必擔心構建額外的抽象層以擴充套件到多個區域。

Consul 旨在對 DevOps 社群和應用程式開發人員友好,使其非常適合現代、彈性的基礎設施。

Consul下載

https://www.consul.io/downloads.html

安裝並執行Consul

  1. 下載完成後只有一個consul.exe檔案,使用開發模式啟動 consul agent -dev。
  2. 通過http://localhost:8500地址訪問Consul的首頁。
  3. 結果頁面

Springcloud中Consul的使用

服務提供者

  • 新建Module支付服務cloud-providerconsul-payment8006模組

  • POM檔案

    <!--?xml version="1.0" encoding="UTF-8"?-->
    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemalocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <parent>
            <artifactid>cloud2020</artifactid>
            <groupid>com.atguigu.springcloud</groupid>
            <version>1.0-SNAPSHOT</version>
        </parent>
        <modelversion>4.0.0</modelversion>
    
        <artifactid>cloud-providerconsul-payment8006</artifactid>
        <description>支付服務的提供者之註冊中心consul</description>
    
        <dependencies>
            <!--SpringCloud consul-server-->
            <dependency>
                <groupid>org.springframework.cloud</groupid>
                <artifactid>spring-cloud-starter-consul-discovery</artifactid>
            </dependency>
            <dependency>
                <groupid>com.atguigu.springcloud</groupid>
                <artifactid>cloud-api-common</artifactid>
                <version>${project.version}</version>
            </dependency>
            <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.boot</groupid>
                <artifactid>spring-boot-devtools</artifactid>
                <scope>runtime</scope>
                <optional>true</optional>
            </dependency>
            <dependency>
                <groupid>org.projectlombok</groupid>
                <artifactid>lombok</artifactid>
                <optional>true</optional>
            </dependency>
            <dependency>
                <groupid>org.springframework.boot</groupid>
                <artifactid>spring-boot-starter-test</artifactid>
                <scope>test</scope>
            </dependency>
        </dependencies>
    </project>
    
  • YML檔案
    application.yml

    server:
      # consul服務埠
      port: 8006
    spring:
      application:
        name: cloud-provider-payment
      cloud:
        consul:
          # consul註冊中心地址
          host: localhost
          port: 8500
          discovery:
            hostname: 127.0.0.1
            service-name: ${spring.application.name}
    
  • 主啟動類

    package com.atguigu.springcloud;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
    
    @SpringBootApplication
    @EnableDiscoveryClient
    public class PaymentMain8006 {
        public static void main(String[] args) {
            SpringApplication.run(PaymentMain8006.class, args);
        }
    }
     
    
  • 業務類Controller

package com.atguigu.springcloud.controller;

import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.UUID;


@RestController
@Slf4j
public class PaymentController {
    @Value("${server.port}")
    private String serverPort;

    @RequestMapping(value = "payment/consul")
    public String paymentConsul() {
        return "SpringCloud with consul:" + serverPort + "\t" + UUID.randomUUID().toString();
    }
}
 
 

  • 驗證執行
    啟動PaymentMain8006啟動類,訪問Consul首頁http://localhost:8500檢視是否載入到consul控制中心。

​ 訪問網址http://localhost:8006/payment/consul 檢視是否顯示資訊。

服務消費者

  • 新建Module消費服務cloud-consumerconsul-order80

    步驟同上

  • POM檔案

    application.xml

    <!--?xml version="1.0" encoding="UTF-8"?-->
    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemalocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <parent>
            <artifactid>cloud2020</artifactid>
            <groupid>com.atguigu.springcloud</groupid>
            <version>1.0-SNAPSHOT</version>
        </parent>
        <modelversion>4.0.0</modelversion>
    
        <artifactid>cloud-consumerconsul-payment80</artifactid>
        <description>服務消費者之註冊中心consul</description>
    
        <dependencies>
            <!--SpringCloud consul-server-->
            <dependency>
                <groupid>org.springframework.cloud</groupid>
                <artifactid>spring-cloud-starter-consul-discovery</artifactid>
            </dependency>
            <dependency>
                <groupid>com.atguigu.springcloud</groupid>
                <artifactid>cloud-api-common</artifactid>
                <version>${project.version}</version>
            </dependency>
            <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.boot</groupid>
                <artifactid>spring-boot-devtools</artifactid>
                <scope>runtime</scope>
                <optional>true</optional>
            </dependency>
            <dependency>
                <groupid>org.projectlombok</groupid>
                <artifactid>lombok</artifactid>
                <optional>true</optional>
            </dependency>
            <dependency>
                <groupid>org.springframework.boot</groupid>
                <artifactid>spring-boot-starter-test</artifactid>
                <scope>test</scope>
            </dependency>
        </dependencies>
    </project>
     
    
  • YML檔案

    server:
      port: 80
    spring:
      application:
        name: cloud-consumer-order
      cloud:
        consul:
          # consul註冊中心地址
          host: localhost
          port: 8500
          discovery:
            hostname: 127.0.0.1
            service-name: ${spring.application.name}
    
    
  • 主啟動類

    package com.atguigu.springcloud;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
    
    /**
     * @author zzyy
     * @date 2020/02/18 17:20
     **/
    @SpringBootApplication
    @EnableDiscoveryClient
    public class OrderConsulMain80 {
        public static void main(String[] args) {
            SpringApplication.run(OrderConsulMain80.class, args);
        }
    }
    
  • 配置bean

    package com.whpu.springcloud.config;
    import org.springframework.cloud.client.loadbalancer.LoadBalanced;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.web.client.RestTemplate;
    
    @Configuration
    public class ApplicationContextConfig {
        @Bean
        @LoadBalanced
        public RestTemplate getRestTemplate(){
            return new RestTemplate();
        }
    }
     
    
  • Controller

    package com.whpu.springcloud.controller;
    
    import com.whpu.springcloud.entities.CommonResult;
    import com.whpu.springcloud.entities.Payment;
    import lombok.extern.slf4j.Slf4j;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.PathVariable;
    import org.springframework.web.bind.annotation.RestController;
    import org.springframework.web.client.RestTemplate;
    
    import javax.annotation.Resource;
    
    @RestController
    @Slf4j
    public class OrderConsulController {
    
        //public static final String PAYMENT_URL = "http://localhost:8006";
        public static final String INVOKE_URL = "http://cloud-provider-payment";
    
    
        @Resource
        private RestTemplate restTemplate;
    
        @GetMapping(value = "/consumer/payment/consul")
        public String paymentInfo(){
            String result = restTemplate.getForObject(INVOKE_URL+"/payment/consul",String.class);
    
            return result;
        }
    }
    
    
  • 驗證測試

    訪問 http://localhost/consumer/payment/consul