【SpringCloud】整合Consul实现服务注册与发现
一、Consul简介
什么是Consul
Consul是HashiCorp公司推出的开源软件,使用GO语言编写,提供了分布式系统的
服务注册和发现、配置等功能,
这些功能中的每一个都可以根据需要单独使用,也可以一起使用以构建全方位的服务网格。
Consul不仅具有服务治理的功能,而且使用分布式一致协议RAFT算法实现,有多数据中心的高可用方案,并且很容易和Spring Cloud等微服务框架集成,
使用起来非常的简单,具有简单、易用、可插排等特点。使用简而言之,Consul提供了一种完整的服务网格解决方案 。
二、Consul 服务注册发现流程
在上面的流程图上有三个角色,分别为服务注册中心、服务提供者、服务消费者。
服务提供者Provider启动的时候,会向Consul发送一个请求,
将自己的host、ip、应用名、健康检查等元数据信息发送给Consul
Consul 接收到 Provider 的注册后,定期向 Provider 发送健康检查的请求,检验Provider是否健康
服务消费者Consumer会从注册中心Consul中获取服务注册列表,当服务消费者消费服务时,根据应用名从服务注册列表获取到具体服务的实例(1个或者多个),从而完成服务的调用。
三、项目实战代码
Consul采用Go语言编写,支持Linux、Mac、Windows等各大操作系统,本文使用windows操作系统,下载地址:https://www.consul.io/downloads.html,下完成后解压到计算机目录下,解压成功后,只有一个可执行的consul.exe可执行文件。打开cmd终端,切换到目录,执行以下命令:
consul agent -dev -client 0.0.0.0 -ui
新建maven项目,项目名为consul-test,同时添加两个子模块:consul-consumer、consul-provider
新建完成后,项目结构如上图
根目录pom.xml
<?xml version=”1.0” encoding=”UTF-8”?>
4.0.0
org.example
consul-test
pom
1.0-SNAPSHOT
consul-provider
consul-consumer
org.springframework.boot
spring-boot-starter-parent
2.1.4.RELEASE
org.springframework.cloud
spring-cloud-dependencies
Greenwich.RELEASE
pom
import
8
8
org.springframework.cloud
spring-cloud-starter-consul-discovery
org.springframework.boot
spring-boot-starter-actuator
org.springframework.boot
spring-boot-starter-web
org.springframework.cloud
spring-cloud-starter-openfeign
服务提供者代码
consul-provider下pom.xml代码
<?xml version=”1.0” encoding=”UTF-8”?>
consul-test
org.example
1.0-SNAPSHOT
../pom.xml
4.0.0
consul-provider
8
8
consul-provider/src/main/resources
application.yml
spring:
application:
name: consul-provider
profiles:
active: dev
cloud:
consul:
# 服务发现配置
discovery:
# 启用服务发现
enabled: true
# 启用服务注册
register: true
# 服务停止时取消注册
deregister: true
# 表示注册时使用IP而不是hostname
prefer-ip-address: true
# 执行监控检查的频率
health-check-interval: 30s
# 设置健康检查失败多长时间后,取消注册
health-check-critical-timeout: 30s
# 健康检查的路径
health-check-path: /actuator/info
# 服务注册标识,格式为:应用名称+服务器IP+端口
instance-id: ${spring.application.name}:${spring.cloud.client.ip-address}:${server.port}
server:
port: 8764
bootstrap.yml
# bootstrap.yml
# consul 使用动态配置,必须在bootstrap.yml中配置好动态配置项目的配置
spring:
cloud:
consul:
host: localhost
port: 8500
#enabled将此值设置为“false”禁用Consul配置
config:
enabled: true #默认是true --
format: YAML # 表示consul上面文件的格式 有四种 YAML PROPERTIES KEY-VALUE FILES
data-key: data #表示consul上面的KEY值(或者说文件的名字) 默认是data
# watch选项为配置监视功能,主要监视配置的改变
watch:
enabled: true
delay: 10000
wait-time: 30
consul-provider/src/main/java/com/example/controller/HiController.java
package com.example.controller;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class HiController {
@Value("${server.port}")
String port;
@GetMapping("/hi")
public String home(@RequestParam String name) {
return "hi "+name+",i am from port:" +port;
}
}
consul-provider/src/main/java/com/example/ConsulProviderApplication.java
package com.example;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;@SpringBootApplication
@EnableDiscoveryClient
public class ConsulProviderApplication {public static void main(String[] args) {
SpringApplication.run(ConsulProviderApplication.class, args);
System.out.println(".....................................");
System.out.println("....Provider Application started.....");
System.out.println(".....................................");
}
}
服务消费者代码
1. consul-consumer/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>consul-test</artifactId>
<groupId>org.example</groupId>
<version>1.0-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>consul-consumer</artifactId>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>
</project>
2. consul-consumer/src/main/resources
application.yml
spring:
application:
name: consul-consumer
profiles:
active: dev
cloud:
consul:
# 服务发现配置
discovery:
# 启用服务发现
enabled: true
# 启用服务注册
register: true
# 服务停止时取消注册
deregister: true
# 表示注册时使用IP而不是hostname
prefer-ip-address: true
# 执行监控检查的频率
health-check-interval: 30s
# 设置健康检查失败多长时间后,取消注册
health-check-critical-timeout: 30s
# 健康检查的路径
health-check-path: /actuator/info
# 服务注册标识,格式为:应用名称+服务器IP+端口
instance-id: ${spring.application.name}:${spring.cloud.client.ip-address}:${server.port}
server:
port: 8766
bootstrap.yml
# bootstrap.yml
# consul 使用动态配置,必须在bootstrap.yml中配置好动态配置项目的配置
spring:
cloud:
consul:
host: localhost
port: 8500
#enabled将此值设置为“false”禁用Consul配置
config:
enabled: true #默认是true --
format: YAML # 表示consul上面文件的格式 有四种 YAML PROPERTIES KEY-VALUE FILES
data-key: data #表示consul上面的KEY值(或者说文件的名字) 默认是data
# watch选项为配置监视功能,主要监视配置的改变
watch:
enabled: true
delay: 10000
wait-time: 30
3. consul-consumer/src/main/java/com/example/feign/EurekaClientFeign.java
package com.example.feign;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
@FeignClient(value = "consul-provider")
public interface EurekaClientFeign {
@GetMapping(value = "/hi")
String sayHiFromClientEureka(@RequestParam(value = "name") String name);
}
4. consul-consumer/src/main/java/com/example/service/HiService.java
package com.example.service;
import com.example.feign.EurekaClientFeign;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class HiService {
@Autowired
EurekaClientFeign eurekaClientFeign;
public String sayHi(String name){
return eurekaClientFeign.sayHiFromClientEureka(name);
}
}
5. consul-consumer/src/main/java/com/example/ConsulConsumerApplication.java
package com.example;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.openfeign.EnableFeignClients;
@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
public class ConsulConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(ConsulConsumerApplication.class, args);
System.out.println(".....................................");
System.out.println("....Consumer Application started.....");
System.out.println(".....................................");
}
}
分别启动 provider 和 consumer Application
访问consul -sevices如下图:
单独访问 提供者
http://127.0.0.1:8764/hi?name=aaa
单独访问消费者
返回的是 提供者的端口,说明微服务调用成功
还没有评论,来说两句吧...