# springcloud **Repository Path**: hdon98/springcloud ## Basic Information - **Project Name**: springcloud - **Description**: Spring Cloud Study - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2021-08-21 - **Last Updated**: 2022-07-14 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Spring-Cloud学习 ## [课程介绍:尚硅谷SpringCloud框架开发教程第二季](https://www.bilibili.com/video/BV18E411x7eT "讲师:周阳") ### 服务注册 #### 1. [Eureka](https://github.com/Netflix/eureka/wiki) ![停止更新](https://img.shields.io/badge/-%E5%81%9C%E6%AD%A2%E6%9B%B4%E6%96%B0-red) > * 简介 > ``` > Eureka Server 提供服务注册服务。 > Eureka Client 提供服务注册服务。 > ``` > * 服务端依赖 > ```xml > > org.springframework.cloud > spring-cloud-starter-netflix-eureka-server > > ``` > * 客户端依赖 > ```xml > > org.springframework.cloud > spring-cloud-starter-netflix-eureka-client > > ``` #### 2. [Zookeeper](https://zookeeper.apache.org/) > * 简介 > ``` > 暂无 > ``` > >* 依赖 > ```xml > > org.springframework.cloud > spring-cloud-starter-zookeeper-discovery > > ``` #### 3. [Consul](https://www.consul.io/intro/index.html) > * 简介 [![中文](https://img.shields.io/badge/-%E4%B8%AD%E6%96%87-green)](https://www.springcloud.cc/spring-cloud-consul.html) > ``` > Consul是一套开源的分布式服务发现和配置管理系统。 > ``` >* 依赖 > ```xml > > org.springframework.cloud > spring-cloud-starter-consul-discovery > > ``` #### 4. Nacos > * 简介 > ``` > 暂无 > ``` ### 负载均衡 #### 1、服务调用1 ##### 1. [Ribbon](https://github.com/Netflix/ribbon/wiki/Getting-Started) ![进入维护](https://img.shields.io/badge/-%E8%BF%9B%E5%85%A5%E7%BB%B4%E6%8A%A4-orange) > * 简介 > ``` > Spring Cloud Ribbon 是基于 Netflix Ribbon 实现的一套客户端负载均衡工具。 > ``` ##### 2. LoadBalancer > * 简介 > ``` > 暂无 > ``` #### 2、服务调用2 ##### 1. [Feign](https://github.com/spring-cloud/spring-cloud-openfeign) ![停止更新](https://img.shields.io/badge/-%E5%81%9C%E6%AD%A2%E6%9B%B4%E6%96%B0-red) > * 简介 > ``` > Feign是一个声明式的Web客户服务端,集成了Ribbon。 > ``` ##### 2. [OpenFeign](https://github.com/spring-cloud/spring-cloud-openfeign) > * 简介 > ``` > OpenFeign 在 Feign 的基础上支持了对 SpringMVC 的注解。 > ``` >* 依赖 > ```xml > > org.springframework.cloud > spring-cloud-starter-openfeign > > ``` ### 服务熔断 #### 1. [Hystrix](https://github.com/Netflix/Hystrix/wiki/How-To-Use) ![停止更新](https://img.shields.io/badge/-%E5%81%9C%E6%AD%A2%E6%9B%B4%E6%96%B0-red) > * 简介 [![star](https://img.shields.io/badge/-%E6%96%AD%E8%B7%AF%E5%99%A8-blue)](https://martinfowler.com/bliki/CircuitBreaker.html) > ``` > Hystrix是一个用于处理分布式系统的延迟和容错的开源库。 > 服务降级: > 服务器忙,请稍后再试,不让客户端等待并立刻返回一个友好提示,fallback > 降级发生情况: > 1、程序超时运行。 > 2、超时。 > 3、服务熔断出发服务降级。 > 4、线程池/信号量打满也会导致服务降级。 > 服务熔断: > 类比保险丝,达到最大访问量之后,直接拒绝访问,然后调用服务降级的方法并返回友好提示。 > 熔断机制是应对雪崩效应的一种微服务链路保护机制,当检测到该节点微服务调用响应正常后,恢复调用链路。 > 服务限流: > 秒杀高并发等操作,严禁一窝蜂的过来拥挤,大家排队,一秒钟进行N个,有序进行。 > ``` > >* @HystrixProperty配置 > ```java > @HystrixCommand(fallbackMethod = "str_ fallbackMethod", > groupKey = "strGroupCommand", > commanakey = "strCommand", > threadPoolKey = "strThreadPool", > commandProperties = { > //--- Execution --- > //设置隔离组策略,THREAD:线程池;SEMAPHORE:信号池隔离 > @HystrixProperty(name = "execution.isolation.strategy", value = "THREAD"), > //当隔离策略选择信号池隔离的时候,用来设置信号池的大小(最大并发数) > @HystrixProperty(name = "execution.isolation.semaphore.maxConcurrentRequests", value = "10"), > //配置命令执行的超时时间 > @HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds", value = "10"), > //是否启用超时时间 > @HystrixProperty(name = "execution.timeout.enabled", value = "true") > //执行超时的时候是否中断 > @HystrixProperty(name = "execution.isolation.thread.interruptOnTimeout", value = "true"), > //执行被取消的时候是否中断 > @HystrixProperty(name = "execution.isolation.thread.interruptOnCancel", value = "true"), > //--- Fallback --- > //允许回调方法执行的最大并发数 > @HystrixProperty(name = "fallback.isolation.semaphore.maxConcurrentRequests", value = "10"), > //服务降级是否启用,是否执行回调函数 > @HystrixProperty(name = "fallback.enabled", value = "true"), > //--- Circuit Breaker --- > //设置断路器是否起作用 > @HystrixProperty(name = "circuitBreaker.enabled", value = "true"), > //该属性用来设置在滚动时间窗中,断路器熔断的最小请求数 > //eg:默认该值为20的时候,如果滚动时间窗(默认10秒)内仅收到了19个请求, > //即使这19个请求都失败了,断路器也不会打开。 > @HystrixProperty(name = "circuitBreaker.requestVolumeThreshold", value = "20"), > //该属性用来设置在滚动时间窗中,表示在滚动的时间窗中,在请求数超过circuitBreaker.requestVolumeThreshold > //的情况下,如果错误请求的百分比超过50,就把断路器设置为“打开”状态,否则就设置为“关闭”状态 > @HystrixProperty(name = "circuitBreaker.errorThresholdPercentage", value = "50"), > //该属性用来设置当断路器打开之后的休眠时间窗,休眠时间窗结束后,会将断路器设置为“半开”状态,尝试熔断的请求命令, > //如果依然失败,就将断路器继续设置为“打开”状态,如果成功,就设置为“关闭状态” > @HystrixProperty(name = "circuitBreaker.sleepWindowInMilliseconds", value = "5000"), > //断路器强制打开 > @HystrixProperty(name = "circuitBreaker.forceOpen", value = "false"), > //断路器强制关闭 > @HystrixProperty(name = "fallback.enabled", value = "false"), > //--- Metrics --- > //滚动时间窗设置,该时间用于断路器判断健康度时,需要收集信息的持续时间 > @HystrixProperty(name = "metrics.rollingStats.timeInMilliseconds", value = "10000"), > //该属性用来设置滚动时间窗统计指标信息时,划分“桶”的数量,断路器在收集指标信息的时候会根据设置的 > //时间窗长度拆分成多个“桶”来累计各度量值,每个“桶”记录了一段时间内的采集指标 > //eg:比如10秒内拆分成10个”桶"收集这样,所以 timeinMilliseconds必须能被 numBuckets整除。 > //否则会抛异常@HystrixProperty(name = "metrics . rollingStats . numBuckets", value = "10"), > @HystrixProperty(name = "metrics.rollingStats.numBuckets", value = "10"), > //该属性用来设置对命令执行的延迟是否使用百分位数来跟踪和计算。如果设置为 false,那么所有的概受统计都将返回-1。 > @HystrixProperty(name = "metrics.rollingPercentile.enabled",value = "false"), > //该属性用来设置百分位统计的滚动窗口的持续时间,单位为毫秒。 > @HystrixProperty(name = "metrics.rollingPercentile.timeinMilliseconds",value = "60000"), > //该属性用来没置百分位统计动口中使用“桶”的数量。 > @HystrixProperty(name = "metrics.rollingPercentile.numBuckets",value = "60000"), > //该属性用来置在执过程中每个“桶”中保的最大执行次数。如在滚动时间窗内发生超过核定值的执行次数, > //就从最初的位置开始重写。 > //eg:将该值没置为100,滚动窗口为10秒,若在10秒内一个“桶”中发生了500执行,那么该“桶”中只保留最后的100的热行的统计。 > //另外,增加该值的大小将会增加内存量的消耗,并增加排序百分位数所需的计算时间。 > @HystrixProperty(name = "metrics.rollingPercentile.bucketSize",value = "100"), > //该属性用来设置来采集影响断路器状态的健康快照(请求的成功、错误百分比)的间隔等待时间 > @HystrixProperty(name = "metrics.healthSnapshot.intervalinMilliseconds",value = "500"), > //--- Request Context --- > //是否开启请求缓存 > @HystrixProperty(name = "requestCache.enabled",value = "true"), > //HystrixCommand的执行和事件是否打印日志到 HystrixRequestLog > @HystrixProperty(name = "requestLog.enabled",value = "true"), > }, > threadPollProperties = { > //该参数用来设置执行命令线程地的核心线程数,该值也就是命令执行的最大并发量 > @HystrixProperty(name = "coreSize",value = "10"), > //该参数用来设置线程地的最大队列大小。当设置为-1时,线程池将使用 SynchronousQueue实现的队列, > //否则将使用 LinkedBLockingQueue实现的队列 > @HystrixProperty(name = "maxQueueSize",value = "-1"), > //该参数用来为队列设置拒绝阀值。过该参数,即使队列没有达到最大值也能拒绝请求 > //该参数主要是对 LinkedBLockingQueue队列的补充, > //因为LinkedBlockingQueue队列不能动态修改它的对象大小,而通过该属性就可纵调整拒绝请求的队列大小了。 > @HystrixProperty(name = "queueSizeRejectionTreshold,value = "5"), > }) > ``` > >* Hystrix Dashboard 配置 > > * 添加依赖文本hystrix-dashboard > ```xml > > org.springframework.cloud > spring-cloud-starter-netflix-hystrix-dashboard > > ``` >* 在启动类名上添加以下注解 >```java >@EnableHystrixDashboard >``` > >* 被监控的服务端 > > * 添加依赖文本actuator > ```xml > > org.springframework.boot > spring-boot-starter-actuator > > ``` > * 如果使用的是2.x比较新的版本,需要在hystrix的消费端配置监控,在启动类添加bean > ```java > @Bean > public ServletRegistrationBean hystrixMetricsStreamServlet() { > ServletRegistrationBean registrationBean = new ServletRegistrationBean(new HystrixMetricsStreamServlet()); > registrationBean.addUrlMappings("/actuator/hystrix.stream");//访问该页面就是监控页面 > return registrationBean; > } >``` > * 如果使用1.X的版本,则启动类添加bean > ```java > @Bean > public ServletRegistrationBean getServlet() { > HystrixMetricsStreamServlet streamServlet = new HystrixMetricsStreamServlet(); > ServletRegistrationBean registrationBean = new ServletRegistrationBean(streamServlet); > registrationBean.setLoadOnStartup(1); > registrationBean.addUrlMappings("/hystrix.stream"); > registrationBean.setName("HystrixMetricsStreamServlet"); > return registrationBean; > } >``` > > >* 官网图例 > > ![hystrix-command-flow-chart](https://i.loli.net/2021/08/25/CU4OHGxfo9PhSpZ.png "官网图例") > >* 步骤说明 > > | 步骤 | 执行方式 | > | :----: | :----- | > | 1、 | 创建HystrixCommand (用在依赖的服务返回单个操作结果的时候)或HystrixObservableCommand (用在依赖的服务返回多个操作结果的时候)对象。 | > | 2、 | 命令执行。中HystrixCommand实现了下面前两种执行方式;而HystrixObservableCommand实现了后两种执行方式: execute(): 同步执行,从依赖的服务返回一个单一的结果对象,或是在发生错误的时候抛出异常。queue(): 异步执行,直接返回-个Future对象,其中包含了服务执行结束时要返回的单一结果对象。observe0: 返回Observable对象。它代表了操作的多个结果,它是一个Hot Observable (不论“事件源”是否有“订阅者"。都会在创建后对事件进行发布,所以对于Hot Observable的每一个“订阅者“都有可能是从”事件源“的中途开始的,井可能只是看到了整个操作的局部过程) . toObservable(): 同样会返回 Observable对象,也代表了操作的多个结果,但它返回的是一个Cold Observable (没有“订阅者”的时候并不会发布事件,而是进行等待,直到有“订阅者“之后才发布事件,所以对于Cold Observable的订阅者,它可以保证从一开始看到整个操作的全部过程) 。 | > | 3、 | 若当前命令的请求缓存功能是被启用的,并且该命令缓存命中。那么缓存的结果会立即以Observable对象的形式返回。 | > | 4、 | 检查断路器是否为打开状态。如果断路器是打开的,那么Hystrix不会执行命令,而是转接到fallback处理逻辑(第8步) ;如果斷路器是关闭的,检查是否有可用资源来执行命令(第5步) 。 | > | 5、 | 线程油/请求队列信号量是否占满,如果命令依赖服务的专有线程油和请求队列,或者信号量(不使用线程池的时候)已经被占满,那么 Hystrix也不会执行命令,而是转接到 fallback处理逻辑(第8步)。 | > | 6、 | Hystrix会根据我们编写的方法来决定采取什么样的方式去请求依赖服务。HystrixCommand.run(): 返回一个单一的结果, 或者抛出异常。HystrixObservableCommand.construct(): 返回一 个Observable对象来发射多个结果,或通过onError发送错误通知。 | > | 7、 | Hystrix会将“成功"、“失败”、“拒绝"、 “超时“等信息报告给断路器,而断路器会维护- 组计数器来统计这些教据, 断路器会使用这些统计数据来决定是否要将断路器打开,来对某个依赖服务的请求进行“熔断/短路"。 | > | 8、 | 当命令执行失败的时候,Hystrix 会进入fallback尝试回退处理,我们通常也称该操作为 “服务降级"。而能够引起服务降级处理的情况有下面几种:第4步:当前命令处于 “熔断/短路“状态。断路器是打开的时候。第5步:当前命令的线程池、请求队列或 者信号量被占满的时候,第6步: HystrixObservableCommand.construct() 或HystrixCommand.run()抛出异常的时候。 | > | 9、 | 当Hystrix命令执行成功之后,它会将处理结果直接返回或是L以observable 的形式返回。 | > | tips | 如果我们没有为命令实现降级逻辑或者在降级处理逻辑中抛出了异常,Hystrix 依然会返回一个Observable对象,但是它不会发射任何结果数据。 而是通过 onError方法通知命令立即中断请求,并通过onError()方法将引起命令失败的异常发送给调用者。 | #### 2. [Resilience4j]() > * 简介 > ``` > 暂无 > ``` #### 3. Sentinel > * 简介 > ``` > 暂无 > ``` ### 服务网关 #### 1. [Zuul](https://github.com/Netflix/zuul/wiki) ![停止更新](https://img.shields.io/badge/-%E5%81%9C%E6%AD%A2%E7%BB%B4%E6%8A%A4-orange) > * 简介 > ``` > zuul 是netflix开源的一个API Gateway 服务器, 本质上是一个web servlet应用。不过现在已经停止维护。 > ``` #### 2. [Zuul2](https://github.com/Netflix/zuul/wiki/Getting-Started-2.0) > * 简介 > ``` > 暂无 > ``` #### 3. [Gateway](https://spring.io/projects/spring-cloud-gateway) > * 简介 > ``` > Gateway是在Spring生态系统之上构建的API网关服务,基于Spring 5,Spring Boot 2和Project Reactor等技术。 > > Gateway旨在提供一种简单而有效的方式来对API进行路由,以及提供一些强大的过滤器功能,例如:熔断、限流、重试等。 > > Spring Cloud Gateway作为Spring Cloud生态系统中的网关,目标是代替Zuul。 > > Spring Cloud Gateway的目标提供统一的路由方式且基于Filter链的方式提供了网关基本的功能,例如:安全,监控/指标、限流。 > > 在Spring Cloud 2.0 以上版本中,没有对新版本的Zuul 2.0以上最新高性能版本进行集成,仍然还是使用Zuul 1.X非Reactor模式的老版本。 > 为了提升网关性能,Spring Cloud Gateway是基于WebFlux框架实现的,而WebFlux框架底层则使用了高性能的Reactor模式通信框架Netty。 > > 总结:Spring Cloud Gateway 使用的 WebFlux中的 Reactor-netty响应式编程组件,底层使用了Netty的通讯框架。 > > Spring Cloud Gateway的功能有: > 1、反向代理 > 2、鉴权 > 3、流量监控 > 4、熔断 > 5、日志监控 > ``` > >* Spring Cloud Gateway三大核心概念 > ``` > Route(路由):路由是构建网关的基本模块,它由ID,目标URL,一系列的断言和过滤器组成,如果断言为true则匹配该路由。 > > Predicate(断言/匹配条件):参考的是Java 8中的java.util.function.Predicate;开发人员可以进行匹配HTTP请求中的所有内容(例如请求头或请求参数),如果请求与断言相匹配则进行路由。 > > Filter(过滤/拦截器):指的是Spring框架中GatewayFilter的实例,使用过滤器,可以在请求被路由前或者之后对请求进行修改。 > ``` > >* 结构图例 > > ![1e60eb9ed08b67edfb17c4256f3244af](https://i.loli.net/2021/08/25/KSMeo9TFVpWnltZ.jpg "结构图例") > >* 工作流程图 > > ![spring_cloud_gateway_diagram](https://i.loli.net/2021/08/25/M98qCSu4HvwaeEo.png "工作流程图") > >* Spring Cloud Gateway 与 Zuul的区别 > ``` > 1、Zuul 1.X 是一个基于阻塞I/O的API Gateway。 > > 2、Zuul 1.X基于Servlet 2.5使用阻塞架构,它不支持任何长连接(如Web Scoket)。Zuul的设计模式和Nginx较像,每次I/O操作都是从工作线程中选择一个执行,请求线程被阻塞到工作县城完成,但是差别是Nginx用C++实现,Zuul用Java实现,而JVM本身会有第一次加载较慢的情况,使得Zuul的性能相对较差。 > > 3、Zuul 2.X理念更先进,想基于Netty非阻塞和支持长连接,但Spring Cloud目前还没有整合。Zuul 2.X较Zuul 1.X有较提升。在性能方面,根据官方提供的基准测试,Spring Cloud Gateway的RPS(每秒请求数)是Zuul的1.6倍。 > > 4、Spring Cloud Gateway建立在SpringFramework 5、Proect Reactor和Spring Boot 2之上,使用非阻塞API。 > > 5、Spring Cloud Gateway还支持WebSocket,并且与Spring紧密集成拥有更好的开发体验。 > ``` >* 添加依赖文本gateway > ```xml > > org.springframework.cloud > spring-cloud-starter-gateway > > ``` > * 去掉依赖文本web > ```xml > > org.springframework.boot > spring-boot-starter-web > > ``` > * 通过YML配置Gateway网关 > ```yaml > spring: > application: > name: spring-cloud-gateway > cloud: > gateway: > discovery: > locator: > enabled: true #开启从注册中心动态创建路由的功能,利用微服务名进行路由 > routes: > #路由ID,没有固定要求,但建议配合服务名 > - id: payment_routh > #匹配后提供服务的路由地址 > #uri: http://localhost:8001 #静态路由 > uri: lb://spring-cloud-payment #通过微服务名实现动态路由 > #断言,路径相匹配的进行路由 > predicates: > - Path=/payment/get/** > > - id: payment_routh2 > #uri: http://localhost:8001 > uri: lb://spring-cloud-payment #通过微服务名实现动态路由 > > #predicate就是为了实现一组匹配规则,让请求过来找到对应的Router进行处理 > predicates: > #断言,路径相匹配的进行路由 > #例如:curl http://localhost:9527/payment/lb > - Path=/payment/lb/** > > #要有参数名username并且值还要是整数才能路由 > #例如:curl http://localhost:9527/payment/lb?username=31 > #- Query=username,\d+ > > #使用GET、POST方法请求 > #例如:curl http://localhost:9527/payment/lb 【GET、POST】 > #- Method=POST > > #请求头要有host属性值。 > #例如:curl http://localhost:9527/payment/lb -H "Host: 【任意值】.ghd" > #- Host=**.ghd > > #请求头要有X-Request-Id属性并且值为整数的正则表达式。 > #例如:curl http://localhost:9527/payment/lb -H "X-Request-Id:1" > #- Header=X-Request-Id,\d+ > > #配置携带cookie访问username=ghd, > #例如:curl http://localhost:9527/payment/lb --cookie "username=ghd" > # curl http://localhost:9527/payment/lb -b "username=ghd" > #- Cookie=username,ghd > > #配置生效时间,可以在test文件夹中生成;有after、 before、 between > #- After=2021-08-25T19:04:49.952+08:00[Asia/Shanghai] > ``` > * 通过Config.java文件对Gateway进行配置 > ```java > /*** > * 配置一个ID为path的路由规则 > * 当访问地址:http://localhost:9527/guonei时会自动转发到地址:http://news.baidu.com/guonei > * > * @Author: GHD > * @Date: 2021/8/25 18:05 > * @Param routeLocatorBuilder > * @return: org.springframework.cloud.gateway.route.RouteLocator > **/ > @Bean > public RouteLocator routers(RouteLocatorBuilder routeLocatorBuilder) { > RouteLocatorBuilder.Builder routers = routeLocatorBuilder.routes(); > routers.route("path", r -> r.path("/guonei").uri("http://news.baidu.com/guonei")).build(); > return routers.build(); > } > ``` > > * Filter的使用 > ```java > @Component > @Slf4j > public class MyLogGatewayFilter implements GlobalFilter, Ordered { > /*** > * 全局过滤器 > * > * @MethodName: filter > * @Author: GHD > * @Param exchange, chain > * @return: reactor.core.publisher.Mono > * @Date: 2022/7/9 19:27 > **/ > @Override > public Mono filter(ServerWebExchange exchange, GatewayFilterChain chain) { > log.info("**************come in MyLogGatewayFilter:"+new Date()); > String uname = exchange.getRequest().getQueryParams().getFirst("uname"); > if (uname == null){ > log.info("********用户名为null,非法用户"); > exchange.getResponse().setStatusCode(HttpStatus.NOT_ACCEPTABLE); > return exchange.getResponse().setComplete(); > } > //过滤链 > return chain.filter(exchange); > } > /*** > * 加载过滤器顺序,数字越小,优先级越高 > * > * @MethodName: getOrder > * @Author: GHD > * @return: int > * @Date: 2022/7/9 19:17 > **/ > @Override > public int getOrder() { > return 0; > } > } > ``` ### 服务配置 #### 1. [Config](https://docs.spring.io/spring-cloud-config/docs/current/reference/html) > * 简介 > ``` > Spring Cloud Config为微服务架构中的微服务提供集中化的外部配置支持,配置服务器为各个不同微服务应用的所有环境提供了一个中心化的外部配置。 > > Spring Cloud COnfig分为服务端和客户端两部分。 > > 服务端也成为分布式配置中心,它是一个独立的微服务应用,用来连接配置服务器并为客户端提供获取配置信息,加密/解密信息等访问接口。 > > 客户端则是通过指定的配置中心来管理应用资源,以及业务相关的配置内容,并在启动的时候从配置中心获取和加载配置信息配置服务器默认采用git来储存配置信息,这样就有助于对环境配置进行版本管理,并且可以通过git客户端工具来方便的管理和访问配置内容。 > > Spring Cloud Config的作用: > 1、集中管理配置文件。 > 2、不同环境不同配置,动态画的配置更新,分环境部署比如dev/test/prod/beta/release。 > 3、运行期间动态调整配置,不再需要在每个服务部署的机器上编写配置文件,服务会向配置中心统一拉取配置自己的信息。 > 4、当配置发生变动时,服务不需要重启即可感知到配置的变化并应用新的配置。 > 5、将配置信息以REST接口的形式暴露。 > ``` > * 业务逻辑图 > > ![spring_cloud_config_diagram](https://s2.loli.net/2022/07/09/mY1TotlS2McRvNy.png "业务逻辑图") > > * bootstrap.yml 与 application.yml 说明 > > ``` > application.yml是用户级的资源配置项。 > bootstrap.yml是系统级的,优先级更加高。 > > Spring Cloud会创建一个“Bootstrap Context”,作为Spring应用的“Application Context”的父上下文。初始化的时候,“Bootstrap Context”负责从外部源加载配置属性并解析配置。这两个上下文共享一个从外部获取的“Environment”。 > > “Bootstrap”具有高优先级,默认情况下,它们不会被本地配置覆盖。“Bootstrap Context”和“Application Context”有着不同的约定,所以新增一个“bootstrap.yml”文件,保证“Bootstrap Context”和“Application Context”配置的分离。 > > 要将Client模块下的application.yml文件改为bootstrap.yml,这是很关键的。 > 因为bootstrap.yml是比application.yml先加载的,bootstrap.yml优先级高于application.yml。 > ``` > * Config-Client 手动刷新 > > * 1、在POM依赖中需要添加actuator监控 > ``` xml > > org.springframework.boot > spring-boot-starter-actuator > > ``` > * 2、修改YML暴露监控端口 > ``` yaml > management: > endpoints: > web: > exposure: > include: "*" > ``` > * 3、添加@RefreshScope修改Controller业务类 > ``` java > @RestController > @RefreshScope > public class ConfigClientController { > > @Value("${config.info}") > private String configInfo; > > @GetMapping("/configInfo") > public String getConfigInfo(){ > return configInfo; > } > } > ``` > * 4、通过命令发送请求刷新客户端 > ``` > curl -X POST http://localhost:3355/actuator/refresh > ``` #### 2. Nacos > * 简介 > ``` > 暂无 > ``` ### 服务总线 #### 1. Bus > * 简介 > ``` > 暂无 > ``` #### 2. Nacos > * 简介 > ``` > 暂无 > ```