Consul官方文档
官方文档:https://www.consul.io/docs/intro
中文文档:https://www.springcloud.cc/spring-cloud-consul.html
Consul简介
Consul是一套开源的分布式服务发现和配置管理系统,由HashiCorp公司用Go语言开发。
提供了微服务系统中的服务治理、配置中心、控制总线等功能。这些功能中的每一个都可以根据需要单独使用,也可以一起使用以构建全方位的服务网格,总之Consul提供了一种完整的服务网格解决方案。
它具有很多优点。包括:基于raft协议,比较简洁;支持健康检查,同时支持HTTP和DNS协议;支持跨数据中心的WAN集群;提供图形界面;跨平台,支持Linux、Mac、Windows。
Consul主要特点
Consul 的主要特点是:
- 服务发现:Consul 的客户端可以注册一个服务,例如
api
或mysql
,其他客户端可以使用 Consul 来发现给定服务的提供者。使用 DNS 或 HTTP,应用程序可以轻松找到它们所依赖的服务。 - 健康检查:Consul 客户端可以提供任意数量的健康检查,要么与给定的服务相关联(“网络服务器是否返回 200 OK”),要么与本地节点(“内存利用率是否低于 90%”)相关联。操作员可以使用此信息来监控集群健康状况,并且服务发现组件可以使用它来将流量路由到不健康的主机之外。
- KV 存储:应用程序可以将 Consul 的分层键/值存储用于多种目的,包括动态配置、功能标记、协调、领导选举等。简单的 HTTP API 使其易于使用。
- 安全服务通信:Consul 可以为服务生成和分发 TLS 证书,以建立相互的 TLS 连接。 意图 可用于定义允许哪些服务进行通信。可以通过实时更改意图轻松管理服务分段,而不是使用复杂的网络拓扑和静态防火墙规则。
- 多数据中心:Consul 支持开箱即用的多个数据中心。这意味着 Consul 的用户不必担心构建额外的抽象层以扩展到多个区域。
Consul 旨在对 DevOps 社区和应用程序开发人员友好,使其非常适合现代、弹性的基础设施。
Consul下载
https://www.consul.io/downloads.html
安装并运行Consul
- 下载完成后只有一个consul.exe文件,使用开发模式启动 consul agent -dev。
- 通过http://localhost:8500地址访问Consul的首页。
- 结果页面
Springcloud中Consul的使用
服务提供者
-
新建Module支付服务cloud-providerconsul-payment8006模块
-
POM文件
<!--?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> <description>支付服务的提供者之注册中心consul</description> <dependencies> <!--SpringCloud consul-server--> <dependency> <groupid>org.springframework.cloud</groupid> <artifactid>spring-cloud-starter-consul-discovery</artifactid> </dependency> <dependency> <groupid>com.atguigu.springcloud</groupid> <artifactid>cloud-api-common</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>
-
YML文件
application.ymlserver: # consul服务端口 port: 8006 spring: application: name: cloud-provider-payment cloud: consul: # consul注册中心地址 host: localhost port: 8500 discovery: hostname: 127.0.0.1 service-name: ${spring.application.name}
-
主启动类
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); } }
-
业务类Controller
package com.atguigu.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();
}
}
- 验证运行
启动PaymentMain8006启动类,访问Consul首页http://localhost:8500查看是否加载到consul控制中心。
访问网址http://localhost:8006/payment/consul 查看是否显示信息。
服务消费者
-
新建Module消费服务cloud-consumerconsul-order80
步骤同上
-
POM文件
application.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"> <parent> <artifactid>cloud2020</artifactid> <groupid>com.atguigu.springcloud</groupid> <version>1.0-SNAPSHOT</version> </parent> <modelversion>4.0.0</modelversion> <artifactid>cloud-consumerconsul-payment80</artifactid> <description>服务消费者之注册中心consul</description> <dependencies> <!--SpringCloud consul-server--> <dependency> <groupid>org.springframework.cloud</groupid> <artifactid>spring-cloud-starter-consul-discovery</artifactid> </dependency> <dependency> <groupid>com.atguigu.springcloud</groupid> <artifactid>cloud-api-common</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>
-
YML文件
server: port: 80 spring: application: name: cloud-consumer-order cloud: consul: # consul注册中心地址 host: localhost port: 8500 discovery: hostname: 127.0.0.1 service-name: ${spring.application.name}
-
主启动类
package com.atguigu.springcloud; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; /** * @author zzyy * @date 2020/02/18 17:20 **/ @SpringBootApplication @EnableDiscoveryClient public class OrderConsulMain80 { public static void main(String[] args) { SpringApplication.run(OrderConsulMain80.class, args); } }
-
配置bean
package com.whpu.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(); } }
-
Controller
package com.whpu.springcloud.controller; import com.whpu.springcloud.entities.CommonResult; import com.whpu.springcloud.entities.Payment; import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; 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 PAYMENT_URL = "http://localhost:8006"; public static final String INVOKE_URL = "http://cloud-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; } }
-
验证测试
访问 http://localhost/consumer/payment/consul