【Spring Cloud 之 Consul】2019-01-27 SpringCloud使用Consul作为服务注册和发现中心

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/kye055947/article/details/86671836

【Spring Cloud 之 Consul】2019-01-27 SpringCloud使用Consul作为服务注册和发现中心

1. consul 的安装

2. 搭建 consul 服务端(SpringCloud 往 consul 注册服务)

window系统安装consule

linux系统安装consule

本博客采用的是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 运行 ConsulServerApplicationmain 方法

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 下一个间隔的乘数。

如果对亲有用,点个赞呗!!!!

猜你喜欢

转载自blog.csdn.net/kye055947/article/details/86671836