Spring Cloud

Spring Cloud

服务重启zuul不能及时发现

Spring CloudLevin 回复了问题 • 4 人关注 • 4 个回复 • 238 次浏览 • 2017-09-16 12:43 • 来自相关话题

Spring Cloud Bus /bus/refresh 无效

Spring CloudRuntyPig 回复了问题 • 2 人关注 • 2 个回复 • 171 次浏览 • 2017-09-14 15:18 • 来自相关话题

注册到Eureka服务不自动注销

Spring Cloudwayne 回复了问题 • 2 人关注 • 2 个回复 • 221 次浏览 • 2017-09-12 16:29 • 来自相关话题

SpringCloud进阶

Spring Clouditmuch.com 回复了问题 • 2 人关注 • 1 个回复 • 194 次浏览 • 2017-09-11 22:48 • 来自相关话题

部署了一个zuul的api-gateway,自定义一个filter,但是无效

Spring Cloud程序猿DD 回复了问题 • 4 人关注 • 3 个回复 • 184 次浏览 • 2017-09-07 22:20 • 来自相关话题

使用zuul进行代理,后端应用获取静态资源时的问题

Spring Cloudkaicheng90 回复了问题 • 4 人关注 • 4 个回复 • 1195 次浏览 • 2017-09-06 16:14 • 来自相关话题

swagger 和 jwt 配合

Spring Bootzhaojiefeng 回复了问题 • 7 人关注 • 6 个回复 • 1030 次浏览 • 2017-08-31 15:16 • 来自相关话题

zuul中使用feign重写了rule服务选择之后调用不到client,急求解决

Spring Cloud程序猿DD 回复了问题 • 3 人关注 • 2 个回复 • 304 次浏览 • 2017-08-28 08:03 • 来自相关话题

spring cloud MAVN打包问题

Spring Cloudsteve 回复了问题 • 4 人关注 • 3 个回复 • 348 次浏览 • 2017-08-25 13:29 • 来自相关话题

springcloud feign gbk乱码

回复

Spring Cloudspringbootx 回复了问题 • 1 人关注 • 1 个回复 • 218 次浏览 • 2017-08-24 10:11 • 来自相关话题

条新动态, 点击查看
## 自己再来回复一下
 
前两天买了两本书:didi老大的 《SpringCloud微服务实战》 和周立老大的 《SpringCloud和Docker微服务架构实战》 ,刚到。
 
在周老大的书里边有介绍zuul上传文件的具体说明

8.7 使用Zuul上... 显示全部 »
## 自己再来回复一下
 
前两天买了两本书:didi老大的 《SpringCloud微服务实战》 和周立老大的 《SpringCloud和Docker微服务架构实战》 ,刚到。
 
在周老大的书里边有介绍zuul上传文件的具体说明

8.7 使用Zuul上传文件

 
这里简述一下规则:
1.通过网关上传小于1MB的文件,无须任何处理,即可正常上传;
 
2.大文件,需要在上传路径之前添加/zuul,或者使用zuul.servlet-path自定义前缀。
例如: //zuul-config
zuul.routes.ms-fileupload = /ms-fileupload/**

//fileupload request path

//for small-file-upload
http://gateway-server/ms-fileupload/upload

//for large-file-upload
http://gateway-server:port/zuul/ms-fileupload/upload
 
3.如果zuul使用了Ribbon做负载均衡,对于大文件上传,需要提升超时设置
例如: hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds: 60000
ribbon:
ConnectionTimeout: 3000
ReadTimeout: 6000
4.在上传文件的微服务的配置application.yml里边也有文件大小的配置要修改
例如: spring:
http:
multipart:
max-file-size: 2000Mb # Max file size, default 1MB
max-request-size: 2500Mb # Max request size, default 10MB
 
返回的对象序列化需要无参构造函数
返回的对象序列化需要无参构造函数
lance

lance 回答了问题 • 2017-08-01 11:40 • 1 个回复 不感兴趣

Spring cloud bus kafka配置producer超时问题

赞同来自:

问题解决了 是我的kafka server端版本问题和 现在和客户端都用0.10.1.1 就可以了
问题解决了 是我的kafka server端版本问题和 现在和客户端都用0.10.1.1 就可以了

跟我学 Spring Cloud 开源项目视频公开课系列

开源项目itmuch.com 发表了文章 • 28 个评论 • 9805 次浏览 • 2017-06-14 15:02 • 来自相关话题

跟我学Spring Cloud

视频主旨
基于Spring Cloud Dalston SR1讲解Spring Cloud核心组件的系统讲解帮助大家快速上手,理解Spring Cloud各组件的用途先脉络,后细节

版权声明
本视频由周立http://www.itmuch.com 贡献给Spring For All社区http://www.spring4all.com ,版权为个人及社区所有。欢迎转载。

转载协议
本视频采用 CC BY 3.0 CN协议 进行许可。 可自由转载、引用,但需署名作者且注明文章出处。如转载至微信公众号,请在添加作者公众号二维码。

个人公众号 




社区公众号





代码&课件
https://github.com/itmuch/spring-cloud-learning-video 
http://git.oschina.net/itmuch/spring-cloud-learning-video
 答疑&勘误&建议&意见
http://www.spring4all.com 
 
具体课程在线播放如下:
 
- 跟我学SpringCloud(一)视频介绍「spring4all.com」







跟我学SpringCloud(二)SpringCloud简介「spring4all.com」





跟我学SpringCloud(三)Spring Boot快速入门





待续...
(社区小编努力上传ing ... , 先分享收藏吧 )
 
赞助社区
(微信扫一扫)




  查看全部
跟我学Spring Cloud

视频主旨
  • 基于Spring Cloud Dalston SR1讲解
  • Spring Cloud核心组件的系统讲解
  • 帮助大家快速上手,理解Spring Cloud各组件的用途
  • 先脉络,后细节


版权声明
本视频由周立http://www.itmuch.com 贡献给Spring For All社区http://www.spring4all.com ,版权为个人及社区所有。欢迎转载。

转载协议
本视频采用 CC BY 3.0 CN协议 进行许可。 可自由转载、引用,但需署名作者且注明文章出处。如转载至微信公众号,请在添加作者公众号二维码。

个人公众号 
1.jpg

社区公众号
2.jpg


代码&课件
https://github.com/itmuch/spring-cloud-learning-video 
http://git.oschina.net/itmuch/spring-cloud-learning-video
 答疑&勘误&建议&意见
http://www.spring4all.com 
 
具体课程在线播放如下
 
- 跟我学SpringCloud(一)视频介绍「spring4all.com」








跟我学SpringCloud(二)SpringCloud简介「spring4all.com」






跟我学SpringCloud(三)Spring Boot快速入门






待续...
(社区小编努力上传ing ... , 先分享收藏吧 )
 
赞助社区
(微信扫一扫)
8888.png

 

服务重启zuul不能及时发现

回复

Spring CloudLevin 回复了问题 • 4 人关注 • 4 个回复 • 238 次浏览 • 2017-09-16 12:43 • 来自相关话题

Spring Cloud Bus /bus/refresh 无效

回复

Spring CloudRuntyPig 回复了问题 • 2 人关注 • 2 个回复 • 171 次浏览 • 2017-09-14 15:18 • 来自相关话题

注册到Eureka服务不自动注销

回复

Spring Cloudwayne 回复了问题 • 2 人关注 • 2 个回复 • 221 次浏览 • 2017-09-12 16:29 • 来自相关话题

SpringCloud进阶

回复

Spring Clouditmuch.com 回复了问题 • 2 人关注 • 1 个回复 • 194 次浏览 • 2017-09-11 22:48 • 来自相关话题

部署了一个zuul的api-gateway,自定义一个filter,但是无效

回复

Spring Cloud程序猿DD 回复了问题 • 4 人关注 • 3 个回复 • 184 次浏览 • 2017-09-07 22:20 • 来自相关话题

使用zuul进行代理,后端应用获取静态资源时的问题

回复

Spring Cloudkaicheng90 回复了问题 • 4 人关注 • 4 个回复 • 1195 次浏览 • 2017-09-06 16:14 • 来自相关话题

swagger 和 jwt 配合

回复

Spring Bootzhaojiefeng 回复了问题 • 7 人关注 • 6 个回复 • 1030 次浏览 • 2017-08-31 15:16 • 来自相关话题

zuul中使用feign重写了rule服务选择之后调用不到client,急求解决

回复

Spring Cloud程序猿DD 回复了问题 • 3 人关注 • 2 个回复 • 304 次浏览 • 2017-08-28 08:03 • 来自相关话题

spring cloud MAVN打包问题

回复

Spring Cloudsteve 回复了问题 • 4 人关注 • 3 个回复 • 348 次浏览 • 2017-08-25 13:29 • 来自相关话题

springcloud feign gbk乱码

回复

Spring Cloudspringbootx 回复了问题 • 1 人关注 • 1 个回复 • 218 次浏览 • 2017-08-24 10:11 • 来自相关话题

【公益】开放一台Eureka注册中心给各位Spring Cloud爱好者

Spring Cloud程序猿DD 发表了文章 • 0 个评论 • 690 次浏览 • 2017-08-03 22:54 • 来自相关话题

这是一篇博客福利!


相信很多关注Spring Cloud的爱好者们,不论是读我的系列文章和书籍还是看其他朋友们写的博客佳文,都不可避免的启动多个项目来体验Spring Cloud带来的整套微服务架构方案。其中,Eureka注册中心几乎是每个试验都必须要启动的应用。在整个学习过程中,我们不厌其烦的启动它,为了让微服务之间能够正常的发现并调用服务接口。

所以…我花了点业余时间,对Spring Cloud Eureka Server的UI增加了一些说明,并将在博客上公开出来给Spring Cloud的初学者和开发者们使用,大家可以方便的使用它来调试我博客和《Spring Cloud微服务实战》书中的诸多示例,或是利用此开发和调试自己的应用。

该Eureka注册中心关闭了自我保护机制,所以当各位开发者的服务下线后,稍等片刻就会被剔除,所以大家不用担心服务的长时间停留在该服务注册中心上。说了那么多,这个开放的注册中心在哪里呢?请看下面,它主要分为两部分:

Dashboard : http://eureka.didispace.com/
客户端配置:
$(document).ready(function() {$('pre code').each(function(i, block) { hljs.highlightBlock( block); }); });eureka.client.serviceUrl.defaultZone=http://eureka.didispace.com/eureka/

关于该服务注册中心的源码如下,欢迎给予*Star*支持! 
 
码云:https://gitee.com/didispace/didi-eureka-server GitHub:https://github.com/dyc87112/didi-eureka-server 查看全部


这是一篇博客福利!



相信很多关注Spring Cloud的爱好者们,不论是读我的系列文章和书籍还是看其他朋友们写的博客佳文,都不可避免的启动多个项目来体验Spring Cloud带来的整套微服务架构方案。其中,Eureka注册中心几乎是每个试验都必须要启动的应用。在整个学习过程中,我们不厌其烦的启动它,为了让微服务之间能够正常的发现并调用服务接口。

所以…我花了点业余时间,对Spring Cloud Eureka Server的UI增加了一些说明,并将在博客上公开出来给Spring Cloud的初学者和开发者们使用,大家可以方便的使用它来调试我博客和《Spring Cloud微服务实战》书中的诸多示例,或是利用此开发和调试自己的应用。

该Eureka注册中心关闭了自我保护机制,所以当各位开发者的服务下线后,稍等片刻就会被剔除,所以大家不用担心服务的长时间停留在该服务注册中心上。说了那么多,这个开放的注册中心在哪里呢?请看下面,它主要分为两部分:

Dashboard : http://eureka.didispace.com/
客户端配置:
eureka.client.serviceUrl.defaultZone=http://eureka.didispace.com/eureka/


关于该服务注册中心的源码如下,欢迎给予*Star*支持! 
 

Spring Cloud构建微服务架构:Hystrix监控数据聚合【Dalston版】

Spring Cloud程序猿DD 发表了文章 • 0 个评论 • 320 次浏览 • 2017-07-24 22:57 • 来自相关话题

上一篇我们介绍了使用Hystrix Dashboard来展示Hystrix用于熔断的各项度量指标。通过Hystrix Dashboard,我们可以方便的查看服务实例的综合情况,比如:服务调用次数、服务调用延迟等。但是仅通过Hystrix Dashboard我们只能实现对服务当个实例的数据展现,在生产环境我们的服务是肯定需要做高可用的,那么对于多实例的情况,我们就需要将这些度量指标数据进行聚合。下面,在本篇中,我们就来介绍一下另外一个工具:Turbine。
 
准备工作

在开始使用Turbine之前,我们先回顾一下上一篇中实现的架构,如下图所示:





 
其中,我们构建的内容包括:
 
eureka-server:服务注册中心eureka-client:服务提供者eureka-consumer-ribbon-hystrix:使用ribbon和hystrix实现的服务消费者hystrix-dashboard:用于展示eureka-consumer-ribbon-hystrix服务的Hystrix数据
 
动手试一试

下面,我们将在上述架构基础上,引入Turbine来对服务的Hystrix数据进行聚合展示。这里我们将分别介绍两种聚合方式。

通过HTTP收集聚合

具体实现步骤如下:
创建一个标准的Spring Boot工程,命名为:turbine。编辑pom.xml,具体依赖内容如下:
 
<parent>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-parent</artifactId>
<version>Dalston.SR1</version>
<relativePath /> <!-- lookup parent from repository -->
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-turbine</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
</dependencies>
创建应用主类TurbineApplication,并使用@EnableTurbine注解开启Turbine。
@Configuration
@EnableAutoConfiguration
@EnableTurbine
@EnableDiscoveryClient
public class TurbineApplication {
public static void main(String[] args) {
SpringApplication.run(TurbineApplication.class, args);
}
}
在application.properties加入eureka和turbine的相关配置,具体如下:
spring.application.name=turbine
server.port=8989
management.port=8990
eureka.client.serviceUrl.defaultZone=http://localhost:1001/eureka/
turbine.app-config=eureka-consumer-ribbon-hystrix
turbine.cluster-name-expression="default"
turbine.combine-host-port=true参数说明

turbine.app-config参数指定了需要收集监控信息的服务名;
turbine.cluster-name-expression 参数指定了集群名称为default,当我们服务数量非常多的时候,可以启动多个Turbine服务来构建不同的聚合集群,而该参数可以用来区分这些不同的聚合集群,同时该参数值可以在Hystrix仪表盘中用来定位不同的聚合集群,只需要在Hystrix Stream的URL中通过cluster参数来指定;
turbine.combine-host-port参数设置为true,可以让同一主机上的服务通过主机名与端口号的组合来进行区分,默认情况下会以host来区分不同的服务,这会使得在本地调试的时候,本机上的不同服务聚合成一个服务来统计。

在完成了上面的内容构建之后,我们来体验一下Turbine对集群的监控能力。分别启动eureka-server、eureka-client、eureka-consumer-ribbon-hystrix、turbine以及hystrix-dashboard。访问Hystrix Dashboard,并开启对http://localhost:8989/turbine.stream`的监控,这时候,我们将看到针对服务`eureka-consumer-ribbon-hystrix`的聚合监控数据。

而此时的架构如下图所示:





 
通过消息代理收集聚合
 
Spring Cloud在封装Turbine的时候,还实现了基于消息代理的收集实现。所以,我们可以将所有需要收集的监控信息都输出到消息代理中,然后Turbine服务再从消息代理中异步的获取这些监控信息,最后将这些监控信息聚合并输出到Hystrix Dashboard中。通过引入消息代理,我们的Turbine和Hystrix Dashoard实现的监控架构可以改成如下图所示的结构:





 
从图中我们可以看到,这里多了一个重要元素:RabbitMQ。对于RabbitMQ的安装与基本时候我们可以查看之前的《Spring Boot中使用RabbitMQ》一文,这里不做过多的说明。下面,我们可以来构建一个新的应用来实现基于消息代理的Turbine聚合服务,具体步骤如下:
创建一个标准的Spring Boot工程,命名为:turbine-amqp。编辑pom.xml,具体依赖内容如下:
<parent>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-parent</artifactId>
<version>Dalston.SR1</version>
<relativePath /> <!-- lookup parent from repository -->
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-turbine-amqp</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
</dependencies>可以看到这里主要引入了spring-cloud-starter-turbine-amqp依赖,它实际上就是包装了spring-cloud-starter-turbine-stream和pring-cloud-starter-stream-rabbit。
注意:这里我们需要使用Java 8来运行
 
在应用主类中使用@EnableTurbineStream注解来启用Turbine Stream的配置。
@Configuration
@EnableAutoConfiguration
@EnableTurbineStream
@EnableDiscoveryClient
public class TurbineApplication {
public static void main(String[] args) {
SpringApplication.run(TurbineApplication.class, args);
}
}
配置application.properties文件:
spring.application.name=turbine-amqp
server.port=8989
management.port=8990
eureka.client.serviceUrl.defaultZone=http://localhost:1001/eureka/对于Turbine的配置已经完成了,下面我们需要对服务消费者eureka-consumer-ribbon-hystrix做一些修改,使其监控信息能够输出到RabbitMQ上。这个修改也非常简单,只需要在pom.xml中增加对spring-cloud-netflix-hystrix-amqp依赖,具体如下:
<dependencies>
...
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-netflix-hystrix-amqp</artifactId>
</dependency>
</dependencies>在完成了上面的配置之后,我们可以继续之前的所有项目(除turbine以外),并通过Hystrix Dashboard开启对http://localhost:8989/turbine.stream的监控,我们可以获得如之前实现的同样效果,只是这里我们的监控信息收集时是通过了消息代理异步实现的。

更多Spring Cloud内容请持续关注我的博客更新或在《Spring Cloud微服务实战》中获取。





 
代码示例

样例工程将沿用之前在码云和GitHub上创建的SpringCloud-Learning项目,重新做了一下整理。通过不同目录来区分Brixton和Dalston的示例。

码云:点击查看
GitHub:点击查看

本文作者:程序猿DD-翟永超
原文链接:Spring Cloud构建微服务架构:Hystrix监控数据聚合【Dalston版】
版权归作者所有,转载请注明出处

 
 
  查看全部
上一篇我们介绍了使用Hystrix Dashboard来展示Hystrix用于熔断的各项度量指标。通过Hystrix Dashboard,我们可以方便的查看服务实例的综合情况,比如:服务调用次数、服务调用延迟等。但是仅通过Hystrix Dashboard我们只能实现对服务当个实例的数据展现,在生产环境我们的服务是肯定需要做高可用的,那么对于多实例的情况,我们就需要将这些度量指标数据进行聚合。下面,在本篇中,我们就来介绍一下另外一个工具:Turbine。
 
准备工作

在开始使用Turbine之前,我们先回顾一下上一篇中实现的架构,如下图所示:

spring-cloud-starter-dalston-5-2-1.png

 
其中,我们构建的内容包括:
 
  • eureka-server:服务注册中心
  • eureka-client:服务提供者
  • eureka-consumer-ribbon-hystrix:使用ribbon和hystrix实现的服务消费者
  • hystrix-dashboard:用于展示eureka-consumer-ribbon-hystrix服务的Hystrix数据

 
动手试一试

下面,我们将在上述架构基础上,引入Turbine来对服务的Hystrix数据进行聚合展示。这里我们将分别介绍两种聚合方式。

通过HTTP收集聚合

具体实现步骤如下:
  • 创建一个标准的Spring Boot工程,命名为:turbine。
  • 编辑pom.xml,具体依赖内容如下:

 
<parent>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-parent</artifactId>
<version>Dalston.SR1</version>
<relativePath /> <!-- lookup parent from repository -->
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-turbine</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
</dependencies>

  • 创建应用主类TurbineApplication,并使用@EnableTurbine注解开启Turbine。

@Configuration
@EnableAutoConfiguration
@EnableTurbine
@EnableDiscoveryClient
public class TurbineApplication {
public static void main(String[] args) {
SpringApplication.run(TurbineApplication.class, args);
}
}

  • 在application.properties加入eureka和turbine的相关配置,具体如下:

spring.application.name=turbine
server.port=8989
management.port=8990
eureka.client.serviceUrl.defaultZone=http://localhost:1001/eureka/
turbine.app-config=eureka-consumer-ribbon-hystrix
turbine.cluster-name-expression="default"
turbine.combine-host-port=true
参数说明

turbine.app-config参数指定了需要收集监控信息的服务名;
turbine.cluster-name-expression 参数指定了集群名称为default,当我们服务数量非常多的时候,可以启动多个Turbine服务来构建不同的聚合集群,而该参数可以用来区分这些不同的聚合集群,同时该参数值可以在Hystrix仪表盘中用来定位不同的聚合集群,只需要在Hystrix Stream的URL中通过cluster参数来指定;
turbine.combine-host-port参数设置为true,可以让同一主机上的服务通过主机名与端口号的组合来进行区分,默认情况下会以host来区分不同的服务,这会使得在本地调试的时候,本机上的不同服务聚合成一个服务来统计。

在完成了上面的内容构建之后,我们来体验一下Turbine对集群的监控能力。分别启动eureka-server、eureka-client、eureka-consumer-ribbon-hystrix、turbine以及hystrix-dashboard。访问Hystrix Dashboard,并开启对http://localhost:8989/turbine.stream`的监控,这时候,我们将看到针对服务`eureka-consumer-ribbon-hystrix`的聚合监控数据。

而此时的架构如下图所示:

spring-cloud-starter-dalston-5-2-2.png

 
通过消息代理收集聚合
 
Spring Cloud在封装Turbine的时候,还实现了基于消息代理的收集实现。所以,我们可以将所有需要收集的监控信息都输出到消息代理中,然后Turbine服务再从消息代理中异步的获取这些监控信息,最后将这些监控信息聚合并输出到Hystrix Dashboard中。通过引入消息代理,我们的Turbine和Hystrix Dashoard实现的监控架构可以改成如下图所示的结构:

spring-cloud-starter-dalston-5-2-3.png

 
从图中我们可以看到,这里多了一个重要元素:RabbitMQ。对于RabbitMQ的安装与基本时候我们可以查看之前的《Spring Boot中使用RabbitMQ》一文,这里不做过多的说明。下面,我们可以来构建一个新的应用来实现基于消息代理的Turbine聚合服务,具体步骤如下:
  • 创建一个标准的Spring Boot工程,命名为:turbine-amqp。
  • 编辑pom.xml,具体依赖内容如下:

<parent>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-parent</artifactId>
<version>Dalston.SR1</version>
<relativePath /> <!-- lookup parent from repository -->
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-turbine-amqp</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
</dependencies>
可以看到这里主要引入了spring-cloud-starter-turbine-amqp依赖,它实际上就是包装了spring-cloud-starter-turbine-stream和pring-cloud-starter-stream-rabbit。
注意:这里我们需要使用Java 8来运行
 
  • 在应用主类中使用@EnableTurbineStream注解来启用Turbine Stream的配置。

@Configuration
@EnableAutoConfiguration
@EnableTurbineStream
@EnableDiscoveryClient
public class TurbineApplication {
public static void main(String[] args) {
SpringApplication.run(TurbineApplication.class, args);
}
}

  • 配置application.properties文件:

spring.application.name=turbine-amqp
server.port=8989
management.port=8990
eureka.client.serviceUrl.defaultZone=http://localhost:1001/eureka/
对于Turbine的配置已经完成了,下面我们需要对服务消费者eureka-consumer-ribbon-hystrix做一些修改,使其监控信息能够输出到RabbitMQ上。这个修改也非常简单,只需要在pom.xml中增加对spring-cloud-netflix-hystrix-amqp依赖,具体如下:
<dependencies>
...
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-netflix-hystrix-amqp</artifactId>
</dependency>
</dependencies>
在完成了上面的配置之后,我们可以继续之前的所有项目(除turbine以外),并通过Hystrix Dashboard开启对http://localhost:8989/turbine.stream的监控,我们可以获得如之前实现的同样效果,只是这里我们的监控信息收集时是通过了消息代理异步实现的。

更多Spring Cloud内容请持续关注我的博客更新或在《Spring Cloud微服务实战》中获取。

翟永超-京东-推广链接.png

 
代码示例

样例工程将沿用之前在码云和GitHub上创建的SpringCloud-Learning项目,重新做了一下整理。通过不同目录来区分Brixton和Dalston的示例。

码云:点击查看
GitHub:点击查看


本文作者:程序猿DD-翟永超
原文链接:Spring Cloud构建微服务架构:Hystrix监控数据聚合【Dalston版】
版权归作者所有,转载请注明出处


 
 
 

SpringCloud使用Feign经验总结(Dalston.SR1)

Spring CloudLevin 发表了文章 • 0 个评论 • 382 次浏览 • 2017-07-24 19:11 • 来自相关话题

 
主要讲述SpringCloud在使用Feign经验总结(Dalston.SR1),如何优雅的使用GET/POST/PUT/DELETE等等,以及为什么别人使用的都是POST?
 
- 为什么要改成POST?
 
-- 用户服务
 
1.使用Feign遇到问题的时候,老司机第一句话就是改成POST试试,我很纳闷,直到我撸了半天代码测试了不同情况得出以下几个结论!!!
 
/**
* 提取用户服务的会员信息
*
* @author Levin
*/
@FeignClient(name = "commerce-user-service", fallback = UserServiceFallback.class)
public interface BodyImageService {

① @RequestMapping(value = "/query",method = RequestMethod.GET)
PageInfo<BodyImage> query(String name);

② @RequestMapping(value = "/query",method = RequestMethod.POST)
PageInfo<BodyImage> query(@PathVariable("name") String name);

③ @GetMapping("/query/{name}")
PageInfo<BodyImage> query(@PathVariable("name") String name);

/**
* 这边采取了和Spring Cloud官方文档相同的做法,<br>
* 将fallback类作为内部类放入Feign的接口中,当然也可以单独写一个fallback类。
*
* @author Levin
*/
@Component
static class UserServiceFallback implements BodyImageService {
private static final Logger LOGGER = LoggerFactory.getLogger(UserServiceFallback.class);

@Override
public PageInfo<BodyImage> query(String name) {
UserServiceFallback.LOGGER.info("[请求错误,请稍后在试...]");
return new PageInfo<>();
}
}

}
 @RestController
public class BodyImageServiceImpl implements BodyImageService {

private static final Logger LOGGER = LoggerFactory.getLogger(BodyImageServiceImpl.class);

@Autowired
BodyImageMapper imageMapper;

① @RequestMapping(value = "/query",method = RequestMethod.GET)
@Override
public PageInfo<BodyImage> query(String name) {
LOGGER.debug("[name] - [{}]", name);
PageInfo<BodyImage> info = PageHelper.startPage(1, 20).doSelectPageInfo(() -> {
this.imageMapper.queryBodyImageForList();
});
return info;
}

② @RequestMapping(value = "/query",method = RequestMethod.POST)
@Override
public PageInfo<BodyImage> query(String name) {
LOGGER.debug("[name] - [{}]", name);
PageInfo<BodyImage> info = PageHelper.startPage(1, 20).doSelectPageInfo(() -> {
this.imageMapper.queryBodyImageForList();
});
return info;
}


③ @GetMapping("/query/{name}")
@Override
public PageInfo<BodyImage> query(@PathVariable("name") String name) {
LOGGER.debug("[name] - [{}]", name);
PageInfo<BodyImage> info = PageHelper.startPage(1, 20).doSelectPageInfo(() -> {
this.imageMapper.queryBodyImageForList();
});
return info;
}

}
 
- 订单服务
 
@RestController
public class OrderServiceImpl {

@Autowired
BodyImageService bodyImageService;

@GetMapping("/query")
public PageInfo<BodyImage> getBodyImage() {
return bodyImageService.query("bbbb");
}

}
- 结论

① 你会发现项目Run一切正常,但是请求只会进入 UserServiceFallback.java 中去,并输出Log(如果不指定GET那么你会发现请求报错,说Method Get Not…)

② 第二种是可行的 但是试想一下我对外写的查询数据接口还要POST有点说不过去吧?

③ 第三种就是解决方案,以Restful风格的方式,这里的猜想是Feign集成的是Ribbon和Hystrix那么Ribbon里面的是RestTemplate,还有一个可能就是Feign接口在预处理的时候不知道你的GET方式有那些参数需要传递,他并不像简单的MVC框架可以自动装配和映射(个人猜想,打脸轻点),同理PUT/DELETE/PATH只要按照restful规范就可以使用而不一定要post
 
 
原文地址:http://blog.battcn.com/2017/07 ... ysis/
 
 
 
 
 
  查看全部
 
主要讲述SpringCloud在使用Feign经验总结(Dalston.SR1),如何优雅的使用GET/POST/PUT/DELETE等等,以及为什么别人使用的都是POST?
 
- 为什么要改成POST?
 
-- 用户服务
 
1.使用Feign遇到问题的时候,老司机第一句话就是改成POST试试,我很纳闷,直到我撸了半天代码测试了不同情况得出以下几个结论!!!
 
/**
* 提取用户服务的会员信息
*
* @author Levin
*/
@FeignClient(name = "commerce-user-service", fallback = UserServiceFallback.class)
public interface BodyImageService {

① @RequestMapping(value = "/query",method = RequestMethod.GET)
PageInfo<BodyImage> query(String name);

② @RequestMapping(value = "/query",method = RequestMethod.POST)
PageInfo<BodyImage> query(@PathVariable("name") String name);

③ @GetMapping("/query/{name}")
PageInfo<BodyImage> query(@PathVariable("name") String name);

/**
* 这边采取了和Spring Cloud官方文档相同的做法,<br>
* 将fallback类作为内部类放入Feign的接口中,当然也可以单独写一个fallback类。
*
* @author Levin
*/
@Component
static class UserServiceFallback implements BodyImageService {
private static final Logger LOGGER = LoggerFactory.getLogger(UserServiceFallback.class);

@Override
public PageInfo<BodyImage> query(String name) {
UserServiceFallback.LOGGER.info("[请求错误,请稍后在试...]");
return new PageInfo<>();
}
}

}

 
@RestController
public class BodyImageServiceImpl implements BodyImageService {

private static final Logger LOGGER = LoggerFactory.getLogger(BodyImageServiceImpl.class);

@Autowired
BodyImageMapper imageMapper;

① @RequestMapping(value = "/query",method = RequestMethod.GET)
@Override
public PageInfo<BodyImage> query(String name) {
LOGGER.debug("[name] - [{}]", name);
PageInfo<BodyImage> info = PageHelper.startPage(1, 20).doSelectPageInfo(() -> {
this.imageMapper.queryBodyImageForList();
});
return info;
}

② @RequestMapping(value = "/query",method = RequestMethod.POST)
@Override
public PageInfo<BodyImage> query(String name) {
LOGGER.debug("[name] - [{}]", name);
PageInfo<BodyImage> info = PageHelper.startPage(1, 20).doSelectPageInfo(() -> {
this.imageMapper.queryBodyImageForList();
});
return info;
}


③ @GetMapping("/query/{name}")
@Override
public PageInfo<BodyImage> query(@PathVariable("name") String name) {
LOGGER.debug("[name] - [{}]", name);
PageInfo<BodyImage> info = PageHelper.startPage(1, 20).doSelectPageInfo(() -> {
this.imageMapper.queryBodyImageForList();
});
return info;
}

}

 
- 订单服务
 
@RestController
public class OrderServiceImpl {

@Autowired
BodyImageService bodyImageService;

@GetMapping("/query")
public PageInfo<BodyImage> getBodyImage() {
return bodyImageService.query("bbbb");
}

}

- 结论

① 你会发现项目Run一切正常,但是请求只会进入 UserServiceFallback.java 中去,并输出Log(如果不指定GET那么你会发现请求报错,说Method Get Not…)

② 第二种是可行的 但是试想一下我对外写的查询数据接口还要POST有点说不过去吧?

③ 第三种就是解决方案,以Restful风格的方式,这里的猜想是Feign集成的是Ribbon和Hystrix那么Ribbon里面的是RestTemplate,还有一个可能就是Feign接口在预处理的时候不知道你的GET方式有那些参数需要传递,他并不像简单的MVC框架可以自动装配和映射(个人猜想,打脸轻点),同理PUT/DELETE/PATH只要按照restful规范就可以使用而不一定要post
 
 
原文地址:http://blog.battcn.com/2017/07 ... ysis/
 
 
 
 
 
 

Spring Cloud构建微服务架构:Hystrix监控面板【Dalston版】

Spring Cloud程序猿DD 发表了文章 • 0 个评论 • 288 次浏览 • 2017-07-23 11:54 • 来自相关话题

在上一篇[《服务容错保护(hystrix断路器)》](http://blog.didispace.com/spri ... on-4-3)的介绍中,我们提到断路器是根据一段时间窗内的请求情况来判断并操作断路器的打开和关闭状态的。而这些请求情况的指标信息都是HystrixCommand和HystrixObservableCommand实例在执行过程中记录的重要度量信息,它们除了Hystrix断路器实现中使用之外,对于系统运维也有非常大的帮助。这些指标信息会以“滚动时间窗”与“桶”结合的方式进行汇总,并在内存中驻留一段时间,以供内部或外部进行查询使用,Hystrix Dashboard就是这些指标内容的消费者之一。

下面我们基于之前的示例来结合Hystrix Dashboard实现Hystrix指标数据的可视化面板,这里我们将用到下之前实现的几个应用,包括:

- eureka-server:服务注册中心
- eureka-client:服务提供者
- eureka-consumer-ribbon-hystrix:使用ribbon和hystrix实现的服务消费者

由于eureka-consumer-ribbon-hystrix项目中的`/consumer`接口实现使用了`@HystrixCommand`修饰,所以这个接口的调用情况会被Hystrix记录下来,以用来给断路器和Hystrix Dashboard使用。断路器我们在上一篇中已经介绍过了,下面我们来具体说说Hystrix Dashboard的构建。

动手试一试

在Spring Cloud中构建一个Hystrix Dashboard非常简单,只需要下面四步:

- 创建一个标准的Spring Boot工程,命名为:hystrix-dashboard。
- 编辑pom.xml,具体依赖内容如下:<parent>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-parent</artifactId>
<version>Dalston.SR1</version>
<relativePath />
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix-dashboard</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
</dependencies>
- 为应用主类加上`@EnableHystrixDashboard`,启用Hystrix Dashboard功能。@EnableHystrixDashboard
@SpringCloudApplication
public class HystrixDashboardApplication {
public static void main(String[] args) {
SpringApplication.run(HystrixDashboardApplication.class, args);
}
}
- 根据实际情况修改`application.properties`配置文件,比如:选择一个未被占用的端口等,此步非必须。spring.application.name=hystrix-dashboard
server.port=1301
到这里我们已经完成了基本配置,接下来我们可以启动该应用,并访问:`http://localhost:1301/hystrix`,我们可以看到如下页面:






这是Hystrix Dashboard的监控首页,该页面中并没有具体的监控信息。从页面的文字内容中我们可以知道,Hystrix Dashboard共支持三种不同的监控方式,依次为:

- 默认的集群监控:通过URL`http://turbine-hostname:port/turbine.stream`开启,实现对默认集群的监控。
- 指定的集群监控:通过URL`http://turbine-hostname:port/t ... er%3D[clusterName]`开启,实现对clusterName集群的监控。
- 单体应用的监控:通过URL`http://hystrix-app:port/hystrix.stream`开启,实现对具体某个服务实例的监控。

前两者都对集群的监控,需要整合Turbine才能实现,这部分内容我们将在下一篇中做详细介绍。在本节中,我们主要实现对单个服务实例的监控,所以这里我们先来实现单个服务实例的监控。

既然Hystrix Dashboard监控单实例节点需要通过访问实例的`/hystrix.stream`接口来实现,自然我们需要为服务实例添加这个端点,而添加该功能的步骤也同样简单,只需要下面两步:

- 在服务实例`pom.xml`中的`dependencies`节点中新增`spring-boot-starter-actuator`监控模块以开启监控相关的端点,并确保已经引入断路器的依赖`spring-cloud-starter-hystrix`:<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

- 确保在服务实例的主类中已经使用`@EnableCircuitBreaker`或`@EnableHystrix`注解,开启了断路器功能。

到这里已经完成了所有的配置,我们可以在Hystrix Dashboard的首页输入`http://localhost:2101/hystrix.stream`,已启动对“eureka-consumer-ribbon-hystrix”的监控,点击“Monitor Stream”按钮,此时我们可以看到如下页面:






在对该页面介绍前,我们先看看在首页中我们还没有介绍的两外两个参数:

- `Delay`:该参数用来控制服务器上轮询监控信息的延迟时间,默认为2000毫秒,我们可以通过配置该属性来降低客户端的网络和CPU消耗。
- `Title`:该参数对应了上图头部标题Hystrix Stream之后的内容,默认会使用具体监控实例的URL,我们可以通过配置该信息来展示更合适的标题。

回到监控页面,我们来详细说说其中各元素的具体含义:

- 我们可以在监控信息的左上部分找到两个重要的图形信息:一个实心圆和一条曲线。
  - 实心圆:共有两种含义。它通过颜色的变化代表了实例的健康程度,如下图所示,它的健康度从绿色、黄色、橙色、红色递减。该实心圆除了颜色的变化之外,它的大小也会根据实例的请求流量发生变化,流量越大该实心圆就越大。所以通过该实心圆的展示,我们就可以在大量的实例中快速的发现故障实例和高压力实例。






  - 曲线:用来记录2分钟内流量的相对变化,我们可以通过它来观察到流量的上升和下降趋势。
- 其他一些数量指标如下图所示:






更多Spring Cloud内容请持续关注我的博客更新或在《Spring Cloud微服务实战》中获取。

代码示例

样例工程将沿用之前在码云和GitHub上创建的SpringCloud-Learning项目,重新做了一下整理。通过不同目录来区分Brixton和Dalston的示例。

- 码云:点击查看
- GitHub:点击查看
 

本文作者:程序猿DD-翟永超
原文链接:Spring Cloud构建微服务架构:Hystrix监控面板【Dalston版】
版权归作者所有,转载请注明出处 查看全部
在上一篇[《服务容错保护(hystrix断路器)》](http://blog.didispace.com/spri ... on-4-3)的介绍中,我们提到断路器是根据一段时间窗内的请求情况来判断并操作断路器的打开和关闭状态的。而这些请求情况的指标信息都是HystrixCommand和HystrixObservableCommand实例在执行过程中记录的重要度量信息,它们除了Hystrix断路器实现中使用之外,对于系统运维也有非常大的帮助。这些指标信息会以“滚动时间窗”与“桶”结合的方式进行汇总,并在内存中驻留一段时间,以供内部或外部进行查询使用,Hystrix Dashboard就是这些指标内容的消费者之一。

下面我们基于之前的示例来结合Hystrix Dashboard实现Hystrix指标数据的可视化面板,这里我们将用到下之前实现的几个应用,包括:

- eureka-server:服务注册中心
- eureka-client:服务提供者
- eureka-consumer-ribbon-hystrix:使用ribbon和hystrix实现的服务消费者

由于eureka-consumer-ribbon-hystrix项目中的`/consumer`接口实现使用了`@HystrixCommand`修饰,所以这个接口的调用情况会被Hystrix记录下来,以用来给断路器和Hystrix Dashboard使用。断路器我们在上一篇中已经介绍过了,下面我们来具体说说Hystrix Dashboard的构建。

动手试一试

在Spring Cloud中构建一个Hystrix Dashboard非常简单,只需要下面四步:

- 创建一个标准的Spring Boot工程,命名为:hystrix-dashboard。
- 编辑pom.xml,具体依赖内容如下:
<parent>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-parent</artifactId>
<version>Dalston.SR1</version>
<relativePath />
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix-dashboard</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
</dependencies>

- 为应用主类加上`@EnableHystrixDashboard`,启用Hystrix Dashboard功能。
@EnableHystrixDashboard
@SpringCloudApplication
public class HystrixDashboardApplication {
public static void main(String[] args) {
SpringApplication.run(HystrixDashboardApplication.class, args);
}
}

- 根据实际情况修改`application.properties`配置文件,比如:选择一个未被占用的端口等,此步非必须。
spring.application.name=hystrix-dashboard
server.port=1301

到这里我们已经完成了基本配置,接下来我们可以启动该应用,并访问:`http://localhost:1301/hystrix`,我们可以看到如下页面:

spring-cloud-starter-dalston-5-1-1.png


这是Hystrix Dashboard的监控首页,该页面中并没有具体的监控信息。从页面的文字内容中我们可以知道,Hystrix Dashboard共支持三种不同的监控方式,依次为:

- 默认的集群监控:通过URL`http://turbine-hostname:port/turbine.stream`开启,实现对默认集群的监控。
- 指定的集群监控:通过URL`http://turbine-hostname:port/t ... er%3D[clusterName]`开启,实现对clusterName集群的监控。
- 单体应用的监控:通过URL`http://hystrix-app:port/hystrix.stream`开启,实现对具体某个服务实例的监控。

前两者都对集群的监控,需要整合Turbine才能实现,这部分内容我们将在下一篇中做详细介绍。在本节中,我们主要实现对单个服务实例的监控,所以这里我们先来实现单个服务实例的监控。

既然Hystrix Dashboard监控单实例节点需要通过访问实例的`/hystrix.stream`接口来实现,自然我们需要为服务实例添加这个端点,而添加该功能的步骤也同样简单,只需要下面两步:

- 在服务实例`pom.xml`中的`dependencies`节点中新增`spring-boot-starter-actuator`监控模块以开启监控相关的端点,并确保已经引入断路器的依赖`spring-cloud-starter-hystrix`:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>


- 确保在服务实例的主类中已经使用`@EnableCircuitBreaker`或`@EnableHystrix`注解,开启了断路器功能。

到这里已经完成了所有的配置,我们可以在Hystrix Dashboard的首页输入`http://localhost:2101/hystrix.stream`,已启动对“eureka-consumer-ribbon-hystrix”的监控,点击“Monitor Stream”按钮,此时我们可以看到如下页面:

spring-cloud-starter-dalston-5-1-2.png


在对该页面介绍前,我们先看看在首页中我们还没有介绍的两外两个参数:

- `Delay`:该参数用来控制服务器上轮询监控信息的延迟时间,默认为2000毫秒,我们可以通过配置该属性来降低客户端的网络和CPU消耗。
- `Title`:该参数对应了上图头部标题Hystrix Stream之后的内容,默认会使用具体监控实例的URL,我们可以通过配置该信息来展示更合适的标题。

回到监控页面,我们来详细说说其中各元素的具体含义:

- 我们可以在监控信息的左上部分找到两个重要的图形信息:一个实心圆和一条曲线。
  - 实心圆:共有两种含义。它通过颜色的变化代表了实例的健康程度,如下图所示,它的健康度从绿色、黄色、橙色、红色递减。该实心圆除了颜色的变化之外,它的大小也会根据实例的请求流量发生变化,流量越大该实心圆就越大。所以通过该实心圆的展示,我们就可以在大量的实例中快速的发现故障实例和高压力实例。

spring-cloud-starter-dalston-5-1-3.png


  - 曲线:用来记录2分钟内流量的相对变化,我们可以通过它来观察到流量的上升和下降趋势。
- 其他一些数量指标如下图所示:

spring-cloud-starter-dalston-5-1-4.png


更多Spring Cloud内容请持续关注我的博客更新或在《Spring Cloud微服务实战》中获取。

代码示例

样例工程将沿用之前在码云和GitHub上创建的SpringCloud-Learning项目,重新做了一下整理。通过不同目录来区分Brixton和Dalston的示例。

- 码云:点击查看
- GitHub:点击查看
 


本文作者:程序猿DD-翟永超
原文链接:Spring Cloud构建微服务架构:Hystrix监控面板【Dalston版】
版权归作者所有,转载请注明出处


Spring Cloud构建微服务架构:服务容错保护(Hystrix依赖隔离)【Dalston版】

Spring Cloud程序猿DD 发表了文章 • 2 个评论 • 488 次浏览 • 2017-07-12 22:29 • 来自相关话题

前言

在上一篇《Spring Cloud构建微服务架构:服务容错保护(Hystrix服务降级)》中,我们已经体验了如何使用@HystrixCommand来为一个依赖资源定义服务降级逻辑。实现方式非常简单,同时对于降级逻辑还能实现一些更加复杂的级联降级等策略。之前对于使用Hystrix来实现服务容错保护时,除了服务降级之外,我们还提到过线程隔离、断路器等功能。那么在本篇中我们就来具体说说线程隔离。

依赖隔离

“舱壁模式”对于熟悉Docker的读者一定不陌生,Docker通过“舱壁模式”实现进程的隔离,使得容器与容器之间不会互相影响。而Hystrix则使用该模式实现线程池的隔离,它会为每一个Hystrix命令创建一个独立的线程池,这样就算某个在Hystrix命令包装下的依赖服务出现延迟过高的情况,也只是对该依赖服务的调用产生影响,而不会拖慢其他的服务。

通过对依赖服务的线程池隔离实现,可以带来如下优势:
应用自身得到完全的保护,不会受不可控的依赖服务影响。即便给依赖服务分配的线程池被填满,也不会影响应用自身的额其余部分。可以有效的降低接入新服务的风险。如果新服务接入后运行不稳定或存在问题,完全不会影响到应用其他的请求。当依赖的服务从失效恢复正常后,它的线程池会被清理并且能够马上恢复健康的服务,相比之下容器级别的清理恢复速度要慢得多。当依赖的服务出现配置错误的时候,线程池会快速的反应出此问题(通过失败次数、延迟、超时、拒绝等指标的增加情况)。同时,我们可以在不影响应用功能的情况下通过实时的动态属性刷新(后续会通过Spring Cloud Config与Spring Cloud Bus的联合使用来介绍)来处理它。当依赖的服务因实现机制调整等原因造成其性能出现很大变化的时候,此时线程池的监控指标信息会反映出这样的变化。同时,我们也可以通过实时动态刷新自身应用对依赖服务的阈值进行调整以适应依赖方的改变。除了上面通过线程池隔离服务发挥的优点之外,每个专有线程池都提供了内置的并发实现,可以利用它为同步的依赖服务构建异步的访问。

总之,通过对依赖服务实现线程池隔离,让我们的应用更加健壮,不会因为个别依赖服务出现问题而引起非相关服务的异常。同时,也使得我们的应用变得更加灵活,可以在不停止服务的情况下,配合动态配置刷新实现性能配置上的调整。

虽然线程池隔离的方案带了如此多的好处,但是很多使用者可能会担心为每一个依赖服务都分配一个线程池是否会过多地增加系统的负载和开销。对于这一点,使用者不用过于担心,因为这些顾虑也是大部分工程师们会考虑到的,Netflix在设计Hystrix的时候,认为线程池上的开销相对于隔离所带来的好处是无法比拟的。同时,Netflix也针对线程池的开销做了相关的测试,以证明和打消Hystrix实现对性能影响的顾虑。

下图是Netflix Hystrix官方提供的一个Hystrix命令的性能监控,该命令以每秒60个请求的速度(QPS)向一个单服务实例进行访问,该服务实例每秒运行的线程数峰值为350个。






从图中的统计我们可以看到,使用线程池隔离与不使用线程池隔离的耗时差异如下表所示:






在99%的情况下,使用线程池隔离的延迟有9ms,对于大多数需求来说这样的消耗是微乎其微的,更何况为系统在稳定性和灵活性上所带来的巨大提升。虽然对于大部分的请求我们可以忽略线程池的额外开销,而对于小部分延迟本身就非常小的请求(可能只需要1ms),那么9ms的延迟开销还是非常昂贵的。实际上Hystrix也为此设计了另外的一个解决方案:信号量。

Hystrix中除了使用线程池之外,还可以使用信号量来控制单个依赖服务的并发度,信号量的开销要远比线程池的开销小得多,但是它不能设置超时和实现异步访问。所以,只有在依赖服务是足够可靠的情况下才使用信号量。在HystrixCommand和HystrixObservableCommand中2处支持信号量的使用:
 
命令执行:如果隔离策略参数execution.isolation.strategy设置为SEMAPHORE,Hystrix会使用信号量替代线程池来控制依赖服务的并发控制。降级逻辑:当Hystrix尝试降级逻辑时候,它会在调用线程中使用信号量。

信号量的默认值为10,我们也可以通过动态刷新配置的方式来控制并发线程的数量。对于信号量大小的估算方法与线程池并发度的估算类似。仅访问内存数据的请求一般耗时在1ms以内,性能可以达到5000rps,这样级别的请求我们可以将信号量设置为1或者2,我们可以按此标准并根据实际请求耗时来设置信号量。

如何使用

说了那么多依赖隔离的好处,那么我们如何使用Hystrix来实现依赖隔离呢?其实,我们在上一篇定义服务降级的时候,已经自动的实现了依赖隔离。

在上一篇的示例中,我们使用了@HystrixCommand来将某个函数包装成了Hystrix命令,这里除了定义服务降级之外,Hystrix框架就会自动的为这个函数实现调用的隔离。所以,依赖隔离、服务降级在使用时候都是一体化实现的,这样利用Hystrix来实现服务容错保护在编程模型上就非常方便的,并且考虑更为全面。除了依赖隔离、服务降级之外,还有一个重要元素:断路器。我们将在下一篇做详细的介绍,这三个重要利器构成了Hystrix实现服务容错保护的强力组合拳。

更多Spring Cloud内容请持续关注我的博客更新或在《Spring Cloud微服务实战》中获取。

代码示例

样例工程将沿用之前在码云和GitHub上创建的SpringCloud-Learning项目,重新做了一下整理。通过不同目录来区分Brixton和Dalston的示例。

码云:点击查看
GitHub:点击查看
 

本文作者:程序猿DD-翟永超
原文链接:Spring Cloud构建微服务架构:服务容错保护(Hystrix依赖隔离)【Dalston版】
版权归作者所有,转载请注明出处 查看全部
前言

在上一篇《Spring Cloud构建微服务架构:服务容错保护(Hystrix服务降级)》中,我们已经体验了如何使用@HystrixCommand来为一个依赖资源定义服务降级逻辑。实现方式非常简单,同时对于降级逻辑还能实现一些更加复杂的级联降级等策略。之前对于使用Hystrix来实现服务容错保护时,除了服务降级之外,我们还提到过线程隔离、断路器等功能。那么在本篇中我们就来具体说说线程隔离。

依赖隔离

“舱壁模式”对于熟悉Docker的读者一定不陌生,Docker通过“舱壁模式”实现进程的隔离,使得容器与容器之间不会互相影响。而Hystrix则使用该模式实现线程池的隔离,它会为每一个Hystrix命令创建一个独立的线程池,这样就算某个在Hystrix命令包装下的依赖服务出现延迟过高的情况,也只是对该依赖服务的调用产生影响,而不会拖慢其他的服务。

通过对依赖服务的线程池隔离实现,可以带来如下优势:
  • 应用自身得到完全的保护,不会受不可控的依赖服务影响。即便给依赖服务分配的线程池被填满,也不会影响应用自身的额其余部分。
  • 可以有效的降低接入新服务的风险。如果新服务接入后运行不稳定或存在问题,完全不会影响到应用其他的请求。
  • 当依赖的服务从失效恢复正常后,它的线程池会被清理并且能够马上恢复健康的服务,相比之下容器级别的清理恢复速度要慢得多。
  • 当依赖的服务出现配置错误的时候,线程池会快速的反应出此问题(通过失败次数、延迟、超时、拒绝等指标的增加情况)。同时,我们可以在不影响应用功能的情况下通过实时的动态属性刷新(后续会通过Spring Cloud Config与Spring Cloud Bus的联合使用来介绍)来处理它。
  • 当依赖的服务因实现机制调整等原因造成其性能出现很大变化的时候,此时线程池的监控指标信息会反映出这样的变化。同时,我们也可以通过实时动态刷新自身应用对依赖服务的阈值进行调整以适应依赖方的改变。
  • 除了上面通过线程池隔离服务发挥的优点之外,每个专有线程池都提供了内置的并发实现,可以利用它为同步的依赖服务构建异步的访问。


总之,通过对依赖服务实现线程池隔离,让我们的应用更加健壮,不会因为个别依赖服务出现问题而引起非相关服务的异常。同时,也使得我们的应用变得更加灵活,可以在不停止服务的情况下,配合动态配置刷新实现性能配置上的调整。

虽然线程池隔离的方案带了如此多的好处,但是很多使用者可能会担心为每一个依赖服务都分配一个线程池是否会过多地增加系统的负载和开销。对于这一点,使用者不用过于担心,因为这些顾虑也是大部分工程师们会考虑到的,Netflix在设计Hystrix的时候,认为线程池上的开销相对于隔离所带来的好处是无法比拟的。同时,Netflix也针对线程池的开销做了相关的测试,以证明和打消Hystrix实现对性能影响的顾虑。

下图是Netflix Hystrix官方提供的一个Hystrix命令的性能监控,该命令以每秒60个请求的速度(QPS)向一个单服务实例进行访问,该服务实例每秒运行的线程数峰值为350个。

spring-cloud-starter-dalston-4-2.png


从图中的统计我们可以看到,使用线程池隔离与不使用线程池隔离的耗时差异如下表所示:

微信截图_20170712222712.png


在99%的情况下,使用线程池隔离的延迟有9ms,对于大多数需求来说这样的消耗是微乎其微的,更何况为系统在稳定性和灵活性上所带来的巨大提升。虽然对于大部分的请求我们可以忽略线程池的额外开销,而对于小部分延迟本身就非常小的请求(可能只需要1ms),那么9ms的延迟开销还是非常昂贵的。实际上Hystrix也为此设计了另外的一个解决方案:信号量。

Hystrix中除了使用线程池之外,还可以使用信号量来控制单个依赖服务的并发度,信号量的开销要远比线程池的开销小得多,但是它不能设置超时和实现异步访问。所以,只有在依赖服务是足够可靠的情况下才使用信号量。在HystrixCommand和HystrixObservableCommand中2处支持信号量的使用:
 
  • 命令执行:如果隔离策略参数execution.isolation.strategy设置为SEMAPHORE,Hystrix会使用信号量替代线程池来控制依赖服务的并发控制。
  • 降级逻辑:当Hystrix尝试降级逻辑时候,它会在调用线程中使用信号量。


信号量的默认值为10,我们也可以通过动态刷新配置的方式来控制并发线程的数量。对于信号量大小的估算方法与线程池并发度的估算类似。仅访问内存数据的请求一般耗时在1ms以内,性能可以达到5000rps,这样级别的请求我们可以将信号量设置为1或者2,我们可以按此标准并根据实际请求耗时来设置信号量。

如何使用

说了那么多依赖隔离的好处,那么我们如何使用Hystrix来实现依赖隔离呢?其实,我们在上一篇定义服务降级的时候,已经自动的实现了依赖隔离。

在上一篇的示例中,我们使用了@HystrixCommand来将某个函数包装成了Hystrix命令,这里除了定义服务降级之外,Hystrix框架就会自动的为这个函数实现调用的隔离。所以,依赖隔离、服务降级在使用时候都是一体化实现的,这样利用Hystrix来实现服务容错保护在编程模型上就非常方便的,并且考虑更为全面。除了依赖隔离、服务降级之外,还有一个重要元素:断路器。我们将在下一篇做详细的介绍,这三个重要利器构成了Hystrix实现服务容错保护的强力组合拳。

更多Spring Cloud内容请持续关注我的博客更新或在《Spring Cloud微服务实战》中获取。

代码示例

样例工程将沿用之前在码云和GitHub上创建的SpringCloud-Learning项目,重新做了一下整理。通过不同目录来区分Brixton和Dalston的示例。

码云:点击查看
GitHub:点击查看
 


本文作者:程序猿DD-翟永超
原文链接:Spring Cloud构建微服务架构:服务容错保护(Hystrix依赖隔离)【Dalston版】
版权归作者所有,转载请注明出处


Spring Cloud Eureka 入门 (三)服务消费者详解

Spring Cloud泥瓦匠BYSocket 发表了文章 • 0 个评论 • 1158 次浏览 • 2017-07-12 19:03 • 来自相关话题

摘要: 原创出处:www.bysocket.com 泥瓦匠BYSocket 希望转载,保留摘要,谢谢!

“真正的进步,不在于学习,而在于反思”

 
「Spring Cloud Eureka 入门系列」
Spring Cloud Eureka 入门 (一)服务注册中心详解Spring Cloud Eureka 入门 (二)服务提供者详解Spring Cloud Eureka 入门 (三)服务消费者详解

本文提纲
1.  springcloud-eureka-sample 工程介绍
2. 运行 springcloud-eureka-client-customer 服务消费者工程
3. 详解 springcloud-eureka-client-customer 服务消费者工程

一、springcloud-eureka-sample 工程介绍
 
还是回到Eureka 集群简单架构图:






第一小节《Spring Cloud Eureka 入门 (一)服务注册中心详解》实现了 Eureka Server 作为注册中心,
第二小节《Spring Cloud Eureka 入门 (二)服务提供者详解》是 Provider Service B 的案例,实现了 Eureka Cleint 作为服务提供者,包括其服务的注册和心跳的功能。
本小节,是 Provider Service A 的案例,实现了 Eureka Cleint 作为服务消费者,包括其服务的注册和心跳的功能,还有其服务发现和通过 Ribbon 进行服务调用的功能。

springcloud-eureka-client-customer  服务消费者工程,他本身也是一个服务提供者。即具有服务提供功能和服务消费功能。下面去运行该工程

二、运行 springcloud-eureka-client-customer 服务消费者工程
运行环境:JDK 7 或 8,Maven 3.0+
技术栈:Spring Cloud Dalston.SR1、 spring-cloud-netflix 1.3.1、Spring Boot 1.5.4

自然,我们先得去上一小节《Spring Cloud Eureka 入门 (一)服务注册中心详解》 ,把注册中心工程启动完毕。

1. git clone 下载工程 springcloud-learning-example
项目地址见 GitHub - https://github.com/JeffLi1993/springcloud-learning-example: 
 git clone https://github.com/JeffLi1993/ ... e.git


 
2. Maven 编译安装这个工程:cd springcloud-learning-example
mvn clean install

3. 运行 Eureka 工程 springcloud-eureka-client-customer
启动 springcloud-eureka-client-customer 工程启动类 CustomerApplication,启动服务注册中心工程。
EurekaServerApplication 类路径:/springcloud-learning-example/springcloud-eureka-sample/springcloud-eureka-client-customer/src/main/java/org/spring/springcloud/CustomerApplication.java
 
控制台 Console 看到这类信息,代表启动成功:2017-07-12 18:19:21.725 INFO 11314 --- [nfoReplicator-0] com.netflix.discovery.DiscoveryClient : DiscoveryClient_CUSTOMER-SERVICE/10.18.29.64:customer-service:8081: registering service...
2017-07-12 18:19:21.814 INFO 11314 --- [nfoReplicator-0] com.netflix.discovery.DiscoveryClient : DiscoveryClient_CUSTOMER-SERVICE/10.18.29.64:customer-service:8081 - registration status: 204
2017-07-12 18:19:21.916 INFO 11314 --- [ main] s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat started on port(s): 8081 (http)
2017-07-12 18:19:21.918 INFO 11314 --- [ main] .s.c.n.e.s.EurekaAutoServiceRegistration : Updating port to 8081
2017-07-12 18:19:21.925 INFO 11314 --- [ main] o.s.springcloud.CustomerApplication : Started CustomerApplication in 17.075 seconds (JVM running for 18.141)可以看出,注册了应用名为 CUSTOMER-SERVICE 的应用,该服务提供者的工程端口为 8081

4. 访问 Eureka 注册中心可视化界面
打开浏览器,访问 http://localhost:8888/ ,如图所示:






可以看到,服务提供者向服务注册中心注册自己的实例,展示了应用名和端口信息等。
5.访问服务消费者案例
打开浏览器,访问 http://localhost:8081/customer,如图所示: 
 






可以看出,下面一句消息 Hello,Provider! ,是服务消费者调用服务提供者获取的信息。
 

三、详解 springcloud-eureka-client-customer 服务消费者工程
1.springcloud-eureka-client-customer 工程目录结构├── pom.xml
└── src
└── main
├── java
│ └── org
│ └── spring
│ ├── springcloud
│ │ └── CustomerApplication.java
│ └── web
│ └── CustomerController.java
└── resources
└── application.yml
ProviderApplication.java Eureka Discovery Client 启动类,启动服务消费者工程,本身也会注册到注册中心,也能发现其他服务。
CustomerController.java 服务消费者 HelloWorld 案例
application.yml 配置文件
 

2. pom.xml 配置<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/ma ... gt%3B
<modelVersion>4.0.0</modelVersion>
<groupId>springcloud</groupId>
<artifactId>springcloud-eureka-client-customer</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>springcloud-eureka-client-customer :: 服务消费者</name>
<!-- Spring Boot 启动父依赖 -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.4.RELEASE</version>
</parent>
<dependencies>
<!-- Spring Cloud Netflix Eureka 依赖 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
<!-- Spring Boot Test 依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<!-- Spring Cloud Netflix 依赖 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-netflix</artifactId>
<version>1.3.1.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</build>
</project>使用的依赖是
- spring-cloud-netflix 1.3.1 是 Spring Cloud Dalston.SR1 版本。
- spring-cloud-starter-eureka Eureka Client 模块依赖,包含了客户端 client 的依赖,还有 Ribbon 的依赖,如:org.springframework.cloud:spring-cloud-netflix-eureka-client:1.3.1.RELEASE
org.springframework.cloud:spring-cloud-starter-ribbon:1.3.1.RELEASE
 

3. application.yml 配置server:
port: 8081 # 服务端口
eureka:
client:
service-url:
defaultZone: http://localhost:8888/eureka/ # 服务注册中心地址
spring:
application:
name: customer-service # 服务名称
- server.port 设置工程服务端口
- eureka.client.service-url.defaultZone 设置服务注册中心地址



4.服务消费者应用启动类/**
* Spring Boot Eureka Server 应用启动类
*
* Created by bysocket on 21/06/17.
*/
@EnableDiscoveryClient // Eureka Discovery Client 标识
@SpringBootApplication // Spring Boot 应用标识
public class CustomerApplication {
@Bean
@LoadBalanced
RestTemplate restTemplate() {
return new RestTemplate();
}
public static void main(String args) {
// 程序启动入口
// 启动嵌入式的 Tomcat 并初始化 Spring 环境及其各 Spring 组件
SpringApplication.run(CustomerApplication.class,args);
}
}
@EnableDiscoveryClient 标志该应用作为 Eureka Client ,并会自动化读取 Eureka 相关配置。还有向服务注册中心发现服务并进行调用。
@LoadBalanced 标志着 RestTemplate 是通过 Ribbon 客户端负载均衡去调用服务提供者集群的。即可以在获取的服务提供者实例列表中,通过 Ribbon 进行选择某实例,然后调用该服务实例。

6.服务消费者 Hello World 案例/**
* Customer HelloWorld 案例
* <p>
* Created by bysocket on 06/22/17.
*/
@RestController
public class CustomerController {
private static final Logger LOGGER = LoggerFactory.getLogger(CustomerController.class);
@Autowired
private RestTemplate restTemplate; // HTTP 访问操作类
@RequestMapping("/customer")
public String customer() {
String providerMsg = restTemplate.getForEntity("http://PROVIDER-SERVICE/provider",
String.class).getBody();
return "Hello,Customer! msg from provider : <br/><br/> " + providerMsg;
}
}可以看到注入了 RestTemplate 对象,它是 HTTP 访问操作类。
然后 customer 方法,通过 restTemplate 通过 HTTP 协议调用服务提供者暴露的 provider 接口,并获取服务提供者的结果。然后组装输出。

四、小结
此小章节介绍了如何 Eureka 作为服务消费者,并向服务注册中心注册自己实例,更重要的是发现其他服务,并调用其他服务。 
这是 Spring Cloud Eureka 入门系列完结:
Spring Cloud Eureka 入门 (一)服务注册中心详解Spring Cloud Eureka 入门 (二)服务提供者详解Spring Cloud Eureka 入门 (三)服务消费者详解

推荐:springcloud-learning-example 开源项目 https://github.com/JeffLi1993/ ... e.git
资料:
《Spring Cloud微服务实战》二维码






官方文档
http://cloud.spring.io/spring-cloud-static/spring-cloud-netflix/1.3.1.RELEASE/
 





  查看全部
摘要: 原创出处:www.bysocket.com 泥瓦匠BYSocket 希望转载,保留摘要,谢谢!


“真正的进步,不在于学习,而在于反思”


 
「Spring Cloud Eureka 入门系列」


本文提纲
1.  springcloud-eureka-sample 工程介绍
2. 运行 springcloud-eureka-client-customer 服务消费者工程
3. 详解 springcloud-eureka-client-customer 服务消费者工程


一、springcloud-eureka-sample 工程介绍
 
还是回到Eureka 集群简单架构图:

7c852379823bcb6ccc32ec474f4a5794.jpeg


第一小节《Spring Cloud Eureka 入门 (一)服务注册中心详解》实现了 Eureka Server 作为注册中心,
第二小节《Spring Cloud Eureka 入门 (二)服务提供者详解》是 Provider Service B 的案例,实现了 Eureka Cleint 作为服务提供者,包括其服务的注册和心跳的功能。
本小节,是 Provider Service A 的案例,实现了 Eureka Cleint 作为服务消费者,包括其服务的注册和心跳的功能,还有其服务发现和通过 Ribbon 进行服务调用的功能。

springcloud-eureka-client-customer  服务消费者工程,他本身也是一个服务提供者。即具有服务提供功能和服务消费功能。下面去运行该工程

二、运行 springcloud-eureka-client-customer 服务消费者工程
运行环境:JDK 7 或 8,Maven 3.0+
技术栈:Spring Cloud Dalston.SR1、 spring-cloud-netflix 1.3.1、Spring Boot 1.5.4

自然,我们先得去上一小节《Spring Cloud Eureka 入门 (一)服务注册中心详解》 ,把注册中心工程启动完毕。

1. git clone 下载工程 springcloud-learning-example
项目地址见 GitHub - https://github.com/JeffLi1993/springcloud-learning-example: 
 
git clone https://github.com/JeffLi1993/ ... e.git


 
2. Maven 编译安装这个工程:
cd springcloud-learning-example
mvn clean install


3. 运行 Eureka 工程 springcloud-eureka-client-customer
启动 springcloud-eureka-client-customer 工程启动类 CustomerApplication,启动服务注册中心工程。
EurekaServerApplication 类路径:/springcloud-learning-example/springcloud-eureka-sample/springcloud-eureka-client-customer/src/main/java/org/spring/springcloud/CustomerApplication.java
 
控制台 Console 看到这类信息,代表启动成功:
2017-07-12 18:19:21.725  INFO 11314 --- [nfoReplicator-0] com.netflix.discovery.DiscoveryClient    : DiscoveryClient_CUSTOMER-SERVICE/10.18.29.64:customer-service:8081: registering service...
2017-07-12 18:19:21.814 INFO 11314 --- [nfoReplicator-0] com.netflix.discovery.DiscoveryClient : DiscoveryClient_CUSTOMER-SERVICE/10.18.29.64:customer-service:8081 - registration status: 204
2017-07-12 18:19:21.916 INFO 11314 --- [ main] s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat started on port(s): 8081 (http)
2017-07-12 18:19:21.918 INFO 11314 --- [ main] .s.c.n.e.s.EurekaAutoServiceRegistration : Updating port to 8081
2017-07-12 18:19:21.925 INFO 11314 --- [ main] o.s.springcloud.CustomerApplication : Started CustomerApplication in 17.075 seconds (JVM running for 18.141)
可以看出,注册了应用名为 CUSTOMER-SERVICE 的应用,该服务提供者的工程端口为 8081

4. 访问 Eureka 注册中心可视化界面
打开浏览器,访问 http://localhost:8888/ ,如图所示:

WX20170712-182332.png


可以看到,服务提供者向服务注册中心注册自己的实例,展示了应用名和端口信息等。
5.访问服务消费者案例
打开浏览器,访问 http://localhost:8081/customer,如图所示: 
 

WX20170712-182628.png


可以看出,下面一句消息 Hello,Provider! ,是服务消费者调用服务提供者获取的信息。
 

三、详解 springcloud-eureka-client-customer 服务消费者工程
1.springcloud-eureka-client-customer 工程目录结构
├── pom.xml
└── src
└── main
├── java
│ └── org
│ └── spring
│ ├── springcloud
│ │ └── CustomerApplication.java
│ └── web
│ └── CustomerController.java
└── resources
└── application.yml

ProviderApplication.java Eureka Discovery Client 启动类,启动服务消费者工程,本身也会注册到注册中心,也能发现其他服务。
CustomerController.java 服务消费者 HelloWorld 案例
application.yml 配置文件
 

2. pom.xml 配置
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/ma ... gt%3B
<modelVersion>4.0.0</modelVersion>
<groupId>springcloud</groupId>
<artifactId>springcloud-eureka-client-customer</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>springcloud-eureka-client-customer :: 服务消费者</name>
<!-- Spring Boot 启动父依赖 -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.4.RELEASE</version>
</parent>
<dependencies>
<!-- Spring Cloud Netflix Eureka 依赖 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
<!-- Spring Boot Test 依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<!-- Spring Cloud Netflix 依赖 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-netflix</artifactId>
<version>1.3.1.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</build>
</project>
使用的依赖是
- spring-cloud-netflix 1.3.1 是 Spring Cloud Dalston.SR1 版本。
- spring-cloud-starter-eureka Eureka Client 模块依赖,包含了客户端 client 的依赖,还有 Ribbon 的依赖,如:org.springframework.cloud:spring-cloud-netflix-eureka-client:1.3.1.RELEASE
org.springframework.cloud:spring-cloud-starter-ribbon:1.3.1.RELEASE
 

3. application.yml 配置
server:
port: 8081 # 服务端口
eureka:
client:
service-url:
defaultZone: http://localhost:8888/eureka/ # 服务注册中心地址
spring:
application:
name: customer-service # 服务名称
- server.port 设置工程服务端口
- eureka.client.service-url.defaultZone 设置服务注册中心地址



4.服务消费者应用启动类
/**
* Spring Boot Eureka Server 应用启动类
*
* Created by bysocket on 21/06/17.
*/
@EnableDiscoveryClient // Eureka Discovery Client 标识
@SpringBootApplication // Spring Boot 应用标识
public class CustomerApplication {
@Bean
@LoadBalanced
RestTemplate restTemplate() {
return new RestTemplate();
}
public static void main(String args) {
// 程序启动入口
// 启动嵌入式的 Tomcat 并初始化 Spring 环境及其各 Spring 组件
SpringApplication.run(CustomerApplication.class,args);
}
}

@EnableDiscoveryClient 标志该应用作为 Eureka Client ,并会自动化读取 Eureka 相关配置。还有向服务注册中心发现服务并进行调用。
@LoadBalanced 标志着 RestTemplate 是通过 Ribbon 客户端负载均衡去调用服务提供者集群的。即可以在获取的服务提供者实例列表中,通过 Ribbon 进行选择某实例,然后调用该服务实例。

6.服务消费者 Hello World 案例
/**
* Customer HelloWorld 案例
* <p>
* Created by bysocket on 06/22/17.
*/
@RestController
public class CustomerController {
private static final Logger LOGGER = LoggerFactory.getLogger(CustomerController.class);
@Autowired
private RestTemplate restTemplate; // HTTP 访问操作类
@RequestMapping("/customer")
public String customer() {
String providerMsg = restTemplate.getForEntity("http://PROVIDER-SERVICE/provider",
String.class).getBody();
return "Hello,Customer! msg from provider : <br/><br/> " + providerMsg;
}
}
可以看到注入了 RestTemplate 对象,它是 HTTP 访问操作类。
然后 customer 方法,通过 restTemplate 通过 HTTP 协议调用服务提供者暴露的 provider 接口,并获取服务提供者的结果。然后组装输出。

四、小结
此小章节介绍了如何 Eureka 作为服务消费者,并向服务注册中心注册自己实例,更重要的是发现其他服务,并调用其他服务。 
这是 Spring Cloud Eureka 入门系列完结:


推荐:springcloud-learning-example 开源项目 https://github.com/JeffLi1993/ ... e.git
资料:
《Spring Cloud微服务实战》二维码

481AEC9F-3FE5-44C3-A61C-28D518CB9217.png


官方文档
http://cloud.spring.io/spring-cloud-static/spring-cloud-netflix/1.3.1.RELEASE/
 

qrcode_for_gh_cd421e7eb7d6_430.jpg

 

sky-walking 将使用Spring Cloud/Stream 在CNUTCon 2017大会上演示分布式监控

Spring Cloudwusheng 发表了文章 • 0 个评论 • 575 次浏览 • 2017-07-11 15:44 • 来自相关话题

2017年9月11日,下午,Sky-walking(https://github.com/wu-sheng/sky-walking)开源团队两位Project Maintainer将参与CNUTCon 2017的”运维监控与安全“专场,讲解构建微服务下的性能监控 
吴晟:华为开发云监控产品经理,主导监控产品的规划、技术路线及相关研发工作。前OneAPM Ai 应用性能监控产品架构师,CNCF OpenTracing分布式追踪标组织成员,OTIAB成员,OpenTracing标准中文版本的发起者和维护者,CNCF GSoC 2017导师,sky-walking Founder and Project Maintainer。彭勇升:OneAPM技术专家,sky-walking Project Maintainer。
 
APM系统诞生已久,但是在这几年才越来越受到开发、运维团队的关注,应用系统从CS到J2EE,再到如今的SOA、微服务以及容器化,应用的分布式复杂程度与日俱增,当年可以从日志排查的错误,现在却成为了难以定位的问题。
 
我们将从行业背景,分布式追踪全球发展,构建适合自己的追踪系统等多个方面,介绍分布式追踪。
 
而最后的重头戏,我们会使用Spring生态组件: Spring Cloud Config,Netflix Eureka, Spring Stream, Spring Cloud Bus, 构建一个模拟的分布式应用,并使用sky-walking展示秒级的分布式追踪。 查看全部
2017年9月11日,下午,Sky-walking(https://github.com/wu-sheng/sky-walking)开源团队两位Project Maintainer将参与CNUTCon 2017的”运维监控与安全“专场,讲解构建微服务下的性能监控 
  • 吴晟:华为开发云监控产品经理,主导监控产品的规划、技术路线及相关研发工作。前OneAPM Ai 应用性能监控产品架构师,CNCF OpenTracing分布式追踪标组织成员,OTIAB成员,OpenTracing标准中文版本的发起者和维护者,CNCF GSoC 2017导师,sky-walking Founder and Project Maintainer。
  • 彭勇升:OneAPM技术专家,sky-walking Project Maintainer。

 
APM系统诞生已久,但是在这几年才越来越受到开发、运维团队的关注,应用系统从CS到J2EE,再到如今的SOA、微服务以及容器化,应用的分布式复杂程度与日俱增,当年可以从日志排查的错误,现在却成为了难以定位的问题。
 
我们将从行业背景,分布式追踪全球发展,构建适合自己的追踪系统等多个方面,介绍分布式追踪。
 
而最后的重头戏,我们会使用Spring生态组件: Spring Cloud Config,Netflix Eureka, Spring Stream, Spring Cloud Bus, 构建一个模拟的分布式应用,并使用sky-walking展示秒级的分布式追踪。

Spring Cloud Eureka 入门 (二)服务提供者详解

Spring Cloud泥瓦匠BYSocket 发表了文章 • 0 个评论 • 1990 次浏览 • 2017-07-10 16:52 • 来自相关话题

 
摘要: 原创出处:www.bysocket.com 泥瓦匠BYSocket 希望转载,保留摘要,谢谢!

“优秀不是过去是一种心态”

 
「Spring Cloud Eureka 入门系列」
Spring Cloud Eureka 入门 (一)服务注册中心详解Spring Cloud Eureka 入门 (二)服务提供者详解Spring Cloud Eureka 入门 (三)服务消费者详解

本文提纲
1. springcloud-eureka-sample 工程结构
2. 运行 springcloud-eureka-client-provider 服务提供者工程
3. 详解 springcloud-eureka-client-provider 服务提供者工程
 
一、springcloud-eureka-sample 工程结构
接着上一小节《Spring Cloud Eureka 入门 (一)服务注册中心详解》,我们成功运行了 Spring Cloud Eureka Server 工程作为服务注册中心工程。这小节,我们写一个作为客户端的服务提供者工程,服务提供者向服务中心注册或者下线服务实例。即图中的右侧 1 ,2 流程:






springcloud-eureka-sample 工程结构├── springcloud-eureka-client-customer
├── springcloud-eureka-client-provider
└── springcloud-eureka-server
上面依次是 服务消费者工程、服务提供者工程和服务注册中心工程。
 
二、运行 springcloud-eureka-client-provider 服务提供者工程
运行环境:JDK 7 或 8,Maven 3.0+
技术栈:Spring Cloud Dalston.SR1、 spring-cloud-netflix 1.3.1、Spring Boot 1.5.4

自然,我们先得去上一小节《Spring Cloud Eureka 入门 (一)服务注册中心详解》 ,把注册中心工程启动完毕。

1. git clone 下载工程 springcloud-learning-example
项目地址见 GitHub - https://github.com/JeffLi1993/ ... ample:git clone https://github.com/JeffLi1993/ ... e.git
2. Maven 编译安装这个工程:cd springcloud-learning-example
mvn clean install
3. 运行 Eureka 工程 springcloud-eureka-client-provider
启动 springcloud-eureka-client-provider 工程启动类 ProviderApplication,启动服务注册中心工程。
EurekaServerApplication 类路径:/springcloud-learning-example/springcloud-eureka-sample/springcloud-eureka-client-provider/src/main/java/org/spring/springcloud/ProviderApplication.java

控制台 Console 看到这类信息,代表启动成功:2017-07-10 16:03:15.075 INFO 11020 --- [ main] o.s.c.n.e.s.EurekaServiceRegistry : Registering application provider-service with eureka with status UP
2017-07-10 16:03:15.075 INFO 11020 --- [ main] com.netflix.discovery.DiscoveryClient : Saw local status change event StatusChangeEvent [timestamp=1499673795075, current=UP, previous=STARTING]
2017-07-10 16:03:15.079 INFO 11020 --- [nfoReplicator-0] com.netflix.discovery.DiscoveryClient : DiscoveryClient_PROVIDER-SERVICE/10.18.29.31:provider-service:8080: registering service...
2017-07-10 16:03:15.126 INFO 11020 --- [nfoReplicator-0] com.netflix.discovery.DiscoveryClient : DiscoveryClient_PROVIDER-SERVICE/10.18.29.31:provider-service:8080 - registration status: 204
2017-07-10 16:03:15.183 INFO 11020 --- [ main] s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat started on port(s): 8080 (http)
2017-07-10 16:03:15.185 INFO 11020 --- [ main] .s.c.n.e.s.EurekaAutoServiceRegistration : Updating port to 8080
2017-07-10 16:03:15.191 INFO 11020 --- [ main] o.s.springcloud.ProviderApplication : Started ProviderApplication in 9.809 seconds (JVM running for 10.981)
可以看出,注册了应用名为 provider-service 的应用,该服务提供者的工程端口为 8080

4. 访问 Eureka 注册中心可视化界面
打开浏览器,访问 http://localhost:8888/ ,如图所示:





可以看到,服务提供者向服务注册中心注册自己的实例,展示了应用名和端口信息等。

三、详解 springcloud-eureka-client-provider 服务提供者工程
1.springcloud-eureka-server  工程目录结构├── pom.xml
└── src
└── main
├── java
│ └── org
│ └── spring
│ ├── springcloud
│ │ └── ProviderApplication.java
│ └── web
│ └── ProviderController.java
└── resources
└── application.yml
ProviderApplication.java Eureka Client 启动类,启动服务提供者工程
ProviderApplication.java Provider HelloWorld 案例
application.yml 配置文件

2. pom.xml 配置<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/ma ... gt%3B
<modelVersion>4.0.0</modelVersion>
<groupId>springcloud</groupId>
<artifactId>springcloud-eureka-client-provider</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>springcloud-eureka-client-provider :: 服务提供者</name>
<!-- Spring Boot 启动父依赖 -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.4.RELEASE</version>
</parent>
<dependencies>
<!-- Spring Cloud Netflix Eureka Client 依赖 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
<!-- Spring Boot Test 依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<!-- Spring Cloud Netflix 依赖 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-netflix</artifactId>
<version>1.3.1.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</build>
</project>
使用的依赖是
- spring-cloud-netflix 1.3.1 是 Spring Cloud Dalston.SR1 版本。
- spring-cloud-starter-eureka Eureka Client 模块依赖,包含了客户端 client 的依赖,还有 Ribbon 的依赖,如:org.springframework.cloud:spring-cloud-netflix-eureka-client:1.3.1.RELEASE
org.springframework.cloud:spring-cloud-starter-ribbon:1.3.1.RELEASE
 

3. application.yml 配置server:
port: 8080 # 服务端口
eureka:
client:
service-url:
defaultZone: http://localhost:8888/eureka/ # 服务注册中心地址
spring:
application:
name: provider-service # 服务名称- server.port 设置工程服务端口
- eureka.client.service-url.defaultZone 设置服务注册中心地址
 
4.注册中心应用启动类/**
* Spring Boot Eureka Server 应用启动类
*
* Created by bysocket on 21/06/17.
*/
@EnableEurekaClient // Eureka Client 标识
@SpringBootApplication // Spring Boot 应用标识
public class ProviderApplication {
public static void main(String args) {
// 程序启动入口
// 启动嵌入式的 Tomcat 并初始化 Spring 环境及其各 Spring 组件
SpringApplication.run(ProviderApplication.class,args);
}
}@EnableEurekaClient 标志该应用作为 Eureka Client ,并会自动化读取 Eureka 相关配置。

6.服务提供者 Hello World 案例/**
* Provider HelloWorld 案例
* <p>
* Created by bysocket on 06/22/17.
*/
@RestController
public class ProviderController {
private static final Logger LOGGER = LoggerFactory.getLogger(ProviderController.class);
@Autowired
private Registration registration; // 服务注册
@Autowired
private DiscoveryClient discoveryClient; // 服务发现客户端
@RequestMapping("/provider")
public String provider() {
ServiceInstance instance = serviceInstance();
LOGGER.info("provider service, host = " + instance.getHost()
+ ", service_id = " + instance.getServiceId());
return "Hello,Provider!";
}
/**
* 获取当前服务的服务实例
*
* @return ServiceInstance
*/
public ServiceInstance serviceInstance() {
List<ServiceInstance> list = discoveryClient.getInstances(registration.getServiceId());
if (list != null && list.size() > 0) {
return list.get(0);
}
return null;
}
}可以看到注入了 Registration 和 DiscoveryClient 两个对象:
- Registration 服务注册接口,包含了获取服务 ID 的方法。
- DiscoveryClient 服务发现客户端,具有以下方法:
     - String description(); 获取描述
     - ServiceInstance getLocalServiceInstance(); @Deprecated 方法被删除,推荐不要使用。获取本地服务实例
     - List<ServiceInstance> getInstances(String serviceId);  通过服务 ID,获取当前服务的服务实例
     - List<String> getServices(); 获取所有服务 ID 列表

四、小结
此小章节介绍了如何 Eureka 作为服务提供者,并向服务注册中心注册自己实例。 下一小结讲下 服务消费者详解 具体是如何向服务注册中心注册自己,发现其他服务,并调用其他服务的。系列目录如下:
Spring Cloud Eureka 入门 (一)服务注册中心详解Spring Cloud Eureka 入门 (二)服务提供者详解Spring Cloud Eureka 入门 (三)服务消费者详解

资料:
1.《Spring Cloud微服务实战》






2. 官方文档
http://cloud.spring.io/spring- ... EASE/

by 泥瓦匠博客
— http://www.bysocket.com/
— https://github.com/JeffLi1993 查看全部
 
摘要: 原创出处:www.bysocket.com 泥瓦匠BYSocket 希望转载,保留摘要,谢谢!


“优秀不是过去是一种心态”


 
「Spring Cloud Eureka 入门系列」


本文提纲
1. springcloud-eureka-sample 工程结构
2. 运行 springcloud-eureka-client-provider 服务提供者工程
3. 详解 springcloud-eureka-client-provider 服务提供者工程
 
一、springcloud-eureka-sample 工程结构
接着上一小节《Spring Cloud Eureka 入门 (一)服务注册中心详解》,我们成功运行了 Spring Cloud Eureka Server 工程作为服务注册中心工程。这小节,我们写一个作为客户端的服务提供者工程,服务提供者向服务中心注册或者下线服务实例。即图中的右侧 1 ,2 流程:

Eureka集群.jpeg


springcloud-eureka-sample 工程结构
├── springcloud-eureka-client-customer
├── springcloud-eureka-client-provider
└── springcloud-eureka-server

上面依次是 服务消费者工程、服务提供者工程和服务注册中心工程。
 
二、运行 springcloud-eureka-client-provider 服务提供者工程
运行环境:JDK 7 或 8,Maven 3.0+
技术栈:Spring Cloud Dalston.SR1、 spring-cloud-netflix 1.3.1、Spring Boot 1.5.4

自然,我们先得去上一小节《Spring Cloud Eureka 入门 (一)服务注册中心详解》 ,把注册中心工程启动完毕。

1. git clone 下载工程 springcloud-learning-example
项目地址见 GitHub - https://github.com/JeffLi1993/ ... ample
git clone https://github.com/JeffLi1993/ ... e.git

2. Maven 编译安装这个工程:
cd springcloud-learning-example
mvn clean install

3. 运行 Eureka 工程 springcloud-eureka-client-provider
启动 springcloud-eureka-client-provider 工程启动类 ProviderApplication,启动服务注册中心工程。
EurekaServerApplication 类路径:/springcloud-learning-example/springcloud-eureka-sample/springcloud-eureka-client-provider/src/main/java/org/spring/springcloud/ProviderApplication.java

控制台 Console 看到这类信息,代表启动成功:
2017-07-10 16:03:15.075  INFO 11020 --- [           main] o.s.c.n.e.s.EurekaServiceRegistry        : Registering application provider-service with eureka with status UP
2017-07-10 16:03:15.075 INFO 11020 --- [ main] com.netflix.discovery.DiscoveryClient : Saw local status change event StatusChangeEvent [timestamp=1499673795075, current=UP, previous=STARTING]
2017-07-10 16:03:15.079 INFO 11020 --- [nfoReplicator-0] com.netflix.discovery.DiscoveryClient : DiscoveryClient_PROVIDER-SERVICE/10.18.29.31:provider-service:8080: registering service...
2017-07-10 16:03:15.126 INFO 11020 --- [nfoReplicator-0] com.netflix.discovery.DiscoveryClient : DiscoveryClient_PROVIDER-SERVICE/10.18.29.31:provider-service:8080 - registration status: 204
2017-07-10 16:03:15.183 INFO 11020 --- [ main] s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat started on port(s): 8080 (http)
2017-07-10 16:03:15.185 INFO 11020 --- [ main] .s.c.n.e.s.EurekaAutoServiceRegistration : Updating port to 8080
2017-07-10 16:03:15.191 INFO 11020 --- [ main] o.s.springcloud.ProviderApplication : Started ProviderApplication in 9.809 seconds (JVM running for 10.981)

可以看出,注册了应用名为 provider-service 的应用,该服务提供者的工程端口为 8080

4. 访问 Eureka 注册中心可视化界面
打开浏览器,访问 http://localhost:8888/ ,如图所示:

WechatIMG442.jpeg

可以看到,服务提供者向服务注册中心注册自己的实例,展示了应用名和端口信息等。

三、详解 springcloud-eureka-client-provider 服务提供者工程
1.springcloud-eureka-server  工程目录结构
├── pom.xml
└── src
└── main
├── java
│ └── org
│ └── spring
│ ├── springcloud
│ │ └── ProviderApplication.java
│ └── web
│ └── ProviderController.java
└── resources
└── application.yml

ProviderApplication.java Eureka Client 启动类,启动服务提供者工程
ProviderApplication.java Provider HelloWorld 案例
application.yml 配置文件

2. pom.xml 配置
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/ma ... gt%3B
<modelVersion>4.0.0</modelVersion>
<groupId>springcloud</groupId>
<artifactId>springcloud-eureka-client-provider</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>springcloud-eureka-client-provider :: 服务提供者</name>
<!-- Spring Boot 启动父依赖 -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.4.RELEASE</version>
</parent>
<dependencies>
<!-- Spring Cloud Netflix Eureka Client 依赖 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
<!-- Spring Boot Test 依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<!-- Spring Cloud Netflix 依赖 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-netflix</artifactId>
<version>1.3.1.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</build>
</project>

使用的依赖是
- spring-cloud-netflix 1.3.1 是 Spring Cloud Dalston.SR1 版本。
- spring-cloud-starter-eureka Eureka Client 模块依赖,包含了客户端 client 的依赖,还有 Ribbon 的依赖,如:org.springframework.cloud:spring-cloud-netflix-eureka-client:1.3.1.RELEASE
org.springframework.cloud:spring-cloud-starter-ribbon:1.3.1.RELEASE
 

3. application.yml 配置
server:
port: 8080 # 服务端口
eureka:
client:
service-url:
defaultZone: http://localhost:8888/eureka/ # 服务注册中心地址
spring:
application:
name: provider-service # 服务名称
- server.port 设置工程服务端口
- eureka.client.service-url.defaultZone 设置服务注册中心地址
 
4.注册中心应用启动类
/**
* Spring Boot Eureka Server 应用启动类
*
* Created by bysocket on 21/06/17.
*/
@EnableEurekaClient // Eureka Client 标识
@SpringBootApplication // Spring Boot 应用标识
public class ProviderApplication {
public static void main(String args) {
// 程序启动入口
// 启动嵌入式的 Tomcat 并初始化 Spring 环境及其各 Spring 组件
SpringApplication.run(ProviderApplication.class,args);
}
}
@EnableEurekaClient 标志该应用作为 Eureka Client ,并会自动化读取 Eureka 相关配置。

6.服务提供者 Hello World 案例
/**
* Provider HelloWorld 案例
* <p>
* Created by bysocket on 06/22/17.
*/
@RestController
public class ProviderController {
private static final Logger LOGGER = LoggerFactory.getLogger(ProviderController.class);
@Autowired
private Registration registration; // 服务注册
@Autowired
private DiscoveryClient discoveryClient; // 服务发现客户端
@RequestMapping("/provider")
public String provider() {
ServiceInstance instance = serviceInstance();
LOGGER.info("provider service, host = " + instance.getHost()
+ ", service_id = " + instance.getServiceId());
return "Hello,Provider!";
}
/**
* 获取当前服务的服务实例
*
* @return ServiceInstance
*/
public ServiceInstance serviceInstance() {
List<ServiceInstance> list = discoveryClient.getInstances(registration.getServiceId());
if (list != null && list.size() > 0) {
return list.get(0);
}
return null;
}
}
可以看到注入了 Registration 和 DiscoveryClient 两个对象:
- Registration 服务注册接口,包含了获取服务 ID 的方法。
- DiscoveryClient 服务发现客户端,具有以下方法:
     - String description(); 获取描述
     - ServiceInstance getLocalServiceInstance(); @Deprecated 方法被删除,推荐不要使用。获取本地服务实例
     - List<ServiceInstance> getInstances(String serviceId);  通过服务 ID,获取当前服务的服务实例
     - List<String> getServices(); 获取所有服务 ID 列表

四、小结
此小章节介绍了如何 Eureka 作为服务提供者,并向服务注册中心注册自己实例。 下一小结讲下 服务消费者详解 具体是如何向服务注册中心注册自己,发现其他服务,并调用其他服务的。系列目录如下:


资料:
1.《Spring Cloud微服务实战》

481AEC9F-3FE5-44C3-A61C-28D518CB9217.png


2. 官方文档
http://cloud.spring.io/spring- ... EASE/


by 泥瓦匠博客
http://www.bysocket.com/
https://github.com/JeffLi1993

qrcode_for_gh_cd421e7eb7d6_430.jpg


Spring Cloud构建微服务架构:服务容错保护(Hystrix服务降级)【Dalston版】

Spring Cloud程序猿DD 发表了文章 • 0 个评论 • 457 次浏览 • 2017-07-05 07:45 • 来自相关话题

前言

在微服务架构中,我们将系统拆分成了一个个的服务单元,各单元应用间通过服务注册与订阅的方式互相依赖。由于每个单元都在不同的进程中运行,依赖通过远程调用的方式执行,这样就有可能因为网络原因或是依赖服务自身问题出现调用故障或延迟,而这些问题会直接导致调用方的对外服务也出现延迟,若此时调用方的请求不断增加,最后就会出现因等待出现故障的依赖方响应而形成任务积压,线程资源无法释放,最终导致自身服务的瘫痪,进一步甚至出现故障的蔓延最终导致整个系统的瘫痪。如果这样的架构存在如此严重的隐患,那么相较传统架构就更加的不稳定。为了解决这样的问题,因此产生了断路器等一系列的服务保护机制。

针对上述问题,在Spring Cloud Hystrix中实现了线程隔离、断路器等一系列的服务保护功能。它也是基于Netflix的开源框架 Hystrix实现的,该框架目标在于通过控制那些访问远程系统、服务和第三方库的节点,从而对延迟和故障提供更强大的容错能力。Hystrix具备了服务降级、服务熔断、线程隔离、请求缓存、请求合并以及服务监控等强大功能。

接下来,我们就从一个简单示例开始对Spring Cloud Hystrix的学习与使用。

动手试一试

在开始使用Spring Cloud Hystrix实现断路器之前,我们先拿之前实现的一些内容作为基础,其中包括:

eureka-server工程:服务注册中心,端口:1001
eureka-client工程:服务提供者,两个实例启动端口分别为2001

下面我们可以复制一下之前实现的一个服务消费者:eureka-consumer-ribbon,命名为eureka-consumer-ribbon-hystrix。下面我们开始对其进行改在:

第一步:pom.xml的dependencies节点中引入spring-cloud-starter-hystrix依赖:<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix</artifactId>
</dependency>第二步:在应用主类中使用@EnableCircuitBreaker或@EnableHystrix注解开启Hystrix的使用:@EnableCircuitBreaker
@EnableDiscoveryClient
@SpringBootApplication
public class Application {
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
public static void main(String[] args) {
new SpringApplicationBuilder(Application.class).web(true).run(args);
}
}注意:这里我们还可以使用Spring Cloud应用中的@SpringCloudApplication注解来修饰应用主类,该注解的具体定义如下所示。我们可以看到该注解中包含了上我们所引用的三个注解,这也意味着一个Spring Cloud标准应用应包含服务发现以及断路器。@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootApplication
@EnableDiscoveryClient
@EnableCircuitBreaker
public @interface SpringCloudApplication {
}第三步:改造服务消费方式,新增ConsumerService类,然后将在Controller中的逻辑迁移过去。最后,在为具体执行逻辑的函数上增加@HystrixCommand注解来指定服务降级方法,比如:@RestController
public class DcController {
@Autowired
ConsumerService consumerService;
@GetMapping("/consumer")
public String dc() {
return consumerService.consumer();
}
class ConsumerService {
@Autowired
RestTemplate restTemplate;
@HystrixCommand(fallbackMethod = "fallback")
public String consumer() {
return restTemplate.getForObject("http://eureka-client/dc", String.class);
}
public String fallback() {
return "fallback";
}
}
}下面我们来验证一下上面Hystrix带来的一些基础功能。我们先把涉及的服务都启动起来,然后访问localhost:2101/consumer,此时可以获取正常的返回,比如:Services: [eureka-consumer-ribbon-hystrix, eureka-client]。

为了触发服务降级逻辑,我们可以将服务提供者eureka-client的逻辑加一些延迟,比如:@GetMapping("/dc")
public String dc() throws InterruptedException {
Thread.sleep(5000L);
String services = "Services: " + discoveryClient.getServices();
System.out.println(services);
return services;
}重启eureka-client之后,再尝试访问localhost:2101/consumer,此时我们将获得的返回结果为:fallback。我们从eureka-client的控制台中,可以看到服务提供方输出了原本要返回的结果,但是由于返回前延迟了5秒,而服务消费方触发了服务请求超时异常,服务消费者就通过HystrixCommand注解中指定的降级逻辑进行执行,因此该请求的结果返回了fallback。这样的机制,对自身服务起到了基础的保护,同时还为异常情况提供了自动的服务降级切换机制。

更多Spring Cloud内容请持续关注我的博客更新或在《Spring Cloud微服务实战》中获取。
 
代码示例

样例工程将沿用之前在码云和GitHub上创建的SpringCloud-Learning项目,重新做了一下整理。通过不同目录来区分Brixton和Dalston的示例。

码云:点击查看
GitHub:点击查看

具体工程说明如下:

eureka的服务注册中心:eureka-server
eureka的服务提供方:eureka-client
eureka的服务消费者:eureka-consumer-ribbon-hystrix
 

本文作者:程序猿DD-翟永超
原文链接:Spring Cloud构建微服务架构:服务容错保护(Hystrix服务降级)【Dalston版】
版权归作者所有,转载请注明出处 查看全部
前言

在微服务架构中,我们将系统拆分成了一个个的服务单元,各单元应用间通过服务注册与订阅的方式互相依赖。由于每个单元都在不同的进程中运行,依赖通过远程调用的方式执行,这样就有可能因为网络原因或是依赖服务自身问题出现调用故障或延迟,而这些问题会直接导致调用方的对外服务也出现延迟,若此时调用方的请求不断增加,最后就会出现因等待出现故障的依赖方响应而形成任务积压,线程资源无法释放,最终导致自身服务的瘫痪,进一步甚至出现故障的蔓延最终导致整个系统的瘫痪。如果这样的架构存在如此严重的隐患,那么相较传统架构就更加的不稳定。为了解决这样的问题,因此产生了断路器等一系列的服务保护机制。

针对上述问题,在Spring Cloud Hystrix中实现了线程隔离、断路器等一系列的服务保护功能。它也是基于Netflix的开源框架 Hystrix实现的,该框架目标在于通过控制那些访问远程系统、服务和第三方库的节点,从而对延迟和故障提供更强大的容错能力。Hystrix具备了服务降级、服务熔断、线程隔离、请求缓存、请求合并以及服务监控等强大功能。

接下来,我们就从一个简单示例开始对Spring Cloud Hystrix的学习与使用。

动手试一试

在开始使用Spring Cloud Hystrix实现断路器之前,我们先拿之前实现的一些内容作为基础,其中包括:

eureka-server工程:服务注册中心,端口:1001
eureka-client工程:服务提供者,两个实例启动端口分别为2001

下面我们可以复制一下之前实现的一个服务消费者:eureka-consumer-ribbon,命名为eureka-consumer-ribbon-hystrix。下面我们开始对其进行改在:

第一步:pom.xml的dependencies节点中引入spring-cloud-starter-hystrix依赖:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix</artifactId>
</dependency>
第二步:在应用主类中使用@EnableCircuitBreaker或@EnableHystrix注解开启Hystrix的使用:
@EnableCircuitBreaker
@EnableDiscoveryClient
@SpringBootApplication
public class Application {
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
public static void main(String[] args) {
new SpringApplicationBuilder(Application.class).web(true).run(args);
}
}
注意:这里我们还可以使用Spring Cloud应用中的@SpringCloudApplication注解来修饰应用主类,该注解的具体定义如下所示。我们可以看到该注解中包含了上我们所引用的三个注解,这也意味着一个Spring Cloud标准应用应包含服务发现以及断路器。
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootApplication
@EnableDiscoveryClient
@EnableCircuitBreaker
public @interface SpringCloudApplication {
}
第三步:改造服务消费方式,新增ConsumerService类,然后将在Controller中的逻辑迁移过去。最后,在为具体执行逻辑的函数上增加@HystrixCommand注解来指定服务降级方法,比如:
@RestController
public class DcController {
@Autowired
ConsumerService consumerService;
@GetMapping("/consumer")
public String dc() {
return consumerService.consumer();
}
class ConsumerService {
@Autowired
RestTemplate restTemplate;
@HystrixCommand(fallbackMethod = "fallback")
public String consumer() {
return restTemplate.getForObject("http://eureka-client/dc", String.class);
}
public String fallback() {
return "fallback";
}
}
}
下面我们来验证一下上面Hystrix带来的一些基础功能。我们先把涉及的服务都启动起来,然后访问localhost:2101/consumer,此时可以获取正常的返回,比如:Services: [eureka-consumer-ribbon-hystrix, eureka-client]。

为了触发服务降级逻辑,我们可以将服务提供者eureka-client的逻辑加一些延迟,比如:
@GetMapping("/dc")
public String dc() throws InterruptedException {
Thread.sleep(5000L);
String services = "Services: " + discoveryClient.getServices();
System.out.println(services);
return services;
}
重启eureka-client之后,再尝试访问localhost:2101/consumer,此时我们将获得的返回结果为:fallback。我们从eureka-client的控制台中,可以看到服务提供方输出了原本要返回的结果,但是由于返回前延迟了5秒,而服务消费方触发了服务请求超时异常,服务消费者就通过HystrixCommand注解中指定的降级逻辑进行执行,因此该请求的结果返回了fallback。这样的机制,对自身服务起到了基础的保护,同时还为异常情况提供了自动的服务降级切换机制。

更多Spring Cloud内容请持续关注我的博客更新或在《Spring Cloud微服务实战》中获取。
 
代码示例

样例工程将沿用之前在码云和GitHub上创建的SpringCloud-Learning项目,重新做了一下整理。通过不同目录来区分Brixton和Dalston的示例。

码云:点击查看
GitHub:点击查看

具体工程说明如下:

eureka的服务注册中心:eureka-server
eureka的服务提供方:eureka-client
eureka的服务消费者:eureka-consumer-ribbon-hystrix
 


本文作者:程序猿DD-翟永超
原文链接:Spring Cloud构建微服务架构:服务容错保护(Hystrix服务降级)【Dalston版】
版权归作者所有,转载请注明出处


Spring Cloud构建微服务架构:分布式配置中心【Dalston版】

Spring Cloud程序猿DD 发表了文章 • 0 个评论 • 560 次浏览 • 2017-07-02 22:01 • 来自相关话题

Spring Cloud Config是Spring Cloud团队创建的一个全新项目,用来为分布式系统中的基础设施和微服务应用提供集中化的外部配置支持,它分为服务端与客户端两个部分。其中服务端也称为分布式配置中心,它是一个独立的微服务应用,用来连接配置仓库并为客户端提供获取配置信息、加密/解密信息等访问接口;而客户端则是微服务架构中的各个微服务应用或基础设施,它们通过指定的配置中心来管理应用资源与业务相关的配置内容,并在启动的时候从配置中心获取和加载配置信息。Spring Cloud Config实现了对服务端和客户端中环境变量和属性配置的抽象映射,所以它除了适用于Spring构建的应用程序之外,也可以在任何其他语言运行的应用程序中使用。由于Spring Cloud Config实现的配置中心默认采用Git来存储配置信息,所以使用Spring Cloud Config构建的配置服务器,天然就支持对微服务应用配置信息的版本管理,并且可以通过Git客户端工具来方便的管理和访问配置内容。当然它也提供了对其他存储方式的支持,比如:SVN仓库、本地化文件系统。

在本文中,我们将学习如何构建一个基于Git存储的分布式配置中心,并对客户端进行改造,并让其能够从配置中心获取配置信息并绑定到代码中的整个过程。

准备配置仓库

- 准备一个git仓库,可以在码云或Github上创建都可以。比如本文准备的仓库示例:http://git.oschina.net/didispace/config-repo-demo

- 假设我们读取配置中心的应用名为`config-client`,那么我们可以在git仓库中该项目的默认配置文件`config-client.yml`:info:
profile: default
- 为了演示加载不同环境的配置,我们可以在git仓库中再创建一个针对dev环境的配置文件`config-client-dev.yml`:info:
profile: dev
构建配置中心

通过Spring Cloud Config来构建一个分布式配置中心非常简单,只需要三步:

- 创建一个基础的Spring Boot工程,命名为:`config-server-git`,并在`pom.xml`中引入下面的依赖(省略了parent和dependencyManagement部分):<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</artifactId>
</dependency>
</dependencies>
- 创建Spring Boot的程序主类,并添加`@EnableConfigServer`注解,开启Spring Cloud Config的服务端功能。@EnableConfigServer
@SpringBootApplication
public class Application {

public static void main(String[] args) {
new SpringApplicationBuilder(Application.class).web(true).run(args);
}

}
- 在`application.yml`中添加配置服务的基本信息以及Git仓库的相关信息,例如:spring
application:
name: config-server
cloud:
config:
server:
git:
uri: http://git.oschina.net/didispace/config-repo-demo/
server:
port: 1201
到这里,使用一个通过Spring Cloud Config实现,并使用Git管理配置内容的分布式配置中心就已经完成了。我们可以将该应用先启动起来,确保没有错误产生,然后再尝试下面的内容。

> 如果我们的Git仓库需要权限访问,那么可以通过配置下面的两个属性来实现;
> spring.cloud.config.server.git.username:访问Git仓库的用户名
> spring.cloud.config.server.git.password:访问Git仓库的用户密码

完成了这些准备工作之后,我们就可以通过浏览器、POSTMAN或CURL等工具直接来访问到我们的配置内容了。访问配置信息的URL与配置文件的映射关系如下:

- /{application}/{profile}[/{label}]
- /{application}-{profile}.yml
- /{label}/{application}-{profile}.yml
- /{application}-{profile}.properties
- /{label}/{application}-{profile}.properties

上面的url会映射`{application}-{profile}.properties`对应的配置文件,其中`{label}`对应Git上不同的分支,默认为master。我们可以尝试构造不同的url来访问不同的配置内容,比如,要访问master分支,config-client应用的dev环境,就可以访问这个url:`http://localhost:1201/config-client/dev/master`,并获得如下返回:{
"name": "config-client",
"profiles": [
"dev"
],
"label": "master",
"version": null,
"state": null,
"propertySources": [
{
"name": "http://git.oschina.net/didispa ... ot%3B,
"source": {
"info.profile": "dev"
}
},
{
"name": "http://git.oschina.net/didispa ... ot%3B,
"source": {
"info.profile": "default"
}
}
]
}
我们可以看到该Json中返回了应用名:config-client,环境名:dev,分支名:master,以及default环境和dev环境的配置内容。

构建客户端

在完成了上述验证之后,确定配置服务中心已经正常运作,下面我们尝试如何在微服务应用中获取上述的配置信息。

- 创建一个Spring Boot应用,命名为`config-client`,并在`pom.xml`中引入下述依赖:<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
</dependencies>
- 创建Spring Boot的应用主类,具体如下:@SpringBootApplication
public class Application {

public static void main(String[] args) {
new SpringApplicationBuilder(Application.class).web(true).run(args);
}

}
- 创建`bootstrap.yml`配置,来指定获取配置文件的`config-server-git`位置,例如:spring:
application:
name: config-client
cloud:
config:
uri: http://localhost:1201/
profile: default
label: master

server:
port: 2001
上述配置参数与Git中存储的配置文件中各个部分的对应关系如下:

- spring.application.name:对应配置文件规则中的`{application}`部分
- spring.cloud.config.profile:对应配置文件规则中的`{profile}`部分
- spring.cloud.config.label:对应配置文件规则中的`{label}`部分
- spring.cloud.config.uri:配置中心`config-server`的地址

**这里需要格外注意:上面这些属性必须配置在bootstrap.properties中,这样config-server中的配置信息才能被正确加载。**

在完成了上面你的代码编写之后,读者可以将config-server-git、config-client都启动起来,然后访问http://localhost:2001/info ,我们可以看到该端点将会返回从git仓库中获取的配置信息:{
"profile": "default"
}
另外,我们也可以修改config-client的profile为dev来观察加载配置的变化。

**更多Spring Cloud内容请持续关注我的博客更新或在《Spring Cloud微服务实战》中获取。**

代码示例

样例工程将沿用之前在码云和GitHub上创建的SpringCloud-Learning项目,重新做了一下整理。通过不同目录来区分Brixton和Dalston的示例。

- 码云: 点击查看
- GitHub: 点击查看

具体工程说明如下:

- 基于Git仓库的配置中心:config-server-git
- 使用配置中心的客户端:config-client
 

本文作者:程序猿DD-翟永超
原文链接:Spring Cloud构建微服务架构:分布式配置中心【Dalston版】
版权归作者所有,转载请注明出处 查看全部
Spring Cloud Config是Spring Cloud团队创建的一个全新项目,用来为分布式系统中的基础设施和微服务应用提供集中化的外部配置支持,它分为服务端与客户端两个部分。其中服务端也称为分布式配置中心,它是一个独立的微服务应用,用来连接配置仓库并为客户端提供获取配置信息、加密/解密信息等访问接口;而客户端则是微服务架构中的各个微服务应用或基础设施,它们通过指定的配置中心来管理应用资源与业务相关的配置内容,并在启动的时候从配置中心获取和加载配置信息。Spring Cloud Config实现了对服务端和客户端中环境变量和属性配置的抽象映射,所以它除了适用于Spring构建的应用程序之外,也可以在任何其他语言运行的应用程序中使用。由于Spring Cloud Config实现的配置中心默认采用Git来存储配置信息,所以使用Spring Cloud Config构建的配置服务器,天然就支持对微服务应用配置信息的版本管理,并且可以通过Git客户端工具来方便的管理和访问配置内容。当然它也提供了对其他存储方式的支持,比如:SVN仓库、本地化文件系统。

在本文中,我们将学习如何构建一个基于Git存储的分布式配置中心,并对客户端进行改造,并让其能够从配置中心获取配置信息并绑定到代码中的整个过程。

准备配置仓库

- 准备一个git仓库,可以在码云或Github上创建都可以。比如本文准备的仓库示例:http://git.oschina.net/didispace/config-repo-demo

- 假设我们读取配置中心的应用名为`config-client`,那么我们可以在git仓库中该项目的默认配置文件`config-client.yml`:
info:
profile: default

- 为了演示加载不同环境的配置,我们可以在git仓库中再创建一个针对dev环境的配置文件`config-client-dev.yml`:
info:
profile: dev

构建配置中心

通过Spring Cloud Config来构建一个分布式配置中心非常简单,只需要三步:

- 创建一个基础的Spring Boot工程,命名为:`config-server-git`,并在`pom.xml`中引入下面的依赖(省略了parent和dependencyManagement部分):
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</artifactId>
</dependency>
</dependencies>

- 创建Spring Boot的程序主类,并添加`@EnableConfigServer`注解,开启Spring Cloud Config的服务端功能。
@EnableConfigServer
@SpringBootApplication
public class Application {

public static void main(String[] args) {
new SpringApplicationBuilder(Application.class).web(true).run(args);
}

}

- 在`application.yml`中添加配置服务的基本信息以及Git仓库的相关信息,例如:
spring
application:
name: config-server
cloud:
config:
server:
git:
uri: http://git.oschina.net/didispace/config-repo-demo/
server:
port: 1201

到这里,使用一个通过Spring Cloud Config实现,并使用Git管理配置内容的分布式配置中心就已经完成了。我们可以将该应用先启动起来,确保没有错误产生,然后再尝试下面的内容。

> 如果我们的Git仓库需要权限访问,那么可以通过配置下面的两个属性来实现;
> spring.cloud.config.server.git.username:访问Git仓库的用户名
> spring.cloud.config.server.git.password:访问Git仓库的用户密码

完成了这些准备工作之后,我们就可以通过浏览器、POSTMAN或CURL等工具直接来访问到我们的配置内容了。访问配置信息的URL与配置文件的映射关系如下:

- /{application}/{profile}[/{label}]
- /{application}-{profile}.yml
- /{label}/{application}-{profile}.yml
- /{application}-{profile}.properties
- /{label}/{application}-{profile}.properties

上面的url会映射`{application}-{profile}.properties`对应的配置文件,其中`{label}`对应Git上不同的分支,默认为master。我们可以尝试构造不同的url来访问不同的配置内容,比如,要访问master分支,config-client应用的dev环境,就可以访问这个url:`http://localhost:1201/config-client/dev/master`,并获得如下返回:
{
"name": "config-client",
"profiles": [
"dev"
],
"label": "master",
"version": null,
"state": null,
"propertySources": [
{
"name": "http://git.oschina.net/didispa ... ot%3B,
"source": {
"info.profile": "dev"
}
},
{
"name": "http://git.oschina.net/didispa ... ot%3B,
"source": {
"info.profile": "default"
}
}
]
}

我们可以看到该Json中返回了应用名:config-client,环境名:dev,分支名:master,以及default环境和dev环境的配置内容。

构建客户端

在完成了上述验证之后,确定配置服务中心已经正常运作,下面我们尝试如何在微服务应用中获取上述的配置信息。

- 创建一个Spring Boot应用,命名为`config-client`,并在`pom.xml`中引入下述依赖:
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
</dependencies>

- 创建Spring Boot的应用主类,具体如下:
@SpringBootApplication
public class Application {

public static void main(String[] args) {
new SpringApplicationBuilder(Application.class).web(true).run(args);
}

}

- 创建`bootstrap.yml`配置,来指定获取配置文件的`config-server-git`位置,例如:
spring:
application:
name: config-client
cloud:
config:
uri: http://localhost:1201/
profile: default
label: master

server:
port: 2001

上述配置参数与Git中存储的配置文件中各个部分的对应关系如下:

- spring.application.name:对应配置文件规则中的`{application}`部分
- spring.cloud.config.profile:对应配置文件规则中的`{profile}`部分
- spring.cloud.config.label:对应配置文件规则中的`{label}`部分
- spring.cloud.config.uri:配置中心`config-server`的地址

**这里需要格外注意:上面这些属性必须配置在bootstrap.properties中,这样config-server中的配置信息才能被正确加载。**

在完成了上面你的代码编写之后,读者可以将config-server-git、config-client都启动起来,然后访问http://localhost:2001/info ,我们可以看到该端点将会返回从git仓库中获取的配置信息:
{
"profile": "default"
}

另外,我们也可以修改config-client的profile为dev来观察加载配置的变化。

**更多Spring Cloud内容请持续关注我的博客更新或在《Spring Cloud微服务实战》中获取。**

代码示例

样例工程将沿用之前在码云和GitHub上创建的SpringCloud-Learning项目,重新做了一下整理。通过不同目录来区分Brixton和Dalston的示例。

- 码云: 点击查看
- GitHub: 点击查看

具体工程说明如下:

- 基于Git仓库的配置中心:config-server-git
- 使用配置中心的客户端:config-client
 


本文作者:程序猿DD-翟永超
原文链接:Spring Cloud构建微服务架构:分布式配置中心【Dalston版】
版权归作者所有,转载请注明出处


分布式系统的一套工具,可用于构建微服务