1.Consul简介

Consul官网:https://www.consul.io/intro

Consul是一套开源的分布式服务发现和配置管理系统,有HashiCorp公司使用Go语言开发,提供了微服务系统中服务治理、配置中心、控制总线等功能。每个功能可以单独使用,也可以一起使用以构建全方位的服务网格,Consul提供了一套完整的服务网格解决方案。

优点:基于raft协议,简洁;支持健康检查,同时支持HTTP和DNS协议,支持跨数据中心的WAN集群,提供了图形化界面;支持跨平台,支持Linux、Mac、Windows。

Consul的功能:

  • 实现服务注册发现,提供了了HTTP和DNS两种发现方式
  • 健康检测,支持多种方式,Http,Tcp,Docker,Shell脚本定制
  • KV存储
  • 支持多数据中心
  • 可视化Web界面

下载地址:https://www.consul.io/downloads

Consul中文使用教程:https://www.springcloud.cc/spring-cloud-consul.html

2.安装并运行Consul

这里还是使用Docker吧,在虚拟机上执行docker pull consul:1.6.1拉取镜像,因为视频教程里用的1.6.1,所以这里保持一致性,下载的1.6.1版本。使用命令docker run -d -p 8500:8500 consul:1.6.1运行Consul。通过浏览器访问http://192.168.0.123:8500就可以看到Consul的Web界面了。

如果是使用的Windows版本,在cmd中,跳到Consul安装目录,通过consul agent -dev即可运行Consul了。

3.服务提供者

新建cloud-providerconsul-payment8006模块,修改pom.xml,这里需要加入spring-cloud-starter-consul-discovery的坐标。

<?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>
    <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-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>

添加application.yml配置文件。

server:
  port: 8006
spring:
  application:
    name: consul-provider-payment # 应用名称
  cloud:
    consul: # consul注册中心地址
      host: 192.168.0.123
      port: 8500
      discovery:
        service-name: ${spring.application.name}
        hostname: 192.168.0.105 # 因为使用的Docker,不加hostname,Health Checks会有一个红叉

编写主启动类和业务类。

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);
    }
}
package com.atguigu.springcloud.controller;

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
public class PaymentController {
    @Value("${server.port}")
    private String serverPort;

    @RequestMapping(value = "/payment/consul")
    public String paymentConsul() {
        return "Spring Cloud With Consul:" + serverPort + "\t" + UUID.randomUUID();
    }
}

启动浏览器访问http://localhost:8006/payment/consul,可以访问到内容。

4.服务消费者

新建cloud-consumerconsul-order80模块,修改pom.xml,添加application.yml,创建主启动类,配置类,业务类。

<?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-order80</artifactId>
    <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-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>
server:
  port: 80
spring:
  application:
    name: cloud-consumer-order # 应用名称
  cloud:
    consul: # consul注册中心地址
      host: 192.168.0.123
      port: 8500
      discovery:
        service-name: ${spring.application.name}
        hostname: 192.168.0.105 # 因为使用的Docker,不加hostname,Health Checks会有一个红叉
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 OrderConsulMain80 {
    public static void main(String[] args) {
        SpringApplication.run(OrderConsulMain80.class, args);
    }
}
package com.atguigu.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 restTemplate() {
        return new RestTemplate();
    }
}
package com.atguigu.springcloud.controller;

import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

import javax.annotation.Resource;

@RestController
@Slf4j
public class OrderConsulController {
    private static final String INVOKE_URL = "http://consul-provider-payment";
    @Resource
    private RestTemplate restTemplate;

    @GetMapping("/consumer/payment/consul")
    public String paymentInfo() {
        return restTemplate.getForObject(INVOKE_URL + "/payment/consul", String.class);
    }
}

启动主启动类,访问http://localhost/consumer/payment/consul可以看到效果,在Consul的Web界面也可以看到注册进来的生产者服务和消费者服务的情况。

5.三个注册中心异同点

学了Eureka、Zookeeper、Consul之后,在基本配置和使用上,是大同小异的。新建模块,修改pom.xml,加入相关依赖,编写application.yml配置文件,指明应用名称,注册中心地址,编写主启动类,编写配置类和业务类,最后是测试。

Eureka、Zookeeper、Consul对比

组件名

语言

CAP

服务健康检查

对外暴露接口

Spring Cloud集成

Eureka

Java

AP

可配支持

HTTP

已集成

Zookeeper

Java

CP

支持

客户端

已集成

Consul

Go

CP

支持

HTTP/DNS

已集成

Spring Cloud笔记-Consul服务注册与发现(七)_maven

CAP理论关注粒度是数据,而不是整体系统设计策略。