服务注册与发现——Consul
- 一、Consul简介
- 1、官网
- https://www.consul.io/docs/intro
- 2、什么是consul
- 3、consul的特点
- 二、安装与运行
- 三、服务提供者注册到Consul服务注册中心
- 1、pom
- 2、yaml配置文件
- 3、验证
- 四、服务消费者注册到Consul服务注册中心
- 1、yaml配置文件
- 2、config配置类:使当前微服务能够使用其他微服务
- 3、Controller
- 4、验证
一、Consul简介
1、官网
https://www.consul.io/docs/intro
2、什么是consul
Consul是一套开源的分布式服务发现和配置管理系统,由HashiCorp公司用Go语言开发。提供了微服务系统中的 服务治理 、配置中心 、控制总线 等功能。
Consul需要一个数据平面,并支持代理和本机集成模型。
Consul附带了一个简单的内置代理,因此一切都可以直接使用,还支持Envoy等第三方代理集成。
3、consul的特点
- 服务发现Service Discovery:Consul的客户端可以注册服务,例如
api
或mysql
,其他客户端可以使用Consul来发现给定服务的提供者。提供HTTP和DNS两种发现方式。 - 健康监测Health Checking:客户端可以查询监视群集的运行状况。
- KV存储:Key、Value的存储方式
- 多数据中心:满足一致性、分许容错性的系统,通常性能不是特别高。满足CAP中的CP
- 具有可视化Web界面
二、安装与运行
在官网下载windows64版本后,双击解压后得到consul.exe
在当前目录下进入cmd中,可以查看和使用consul
打开本地8500端口查看集群状态
默认绑定的端口
修改默认端口:打开consul.exe的根目录 ,在次目录下创建一个 basic.json 的文本,以及一个data命名的空文件夹,文本内容如下:
{
"ports": {
"server": 9300,
"serf_lan": 9301,
"serf_wan": 9302,
"http": 9500,
"dns": 9600
}
}
Consul最多需要6个不同的端口才能正常工作,有些使用TCP,UDP或两种协议。下面我们记录每个端口的要求。
端口号 | 协议 | 功能 |
RPC:8300 | TCP | agent server 使用的,用于处理其他agent发来的请求 |
Serf LAN:8301 | TCP 、UDP | agent使用此端口处理LAN中的gossip |
Serf WAN:8302 | TCP 、UDP | agent server使用此端口处理WAN中的与其他server的gossip |
8400 | TCP | agent用于处理从CLI来的RPC请求 |
HTTP API:8500 | TCP | agent用于处理HTTP API |
DNS:8600 | TCP 、UDP | agent用于处理 DNS 查询 |
三、服务提供者注册到Consul服务注册中心
1、pom
<!--SpringCloud consul-server -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-consul-discovery</artifactId>
</dependency>
2、yaml配置文件
server:
port: 8006
spring:
application:
name: consul-Order
cloud:
consul:
host: localhost
port: 8500
discovery:
hostname: 127.0.0.1
service-name: ${spring.application.name}
3、验证
先运行consul,再运行项目,可以看到已经注册到consul中了
四、服务消费者注册到Consul服务注册中心
1、yaml配置文件
server:
port: 80
spring:
application:
name: consul-payment
cloud:
consul:
host: localhost
port: 8500
discovery:
hostname: 127.0.0.1
service-name: ${spring.application.name}
2、config配置类:使当前微服务能够使用其他微服务
package org.jun.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;
/**
* @author junfeng.lin
* @date 2021/2/9 16:43
*/
@Configuration
public class ApplicationContextConfig {
@Bean
@LoadBalanced//使用该注解赋予RestTemplate负载均衡的能力
public RestTemplate getRestTemplate() {
return new RestTemplate();
}
}
3、Controller
package org.jun.Controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
/**
* @author junfeng.lin
* @date 2021/2/9 16:36
*/
@RestController
public class myController {
//要访问的服务提供方的微服务名称
public static final String INVOKE_URL = "http://consul-Order";
@Autowired
private RestTemplate restTemplate;
@GetMapping("/showConsumer")
public String paymentInfo() {
String re = restTemplate.getForObject(INVOKE_URL + "/showOrder", String.class);
return re;
}
}
4、验证
先运行consul,再运行项目,可以看到已经注册到consul中了
访问给定的url,实际上是访问其他服务提供者的服务