1 Consul简介
Consul是一套开源的分布式服务发现与配置管理系统,由HashiCorp公司用go语言开发的。提供了微服务系统中的服务治理,配置中心,控制总线等功能,这些功能中的每一个都可以根据需要单独使用,也可以一起使用以构建全方位的服务网络,总之Consul提供了一种完整的服务网络解决方法。
具有很多优点,包括:基于raft协议,比较简洁;支持健康检查;同时支持http和dns协议,支持跨数据中心的WAN集群,提供图形界面,跨平台,支持linux,mac,windows;
- 服务发现:支持http和dns两种发现方式
- 健康检查:支持多种,http,tcp,docker,shell脚本等定制化
- kv键值对存储
- 多数据中心
- 可视化web界面
1.1 安装
- 下载
- 解压
- 配置环境变量即可,也可以直接将解压后的文件直接移动到你已经配好的环境变量目录下面,比如/usr/bin,/bin等目录。如果是自己的目录也很简单:
- 编辑
bash_profile
文件,方式很多可以使用文本编辑器,也是使用命令。不多赘述 - 添加环境变量
- 保存
- 执行这个
source ~/.bash_profile
- 编辑
环境变量可参考:
elasticSearch安装
- 查看是否安装成功
➜ ~ consul --version
Consul v1.6.1
Protocol 2 spoken by default, understands 2 to 3 (agent will automatically use protocol >2 when speaking to compatible agents)
- 使用开发者模式启动
consul agent -dev
启动日志中有这么一行,告诉我们客户端的http端口号是8500
Client Addr: [127.0.0.1] (HTTP: 8500, HTTPS: -1, gRPC: 8502, DNS: 8600)
- 访问
http://localhost:8500/
2 服务提供者注册到consul
- 新建一个模块:
cloud-provider-payment-consul
,导入依赖
<dependencies>
<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>
<!--引入我们的api-common-->
<dependency>
<groupId>study.wyy</groupId>
<artifactId>cloud-api-common</artifactId>
<version>${project.version}</version>
</dependency>
<!--consul服务发现-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-consul-discovery</artifactId>
</dependency>
</dependencies>
- application.yml 配置
server:
port: 8006
spring:
application:
name: consul-provider-payment
cloud:
consul:
host: localhost
port: 8500
discovery:
service-name: ${spring.application.name}
- 主启动类
package study.wyy.cloud.consul.payment;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
/**
* @author by wyaoyao
* @Description
* @Date 2020/12/15 8:19 上午
*/
@EnableDiscoveryClient// 开启服务发现
@Slf4j
@SpringBootApplication
public class PaymentConsul {
public static void main(String[] args) {
SpringApplication.run(PaymentConsul.class,args);
}
}
- 提供一个rest接口,
package study.wyy.cloud.consul.payment.controller;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @author by wyaoyao
* @Description
* @Date 2020/12/14 5:04 下午
*/
@RestController
public class HelloController {
// 获取配置文件中的端口号
@Value("${server.port}")
private String port;
@GetMapping("payment/consul/hello")
public String hello(){
return "Hello World From Port: " + port;
}
}
- 启动,观察consul的web界面
- 访问刚刚的rest接口
http://localhost:8006/payment/consul/hello
,是否正常
3 服务消费者注册到consul
- 新建一个model
cloud-consumer-order-consul
,导入依赖
<dependencies>
<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>
<!--引入我们的api-common-->
<dependency>
<groupId>study.wyy</groupId>
<artifactId>cloud-api-common</artifactId>
<version>${project.version}</version>
</dependency>
<!--consul服务发现-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-consul-discovery</artifactId>
</dependency>
</dependencies>
- 配置文件
spring:
application:
name: consul-consumer-order
cloud:
consul:
host: localhost
port: 8500
discovery:
service-name: ${spring.application.name}
server:
port: 80
- 启动类
package study.wyy.cloud.consul.order;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
/**
* @author by wyaoyao
* @Description
* @Date 2020/12/15 9:52 上午
*/
@SpringBootApplication
@Slf4j
@EnableDiscoveryClient
public class OrderServiceConsul {
public static void main(String[] args) {
SpringApplication.run(OrderServiceConsul.class,args);
}
}
- 配置一个RestTemplate
package study.wyy.cloud.consul.order.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 by wyaoyao
* @Description
* @Date 2020/12/15 9:53 上午
*/
@Configuration
public class BeanConfig {
@Bean
@LoadBalanced
public RestTemplate restTemplate(){
return new RestTemplate();
}
}
- 测试调用支付服务的接口
package study.wyy.cloud.consul.order.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;
/**
* @author by wyaoyao
* @Description
* @Date 2020/12/15 10:19 上午
*/
@Slf4j
@RestController
public class OrderController {
private final RestTemplate restTemplate;
private final String PROVIDER_URL = "http://consul-provider-payment";
public OrderController(RestTemplate restTemplate) {
this.restTemplate = restTemplate;
}
@GetMapping(("/consume/payment/consul/hello"))
public String consume(){
String result = restTemplate.getForObject(PROVIDER_URL + "/payment/consul/hello", String.class);
return result;
}
}
- 访问:
http://localhost/consume/payment/consul/hello
进行测试