Consul快速入门(三):Spring Cloud Consul实现服务注册与发现

1、前言

本文通过创建provider-service、consumer-service两个微服务,并通过feign接口调用来演示Spring Cloud整合Consul。阅读本文需要前置知识:

  • Spring Boot
  • Spring Cloud
  • Spring Cloud Feign

2、搭建provider-service服务

2.1、创建maven模块

创建provider项目,添加provider-service、provider-service-remote-api两个maven模块:

provider-module.png

2.2、添加spring boot、spring cloud依赖

在父模块provider中添加spring boot、spring cloud依赖
,spring cloud使用截止当前最新版本Hoxton.SR1,关联spring boot版本2.2.2.RELEASE

<properties>
    <java.version>1.8</java.version>
    <spring-cloud.version>Hoxton.SR1</spring-cloud.version>
</properties>

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.2.2.RELEASE</version>
    <relativePath/> <!-- lookup parent from repository -->
</parent>

<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>

注意:spring boot和spring cloud之间有版本依赖关系,如果想用其他版本,请自行查询对应的依赖版本,否则可能由于不兼容服务起不来

2.3、provider-service-remote-api模块编写feign接口

maven模块provider-service-remote-api引入spring cloud feign

<dependencies>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-openfeign</artifactId>
    </dependency>
</dependencies>

代码编写,新建IProviderRemoteService接口

@FeignClient(name = "provider-service")
public interface IProviderRemoteService {

    @RequestMapping(value = "hello", method = RequestMethod.GET)
    String hello();
}

2.4、provider-service模块编写接口实现

maven依赖

<dependency>
    <groupId>com.example</groupId>
    <artifactId>provider-service-remote-api</artifactId>
    <version>0.0.1-SNAPSHOT</version>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

接口实现类ProviderRemoteService

@RestController
public class ProviderRemoteService implements IProviderRemoteService {

    @Override
    public String hello() {
        return "hello world!";
    }
}

2.5、集成spring cloud consul

引入spring cloud consul模块

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-consul-discovery</artifactId>
</dependency>

application.yml添加consul配置

server:
  port: 8080
spring:
  application:
    name: provider-service
  cloud:
    consul:
      host: 127.0.0.1
      port: 8500
      discovery:
        heartbeat:
          enabled: true

启动类添加@EnableDiscoveryClient注解,启用服务发现功能

@SpringBootApplication
@EnableDiscoveryClient
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }

}

到此,provider-service服务已经全部搭建完毕,完整项目结构:

provider-service.png

3、搭建consumer-service服务

3.1、创建maven模块

创建consumer项目,添加consumer-service,因为该服务不需要对外提供接口,所以无需consumer-service-remote-api模块:
consumer-module.png

3.2、consumer-service编写接口调用provider-service服务

引用provider-service-remote-api

<dependency>
    <groupId>com.example</groupId>
    <artifactId>provider-service-remote-api</artifactId>
    <version>0.0.1-SNAPSHOT</version>
</dependency>

编写测试接口,通过feign调用provider-service服务

@RestController
public class ConsumerController {

    @Autowired
    private IProviderRemoteService providerRemoteService;

    @RequestMapping(value = "/test")
    public String test() {
        return providerRemoteService.hello();
    }
}

3.3、集成spring cloud consul

同provider-service服务一样,引入spring cloud consul模块

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-consul-discovery</artifactId>
</dependency>

application.yml添加consul配置

server:
  port: 9090
spring:
  application:
    name: consumer-service
  cloud:
    consul:
      host: 127.0.0.1
      port: 8500
      discovery:
        heartbeat:
          enabled: true

启动类添加@EnableDiscoveryClient注解,启用服务发现功能,并添加@EnableFeignClients注解,启用feign功能

@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }

}

到此,consumer-service服务也搭建完成,完整项目结构:

consumer-service.png

4、测试

4.1、启动consul服务

为了便于测试,笔者在本机以开发者模式起了一个consul服务

D:\consul>consul agent -dev
==> Starting Consul agent...
           Version: 'v1.7.0'
           Node ID: 'c43eedeb-f211-dbf2-e3fa-3caa64f86ddb'
         Node name: 'DESKTOP-77V3R9P'
        Datacenter: 'dc1' (Segment: '<all>')
            Server: true (Bootstrap: false)
       Client Addr: [127.0.0.1] (HTTP: 8500, HTTPS: -1, gRPC: 8502, DNS: 8600)
      Cluster Addr: 127.0.0.1 (LAN: 8301, WAN: 8302)
           Encrypt: Gossip: false, TLS-Outgoing: false, TLS-Incoming: false, Auto-Encrypt-TLS: false

==> Log data will now stream in as it occurs:

    2020-02-22T15:34:07.878+0800 [DEBUG] agent: Using random ID as node ID: id=c43eedeb-f211-dbf2-e3fa-3caa64f86ddb
    2020-02-22T15:34:07.900+0800 [DEBUG] agent.tlsutil: Update: version=1
    2020-02-22T15:34:07.914+0800 [DEBUG] agent.tlsutil: OutgoingRPCWrapper: version=1
    2020-02-22T15:34:07.916+0800 [INFO]  agent.server.raft: initial configuration: index=1 servers="[{Suffrage:Voter ID:c43eedeb-f211-dbf2-e3fa-3caa64f86ddb Address:127.0.0.1:8300}]"
    2020-02-22T15:34:07.916+0800 [INFO]  agent.server.raft: entering follower state: follower="Node at 127.0.0.1:8300 [Follower]" leader=
    2020-02-22T15:34:07.919+0800 [INFO]  agent.server.serf.wan: serf: EventMemberJoin: DESKTOP-77V3R9P.dc1 127.0.0.1
    2020-02-22T15:34:07.920+0800 [INFO]  agent.server.serf.lan: serf: EventMemberJoin: DESKTOP-77V3R9P 127.0.0.1
    2020-02-22T15:34:07.920+0800 [INFO]  agent.server: Adding LAN server: server="DESKTOP-77V3R9P (Addr: tcp/127.0.0.1:8300) (DC: dc1)"
    2020-02-22T15:34:07.921+0800 [INFO]  agent.server: Handled event for server in area: event=member-join server=DESKTOP-77V3R9P.dc1 area=wan
    2020-02-22T15:34:07.921+0800 [INFO]  agent: Started DNS server: address=127.0.0.1:8600 network=udp
    2020-02-22T15:34:07.923+0800 [INFO]  agent: Started DNS server: address=127.0.0.1:8600 network=tcp
    2020-02-22T15:34:07.926+0800 [INFO]  agent: Started HTTP server: address=127.0.0.1:8500 network=tcp
    2020-02-22T15:34:07.928+0800 [INFO]  agent: started state syncer
==> Consul agent running!
...

4.2、启动服务注册到consul

分别启动provider-service服务和consumer-service服务,访问consul的Web UI界面可以看到两个服务都注册上来了:

consul-services.png

consul-nodes.png

4.3、调用测试接口

调用consumer-service测试接口http://127.0.0.1:9090/test

invoke.png

现在尝试把provider服务停止,consul注册中心可以看到健康检查状态为Critical,服务已经下线

`critical.png

此时,再次调用consumer-service测试接口,会报找不到服务

service not found.ong

5、Spring Cloud Consul应用配置

NameDefaultDescription
spring.cloud.consul.config.acl-token
spring.cloud.consul.config.data-keydataIf format is Format.PROPERTIES or Format.YAML then the following field is used as key to look up consul for configuration.
spring.cloud.consul.config.default-contextapplication
spring.cloud.consul.config.enabledTRUE
spring.cloud.consul.config.fail-fastTRUEThrow exceptions during config lookup if true, otherwise, log warnings.
spring.cloud.consul.config.format
spring.cloud.consul.config.nameAlternative to spring.application.name to use in looking up values in consul KV.
spring.cloud.consul.config.prefixconfig
spring.cloud.consul.config.profile-separator,
spring.cloud.consul.config.watch.delay1000The value of the fixed delay for the watch in millis. Defaults to 1000.
spring.cloud.consul.config.watch.enabledTRUEIf the watch is enabled. Defaults to true.
spring.cloud.consul.config.watch.wait-time55The number of seconds to wait (or block) for watch query, defaults to 55. Needs to be less than default ConsulClient (defaults to 60). To increase ConsulClient timeout create a ConsulClient bean with a custom ConsulRawClient with a custom HttpClient.
spring.cloud.consul.discovery.acl-token
spring.cloud.consul.discovery.catalog-services-watch-delay1000The delay between calls to watch consul catalog in millis, default is 1000.
spring.cloud.consul.discovery.catalog-services-watch-timeout2The number of seconds to block while watching consul catalog, default is 2.
spring.cloud.consul.discovery.consistency-modeConsistency mode for health service request.
spring.cloud.consul.discovery.datacentersMap of serviceId’s → datacenter to query for in server list. This allows looking up services in another datacenters.
spring.cloud.consul.discovery.default-query-tagTag to query for in service list if one is not listed in serverListQueryTags.
spring.cloud.consul.discovery.default-zone-metadata-namezoneService instance zone comes from metadata. This allows changing the metadata tag name.
spring.cloud.consul.discovery.deregisterTRUEDisable automatic de-registration of service in consul.
spring.cloud.consul.discovery.enabledTRUEIs service discovery enabled?
spring.cloud.consul.discovery.fail-fastTRUEThrow exceptions during service registration if true, otherwise, log warnings (defaults to true).
spring.cloud.consul.discovery.health-check-critical-timeoutTimeout to deregister services critical for longer than timeout (e.g. 30m). Requires consul version 7.x or higher.
spring.cloud.consul.discovery.health-check-headersHeaders to be applied to the Health Check calls.
spring.cloud.consul.discovery.health-check-interval10sHow often to perform the health check (e.g. 10s), defaults to 10s.
spring.cloud.consul.discovery.health-check-path/actuator/healthAlternate server path to invoke for health checking.
spring.cloud.consul.discovery.health-check-timeoutTimeout for health check (e.g. 10s).
spring.cloud.consul.discovery.health-check-tls-skip-verifySkips certificate verification during service checks if true, otherwise runs certificate verification.
spring.cloud.consul.discovery.health-check-urlCustom health check url to override default.
spring.cloud.consul.discovery.heartbeat.enabledFALSE
spring.cloud.consul.discovery.heartbeat.interval-ratio
spring.cloud.consul.discovery.heartbeat.ttl30s
spring.cloud.consul.discovery.hostnameHostname to use when accessing server.
spring.cloud.consul.discovery.include-hostname-in-instance-idFALSEWhether hostname is included into the default instance id when registering service.
spring.cloud.consul.discovery.instance-groupService instance group.
spring.cloud.consul.discovery.instance-idUnique service instance id.
spring.cloud.consul.discovery.instance-zoneService instance zone.
spring.cloud.consul.discovery.ip-addressIP address to use when accessing service (must also set preferIpAddress to use).
spring.cloud.consul.discovery.lifecycle.enabledTRUE
spring.cloud.consul.discovery.management-portPort to register the management service under (defaults to management port).
spring.cloud.consul.discovery.management-suffixmanagementSuffix to use when registering management service.
spring.cloud.consul.discovery.management-tagsTags to use when registering management service.
spring.cloud.consul.discovery.order0Order of the discovery client used by?CompositeDiscoveryClient?for sorting available clients.
spring.cloud.consul.discovery.portPort to register the service under (defaults to listening port).
spring.cloud.consul.discovery.prefer-agent-addressFALSESource of how we will determine the address to use.
spring.cloud.consul.discovery.prefer-ip-addressFALSEUse ip address rather than hostname during registration.
spring.cloud.consul.discovery.query-passingFALSEAdd the 'passing` parameter to /v1/health/service/serviceName. This pushes health check passing to the server.
spring.cloud.consul.discovery.registerTRUERegister as a service in consul.
spring.cloud.consul.discovery.register-health-checkTRUERegister health check in consul. Useful during development of a service.
spring.cloud.consul.discovery.schemehttpWhether to register an http or https service.
spring.cloud.consul.discovery.server-list-query-tagsMap of serviceId’s → tag to query for in server list. This allows filtering services by a single tag.
spring.cloud.consul.discovery.service-nameService name.
spring.cloud.consul.discovery.tagsTags to use when registering service.
spring.cloud.consul.enabledTRUEIs spring cloud consul enabled.
spring.cloud.consul.hostlocalhostConsul agent hostname. Defaults to ‘localhost’.
spring.cloud.consul.port8500Consul agent port. Defaults to ‘8500’.
spring.cloud.consul.retry.initial-interval1000Initial retry interval in milliseconds.
spring.cloud.consul.retry.max-attempts6Maximum number of attempts.
spring.cloud.consul.retry.max-interval2000Maximum interval for backoff.
spring.cloud.consul.retry.multiplier1.1Multiplier for next interval.
spring.cloud.consul.schemeConsul agent scheme (HTTP/HTTPS). If there is no scheme in address - client will use HTTP.
spring.cloud.consul.tls.certificate-passwordPassword to open the certificate.
spring.cloud.consul.tls.certificate-pathFile path to the certificate.
spring.cloud.consul.tls.key-store-instance-typeType of key framework to use.
spring.cloud.consul.tls.key-store-passwordPassword to an external keystore.
spring.cloud.consul.tls.key-store-pathPath to an external keystore.

来源官网:https://cloud.spring.io/spring-cloud-consul/reference/html/appendix.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值