SpringCloud-Consul-1

构建微服务架构(Consul篇)

B 站视频:https://www.bilibili.com/video/BV18E411x7eT?from=search&seid=13583080742381804215
原 Blog 笔记文档:https://blog.csdn.net/u011863024/article/details/114298270

本篇文章大部分图片用到了参考的 blog 笔记中的图片。
本人代码下载:下载

Consul 简介

Consul 是一个服务网格解决方案,它提供了一个功能齐全的控制平面,具有服务发现、配置和分段功能。这些特性中的每一个都可以根据需要单独使用,也可以一起用于构建全服务网格。Consul 需要一个数据平面,并支持代理和本机集成模型。Consul 与一个简单的内置代理,使一切工作的开箱即用,但也支持第三方代理集成,如 Envoy。

Consul 是一套开源的分布式服务发现和配置管理系统,由 HashiCorp 公司用 Go 语言开发。

提供了微服务系统中的服务治理、配置中心、控制总线等功能。这些功能中的每一个都可以根据需要单独使用,也可以一起使用以构建全方位的服务网格,总之 Consul 提供了一种完整的服务网格解决方案。

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

能干嘛?

服务发现 - 提供 HTTP 和 DNS 两种发现方式。
健康监测 - 支持多种方式,HTTP、TCP、Docker、Shell 脚本定制化
KV存储 - Key、Value 的存储方式
多数据中心 - Consul 支持多数据中心
可视化 Web 界面

1. 安装并运行 Consul

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

1.2. 安装 Consul

Consul 下载下来后解压就一个 exe 可执行文件。

1.3. 在 CMD 运行窗口运行 Consul

1
consul.exe agent -dev

1.4. 运行成功后就可以在 http://localhost:8500

2. 支付微服务注册进Consul

2.1 创建父工程 springcloud2021

2.2 springcloud2021 父工程 pom.xml 代码如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
<?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">
<modelVersion>4.0.0</modelVersion>
<groupId>com.sevattal.springcloud</groupId>
<artifactId>springcloud2021</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>pom</packaging>
<!--子模块继承之后,提供作用:锁定版本+ 子modlue不用写groupId 和 version-->
<!--dependencyManagement 里只声明依赖,并不实现引入,因此子项目需要显示声明需要的依赖-->
<!--统一管理jar包版本-->
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<junit.version>4.12</junit.version>
<log4j.version>1.2.17</log4j.version>
<lombok.version>1.16.18</lombok.version>
<mysql.version>5.1.47</mysql.version>
<druid.version>1.1.16</druid.version>
<mybatis.spring.boot.version>1.3.0</mybatis.spring.boot.version>
<spring.boot.devtools.version>2.3.10.RELEASE</spring.boot.devtools.version>
</properties>
<!--子模块继承之后,提供作用:锁定版本+子module不用groupId和version-->
<dependencyManagement>
<dependencies>
<!--spring boot 2.2.2-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.2.2.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!--spring cloud Hoxton.SR1-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Hoxton.SR1</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!--spring cloud alibaba 2.1.0.RELEASE-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.1.0.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql.version}</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>${druid.version}</version>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>${mybatis.spring.boot.version}</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junit.version}</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<version>${spring.boot.devtools.version}</version>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<fork>true</fork>
<addResources>true</addResources>
</configuration>
</plugin>
</plugins>
</build>
</project>

2.3 新建 Module 支付服务 cloud-provider-payment8006

2.4 cloud-provider-payment8006 项目 pom.xml 文件如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
<?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>springcloud2021</artifactId>
<groupId>com.sevattal.springcloud</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>cloud-provider-payment8006</artifactId>
<dependencies>
<!-- 引入自己定义的api通用包,可以使用Payment支付Entity -->
<dependency>
<groupId>com.sevattal.springcloud</groupId>
<artifactId>cloud-api-commons</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<!--SpringCloud consul-server -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-consul-discovery</artifactId>
</dependency>
<!-- SpringBoot整合Web组件 -->
<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>
<!--日常通用jar包配置-->
<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>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>RELEASE</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>RELEASE</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>

2.5 cloud-provider-payment8006 项目 application.yml 文件如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# consul服务端口号
server:
port: 8006
spring:
application:
name: consul-provider-payment
####consul注册中心地址
cloud:
consul:
host: localhost
port: 8500
discovery:
#hostname: 127.0.0.1
service-name: ${spring.application.name}

2.6 cloud-provider-payment8006 项目 主启动类 如下

1
2
3
4
5
6
7
8
9
10
11
12
package com.sevattal.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);
}
}

2.7 cloud-provider-payment8006 项目 业务类Controller

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
package com.sevattal.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();
}
}

2.8 验证测试

http://localhost:8006/payment/consul

http://localhost:8500 - 会显示 consul-provider-payment

3. 服务消费者注册进Consul

3.1 新建Module消费服务order80 - cloud-consumerconsul-order80

3.2 cloud-consumerconsul-order80 项目 pom.xml 文件如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
<?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>springcloud2021</artifactId>
<groupId>com.sevattal.springcloud</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>cloud-consumerconsul-order80</artifactId>
<dependencies>
<!--SpringCloud consul-server -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-consul-discovery</artifactId>
</dependency>
<!-- SpringBoot整合Web组件 -->
<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>
<!--日常通用jar包配置-->
<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>

3.3 cloud-consumerconsul-order80 项目 application.yml 文件如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# consul服务端口号
server:
port: 80
spring:
application:
name: cloud-consumer-order
## consul注册中心地址
cloud:
consul:
host: localhost
port: 8500
discovery:
#hostname: 127.0.0.1
service-name: ${spring.application.name}

3.4 cloud-consumerconsul-order80 项目 主启动类 文件如下

1
2
3
4
5
6
7
8
9
10
11
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
@SpringBootApplication
@EnableDiscoveryClient //该注解用于向使用consul或者zookeeper作为注册中心时注册服务
public class OrderConsulMain80
{
public static void main(String[] args) {
SpringApplication.run(OrderConsulMain80.class, args);
}
}

3.5 cloud-consumerconsul-order80 项目 配置Bean

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
package com.sevattal.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();
}
}

3.6 cloud-consumerconsul-order80 项目 Controller

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
package com.sevattal.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
{
public static final String INVOKE_URL = "http://consul-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;
}
}

3.7.验证测试

运行 consul,cloud-providerconsul-payment8006,cloud-consumerconsul-order80

http://localhost:8500/ 主页会显示出 consul,cloud-providerconsul-payment8006,cloud-consumerconsul-order80三服务。

8.访问测试地址 - http://localhost/consumer/payment/consul

Contents
  1. 1. 构建微服务架构(Consul篇)
    1. 1.1. Consul 简介
    2. 1.2. 能干嘛?
    3. 1.3. 1. 安装并运行 Consul
      1. 1.3.1. 1.1. 下载地址:https://www.consul.io/downloads
      2. 1.3.2. 1.2. 安装 Consul
      3. 1.3.3. 1.3. 在 CMD 运行窗口运行 Consul
      4. 1.3.4. 1.4. 运行成功后就可以在 http://localhost:8500
    4. 1.4. 2. 支付微服务注册进Consul
      1. 1.4.1. 2.1 创建父工程 springcloud2021
      2. 1.4.2. 2.2 springcloud2021 父工程 pom.xml 代码如下
      3. 1.4.3. 2.3 新建 Module 支付服务 cloud-provider-payment8006
      4. 1.4.4. 2.4 cloud-provider-payment8006 项目 pom.xml 文件如下
      5. 1.4.5. 2.5 cloud-provider-payment8006 项目 application.yml 文件如下
      6. 1.4.6. 2.6 cloud-provider-payment8006 项目 主启动类 如下
      7. 1.4.7. 2.7 cloud-provider-payment8006 项目 业务类Controller
      8. 1.4.8. 2.8 验证测试
    5. 1.5. 3. 服务消费者注册进Consul
      1. 1.5.1. 3.1 新建Module消费服务order80 - cloud-consumerconsul-order80
      2. 1.5.2. 3.2 cloud-consumerconsul-order80 项目 pom.xml 文件如下
      3. 1.5.3. 3.3 cloud-consumerconsul-order80 项目 application.yml 文件如下
      4. 1.5.4. 3.4 cloud-consumerconsul-order80 项目 主启动类 文件如下
      5. 1.5.5. 3.5 cloud-consumerconsul-order80 项目 配置Bean
      6. 1.5.6. 3.6 cloud-consumerconsul-order80 项目 Controller
      7. 1.5.7. 3.7.验证测试
      8. 1.5.8. 8.访问测试地址 - http://localhost/consumer/payment/consul
|