关于 Spring For All

关于 Spring For All

Spring For All 的一切
最新动态

最新动态

Spring 5 会是咋样呢
Spring Boot

Spring Boot

快速构建并运行 Spring 应用程序
Spring Cloud

Spring Cloud

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

Spring Framework

提供依赖注入、事务、Web应用、数据访问等模块
Spring Data

Spring Data

提供一致性数据访问模块
Spring Security

Spring Security

提供应用身份验证和授权支持
Spring Batch

Spring Batch

提供高容批处理操作模块
Spring AMQP

Spring AMQP

基于AMQP消息解决方案
Micro Service Arch.

Micro Service Arch.

微服务架构相关
开源项目及视频教程

开源项目及视频教程

做中国最好的 Spring 开源项目及视频教程
小马哥专栏

小马哥专栏

阿里技术布道者,专注 Spring Boot 及微服务

spring cloud stream 无法实现分区效果

回复

匿名用户 发起了问题 • 1 人关注 • 0 个回复 • 123 次浏览 • 2017-09-08 00:05 • 来自相关话题

spring security token校验问题

回复

lennon 发起了问题 • 1 人关注 • 0 个回复 • 146 次浏览 • 2017-09-07 22:45 • 来自相关话题

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

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

api-gateway项目从config server 获取Eureka配置信息,怎么样才能注册到Eureka?

soszhouyou 回复了问题 • 2 人关注 • 1 个回复 • 202 次浏览 • 2017-09-07 17:34 • 来自相关话题

SpringCloud如何实现全局异常处理

soszhouyou 回复了问题 • 3 人关注 • 2 个回复 • 224 次浏览 • 2017-09-07 17:21 • 来自相关话题

解决Turbine Stream无法注册到Eureka Server上的问题

itmuch.com 发表了文章 • 1 个评论 • 112 次浏览 • 2017-09-07 10:01 • 来自相关话题

在我们的项目中,各服务整合spring-cloud-netflix-hystrix-stream ,当开启断路器的API被调用时,就会产生监控数据,这些监控数据会以MQ消息传递到RabbitMQ/Kafka中,Turbine整合spring-cloud-starter-turbine-stream ,消费MQ消息,并聚合各个服务的监控数据。架构如图所示:

代码非常简单,你懂的,就不贴了。至此,各服务可以正常产生Hystrix监控数据;Turbine也可以正常聚合各服务的监控数据;业务一切正常。

然而,当笔者尝试将Turbine Server也注册到Eureka Server时,无法成功。 Turbine Server的配置如下:
$(document).ready(function() {$('pre code').each(function(i, block) { hljs.highlightBlock( block); }); });server:
port: 8989
spring:
application:
index: ${random.long}
cloud:
stream:
kafka:
binder:
zk-nodes: localhost:2181
brokers: localhost:9092
eureka:
client:
serviceUrl:
defaultZone: http://127.0.0.1:8761/eureka/
instance:
prefer-ip-address: true于是开启了辛酸的排查历程:
排查配置:无误排查代码:尼玛没几行代码,不缺注解排查网络问题:无误
 
那么究竟是什么问题呢。笔者在万能的GitHub上找到了答案。问题出在spring-cloud-turbine-stream ,该依赖会启动一个Netty容器,并将server.port 设为-1 ,从而关闭Servlet容器。这其实是官方的一个小Bug,不过官方说等Spring Boot 2.0才会修复,详见:https://github.com/spring-clou ... /1774 。

好在,问题可以规避,规避的方式也很简单,将配置改为如下即可:
server:
# 容器端口
port: 8989
management:
# 配置Spring Boot Actuator的端口
port: 8990
spring:
application:
index: ${random.long}
cloud:
stream:
kafka:
binder:
zk-nodes: localhost:2181
brokers: localhost:9092
eureka:
client:
serviceUrl:
defaultZone: http://127.0.0.1:8761/eureka/
instance:
prefer-ip-address: true
# 务必跟server.port的配置保持一致
non-secure-port: 8989总结一下:
在指定server.port 的基础上,指定management.port ,两个端口务必不同;添加配置:eureka.instance.non-secure-port ,以便于服务注册到Eureka Server上,该端口需要跟server.port 所配置的端口一致。

这样,Turbine Server就可以注册到Eureka Server了。注册到Eureka Server后显示如下:

如图,现在已可正常将Turbine注册到Eureka Server了,但依然存在问题:那就是192.168.191.2:turbine-server:-1 这个里面的-1 应该是服务的端口server.port 此处展示并不正确,对于强迫症,如果想要自定义这部分内容,该如何处理呢?请阅读我的博客:http://www.itmuch.com/spring-c ... e-id/ 。

说明:

如果大家使用的不是Turbine Stream(即:不使用消息中间件收集监控信息),那么不存在该问题。
 
 
 
本文链接: http://www.itmuch.com/spring-c ... rver/版权声明: 本博客由周立创作,采用 CC BY 3.0 CN 许可协议。可自由转载、引用,但需署名作者且注明文章出处。如转载至微信公众号,请在文末添加作者公众号二维码。
  查看全部
在我们的项目中,各服务整合spring-cloud-netflix-hystrix-stream ,当开启断路器的API被调用时,就会产生监控数据,这些监控数据会以MQ消息传递到RabbitMQ/Kafka中,Turbine整合spring-cloud-starter-turbine-stream ,消费MQ消息,并聚合各个服务的监控数据。架构如图所示:

代码非常简单,你懂的,就不贴了。至此,各服务可以正常产生Hystrix监控数据;Turbine也可以正常聚合各服务的监控数据;业务一切正常。

然而,当笔者尝试将Turbine Server也注册到Eureka Server时,无法成功。 Turbine Server的配置如下:
server:
port: 8989
spring:
application:
index: ${random.long}
cloud:
stream:
kafka:
binder:
zk-nodes: localhost:2181
brokers: localhost:9092
eureka:
client:
serviceUrl:
defaultZone: http://127.0.0.1:8761/eureka/
instance:
prefer-ip-address: true
于是开启了辛酸的排查历程:
  • 排查配置:无误
  • 排查代码:尼玛没几行代码,不缺注解
  • 排查网络问题:无误

 
那么究竟是什么问题呢。笔者在万能的GitHub上找到了答案。问题出在spring-cloud-turbine-stream ,该依赖会启动一个Netty容器,并将server.port 设为-1 ,从而关闭Servlet容器。这其实是官方的一个小Bug,不过官方说等Spring Boot 2.0才会修复,详见:https://github.com/spring-clou ... /1774 。

好在,问题可以规避,规避的方式也很简单,将配置改为如下即可:
server:
# 容器端口
port: 8989
management:
# 配置Spring Boot Actuator的端口
port: 8990
spring:
application:
index: ${random.long}
cloud:
stream:
kafka:
binder:
zk-nodes: localhost:2181
brokers: localhost:9092
eureka:
client:
serviceUrl:
defaultZone: http://127.0.0.1:8761/eureka/
instance:
prefer-ip-address: true
# 务必跟server.port的配置保持一致
non-secure-port: 8989
总结一下:
  • 在指定server.port 的基础上,指定management.port ,两个端口务必不同;
  • 添加配置:eureka.instance.non-secure-port ,以便于服务注册到Eureka Server上,该端口需要跟server.port 所配置的端口一致。


这样,Turbine Server就可以注册到Eureka Server了。注册到Eureka Server后显示如下:

如图,现在已可正常将Turbine注册到Eureka Server了,但依然存在问题:那就是192.168.191.2:turbine-server:-1 这个里面的-1 应该是服务的端口server.port 此处展示并不正确,对于强迫症,如果想要自定义这部分内容,该如何处理呢?请阅读我的博客:http://www.itmuch.com/spring-c ... e-id/ 。

说明:

如果大家使用的不是Turbine Stream(即:不使用消息中间件收集监控信息),那么不存在该问题。
 
 
 
  • 本文链接: http://www.itmuch.com/spring-c ... rver/
  • 版权声明: 本博客由周立创作,采用 CC BY 3.0 CN 许可协议。可自由转载、引用,但需署名作者且注明文章出处。如转载至微信公众号,请在文末添加作者公众号二维码。

 

如何自定义微服务的Instance ID

itmuch.com 发表了文章 • 0 个评论 • 123 次浏览 • 2017-09-07 09:55 • 来自相关话题

本文我们来探讨如何自定义微服务的Intance ID。Instance ID用于唯一标识注册到Eureka Server上的微服务实例。

我们可在Eureka Server的首页直观地看到各个微服务的Instance ID。例如,图11-1中的itmuch:microservice-provider-user:8000 就是Intance ID。

图11-1 Eureka Server上的微服务列表

在Spring Cloud中,服务的Instance ID的默认值是${spring.cloud.client.hostname}:${spring.application.name}:${spring.application.instance_id:${server.port}} 。如果想要自定义这部分的内容,只需在微服务中配置eureka.instance.instance-id 属性即可,例如:
spring:
application:
name: microservice-provider-user
eureka:
instance:
instance-id: ${spring.cloud.client.ipAddress}:${server.port} # 将Instance ID设置成IP:端口的形式这样,就可将微服务microservice-provider-user 的Instance ID设为IP:端口的形式。这样设置后,效果如图11-2所示。

图11-2 Eureka Server上的微服务列表

拓展阅读

Spring Cloud初始化Instance ID的相关代码:
org.springframework.cloud.netflix.eureka.EurekaClientAutoConfigurationorg.springframework.cloud.commons.util.IdUtils.getDefaultInstanceId(PropertyResolver)org.springframework.cloud.netflix.eureka.EurekaInstanceConfigBean.getInstanceId()
 
 
本文链接: http://www.itmuch.com/spring-c ... e-id/版权声明: 本博客由周立创作,采用 CC BY 3.0 CN 许可协议。可自由转载、引用,但需署名作者且注明文章出处。如转载至微信公众号,请在文末添加作者公众号二维码。
  查看全部
本文我们来探讨如何自定义微服务的Intance ID。Instance ID用于唯一标识注册到Eureka Server上的微服务实例。

我们可在Eureka Server的首页直观地看到各个微服务的Instance ID。例如,图11-1中的itmuch:microservice-provider-user:8000 就是Intance ID。

图11-1 Eureka Server上的微服务列表

在Spring Cloud中,服务的Instance ID的默认值是${spring.cloud.client.hostname}:${spring.application.name}:${spring.application.instance_id:${server.port}} 。如果想要自定义这部分的内容,只需在微服务中配置eureka.instance.instance-id 属性即可,例如:
spring:
application:
name: microservice-provider-user
eureka:
instance:
instance-id: ${spring.cloud.client.ipAddress}:${server.port} # 将Instance ID设置成IP:端口的形式
这样,就可将微服务microservice-provider-user 的Instance ID设为IP:端口的形式。这样设置后,效果如图11-2所示。

图11-2 Eureka Server上的微服务列表

拓展阅读

Spring Cloud初始化Instance ID的相关代码:
  • org.springframework.cloud.netflix.eureka.EurekaClientAutoConfiguration
  • org.springframework.cloud.commons.util.IdUtils.getDefaultInstanceId(PropertyResolver)
  • org.springframework.cloud.netflix.eureka.EurekaInstanceConfigBean.getInstanceId()

 
 
  • 本文链接: http://www.itmuch.com/spring-c ... e-id/
  • 版权声明: 本博客由周立创作,采用 CC BY 3.0 CN 许可协议。可自由转载、引用,但需署名作者且注明文章出处。如转载至微信公众号,请在文末添加作者公众号二维码。

 

ribbon和feign的区别,能不能说feign可以取代ribbon??

回复

撸友鬼鬼 发起了问题 • 3 人关注 • 0 个回复 • 179 次浏览 • 2017-09-06 18:06 • 来自相关话题

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

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

Zuul的高可用

itmuch.com 发表了文章 • 0 个评论 • 181 次浏览 • 2017-09-06 09:39 • 来自相关话题

近期挺多朋友问到Zuul如何高可用,这里详细探讨一下。

Zuul的高可用非常关键,因为外部请求到后端微服务的流量都会经过Zuul。故而在生产环境中,我们一般都需要部署高可用的Zuul以避免单点故障。

笔者分两种场景讨论Zuul的高可用。

Zuul客户端也注册到了Eureka Server上

这种情况下,Zuul的高可用非常简单,只需将多个Zuul节点注册到Eureka Server上,就可实现Zuul的高可用。此时,Zuul的高可用与其他微服务的高可用没什么区别。

图8-7 Zuul高可用架构图

如图8-7,当Zuul客户端也注册到Eureka Server上时,只需部署多个Zuul节点即可实现其高可用。Zuul客户端会自动从Eureka Server中查询Zuul Server的列表,并使用Ribbon负载均衡地请求Zuul集群。

这种场景一般用于Sidecar。

Zuul客户端未注册到Eureka Server上

现实中,这种场景往往更常见,例如,Zuul客户端是一个手机APP——我们不可能让所有的手机终端都注册到Eureka Server上。这种情况下,我们可借助一个额外的负载均衡器来实现Zuul的高可用,例如Nginx、HAProxy、F5等。

图8-8 Zuul高可用架构图

如图8-8,Zuul客户端将请求发送到负载均衡器,负载均衡器将请求转发到其代理的其中一个Zuul节点。这样,就可以实现Zuul的高可用。

节选自《Spring Cloud与Docker微服务架构实战》8.10节
 
 
 
本文链接: http://www.itmuch.com/spring-cloud/zuul/zuul-ha/版权声明: 本博客由周立创作,采用 CC BY 3.0 CN 许可协议。可自由转载、引用,但需署名作者且注明文章出处。如转载至微信公众号,请在文末添加作者公众号二维码。 查看全部
近期挺多朋友问到Zuul如何高可用,这里详细探讨一下。

Zuul的高可用非常关键,因为外部请求到后端微服务的流量都会经过Zuul。故而在生产环境中,我们一般都需要部署高可用的Zuul以避免单点故障。

笔者分两种场景讨论Zuul的高可用。

Zuul客户端也注册到了Eureka Server上

这种情况下,Zuul的高可用非常简单,只需将多个Zuul节点注册到Eureka Server上,就可实现Zuul的高可用。此时,Zuul的高可用与其他微服务的高可用没什么区别。

图8-7 Zuul高可用架构图

如图8-7,当Zuul客户端也注册到Eureka Server上时,只需部署多个Zuul节点即可实现其高可用。Zuul客户端会自动从Eureka Server中查询Zuul Server的列表,并使用Ribbon负载均衡地请求Zuul集群。

这种场景一般用于Sidecar。

Zuul客户端未注册到Eureka Server上

现实中,这种场景往往更常见,例如,Zuul客户端是一个手机APP——我们不可能让所有的手机终端都注册到Eureka Server上。这种情况下,我们可借助一个额外的负载均衡器来实现Zuul的高可用,例如Nginx、HAProxy、F5等。

图8-8 Zuul高可用架构图

如图8-8,Zuul客户端将请求发送到负载均衡器,负载均衡器将请求转发到其代理的其中一个Zuul节点。这样,就可以实现Zuul的高可用。

节选自《Spring Cloud与Docker微服务架构实战》8.10节
 
 
 
  • 本文链接: http://www.itmuch.com/spring-cloud/zuul/zuul-ha/
  • 版权声明: 本博客由周立创作,采用 CC BY 3.0 CN 许可协议。可自由转载、引用,但需署名作者且注明文章出处。如转载至微信公众号,请在文末添加作者公众号二维码。