5

Spring Cloud Config服务端的配置小伙伴们应该都很熟悉了,本文我们主要来看看客户端配置的一些细节问题。


本文是Spring Cloud系列的第二十五篇文章,了解前二十四篇文章内容有助于更好的理解本文:

1.使用Spring Cloud搭建服务注册中心
2.使用Spring Cloud搭建高可用服务注册中心
3.Spring Cloud中服务的发现与消费
4.Eureka中的核心概念
5.什么是客户端负载均衡
6.Spring RestTemplate中几种常见的请求方式
7.RestTemplate的逆袭之路,从发送请求到负载均衡
8.Spring Cloud中负载均衡器概览
9.Spring Cloud中的负载均衡策略
10.Spring Cloud中的断路器Hystrix
11.Spring Cloud自定义Hystrix请求命令
12.Spring Cloud中Hystrix的服务降级与异常处理
13.Spring Cloud中Hystrix的请求缓存
14.Spring Cloud中Hystrix的请求合并
15.Spring Cloud中Hystrix仪表盘与Turbine集群监控
16.Spring Cloud中声明式服务调用Feign
17.Spring Cloud中Feign的继承特性
18.Spring Cloud中Feign配置详解
19.Spring Cloud中的API网关服务Zuul
20.Spring Cloud Zuul中路由配置细节
21.Spring Cloud Zuul中异常处理细节
22.分布式配置中心Spring Cloud Config初窥
23.Spring Cloud Config服务端配置细节(一)
24.Spring Cloud Config服务端配置细节(二)之加密解密


服务化配置中心

在前面几篇关于Spring Cloud Config配置中心的文章中,我们在config-client中配置config-server地址的时候都是直接将地址写死,这种方式显然不够灵活,有的小伙伴可能已经想到了,这里我们可以结合eureka注册中心,然后在配置的时候直接使用服务名即可,OK,那我们对之前的项目稍加改造吧。

config-server改造

这里的改造都是非常简单的,服务端改造和客户端改造都是分三步走:1.添加依赖;2.添加注解;3.修改application.properties.

首先我们在config-server中添加如下依赖:

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

然后在config-server的入口类上添加@EnableDiscoveryClient注解,表示这是一个Eureka客户端,如下:

@SpringBootApplication
@EnableConfigServer
@EnableDiscoveryClient
public class ConfigServerApplication {

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

最后在application.properties中配置eureka注册中心地址:

eureka.client.service-url.defaultZone=http://localhost:1111/eureka/

至此,我们的config-server就配置成功了。

config-client改造

config-client改造第一步也是先添加依赖,如下:

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

然后入口类添加@EnableDiscoveryClient注解,如下:

@SpringBootApplication
@EnableDiscoveryClient
public class ConfigClientApplication {

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

最后修改配置文件,如下:

spring.application.name=app
# dev根据具体情况来修改
spring.cloud.config.profile=dev
spring.cloud.config.label=master
eureka.client.service-url.defaultZone=http://localhost:1111/eureka/
spring.cloud.config.discovery.enabled=true
spring.cloud.config.discovery.service-id=config-server
server.port=2008

关于这个配置文件我说如下三点:

1.eureka.client.service-url.defaultZone设置了注册中心的地址,将config-client注册到eureka注册中心中去
2.spring.cloud.config.discovery.enabled表示开启通过服务名来访问config-server
3.spring.cloud.config.discovery.service-id=config-server则表示config-server的服务名

测试

OK,经过以上的改造之后,此时我们分别启动eureka服务注册中心、config-server、config-client,然后访问http://localhost:1111,可以看到两个应用都已经注册成功了:

图片描述

然后继续测试config-client的/sang接口,结果如下:

图片描述

没问题。

好了,服务化配置中心构建成功。

失败快速响应

不作任何额外配置的情况下,失败响应有点迟钝,举个简单的例子,关掉config-server,我们直接启动config-client,此时启动会报错,但是报错时间较晚,报错的时候系统已经打印了许多启动日志了,如果我们希望在启动失败时能够快速响应,方式很简单,config-client中添加如下配置即可:

spring.cloud.config.fail-fast=true

此时不启动config-server直接启动config-client依然会报错,但是我们看到报错时间较早,系统都没打印几条启动日志。

重试机制

如果由于网络抖动等原因导致config-client在启动时候访问config-server没有访问成功从而报错,这显然是不划算的,遇到这种情况我们希望config-client最好能重试几次,重试机制在这里也是受支持的,添加重试机制的方式很简单,引入如下两个依赖:

<dependency>
    <groupId>org.springframework.retry</groupId>
    <artifactId>spring-retry</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-aop</artifactId>
</dependency>

引入依赖就OK了,不用做任何额外配置(当然要确保失败快速响应已开启),此时我们再尝试不启动config-server直接启动config-client,得到的启动日志如下:

图片描述

我们看到,config-client一共尝试了六次去访问config-server,六次都失败了才抛异常。

和重试机制相关的配置有如下四个:

# 配置重试次数,默认为6
spring.cloud.config.retry.max-attempts=6
# 间隔乘数,默认1.1
spring.cloud.config.retry.multiplier=1.1
# 初始重试间隔时间,默认1000ms
spring.cloud.config.retry.initial-interval=1000
# 最大间隔时间,默认2000ms
spring.cloud.config.retry.max-interval=2000

动态刷新配置

有的时候,我动态的更新了Git仓库中的配置文件,那么我如何让我的config-client能够及时感知到呢?方式很简单,首先在config-client中添加如下依赖:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

该依赖中包含了/refresh端点的实现,我们将利用这个端点来刷新配置信息。然后需要在application.properties中配置忽略权限拦截:

management.security.enabled=false

OK,配置好之后,启动eureka注册中心,config-server和config-client,访问http://localhost:2008/sang,结果如下:

图片描述

此时我利用Git客户端工具,将app-dev.properties中的内容修改一下,修改成功之后,先用POST请求访问http://localhost:2008/refresh地址,结果如下:

图片描述

然后再访问http://localhost:2008/sang,结果如下:

图片描述

我们看到配置文件已经更新了。

OK,Spring Cloud Config客户端的配置我们就说到这里,有问题欢迎小伙伴们留言讨论。

参考资料:

1.《Spring Cloud微服务实战》

更多JavaEE资料请关注公众号:

图片描述


江南一点雨
9.1k 声望7.6k 粉丝

《Spring Boot+Vue全栈开发实战》作者