【Spring Cloud 之 Consul】2019-01-27 SpringCloud使用Consul作为服务注册和发现中心
【Spring Cloud 之 Consul】2019-01-27 SpringCloud使用Consul作为服务注册和发现中心
文章目录
- 【Spring Cloud 之 Consul】2019-01-27 SpringCloud使用Consul作为服务注册和发现中心
- 1. consul 的安装
- 2. 搭建 consul 服务端(SpringCloud 往 consul 注册服务)
- 2.1 父工程 springcloud-parent 的pom文件
- 2.2 子模块 `10_consul-server-service` 的pom文件
- 2.3 application.yml(很重要)
- 2.4 启动类 ConsulServerApplication
- 2.5 检查服务是否注册成功
- 3. 搭建 consul 客户端 (访问上述注册成功的 `consul-server-hello` 服务,采用 (rest+ribbon) 访问)
- 3.1 pom.xml
- 3.2 application.yml
- 3.3 启动类 `ConsulClientServiceApplication`
- 3.4 测试:访问 `http://localhost:8556/`
- 4. 拓展 sping cloud consul 常见配置:
1. consul 的安装
2. 搭建 consul 服务端(SpringCloud 往 consul 注册服务)
本博客采用的是Linux系统下安装consul,根据具体情况修改配置文件中:
spring.cloud.consul.host(Consul代理主机名。默认为“localhost”)
和(spring.cloud.consul.port)
两个参数
2.1 父工程 springcloud-parent 的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">
<modelVersion>4.0.0</modelVersion>
<groupId>com.springcloud.parent</groupId>
<artifactId>springcloud-parent</artifactId>
<version>1.0.0-SNAPSHOT</version>
<packaging>pom</packaging>
<name>springcloud-parent</name>
<!-- FIXME change it to the project's website -->
<url>http://www.example.com</url>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.3.RELEASE</version>
<relativePath/>
</parent>
<modules>
<module>10_consul-server-service</module>
</modules>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
<spring-cloud.version>Finchley.RELEASE</spring-cloud.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
2.2 子模块 10_consul-server-service
的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">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.springcloud.parent</groupId>
<artifactId>springcloud-parent</artifactId>
<version>1.0.0-SNAPSHOT</version>
</parent>
<groupId>com.springcloud</groupId>
<artifactId>10_consul-server-service</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>demo</name>
<description>Demo project for Spring Boot</description>
<packaging>jar</packaging>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-consul-discovery</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Finchley.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
</dependencies>
</project>
2.3 application.yml(很重要)
spring:
cloud:
consul:
port: 8500 # consul代理端口
host: 192.168.0.102 # consul代理ip
enabled: true #启用 spring cloud consul
discovery:
# 配置服务注册到Consul上
register: true # 是否开启在 consul 中注册服务
health-check-path: /actuator/health #定义 consul 健康检查路径
health-check-interval: 10s # consul 健康检查频率
instance-id: ${spring.application.name}:${server.port} # 配置注册到consul 服务的id
enabled: true #启用 consul 服务发现
service-name: ${spring.application.name} #设置 注册到 consul 的服务名称
ip-address: 192.168.0.100 # 访问服务时使用的 ip地址 (还必须设置preferIpAddress才能使用)
prefer-ip-address: true
application:
name: consul-server-hello
server:
port: 8555
2.4 启动类 ConsulServerApplication
package com.example;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@SpringBootApplication
@EnableDiscoveryClient // 很重要
@RestController
public class ConsulServerApplication {
@Value("${server.port}")
private String port;
public static void main(String[] args) {
SpringApplication.run(ConsulServerApplication.class, args);
}
@RequestMapping("/")
public String hello(){
return "hello,I am Consule,I am from " + port;
}
}
2.5 检查服务是否注册成功
2.5.1 检查之前确保 consul 注册中心启动成功,
2.5.2 运行 ConsulServerApplication
的 main
方法
2.5.3 再次查看 http://192.168.0.102:8500,查看 consul-server-hello
服务是否注册成功
3. 搭建 consul 客户端 (访问上述注册成功的 consul-server-hello
服务,采用 (rest+ribbon) 访问)
3.1 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">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.springcloud.parent</groupId>
<artifactId>springcloud-parent</artifactId>
<version>1.0.0-SNAPSHOT</version>
</parent>
<groupId>com.springcloud.consulclient</groupId>
<artifactId>10_consul-client-service</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>10_consul-client-service</name>
<description>Demo project for Spring Boot</description>
<packaging>jar</packaging>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-consul-discovery</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</dependency>
</dependencies>
</project>
3.2 application.yml
spring:
cloud:
consul:
port: 8500 # consul 服务中心 访问端口
host: 192.168.0.102 # consul 服务中心 访问IP
enabled: true
discovery:
# 关闭 服务注册 到 consul服务中心
register: false
application:
name: consul-client-hello
server:
port: 8556
3.3 启动类 ConsulClientServiceApplication
package com.springcloud.consulclient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.cloud.client.loadbalancer.LoadBalancerClient;
import org.springframework.context.annotation.Bean;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
@SpringBootApplication
@EnableDiscoveryClient
@RestController
public class ConsulClientServiceApplication {
@Value("${server.port}")
private String port;
public static void main(String[] args) {
SpringApplication.run(ConsulClientServiceApplication.class, args);
}
@Autowired
RestTemplate restTemplate;
@Autowired(required=true)
private LoadBalancerClient loadBalancer;
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
@RequestMapping(value = "/", method = RequestMethod.GET)
public String add() {
return restTemplate.getForEntity("http://consul-server-hello/", String.class).getBody();
}
}
3.4 测试:访问 http://localhost:8556/
出现上图所示结果,表示访问 consule服务 consul-server-hello
成功
总体来说,代码不难,但是在使用consul的时候很容易出错,关键是 yml 文件配置 springcloud consul 参数时容易出错,需要注意。
4. 拓展 sping cloud consul 常见配置:
spring.cloud.consul
属性名 | 默认值 | 说明 |
---|---|---|
spring.cloud.consul.discovery.acl-token | ||
spring.cloud.consul.discovery.catalog-services-watch-delay | 10 | |
spring.cloud.consul.discovery.catalog-services-watch-timeout | 2 | |
spring.cloud.consul.discovery.default-query-tag | 如果没有在serverListQueryTags中列出,请在服务列表中查询标签。 | |
spring.cloud.consul.discovery.default-zone-metadata-name | zone | 服务实例区域来自元数据。这允许更改元数据标签名称。 |
spring.cloud.consul.discovery.enabled | true | 是否启用服务发现 |
spring.cloud.consul.discovery.fail-fast | true | 在服务注册期间抛出异常,如果为true,否则,记录警告(默认为true)。 |
spring.cloud.consul.discovery.health-check-interval | 10 | 执行健康检查的频率(例如10s) |
spring.cloud.consul.discovery.health-check-path | /health | 调用健康检查的备用服务器路径 |
spring.cloud.consul.discovery.health-check-timeout | 10 | 健康检查超时(例如10s) |
spring.cloud.consul.discovery.health-check-url | 自定义健康检查网址覆盖默认值 | |
spring.cloud.consul.discovery.heartbeat.enabled | false | |
spring.cloud.consul.discovery.heartbeat.heartbeat-interval | ||
spring.cloud.consul.discovery.heartbeat.interval-ratio | ||
spring.cloud.consul.discovery.heartbeat.ttl-unit | s | |
spring.cloud.consul.discovery.heartbeat.ttl-value | 30 | |
spring.cloud.consul.discovery.host-info | ||
spring.cloud.consul.discovery.hostname | 访问服务器时使用的主机名 | |
spring.cloud.consul.discovery.instance-id | 唯一的服务实例ID | |
spring.cloud.consul.discovery.instance-zone | 服务实例区 | |
spring.cloud.consul.discovery.ip-address | 访问服务时使用的IP地址(还必须设置preferIpAddress才能使用) | |
spring.cloud.consul.discovery.lifecycle.enabled | true | |
spring.cloud.consul.discovery.management-port | 端口注册管理服务(默认为管理端口) | |
spring.cloud.consul.discovery.management-suffix | management | 注册管理服务时使用后缀 |
spring.cloud.consul.discovery.management-tags | 注册管理服务时使用的标签 | |
spring.cloud.consul.discovery.port | 端口注册服务(默认为侦听端口) | |
spring.cloud.consul.discovery.prefer-agent-address | false | 我们将如何确定使用地址的来源 |
spring.cloud.consul.discovery.prefer-ip-address | false | 在注册时使用ip地址而不是主机名 |
spring.cloud.consul.discovery.query-passing | false | |
spring.cloud.consul.discovery.register | true | 注册为领事服务。 |
spring.cloud.consul.discovery.register-health-check | true | 注册领事健康检查。在开发服务期间有用。 |
spring.cloud.consul.discovery.scheme | http | 是否注册http或https服务 |
spring.cloud.consul.discovery.server-list-query-tags | 服务器列表中要查询的serviceId的→标签的映射。这允许通过单个标签过滤服务。 | |
spring.cloud.consul.discovery.service-name | 服务名称 | |
spring.cloud.consul.discovery.tags | 注册服务时使用的标签 | |
spring.cloud.consul.enabled | true | 启用了spring cloud consul |
spring.cloud.consul.host | localhost | Consul代理主机名。默认为“localhost”。 |
spring.cloud.consul.port | 8500 | Consul代理端口。默认为’8500’。 |
spring.cloud.consul.retry.initial-interval | 1000 | 初始重试间隔(以毫秒为单位)。 |
spring.cloud.consul.retry.max-attempts | 6 | 最大尝试次数。 |
spring.cloud.consul.retry.max-interval | 2000 | 退避的最大间隔 |
spring.cloud.consul.retry.multiplier | 1.1 | 下一个间隔的乘数。 |
如果对亲有用,点个赞呗!!!!