领事首次使用 Spring Cloud 配置进行引导

Posted

技术标签:

【中文标题】领事首次使用 Spring Cloud 配置进行引导【英文标题】:consul first bootstrap with spring cloud config 【发布时间】:2016-08-06 09:51:57 【问题描述】:

我使用 spring-cloud-config 进行集中配置和 consul 进行服务发现。就像 eureka first bootstrap - spring 是否支持 consul first bootstrap 即启动客户端服务 - 我应该通过 consul 查找配置服务器。反之亦然,即在配置客户端 bootstrap.properties 中,我提供了 spring.cloud.config.uri=http://localhost:8888,它位于配置服务器并从中提取配置。在我的客户端应用程序的配置存储库中 - 我提供了如下领事配置:

spring.cloud.consul.host=localhost , 
spring.cloud.consul.port=8500

但是,当我尝试使用 consul first bootstrap 时,我无法从配置服务器读取属性。

客户端应用程序(用于领事首次引导):

pom.xml
<parent>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-starter-parent</artifactId>
      <!-- <version>Brixton.BUILD-SNAPSHOT</version> -->
      <version>Brixton.M5</version>
      <relativePath /> 
    </parent>
<dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-aop</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.retry</groupId>
            <artifactId>spring-retry</artifactId>
        </dependency>
     <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-consul-config</artifactId>
        </dependency> 
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-consul-all</artifactId>
        </dependency>
<dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-zuul</artifactId>
        </dependency>
</dependencies>

bootstrap.properties:

spring.application.name=demo
spring.cloud.config.failFast=true
spring.cloud.config.retry.maxAttempts=20
spring.cloud.config.retry.initialInterval=3000
spring.cloud.consul.host=localhost
spring.cloud.consul.port=8500

DemoApplication.java

@EnableDiscoveryClient
@EnableZuulProxy
@SpringBootApplication
public class DemoSleuthApplication 
    public static void main(String[] args) 
        SpringApplication.run(DemoSleuthApplication.class, args);
    

@RefreshScope
@RestController
class RestAPIController 

    @Value(value = "$server.port")
    String port;

    @Value(value = "$message")
    String message;

@RequestMapping("/message")
      public String welcome()
          String s = this.restTemplate.getForObject("http://localhost:"+this.port+"/message", String.class);
          return this.message + s;
      

在领事K/V商店 文件夹结构配置/演示 键/值:spring.cloud.config.uri=http://localhost:8888

配置服务器 git repo:为简洁起见,不添加配置服务器代码 demo.properties

server.port=9080
message=test

理想情况下,当我实现 consul first bootstrap 的概念时 - 我认为 consul 应该启动,并且客户端应该使用 @EnableDiscoveryClient 注释和 consul 属性来标识自己 - 找到配置服务器 url 并获取配置属性从服务器配置。但就我而言,服务正在 consul 中被发现和注册,但我无法从配置服务器 git repo 读取属性。

【问题讨论】:

【参考方案1】:

在此提供我的示例代码以造福他人。我不得不对属性文件做很多修改才能做到这一点。 正如@spencergibb 所回答的那样,它目前仅在 SNAPSHOT 中可用。

这次我没有在 consul 中使用任何键值属性。 配置服务器代码: pom.xml:

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

application.yml

 spring:
    profiles:
     active: native
    cloud:
     config:
       server:
        native:
          search-locations: file://$HOME/properties 
    consul:
      port: 8500
      host: localhost
      enabled: true
      discovery:
        enabled: true
        register: true
        service-name: server --registers in consul as server instead of config-server 
        hostname: localhost
server:
  port: 8888

bootstrap.yml ::

spring:
  application:
    name: config-server

配置服务器应用程序.java

@EnableDiscoveryClient
@EnableConfigServer
@SpringBootApplication
public class SpringConfigServerApplication 
public static void main(String[] args) 
  SpringApplication.run(SpringConfigServerApplication.class, args);
 

客户端微服务:演示

<parent>
   <groupId>org.springframework.cloud</groupId>
   <artifactId>spring-cloud-starter-parent</artifactId>
   <version>Brixton.BUILD-SNAPSHOT</version>
 <!--   <version>Brixton.M5</version> -->
   <relativePath /> 
 </parent>
<dependency>
   <groupId>org.springframework.cloud</groupId>
   <artifactId>spring-cloud-starter-config</artifactId>
 </dependency>
<dependency>
   <groupId>org.springframework.cloud</groupId>
   <artifactId>spring-cloud-starter-consul-all</artifactId>
 </dependency>

bootstrap.properties

spring.application.name=demo-spring-cloud-sleuth
spring.cloud.config.failFast=true
spring.cloud.config.retry.maxAttempts=20
spring.cloud.config.retry.initialInterval=3000
spring.cloud.config.enabled=true
spring.cloud.config.discovery.enabled=true
spring.cloud.config.discovery.serviceId=config-server
spring.cloud.consul.discovery.hostName=localhost
spring.cloud.consul.discovery.register=true -- unless this is there, the service fails to register in consul.

客户端的 git uri 属性文件:

server.port=9082
message=message local
foo1=bar

【讨论】:

【参考方案2】:

已完成here。它在 SNAPSHOTS 和 RC2 中可用,有望在下周推出。

【讨论】:

以上是关于领事首次使用 Spring Cloud 配置进行引导的主要内容,如果未能解决你的问题,请参考以下文章

Spring Cloud 合约功能

使用 Consul 实现高可用性的 Spring Cloud

Spring Cloud Consul 和 Consul Clients dockerized

领事与 API 网关

Spring cloud alibaba Nacos配置中心多数据源配置,Nacos使用占位符${}进行参数配置,Nacos配置MySQL持久化保存配置信息

Spring Cloud Config 配置中心 自动加解密功能