以 Ubuntu 为例
https://learn.hashicorp.com/tutorials/consul/get-started-install
sudo apt-get update && sudo apt-get install consul
consul
# 查看Consul版本
consul veresion
# 启动Consul的三种方式 -dev | -server | client
consul agent -dev #以dev模式运行,这种模式启动一个单节点的Consul环境,它不适用于生产环境。该参数配置下,不会有任何持久化操作,即不会有任何数据写入到磁盘
consul agent -server #以server模式启动
consul agent #默认是以client模式运行,client非常轻量级,它注册服务、运行healthchecks、转发query到servers。agent必须运行于集群上的每一个节点。
Consul默认是只能127.0.0.0 能访问
配置指定IP能够访问
consul agent -dev -client 10.128.223.231
# 发现果然可以使用http://10.128.223.231:8500/ui 访问了。
配置所有IP都能够访问
consul agent -dev -client 0.0.0.0
Ubuntu 服务器上访问:http://127.0.0.1:8500
Windows 上访问 Ubuntu 服务器IP+端口:http://192.168.116.128:8500/
<?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>SpringCloud_H_2020</artifactId>
<groupId>com.ray</groupId>
<version>1.0</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>9-cloud-provider-consul-payment8006</artifactId>
<dependencies>
<dependency><!-- 引用自己定义的api通用包,可以使用Payment支付Entity -->
<groupId>com.ray</groupId>
<artifactId>1-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>
<!-- SpringCloud consul server-->
<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>
# consul 服务端口号
server:
port: 8006
spring:
application:
name: consul-provider-payment
cloud:
consul:
# consul 注册中心IP
host: 192.168.116.128
port: 8500
discovery:
# 对外暴露的名称
service-name: ${spring.application.name}
package com.ray.springcloud;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
/**
* @Description:
* @Author Administrator
* @Date 2020/10/11 10:40
* @Version 1.0
*/
@SpringBootApplication
@EnableDiscoveryClient // 该注解用于向使用 consul 或者 zookeeper 作为注册中心时注册服务
public class PaymentMain8006 {
public static void main(String[] args) {
SpringApplication.run(PaymentMain8006.class, args);
}
}
package com.ray.springcloud.controller;
import cn.hutool.core.lang.UUID;
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;
/**
* @Description:
* @Author Administrator
* @Date 2020/10/11 10:41
* @Version 1.0
*/
@Slf4j
@RestController
@RequestMapping(value = "/payment")
public class PaymentController {
@Value("${server.port}")
private String serverPort;
@RequestMapping(value = "consul")
public String consul() {
return "springCloud with consul: " + serverPort + "\t" + UUID.randomUUID().toString();
}
}
一、启动 Consul 和 8006 端口
consul agent -dev -client 0.0.0.0
二、查看 Consul 视图工具
三、测试接口
http://localhost:8006/payment/consul
四、解决上面的 Health Checks 红色错误问题
打开心跳协议
# consul 服务端口号
server:
port: 8006
spring:
application:
name: consul-provider-payment
cloud:
consul:
# consul 注册中心IP
host: 192.168.116.128
port: 8500
discovery:
# 对外暴露的名称
service-name: ${spring.application.name}
# 打开心跳协议
heartbeat:
enabled: true
<?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>SpringCloud_H_2020</artifactId>
<groupId>com.ray</groupId>
<version>1.0</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>10-cloud-consumer-consul-order80</artifactId>
<dependencies>
<dependency><!-- 引用自己定义的api通用包,可以使用Payment支付Entity -->
<groupId>com.ray</groupId>
<artifactId>1-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>
<!--SpringCloud consul-server-->
<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>
# consul 消费端口号
server:
port: 80
spring:
application:
name: cloud-consumer-order
cloud:
consul:
# consul 注册中心IP
host: 192.168.116.128
port: 8500
discovery:
# 对外暴露的名称
service-name: ${spring.application.name}
# 打开心跳协议
heartbeat:
enabled: true
package com.ray.springcloud;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
/**
* @Description:
* @Author Administrator
* @Date 2020/10/11 11:30
* @Version 1.0
*/
@SpringBootApplication
@EnableDiscoveryClient // 该注解用于向使用 consul 或者 zookeeper 作为注册中心时注册服务
public class OrderConsulMain80 {
public static void main(String[] args) {
SpringApplication.run(OrderConsulMain80.class, args);
}
}
package com.ray.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;
/**
* @Description: 相当于封装了 HttpClient
* @Author Ray
* @Date 2020/10/07 11:40
* @Version 1.0
*/
@Configuration
public class RestTemplateConfig {
@Bean
@LoadBalanced
public RestTemplate getRestTemplate() {
return new RestTemplate();
}
}
package com.ray.springcloud.controller;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
import javax.annotation.Resource;
/**
* @Description:
* @Author Administrator
* @Date 2020/10/11 11:32
* @Version 1.0
*/
@RequestMapping(value = "/consumer")
@RestController
@Slf4j
public class OrderConsulController {
// 与 consul 服务器上面的提供者名称一致
public static final String INVOKE_URL = "http://consul-provider-payment";
@Resource
private RestTemplate restTemplate;
@GetMapping("/payment/consul")
public String paymentInfo() {
String result = restTemplate.getForObject(INVOKE_URL + "/payment/consul", String.class);
return result;
}
}
一、运行 Consul 和 启动 80、8006端口
二、测试接口
http://localhost/consumer/payment/consul
三、Consul 是临时节点
关闭端口 80、8006 后,查看 Consul 面板,发现立刻出现红色打叉,说明 Consul 是 CP(一致性、容错性)