目录
一、简介
前面介绍了通过Eureka搭建微服务注册中心,其实服务注册中心还有其他几种落地实现,如Zookeeper、Consul等,今天介绍如何搭建Consul服务注册中心。
Consul 是一套开源的分布式服务发现和配置管理系统,由 HashiCorp 公司用 Go 语言开发。
能干嘛:
- 服务发现,支持 HTTP 和 DNS 协议;
- 健康监测,支持多种方式,HTTP、TCP、Docker、Shell脚本定制化;
- KV键值对存储;
- 多数据中心;
- 可视化Web页面;
- 跨平台,支持 Linux、Mac、Windows;
Consul 涉及的角色:
- client:客户端, 无状态, 将 HTTP 和 DNS 接口请求转发给局域网内的服务端集群;
- server:服务端, 保存配置信息, 高可用集群, 在局域网内与本地客户端通讯, 通过广域网与其他数据中心通讯。 每个数据中心的 server 数量推荐为 3 个或是 5 个;
二、Consul安装步骤
使用Consul之前,需要先安装Consul,Consul官网下载地址如下:https://www.consul.io/downloads.html,可以根据需要选择下载对应的版本即可。
下载consul_1.7.1_windows_amd64.zip文件解压后,文件内只有一个consul.exe文件,如下图:
在此文件夹内打开cmd命令窗口,使用如下命令使用开发模式启动:
consul agent -dev
启动成功后,如下图所示:
我们可以访问Consul Web可视化界面,浏览器访问http://localhost:8500/ui/dc1/services,如下图:
三、将服务提供者注册到Consul
继续在之前的父工程上面新建module:【springcloud-provider-consul-payment8006】
【a】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">
<parent>
<artifactId>springcloud2020</artifactId>
<groupId>com.wsh.springcloud</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>springcloud-provider-consul-payment8006</artifactId>
<dependencies>
<!-- 引入自己定义的api通用包,可以使用Payment支付Entity -->
<dependency>
<groupId>com.wsh.springcloud</groupId>
<artifactId>springcloud-api-commons</artifactId>
<version>${project.version}</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>
【b】application.yml配置文件
#端口号
server:
port: 8006
spring:
application:
name: springcloud-consul-provider-payment
#consul注册中心地址
cloud:
consul:
host: localhost
port: 8500
discovery:
#hostname: 127.0.0.1
service-name: ${spring.application.name}
【c】主启动类
package com.wsh.springcloud;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
@SpringBootApplication
@EnableDiscoveryClient
public class SpringCloudConsulServiceApplication8006 {
public static void main(String[] args) {
SpringApplication.run(SpringCloudConsulServiceApplication8006.class, args);
}
}
【d】测试controller
package com.wsh.springcloud.controller;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @Description Consul测试Controller
* @Date 2020/8/2 21:20
* @Author weishihuai
* 说明:
*/
@RestController
public class PaymentController {
@Value("${server.port}")
private String port;
@RequestMapping(value = "/payment/consul")
public String paymentConsul() {
return "spring cloud with consul: " + port;
}
}
【e】测试结果
下面我们启动此微服务,然后我们观察Consul Web可视化管理界面,如下图所示:
可见,springcloud-provider-consul-payment8006微服务已经成功注册到Consul中。接着我们浏览器访问:http://localhost:8006/payment/consul,成功访问并且返回数据,由此说明我们成功实现了将服务注册进Consul中。
除了可以查看有哪些服务注册进去之外,我们还可以查看具体某个微服务的详细信息,具体如下图所示:
四、将服务消费者注册到Consul
新建一个module【springcloud-consumer-consul-order80】,如上所示,也是那些文件:maven依赖、配置文件、启动类等。
【a】pom.xml maven依赖
<?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>springcloud2020</artifactId>
<groupId>com.wsh.springcloud</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>springcloud-consumer-consul-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>
【b】application.yml配置文件
#服务端口号
server:
port: 80
spring:
application:
name: springcloud-consumer-consul-order
#consul注册中心地址
cloud:
consul:
host: localhost
port: 8500
discovery:
#hostname: 127.0.0.1
service-name: ${spring.application.name}
【c】主启动类
package com.wsh.springcloud;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;
@SpringBootApplication
@EnableDiscoveryClient
public class SpringCloudOrderConsulServiceApplication80 {
public static void main(String[] args) {
SpringApplication.run(SpringCloudOrderConsulServiceApplication80.class, args);
}
//注入负载均衡的RestTemplate
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
}
【d】测试Controller
package com.wsh.springcloud.controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
import javax.annotation.Resource;
/**
* @Description 测试Controller
* @Date 2020/8/3 20:16
* @Author weishihuai
* 说明:
*/
@RestController
public class OrderController {
//指定服务提供者的application-name,其实也是注册进Consul中的服务名称
private static final String INVOKE_URL = "http://springcloud-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;
}
}
【e】测试
下面我们启动此微服务,观察Consul可视化界面:
可见,【springcloud-consumer-consul-order80】也成功注册进Consul中,下面我们通过RestTemplate远程调用上一步骤建立的payment微服务,查看接口是否能调用成功,浏览器访问:http://localhost/consumer/payment/consul
如上图所示,可见成功实现了跨服务调用两个同时注册进Consul注册中心的微服务,说明我们的搭建过程是成功的。
五、总结
以上就是Consul服务注册中心搭建的详细过程,相关项目的代码我已经放在Gitee上,有需要的小伙伴可以去拉取进行学习:https://gitee.com/weixiaohuai/springcloud_Hoxton,由于笔者水平有限,如有不对之处,还请小伙伴们指正,相互学习,一起进步。