Consul 服务注册与发现
Consul 服务注册与发现
- 1-Consul 概述
- 1.1-是什么
- 1.2-能干嘛
- 1.3-去哪下
- 1.4-怎么玩
- 2-Consul 安装
- 2.1-Consul 下载
- 2.1-Consul 安装
- 3-Consul 服务注册
- 3.1-提供者服务 cloud-providerconsul-payment8006
- 3.2-消费者服务 cloud-consumerconsul-order80
- 4-注册中心(Eureka、Zookeeper、Consul)异同点
- 4.1-经典 CAP 图
- 4.2-AP(Eureka)
- 4.3- CP(Zookeeper、Consul)
1-Consul 概述
1.1-是什么
https://www.consul.io/intro/index.html
Consul 是一套开源的分布式服务发现和配置管理系统,由 HashiCorp 公司用 Go 语言开发。
提供了微服务系统中的服务治理、配置中心、控制总线等功能。这些功能中的每一个都可以根据需要单独使用,也可以一起使用以构建全方位的服务网格,总之 Consul 提供了一种完整的服务网格解决方案。
Consul 具有很多优点,包括:基于 raft 协议、比较简洁、支持健康检查,同时支持 Http 和 DNS 协议、支持跨数据中心的 WAN 集群提供图形界面跨平台、支持 Linux、Mac、Windows。
1.2-能干嘛
SpringCloud Consul 特性:
服务发现
提供 Http 和 DNS 两种发现方式。
健康监测
支持多种协议,Http、Tcp、Docker、Shell 脚本定制化。
KV存储
Key、Value 的存储方式。
多数据中心
Consul 支持多数据中心。
- 可视化 Web 界面
1.3-去哪下
https://www.consul.io/downloads.html
1.4-怎么玩
https://www.springcloud.cc/spring-cloud-consul.html
2-Consul 安装
官网:https://learn.hashicorp.com/tutorials/consul/get-started-install
2.1-Consul 下载
- 官方:https://www.consul.io/downloads
百度云:
- 链接:https://pan.baidu.com/s/1ThUbzsVuM8RRgPsrRa-_hA
- 提取码:1104
2.1-Consul 安装
a、解压 Consul 压缩包(consul_1.9.1_windows_amd64.zip)
b、查看 Consul 版本信息
consul --version
c、启动 Consul(开发模式)
consul agent -dev
d、查看 Consul 首页:http://localhost:8500
3-Consul 服务注册
3.1-提供者服务 cloud-providerconsul-payment8006
a、右击父工程 mscloud,新建子模块 cloud-providerconsul-payment8006
b、修改子模块 cloud-providerconsul-payment8006 中 pom.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">
<modelVersion>4.0.0</modelVersion>
<parent>
<artifactId>cloud2020</artifactId>
<groupId>com.atguigu.springcloud</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<artifactId>cloud-providerconsul-payment8006</artifactId>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-consul-discovery</artifactId>
</dependency>
<dependency>
<groupId>com.atguigu.springcloud</groupId>
<artifactId>cloud-api-commons</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>
c、修改子模块 cloud-providerconsul-payment8006,目录 /src/main/resources 中新建 application.yml
server:
port: 8006
spring:
application:
name: consul-provider-payment
cloud:
consul:
host: localhost
port: 8500
discovery:
service-name: ${spring.application.name}
d、修改子模块 cloud-providerconsul-payment8006,目录 /src/main/java 中新建包 com.atguigu.springcloud
e、修改子模块 cloud-providerconsul-payment8006,包 com.atguigu.springcloud 中新建启动类 PaymentMain8006.java
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);
}
}
f、修改子模块 cloud-providerconsul-payment8006,目录 /src/main/java 中新建包 com.atguigu.springcloud.controller
g、修改子模块 cloud-providerconsul-payment8006,包 com.atguigu.springcloud.controller 中新建 PaymentController.java
package com.atguigu.springcloud.controller;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.UUID;
@RestController
@Slf4j
public class PaymentController {
@Value("${server.port}")
private String serverPort;
@GetMapping(value = "/payment/consul")
public String paymentConsul() {
return "springcloud with consul: " + serverPort + "\t" + UUID.randomUUID().toString();
}
}
h、测试子模块 cloud-providerconsul-payment8006
- 启动子模块 cloud-providerconsul-payment8006
- http://localhost:8006/payment/consul
- http://localhost:8500
3.2-消费者服务 cloud-consumerconsul-order80
a、右击父工程 mscloud,新建子模块 cloud-consumerconsul-order80
b、修改子模块 cloud-consumerconsul-order80 中 pom.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">
<modelVersion>4.0.0</modelVersion>
<parent>
<artifactId>cloud2020</artifactId>
<groupId>com.atguigu.springcloud</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<artifactId>cloud-consumerconsul-order80</artifactId>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-consul-discovery</artifactId>
</dependency>
<dependency>
<groupId>com.atguigu.springcloud</groupId>
<artifactId>cloud-api-commons</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>
c、修改子模块 cloud-consumerconsul-order80,目录 /src/main/resources 中新建 application.yml
server:
port: 80
spring:
application:
name: consul-consumer-order
cloud:
consul:
host: localhost
port: 8500
discovery:
service-name: ${spring.application.name}
d、修改子模块 cloud-consumerconsul-order80,目录 /src/main/java 中新建包 com.atguigu.springcloud
e、修改子模块 cloud-consumerconsul-order80,包 com.atguigu.springcloud 中新建启动类 OrderConsulMain80.java
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);
}
}
f、修改子模块 cloud-consumerconsul-order80,目录 /src/main/java 中新建包 com.atguigu.springcloud.config
g、修改子模块 cloud-consumerconsul-order80,包 com.atguigu.springcloud.config 中新建 ApplicationContextConfig.java
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 getRestTemplate() {
return new RestTemplate();
}
}
h、修改子模块 cloud-consumerconsul-order80,目录 /src/main/java 中新建包 com.atguigu.springcloud.controller
i、修改子模块 cloud-consumerconsul-order80,包 com.atguigu.springcloud.controller 中新建 OrderConsulController.java
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 {
public static final String INVOME_URL = "http://consul-provider-payment";
@Resource
private RestTemplate restTemplate;
@GetMapping("/consumer/payment/consul")
public String payment() {
String result = restTemplate.getForObject(INVOME_URL + "/payment/consul", String.class);
return result;
}
}
j、测试子模块 cloud-consumerconsul-order80
- 启动子模块 cloud-providerconsul-payment8006
- http://localhost:8006/payment/consul
- 启动子模块 cloud-consumerconsul-order80
- http://localhost:8500
- http://localhost/consumer/payment/consul
4-注册中心(Eureka、Zookeeper、Consul)异同点
CAP:
- C:Consistency(强一致性)
- A:Availability(可用性)
- P:Partition Tolerance(分区容错)
CAP 理论关注粒度是数据,而不是整体系统设计的策略。
4.1-经典 CAP 图
最多只能同时较好的满足两个。
CAP 理论的核心是:一个分布式系统不可能同时很好的满足一致性、可用性、分区容错性这三个需求。因此根据 CAP 原理将 NoSQL 数据库分成了满足 CA 原则、满足 CP 原则和满足 AP 原则三大类:
- CA:单点集群、满足一致性、可用性的系统。通常在可扩展性上不太强大。
- CP:满足一致性、分区容忍必的系统。通常性能不是特别高。
- AP:满足可用性、分区容忍性的系统。通堂可能对—致性要求低一些。
4.2-AP(Eureka)
AP 架构:
当网络分区出现后,为了保证可用性,系统 B 可以返回旧值,保证系统的可用性。
结论:违背了一致性 C 的要求,只满足可用性和分区容错,即 AP。
4.3- CP(Zookeeper、Consul)
CP 架构:
当网络分区出现后,为了保证一致性,就必须拒接请求,否则无法保证一致性。
结论:违背了可用性 A 的要求,只满足一致性和分区容错,即 CP。
还没有评论,来说两句吧...