Netflix之后,如何用Spring Cloud 新组件构建微服务架构?( 二 )
借助配置服务器 , 我们能有一个中心化的位置管理应用在所有环境下的外部属性 。 有一些其他的方案可用作基于微服务的架构的配置服务器 , 如Consul、ZooKeeper和AlibabaNacos 。 但是 , 从严格意义上来讲 , 所有的这些方案都不是专门的分布式配置 , 它们也可以用作服务发现的服务器 。 SpringCloudConfig可能会集成不同的工具来存储数据 。 服务器存储后端的默认实现是使用git , 但是我们也能使用像HashiCorpVault这样的工具来管理secret和保护敏感数据 , 也可以使用简单的文件系统 。 在一个配置服务器应用中 , 可能会将不同的后端组合在一起 。 我们只需要在应用属性文件中通过spring.profiles.active激活对应的profile即可 。 我们可以覆盖一些默认值 , 比如修改Vault服务器的地址或设置认证token 。 host:192.168.99.100authentication:TOKENtoken:spring-microservices-course对Consul来讲 , 同样如此 , 在开发模式下 , 我们应该使用Docker来运行Vault实例 。 我们可以使用环境变量VAULT_DEV_ROOT_TOKEN_ID设置一个静态的根token用于进行认证:$dockerrun-d--namevault--cap-add=IPC_LOCK-e'VAULT_DEV_ROOT_TOKEN_ID=spring-microservices-course'-p8200:8200vault:1.4.0当SpringCloudConfig与服务发现一起使用时 , 我们可以在两种可用的方式间做出选择 , 即ConfigFirstBootstrap和DiscoveryFirstBootstrap 。 在DiscoveryFirstBootstrap中 , 配置服务器会将自身注册到发现服务中 。 借助这一点 , 每个微服务都能基于配置服务器的注册id找到它 。
因为配置是在引导阶段注入的 , 我们需要使用bootstrap.yml在客户端设置属性 。 为了在客户端启用配置服务器的“发现”功能 , 我们需要将spring.cloud.config.discovery.enabled属性设置为true 。 如果配置服务器的注册服务id与自动配置的configserverconfig-server)不同的话 , 我们还应该覆盖它 。 当然 , 还可以使用Consul作为配置属性源 。 4服务间通信目前 , 有三种基于HTTP的Spring组件可用于服务间的通信 , 它们都与服务发现进行了集成:同步的RestTemplate、反应式的WebClient以及声明式的REST客户端OpenFeign 。 RestTemplate组件可以通过SpringWeb模块获取 , WebClient能通过SpringWebFlux模块获取 。 要包含SpringCloudOpenFeign的话 , 我们需要一个专门的starter 。 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-webflux</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId></dependency>要使用或WebClient进行支持服务发现的通信 , 我们需要注册bean并为它们添加@LoadBalanced注解 。 我们最好还要为这样的通信设置恰当的超时时间 , 当不使用断路器的时候 , 更应如此 。 @SpringBootApplication@EnableFeignClientsclassInterCallerServiceApplication{@Bean@LoadBalancedfuntemplate:RestTemplate=RestTemplateBuilder.setReadTimeout(Duration.ofMillis(100)).setConnectTimeout(Duration.ofMillis(100)).buildfunclientBuilder:WebClient.Builder{valtcpClient:TcpClient=TcpClient.create.option(ChannelOption.CONNECT_TIMEOUT_MILLIS,100).doOnConnected{conn->conn.addHandlerLast(ReadTimeoutHandler(100,TimeUnit.MILLISECONDS))}valconnector=ReactorClientHttpConnector(HttpClient.from(tcpClient))returnWebClient.builder.clientConnector(connector)}}SpringCloudLoadBalancer提供了自己的抽象和实现 。 为了实现负载均衡机制 , SpringCloud添加了ReactiveLoadBalancer接口 , 并支持基于Round-Robin和Random的实现 。目前 , 对于负载均衡的定制化并没有太多的选项 。 不过 , 选项之一就是配置客户端缓存的能力 。 默认情况下 , 每个客户端缓存目标服务的列表并且每隔30秒刷新一次 。 在你的场景下 , 这样的间隔可能会有些长 。 在配置中 , 我们可以很容易地修改它 , 如下面的样例 , 我们将其设置成1秒 。 如果你的负载均衡器与Eureka服务发现进行集成的话 , 还需要减少获取注册表的时间间隔 , 默认它是30秒钟 。 在修改配置之后 , 这两个对客户端的变更能几乎立即刷新当前运行的服务的列表 。
ttl:1s5断路器断路器是微服务架构中一个很流行的设计模式 。 它被设计用来探测失败并封装阻止失败不断重复出现的逻辑 。 SpringCloud提供了一个使用不同断路器的实现 。 针对Resilience4J , 有两个实现 , 分别用于反应式应用和非反应式应用 。 要启用非反应式的实现 , 我们要包含如下的依赖 。
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-circuitbreaker-resilience4j</artifactId></dependency>如下是负责注册Customizerbean的代码 , 这个bean配置了断路器的行为 。 @BeanfundefaultCustomizer:Customizer<Resilience4JCircuitBreakerFactory>{returnCustomizer{factory:Resilience4JCircuitBreakerFactory->Resilience4JConfigBuilder(id).timeLimiterConfig(TimeLimiterConfig.custom.timeoutDuration(Duration.ofMillis(500)).build).circuitBreakerConfig(CircuitBreakerConfig.custom.slidingWindowSize(10).failureRateThreshold(33.3F).slowCallRateThreshold(33.3F).build).build}}}断路器的设置通过如下图片进行了可视化 。 滑动窗口的大小设置了用于计算错误率的请求数 。 如果我们在大小为10的窗口中出现了3个以上的错误 , 那么断路器就会打开 。
- 中年|一个人的旅行,那就来泸沽湖吧
- 老年|德兴市境内山水如画,被评为“中国天然氧吧”创建地区
- 满清唯一被封为皇贵妃的汉族女子,为乾隆生下3子,结局如何
- 她是琼瑶唯一没捧红女主,却嫁亿万豪门老公,今仍美如少女!
- 如果岁月可回头:白志勇渣男属性显露,景雅是高级绿茶,小美最惨
- 一诺|一诺巅峰赛上分如喝水,2400分补位不开麦,这就是天才选手
- 1450斤全球最胖女孩,因“美丽”被高富帅看中结婚,如今怎样
- 汽车减震器如何判断损坏?
- 喜剧明星大逆袭!继张小斐之后,贾玲的好搭档潘斌龙也火了!
- 小明|搞笑gif趣图:为何你的牙齿如此优秀?还真没想到啊
