GithubHelp home page GithubHelp logo

springcloud / spring-cloud-code Goto Github PK

View Code? Open in Web Editor NEW
1.9K 126.0 1.0K 15.13 MB

🔥《重新定义Spring Cloud实战》实体书对应源码,欢迎大家Star点赞收藏

License: Apache License 2.0

Java 98.81% Dockerfile 1.04% Groovy 0.15%

spring-cloud-code's Introduction

《重新定义Spring Cloud实战》

1. 前言

随着互联网的快速普及,云计算近年来得到蓬勃发展,企业的IT环境和架构体系也逐渐发生变革,其中最典型的就是过去的单体应用架构发展为当今流行的微服务架构。微服务是一种架构风格,其优势是为软件应用开发带来很大的便利,让敏捷开发和复杂的企业应用快速持续交付成为可能。随着微服务架构的流行,很多企业纷纷使用微服务架构来搭建新的系统或者对历史系统进行重构,但是微服务架构的实施和落地会面临很大的挑战。虽然微服务架构的解决方案很多,但是对于如何真正落地微服务架构,目前还没有公认的技术标准和规范。幸运的是,业界已经有一些很有影响力的开源微服务解决方案,比如2015年年初,Spring团队推出的Spring Cloud,其目标是成为Java领域微服务架构落地的标准。Spring Cloud经过高速迭代和发展,至今已经成为Java领域落地微服务架构的推荐解决方案,为企业IT架构变革保驾护航

Spring Cloud是一个优质的开源项目它的稳健发展离不开众多开发人员的实践与反馈,开发人员通过一个社区化的平台去交流学习从而使Spring Cloud逐渐完善。Spring Cloud发展到2016年,得到国内越来越多的人的关注,但是相应的学习交流平台和材料比较分散,这阻碍了Spring Cloud在我国的普及和发展。因此Spring Cloud**社区应运而生。Spring Cloud**社区 (http://springcloud.cn) 是国内基于Spring Cloud微服务体系创建的非盈利技术社区,是专为Spring Boot或Spring Cloud技术人员提供分享和交流服务的平台,目的是推动Spring Cloud在**的普及和应用。关注Spring Cloud**社区微信公众号,一起交流学习。

2.背景概述

Spring Cloud**社区(http://springcloud.cn) 是国内基于Spring Cloud微服务体系创建的非盈利技术社区。自2016年10月份创建以来,在北京,上海,深圳,成都等地举办了多次技术沙龙,提供技术交流平台,帮助数万开发者快速学习Spring Cloud并用于生产。为更好的推动Spring Cloud在**的发展,让更多的开发者受益。社区针对Spring Cloud在国内的使用情况,结合国内企业使用Spring Cloud落地微服务架构遇到的问题给出实战解决方案,特推出此书。《重新定义Spring Cloud实战》封面如下图所示:

本书基于Spring Cloud的Finchley.RELEASE版编写,由7位作者著,共25章,共670页,我们7位作者并不是Spring Cloud微服务落地的架构专家,我们只是Spring Cloud微服务架构的实践者,把我们自己的实践经验分享给大家,帮助大家解决学习和工作上遇到的问题。三人行,必有我师焉,由于我们学识有限,难免会有不足之处,还请读者多多包涵,一起交流学习,共同进步

3.本书介绍

3.1 填坑记录

3.2 BATJ部分书评

过去十几年里,广义的“微服务”架构以其小团队快速创建和迭代服务带来的架构弹性、扩展性、敏捷性,天然匹配了互联网业务快速发展和变化的特点,在各大互联网公司取得了巨大的成功。时至云原生应用时代,已不再是是否采用微服务架构的问题,而是何时采用以及如何在生产上实战的问题。本书将如何基于Spring Cloud生态体系进行微服务实战的方方面面的细节都涵盖了,,从这个意义上来讲,确实做到了“重新定义”。

—— 坤宇 Nacos开源项目创始人/阿里巴巴高级技术专家

微服务以敏捷为目标,以降低复杂的系统结构为基础,带给我们更好的系统可用性和稳定性。Spring Cloud作为一套完善的微服务治理的典型框架,涵盖了微服务治理的方方面面。本书详细介绍了Spring Cloud的每一个核心模块,以理论与实际相结合的方式,透彻地讲述了Spring Cloud的精髓,是每一位奋战在服务化领域一线的工程师、架构师的*选技术书籍。

——李艳鹏 蚂蚁金服高级技术专家/《分布式服务架构》《可伸缩服务架构》作者

本书可以说是后端架构师的进阶宝典,全面地讲解了如何打造一套强大、健壮的微服务体系,深入分析了涉及到的各个组件。*难得的是,书中结合了作者多年积累的架构经验,分析了各种组件适用的场景,平实地说明了实际使用中的各种考量和细节优化,简直是奋斗在一线的工程师的心血结晶。任何想掌握大型后端架构的工程师,无论使用什么技术框架,都能从本书获益匪浅。

——李双涛 饿了么中间件资深架构师

Spring Cloud已然成为Java领域应用微服务化的*选框架,但国内一直缺少全面论述Spring Cloud商用实践相关的书籍。本书围绕Spring Cloud框架中的服务注册发现、服务路由、服务网关、分布式配置、服务治理、容器化及微服务设计等关键领域进行了深入浅出的讲解,并给予了大量的真实应用案例,新手和老手都可以从中受益良多。作者作为Spring Cloud**的资深专家,对于Spring Cloud及微服务有着深刻的架构和实战经验,值得信赖。

——单家骏 腾讯中间件高级工程师

在微服务体系中,Spring Cloud是目前最热门的构建微服务体系的解决方案,它提供了构建微服务架构的一些基础设施。本书内容上覆盖了Spring Cloud的一些主要组件,不仅在如何使用上做了详细的介绍,也从原理上深入浅出地剖析了其中的技术要点,同时部分组件也跟周边的一些开源项目进行了对比,且提供了一些原理分析和相关的示例,是一本不可多得的Spring Cloud实战书籍。新手和有微服务实践经验的读者都能从书中得到一些不一样的收获。

——张艺辰 腾讯高级研发工程师

本书不仅对Spring Cloud各核心组件进行了细致入微的介绍,同时也跳出了框架本身,为微服务的实施和分布式架构所面临的基本问题交出了Spring Cloud式答卷,是开发者快速掌握Spring Cloud技术栈的神兵利器。不仅如此,本书还凝聚着Spring Cloud**社区的智慧结晶,让我们看到了国人在开源领域的研发力量, 可喜可贺。

——王鸿飞 百度高级研发工程师

在微服务如火如荼的今天,各种微服务框架层出不穷,而Spring Cloud无疑是那颗最闪亮的星。从Spring Framework到Spring Boot,再到如今的Spring Cloud,Spring全家桶给众多程序员带来了真正的春天。由于分布式和服务化是极具挑战的任务,因此Spring Cloud也不可避免的愈加复杂。Spring CLoud**社区为Spring Cloud的普及做出了巨大的贡献,并迅速的降低了语言问题所带来的学习门槛。这本书由Spring CLoud**社区倾力打造,书籍涵盖了Spring Cloud的服务发现、网关、熔断器、配置、全链路监控等最核心组件,并很接地气地详述了Dubbo向Spring Cloud迁移以及Spring Cloud与分布式事务相关内容,值得一看。

——张亮 京东金融数据研发负责人/分布式数据库中间件Sharding-Sphere负责人

Spring Cloud提供了完整的微服务技术体系,可以帮助开发者快速地实现架构升级。《重新定义Spring Cloud实战》一书完整地介绍了Spring Cloud中各个组件的使用方法并深度剖析了其中的原理,文章深入浅出帮助开发者快速掌握和理解Spring Cloud。

——李艺恒 腾讯研发工程师

3.3 内容简介

这是一本实践与理论并重、广度与深度兼顾的Spring Cloud生产实践开发指南,由Spring Cloud**社区倾力打造,作者来自阿里、蚂蚁金服、京东金融等企业,本书针对Spring Cloud在国内的使用情况,结合国内企业使用Spring Cloud落地微服务架构遇到的问题,提出可落地的解决方案。

本书内容有3大特色:

  • 足够广:详细讲解了Spring Cloud的核心常用组件以及Spring Cloud的增强生态,针对生产实践中常见问题给出可落地的最佳实践方案,无论您是初学者还是开发人员,还是架构师,都能从此书获益。

  • 有深度:本书对涉及的Spring Cloud组件按照从入门、进阶、实战、扩展增强的顺序循序渐进进行剖析和讲解,帮助作者知其然并知其所以然,授之以渔。

  • 重实践:注重生产实践,通过案例驱动,给出优秀的生产实践方案和优秀的生产配置,帮助读者快速落地企业微服务架构。

全书共25章,分为三个部分:

  • 第一部分 核心组件篇(第1~10章) 主要讲解Spring Cloud的核心组件。首先从应用架构的发展历程讲起,介绍了微服务出现的背景,并对微服务架构的落地提出了相应的解决方案;然后分别详细介绍了Spring Cloud微服务体系中的核心常用组件,如Eureka、Feign、Ribbon、Hystrix、Zuul等;最后通过一个综合案例将前面介绍的组件连接起来,帮助大家融会贯通。

  • 第二部分 进阶实战篇(第11~18章) 在核心组件的基础上,对Config、Consul、认证和鉴权、全链路监控以及对Spring Cloud生态圈中第二代网关Spring Cloud Gateway进行了详细阐述,循序渐进、案例驱动,帮助读者加深对组件的理解和运用,更好地掌握相关内容运用于生产实践。

  • 第三部分 解决方案篇(第19~25章) 主要从解决方案着手,内容包括Spring Cloud与gRPC的整合方式、版本控制与灰度发布、Spring Cloud容器化、Dubbo向Spring Cloud的迁移、分布式事务、领域驱动等生产级实用解决方案,为企业IT架构微服务化和变革保驾护航。

3.4 推荐理由

  • 本书由Spring Cloud社区官方撰写,核心成员来自原阿里、蚂蚁金服、京东金融等互联网企业,经验丰富。

  • 本书内容有3大特色:宽度足够广、深度足够深,而且立足于生产实践,直接从生产实践出发,包含大量生产实践的配置

  • 本书得到了来自阿里、腾讯、百度、京东等大型互联网企业的近10位专家的鼎力推荐。

3.5 读者反馈

#1

3.6 源码相关

书籍目录:https://github.com/SpringCloud/spring-cloud-catalog

源码地址:https://github.com/SpringCloud/spring-cloud-code

http://cloud.spring.io/spring-cloud-static/Finchley.RELEASE/single/spring-cloud.html

  • 由于聚合工程很多,Maven内存如果不足,在/spring-cloud-code/pom.xml设置如下,欢迎Star

  • IDE中配置如下:

工程明细

ch是章节的简称,ch10表示第十章,ch10-1表示第十章的第一个案例工程,

├── ch10-1
│   ├── ch10-1-common
│   ├── ch10-1-config-server
│   ├── ch10-1-data-service
│   ├── ch10-1-eureka-server
│   ├── ch10-1-hystrix-dashboard
│   ├── ch10-1-user-service
│   ├── ch10-1-zuul-server
│   ├── ch10-1.iml
│   └── pom.xml
├── ch11-1
│   ├── ch11-1-config-client
│   ├── ch11-1-config-server
│   ├── ch11-1.iml
│   ├── pom.xml
│   └── reademe.txt
├── ch11-2
│   ├── ch11-2-config-client-refresh
│   ├── ch11-2-config-server
│   ├── ch11-2.iml
│   └── pom.xml
├── ch11-3
│   ├── ch11-3-config-client-bus-refresh
│   ├── ch11-3-config-client-bus-refresh-second
│   ├── ch11-3-config-server-bus
│   ├── ch11-3.iml
│   └── pom.xml
├── ch12-1
│   ├── ch12-1-config-client-placeholders
│   ├── ch12-1-config-server-placeholders
│   ├── ch12-1.iml
│   └── pom.xml
├── ch12-10
│   ├── ch12-10-config-client-apollo
│   ├── ch12-10-config-client-apollo2
│   ├── ch12-10-eureka-server
│   ├── ch12-10-gateway-zuul-apollo
│   ├── ch12-10.iml
│   └── pom.xml
├── ch12-2
│   ├── ch12-2-config-client-multiple-repositories
│   ├── ch12-2-config-server-multiple-repositories
│   ├── ch12-2.iml
│   └── pom.xml
├── ch12-3
│   ├── ch12-3-config-client-db
│   ├── ch12-3-config-server-db
│   ├── ch12-3.iml
│   └── pom.xml
├── ch12-4
│   ├── ch12-4-config-client-mongodb
│   ├── ch12-4-config-server-mongodb
│   ├── ch12-4.iml
│   └── pom.xml
├── ch12-5
│   ├── ch12-5-config-client-auto-refresh
│   ├── ch12-5-config-client-refresh-autoconfig
│   ├── ch12-5-config-server
│   ├── ch12-5.iml
│   └── pom.xml
├── ch12-6
│   ├── ch12-6-config-client-fallback
│   ├── ch12-6-config-client-fallback-autoconfig
│   ├── ch12-6-config-server
│   ├── ch12-6.iml
│   └── pom.xml
├── ch12-7
│   ├── ch12-7-config-client-auth-jwt
│   ├── ch12-7-config-client-jwt
│   ├── ch12-7-config-server-auth-jwt
│   ├── ch12-7.iml
│   └── pom.xml
├── ch12-8
│   ├── ch12-8-config-client-high-availability
│   ├── ch12-8-config-client-high-availability-autoconfig
│   ├── ch12-8-config-server
│   ├── ch12-8.iml
│   └── pom.xml
├── ch12-9
│   ├── ch12-9-config-client
│   ├── ch12-9-config-server-high-availability
│   ├── ch12-9-eureka-server
│   ├── ch12-9.iml
│   └── pom.xml
├── ch13-1
│   ├── README.md
│   ├── ch13-1-consul-config
│   ├── ch13-1-consul-consumer
│   ├── ch13-1-consul-provider
│   ├── ch13-1.iml
│   └── pom.xml
├── ch14-1
│   ├── README.md
│   ├── ch14-1-consul-register
│   ├── ch14-1.iml
│   └── pom.xml
├── ch14-2
│   ├── ch14-2-consul-consumer-discoveryclient
│   ├── ch14-2-consul-consumer-ribbon
│   ├── ch14-2-consul-provider-tag-1
│   ├── ch14-2-consul-provider-tag-2
│   ├── ch14-2-cosul-provider-tag-1
│   ├── ch14-2.iml
│   └── pom.xml
├── ch14-3
│   ├── ch14-3-consul-config-customize
│   ├── ch14-3.iml
│   └── pom.xml
├── ch14-4
│   ├── ch14-4-consul-override-consumer
│   ├── ch14-4-consul-override-provider-tag1
│   ├── ch14-4-consul-override-provider-tag2
│   ├── ch14-4.iml
│   └── pom.xml
├── ch14-5
│   ├── ch14-5-consul-override-consumer
│   ├── ch14-5-consul-override-consumer-new
│   ├── ch14-5-consul-provider1
│   ├── ch14-5-consul-provider2
│   ├── ch14-5.iml
│   └── pom.xml
├── ch15-1
│   ├── ch15-1-client-service
│   ├── ch15-1-core-service
│   ├── ch15-1-eureka-service
│   ├── ch15-1-gateway
│   ├── ch15-1-provider-service
│   ├── ch15-1.iml
│   └── pom.xml
├── ch16-1
│   ├── ch16-1-sleuth-consumer
│   ├── ch16-1-sleuth-provider
│   ├── ch16-1.iml
│   └── pom.xml
├── ch16-2
│   ├── ch16-2-sleuth-consumer
│   ├── ch16-2-sleuth-provider
│   ├── ch16-2.iml
│   └── pom.xml
├── ch16-3
│   ├── ch16-3-eureka-server-skywalking
│   ├── ch16-3-script
│   ├── ch16-3-service-a
│   ├── ch16-3-service-b
│   ├── ch16-3-zuul-skywalking
│   ├── ch16-3.iml
│   └── pom.xml
├── ch17-1
│   ├── ch17-1-1-gateway
│   ├── ch17-1-2-gateway
│   ├── ch17-1.iml
│   └── pom.xml
├── ch17-2
│   ├── ch17-2-1-gateway
│   ├── ch17-2-2-gateway
│   ├── ch17-2-3-gateway
│   ├── ch17-2-4-gateway
│   ├── ch17-2-5-gateway
│   ├── ch17-2-6-gateway
│   ├── ch17-2-7-gateway
│   ├── ch17-2-8-gateway
│   ├── ch17-2-9-gateway
│   ├── ch17-2-service
│   ├── ch17-2.iml
│   └── pom.xml
├── ch17-3
│   ├── ch17-3-1-gateway
│   ├── ch17-3-2-gateway
│   ├── ch17-3-3-gateway
│   ├── ch17-3-4-gateway
│   ├── ch17-3-5-gateway
│   ├── ch17-3-6-gateway
│   ├── ch17-3-7-gateway
│   ├── ch17-3-service
│   ├── ch17-3.iml
│   └── pom.xml
├── ch18-1
│   ├── ch18-1-consumer
│   ├── ch18-1-eureka
│   ├── ch18-1-gateway
│   ├── ch18-1-provider
│   ├── ch18-1.iml
│   └── pom.xml
├── ch18-2
│   ├── ch18-2-gateway
│   ├── ch18-2-provider
│   ├── ch18-2.iml
│   ├── pom.xml
│   └── reademe.txt
├── ch18-3
│   ├── ch18-3-gateway
│   ├── ch18-3-provider
│   ├── ch18-3.iml
│   └── pom.xml
├── ch18-4
│   ├── ch18-4-eureka
│   ├── ch18-4-gateway-https
│   ├── ch18-4-service-a
│   ├── ch18-4-service-b
│   ├── ch18-4.iml
│   ├── pom.xml
│   └── reademe.md
├── ch18-5
│   ├── ch18-5-eureka
│   ├── ch18-5-gateway
│   ├── ch18-5-service
│   ├── ch18-5.iml
│   └── pom.xml
├── ch18-6
│   ├── ch18-6-1-gateway
│   ├── ch18-6-2-gateway
│   ├── ch18-6-3-gateway
│   ├── ch18-6-provider
│   ├── ch18-6.iml
│   └── pom.xml
├── ch18-7
│   ├── ch18-7-gateway
│   ├── ch18-7.iml
│   ├── pom.xml
│   └── readme.md
├── ch19-1
│   ├── ch19-1.iml
│   ├── pom.xml
│   └── src
├── ch19-2
│   ├── ch19-2.iml
│   ├── grpc-lib-1
│   ├── grpc-simple-client
│   ├── grpc-simple-server
│   └── pom.xml
├── ch2-1
│   ├── ch2-1-eureka-client
│   ├── ch2-1-eureka-server
│   ├── ch2-1.iml
│   ├── mvnw
│   ├── mvnw.cmd
│   └── pom.xml
├── ch20
│   ├── ch20.iml
│   ├── cloud-eureka-server
│   ├── cloud-grpc-client
│   ├── cloud-grpc-server
│   ├── grpc-lib
│   ├── mvnw
│   ├── mvnw.cmd
│   └── pom.xml
├── ch21-1
│   ├── ch21-1-discovery-console
│   ├── ch21-1-eureka-server
│   ├── ch21-1-original-service
│   ├── ch21-1-zuul-server
│   ├── ch21-1.iml
│   └── pom.xml
├── ch22-1
│   ├── ch22-1-2-dockerfile
│   ├── ch22-1-3-jdk8-docker
│   ├── ch22-1-4-jdk10-docker
│   ├── ch22-1.iml
│   ├── mvnw
│   ├── mvnw.cmd
│   └── pom.xml
├── ch22-2
│   ├── ch22-2-1-config-server
│   ├── ch22-2-2-eureka-server
│   ├── ch22-2-3-gateway
│   ├── ch22-2-4-turbine
│   ├── ch22-2-5-spring-admin
│   ├── ch22-2-6-biz-service
│   ├── ch22-2.iml
│   ├── mvnw
│   ├── mvnw.cmd
│   └── pom.xml
├── ch22-3
│   ├── ch22-3-1
│   ├── ch22-3-2-example-service
│   ├── ch22-3-3-example-service
│   ├── ch22-3.iml
│   ├── metrics-server-0.2.1
│   ├── mvnw
│   ├── mvnw.cmd
│   └── pom.xml
├── ch23-1
│   ├── ch23-1.iml
│   ├── demo-consumer
│   ├── demo-provider
│   ├── dubbo-provider-api
│   ├── mvnw
│   ├── mvnw.cmd
│   └── pom.xml
├── ch23-2
│   ├── ch23-2.iml
│   ├── demo-dubbo-consumer
│   ├── demo-dubbo-provider
│   ├── demo-dubbo-provider-api
│   ├── eureka-server
│   ├── mvnw
│   ├── mvnw.cmd
│   └── pom.xml
├── ch24
│   ├── ch24-jta-atomikos
│   ├── ch24-saga-servicecomb
│   ├── ch24-tcc-rest
│   ├── ch24.iml
│   ├── mvnw
│   ├── mvnw.cmd
│   └── pom.xml
├── ch25
│   ├── LICENSE
│   ├── README.md
│   ├── ch25.iml
│   ├── crm-sales-app
│   ├── crm-sales-client
│   ├── crm-sales-consumer
│   ├── crm-sales-domain
│   ├── crm-sales-infrastructure
│   ├── crm-sales-start
│   ├── pom.xml
│   └── tree.md
├── ch3-1
│   ├── ch3-1-config-server
│   ├── ch3-1-eureka-client
│   ├── ch3-1-eureka-server
│   ├── ch3-1.iml
│   ├── mvnw
│   ├── mvnw.cmd
│   └── pom.xml
├── ch3-2
│   ├── ch3-2-eureka-client
│   ├── ch3-2-eureka-server
│   ├── ch3-2-zuul-gateway
│   ├── ch3-2.iml
│   ├── mvnw
│   ├── mvnw.cmd
│   └── pom.xml
├── ch3-3
│   ├── ch3-3-eureka-client
│   ├── ch3-3-eureka-server
│   ├── ch3-3-zuul-gateway
│   ├── ch3-3.iml
│   ├── mvnw
│   ├── mvnw.cmd
│   └── pom.xml
├── ch3-4
│   ├── ch3-4-eureka-client
│   ├── ch3-4-eureka-server
│   ├── ch3-4.iml
│   ├── mvnw
│   ├── mvnw.cmd
│   └── pom.xml
├── ch3-5
│   ├── ch3-5-eureka-client
│   ├── ch3-5-eureka-server
│   ├── ch3-5.iml
│   ├── mvnw
│   ├── mvnw.cmd
│   └── pom.xml
├── ch4-1
│   ├── ch4-1-gzip
│   ├── ch4-1-hello
│   ├── ch4-1.iml
│   ├── pom.xml
│   └── readme.md
├── ch4-2
│   ├── ch4-2-consumer
│   ├── ch4-2-eureka-server
│   ├── ch4-2-provider
│   ├── ch4-2.iml
│   ├── pom.xml
│   └── readme.md
├── ch4-3
│   ├── ch4-3-httpclient
│   ├── ch4-3-okhttp
│   ├── ch4-3.iml
│   ├── pom.xml
│   └── readme.md
├── ch4-4
│   ├── ch4-4-eureka-server
│   ├── ch4-4-feign-file-server
│   ├── ch4-4-feign-upload-client
│   ├── ch4-4.iml
│   ├── pom.xml
│   └── readme.md
├── ch4-5
│   ├── ch4-5-consumer
│   ├── ch4-5-eureka-server
│   ├── ch4-5-provider
│   ├── ch4-5.iml
│   ├── pom.xml
│   └── readme.md
├── ch4-6
│   ├── ch4-6-consumer
│   ├── ch4-6-eureka-server
│   ├── ch4-6-provider
│   ├── ch4-6-provider-client
│   ├── ch4-6.iml
│   ├── pom.xml
│   └── readme.md
├── ch5-1
│   ├── ch5-1-client-a
│   ├── ch5-1-eureka-server
│   ├── ch5-1-ribbon-loadbalancer
│   ├── ch5-1.iml
│   └── pom.xml
├── ch5-2
│   ├── ch5-2-client-a
│   ├── ch5-2-eureka-server
│   ├── ch5-2-ribbon-loadbalancer
│   ├── ch5-2.iml
│   └── pom.xml
├── ch6-1
│   ├── ch6-1-client-service
│   ├── ch6-1-eureka-server
│   ├── ch6-1.iml
│   └── pom.xml
├── ch6-2
│   ├── ch6-2-consumer-service
│   ├── ch6-2-eureka-server
│   ├── ch6-2-provider-service
│   ├── ch6-2.iml
│   └── pom.xml
├── ch6-3
│   ├── ch6-3-eureka-server
│   ├── ch6-3-hello-service
│   ├── ch6-3-hystrix-dashboard
│   ├── ch6-3-hystrix-exception-service
│   ├── ch6-3-provider-service
│   ├── ch6-3-turbine
│   ├── ch6-3.iml
│   └── pom.xml
├── ch6-4
│   ├── ch6-4-collapsing
│   ├── ch6-4-eureka-server
│   ├── ch6-4-hystrix-cache
│   ├── ch6-4-hystrix-thread-context
│   ├── ch6-4-provider-service
│   ├── ch6-4.iml
│   └── pom.xml
├── ch7-1
│   ├── ch7-1-client-a
│   ├── ch7-1-eureka-server
│   ├── ch7-1-zuul-server
│   ├── ch7-1.iml
│   ├── pom.xml
│   └── reademe.txt
├── ch7-2
│   ├── ch7-2-client-a
│   ├── ch7-2-eureka-server
│   ├── ch7-2-zuul-server
│   ├── ch7-2.iml
│   └── pom.xml
├── ch7-3
│   ├── ch7-3-client-a
│   ├── ch7-3-client-b
│   ├── ch7-3-eureka-server
│   ├── ch7-3-zuul-server
│   ├── ch7-3.iml
│   └── pom.xml
├── ch8-1
│   ├── ch8-1-client-a
│   ├── ch8-1-eureka-server
│   ├── ch8-1-zuul-server
│   ├── ch8-1.iml
│   └── pom.xml
├── ch8-2
│   ├── ch8-2-auth-server
│   ├── ch8-2-client-a
│   ├── ch8-2-eureka-server
│   ├── ch8-2-zuul-server
│   ├── ch8-2.iml
│   └── pom.xml
├── ch8-3
│   ├── ch8-3-client-a
│   ├── ch8-3-eureka-server
│   ├── ch8-3-zuul-server
│   ├── ch8-3.iml
│   └── pom.xml
├── ch8-4
│   ├── ch8-4-client-a
│   ├── ch8-4-eureka-server
│   ├── ch8-4-zuul-server
│   ├── ch8-4.iml
│   ├── mysql.sql
│   └── pom.xml
├── ch8-5
│   ├── ch8-5-client-a
│   ├── ch8-5-eureka-server
│   ├── ch8-5-zuul-server
│   ├── ch8-5.iml
│   └── pom.xml
├── ch8-6
│   ├── ch8-6-eureka-server
│   ├── ch8-6-zuul-server
│   ├── ch8-6.iml
│   └── pom.xml
├── ch8-7
│   ├── ch8-7-client-a
│   ├── ch8-7-eureka-server
│   ├── ch8-7-zuul-server
│   ├── ch8-7.iml
│   └── pom.xml
├── pom.xml

tree -L 2 >>tree.txt

3.7 作者介绍

  1. 许进:Spring Cloud**社区创始人,阿里原资深工程师,花名玹霖,专注于基础架构与中间件研发,曾就职于唯品会平台架构部。个人网站:http://xujin.org。

  2. 钟尊发:Spring Cloud**社区联合创始人,现就职于京东金融,对微服务有深入研究。

  3. 叶志远:Spring Cloud**社区联合创始人,现就职于蚂蚁金服,花名梓尧。CSDN博客专家,开源社区活跃者,国内Spring Cloud早期实践者

  4. 方志朋:Spring Cloud**社区联合创始人,硕士学历,《深入理解Spring Cloud与微服务构建》作者,CSDN博客专家(阅读量600万+),在社区具有较高活跃度与影响力。

  5. 蔡波斯:拥有多年Java开发经验,曾就职于美团、腾讯。国内Spring Cloud领域的早期实践者,现在金融行业从事FinTech相关研发

  6. 郭芳碧:多年微服务实践经验,现任职于某互联网金融公司中间件部门。

  7. 朱德明:拥有10年Java开发经验,多年技术架构和解决方案经验,现任灵雀云微服务架构师,在微服务领域有着丰富的落地经验,曾任某创业公司技术负责人。

Stargazers over time

Stargazers over time

spring-cloud-code's People

Contributors

caibosi avatar lovnx avatar softwareking avatar xnkjj avatar yiailake avatar zhongzunfa avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

spring-cloud-code's Issues

对网关gateway的疑问

@bean("custom_route")
public RouteLocator customerRouteLocator(RouteLocatorBuilder builder) {
return builder.routes()
.route(r -> r.path("/test/customFilter")
.filters(f -> f.filter(new CustomGatewayFilter()).stripPrefix(1))
.uri("http://localhost:7001/test")
.order(0)
.id("custom_filter")
)
.build();
}
我在看书过程中发现:/test/customFilter 并不能路由到http://localhost:7001/test路径下,会报404错误,通过日志跟踪发现,gateway找的是http://localhost:7001/test/customFilter,与书中案例出现冲突! 望解惑!!谢谢!

删除route的代码无效

this.routeDefinitionWriter.delete(Mono.just(id));
这一步跟断点的时候走到的InMemoryRouteDefinitionRepository类里面的删除方法,
但是代码似乎不执行一样,
方法走完了之后请求actuator/gateway/routes发现路由规则仍然存在

章节5.2.1 Ribbon自定义全局负载均衡策略的疑问

我曾经在项目中使用书中说的方法去配置全局负载均衡策略的时候发现这种配置方式无法得到预期的效果。

自定义的负载均衡服务继承AvailabilityFilteringRule去重写了选择服务器的方法

@Bean
public IRule rule() {
    return new RibbonRule();
}

public class RibbonRule extends AvailabilityFilteringRule {
@Override
public Server choose(Object key) {
    ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.currentRequestAttributes();
    HttpServletRequest request = attributes.getRequest();
    // Get the actual ip address
    key = RequestUtils.getIpAddress(request);
    ILoadBalancer lb = getLoadBalancer();
    Server returnServer = null;
    List<Server> server = getPredicate().getEligibleServers(lb.getAllServers(), String.valueOf(key));
    for (Server s : server) {
        if (StringUtils.contains(s.getHost(), String.valueOf(key))) {
            returnServer = s;
        }
    }
    if (returnServer == null) {
        returnServer = super.choose(key);
    }
    return returnServer;    }}

这种配置方式在只请求第一次的场景下不会有任何问题,但是在第二次请求的时候ILoadBalancer没有办法获取到正确的服务器导致请求失败

我在init方法中同时去请求了a-center和b-center两个微服务,第一次没问题,第二次请求a-center的feign获取到的是b-center的IP地址

public void init() {
   //a-center
   a.getA();
   //b-center
    b.getB();
}

Ribbon的文档给的案例上配置全局负载均衡是通过@RibbonClients这个注解的defaultConfiguration属性来实现的

@RibbonClients(defaultConfiguration = RibbonRule.class)
public class RibbonClientConfiguration {

}

所以~~~~我想知道是哪里的问题

Spring Cloud 容器化

Spring Cloud 容器化部署的时候,服务注册失败,你们是不是更改了docker的网络设置?

Eureka实战-3【支持Remote Region】,实战

Eureka实战-3【支持Remote Region】,实战
http://www.dengb.com/Javabc/1372927.html

这 Remote Region不起作用了,我这,一直报错:
zuul-gateway zone1

2019-10-21 11:24:13.478 WARN 1108 --- [o-10001-exec-10] o.s.c.n.z.filters.post.SendErrorFilter : Error during filtering

com.netflix.zuul.exception.ZuulException: Forwarding error
at org.springframework.cloud.netflix.zuul.filters.route.RibbonRoutingFilter.handleException(RibbonRoutingFilter.java:189) ~[spring-cloud-netflix-zuul-2.0.0.RELEASE.jar:2.0.0.RELEASE]
at org.springframework.cloud.netflix.zuul.filters.route.RibbonRoutingFilter.forward(RibbonRoutingFilter.java:164) ~[spring-cloud-netflix-zuul-2.0.0.RELEASE.jar:2.0.0.RELEASE]
at org.springframework.cloud.netflix.zuul.filters.route.RibbonRoutingFilter.run(RibbonRoutingFilter.java:112) ~[spring-cloud-netflix-zuul-2.0.0.RELEASE.jar:2.0.0.RELEASE]
at com.netflix.zuul.ZuulFilter.runFilter(ZuulFilter.java:117) ~[zuul-core-1.3.1.jar:1.3.1]
at com.netflix.zuul.FilterProcessor.processZuulFilter(FilterProcessor.java:193) ~[zuul-core-1.3.1.jar:1.3.1]
at com.netflix.zuul.FilterProcessor.runFilters(FilterProcessor.java:157) ~[zuul-core-1.3.1.jar:1.3.1]
at com.netflix.zuul.FilterProcessor.route(FilterProcessor.java:118) ~[zuul-core-1.3.1.jar:1.3.1]
at com.netflix.zuul.ZuulRunner.route(ZuulRunner.java:96) ~[zuul-core-1.3.1.jar:1.3.1]
at com.netflix.zuul.http.ZuulServlet.route(ZuulServlet.java:116) ~[zuul-core-1.3.1.jar:1.3.1]
at com.netflix.zuul.http.ZuulServlet.service(ZuulServlet.java:81) ~[zuul-core-1.3.1.jar:1.3.1]
at org.springframework.web.servlet.mvc.ServletWrappingController.handleRequestInternal(ServletWrappingController.java:165) [spring-webmvc-5.0.7.RELEASE.jar:5.0.7.RELEASE]
at org.springframework.cloud.netflix.zuul.web.ZuulController.handleRequest(ZuulController.java:44) [spring-cloud-netflix-zuul-2.0.0.RELEASE.jar:2.0.0.RELEASE]
at org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter.handle(SimpleControllerHandlerAdapter.java:52) [spring-webmvc-5.0.7.RELEASE.jar:5.0.7.RELEASE]
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:991) [spring-webmvc-5.0.7.RELEASE.jar:5.0.7.RELEASE]
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:925) [spring-webmvc-5.0.7.RELEASE.jar:5.0.7.RELEASE]
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:974) [spring-webmvc-5.0.7.RELEASE.jar:5.0.7.RELEASE]
at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:866) [spring-webmvc-5.0.7.RELEASE.jar:5.0.7.RELEASE]
at javax.servlet.http.HttpServlet.service(HttpServlet.java:635) [tomcat-embed-core-8.5.31.jar:8.5.31]
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:851) [spring-webmvc-5.0.7.RELEASE.jar:5.0.7.RELEASE]
at javax.servlet.http.HttpServlet.service(HttpServlet.java:742) [tomcat-embed-core-8.5.31.jar:8.5.31]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) [tomcat-embed-core-8.5.31.jar:8.5.31]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) [tomcat-embed-core-8.5.31.jar:8.5.31]
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) [tomcat-embed-websocket-8.5.31.jar:8.5.31]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) [tomcat-embed-core-8.5.31.jar:8.5.31]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) [tomcat-embed-core-8.5.31.jar:8.5.31]
at org.springframework.boot.actuate.metrics.web.servlet.WebMvcMetricsFilter.filterAndRecordMetrics(WebMvcMetricsFilter.java:158) [spring-boot-actuator-2.0.3.RELEASE.jar:2.0.3.RELEASE]
at org.springframework.boot.actuate.metrics.web.servlet.WebMvcMetricsFilter.filterAndRecordMetrics(WebMvcMetricsFilter.java:126) [spring-boot-actuator-2.0.3.RELEASE.jar:2.0.3.RELEASE]
at org.springframework.boot.actuate.metrics.web.servlet.WebMvcMetricsFilter.doFilterInternal(WebMvcMetricsFilter.java:111) [spring-boot-actuator-2.0.3.RELEASE.jar:2.0.3.RELEASE]
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) [spring-web-5.0.7.RELEASE.jar:5.0.7.RELEASE]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) [tomcat-embed-core-8.5.31.jar:8.5.31]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) [tomcat-embed-core-8.5.31.jar:8.5.31]
at org.springframework.boot.actuate.web.trace.servlet.HttpTraceFilter.doFilterInternal(HttpTraceFilter.java:90) [spring-boot-actuator-2.0.3.RELEASE.jar:2.0.3.RELEASE]
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) [spring-web-5.0.7.RELEASE.jar:5.0.7.RELEASE]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) [tomcat-embed-core-8.5.31.jar:8.5.31]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) [tomcat-embed-core-8.5.31.jar:8.5.31]
at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:99) [spring-web-5.0.7.RELEASE.jar:5.0.7.RELEASE]
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) [spring-web-5.0.7.RELEASE.jar:5.0.7.RELEASE]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) [tomcat-embed-core-8.5.31.jar:8.5.31]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) [tomcat-embed-core-8.5.31.jar:8.5.31]
at org.springframework.web.filter.HttpPutFormContentFilter.doFilterInternal(HttpPutFormContentFilter.java:109) [spring-web-5.0.7.RELEASE.jar:5.0.7.RELEASE]
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) [spring-web-5.0.7.RELEASE.jar:5.0.7.RELEASE]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) [tomcat-embed-core-8.5.31.jar:8.5.31]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) [tomcat-embed-core-8.5.31.jar:8.5.31]
at org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:93) [spring-web-5.0.7.RELEASE.jar:5.0.7.RELEASE]
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) [spring-web-5.0.7.RELEASE.jar:5.0.7.RELEASE]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) [tomcat-embed-core-8.5.31.jar:8.5.31]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) [tomcat-embed-core-8.5.31.jar:8.5.31]
at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:200) [spring-web-5.0.7.RELEASE.jar:5.0.7.RELEASE]
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) [spring-web-5.0.7.RELEASE.jar:5.0.7.RELEASE]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) [tomcat-embed-core-8.5.31.jar:8.5.31]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) [tomcat-embed-core-8.5.31.jar:8.5.31]
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:198) [tomcat-embed-core-8.5.31.jar:8.5.31]
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96) [tomcat-embed-core-8.5.31.jar:8.5.31]
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:496) [tomcat-embed-core-8.5.31.jar:8.5.31]
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:140) [tomcat-embed-core-8.5.31.jar:8.5.31]
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:81) [tomcat-embed-core-8.5.31.jar:8.5.31]
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87) [tomcat-embed-core-8.5.31.jar:8.5.31]
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:342) [tomcat-embed-core-8.5.31.jar:8.5.31]
at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:803) [tomcat-embed-core-8.5.31.jar:8.5.31]
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66) [tomcat-embed-core-8.5.31.jar:8.5.31]
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:790) [tomcat-embed-core-8.5.31.jar:8.5.31]
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1468) [tomcat-embed-core-8.5.31.jar:8.5.31]
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) [tomcat-embed-core-8.5.31.jar:8.5.31]
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) [na:1.8.0_151]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) [na:1.8.0_151]
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) [tomcat-embed-core-8.5.31.jar:8.5.31]
at java.lang.Thread.run(Thread.java:748) [na:1.8.0_151]
Caused by: com.netflix.hystrix.exception.HystrixRuntimeException: demo-client timed-out and no fallback available.
at com.netflix.hystrix.AbstractCommand$22.call(AbstractCommand.java:819) ~[hystrix-core-1.5.12.jar:1.5.12]
at com.netflix.hystrix.AbstractCommand$22.call(AbstractCommand.java:804) ~[hystrix-core-1.5.12.jar:1.5.12]
at rx.internal.operators.OperatorOnErrorResumeNextViaFunction$4.onError(OperatorOnErrorResumeNextViaFunction.java:140) ~[rxjava-1.3.8.jar:1.3.8]
at rx.internal.operators.OnSubscribeDoOnEach$DoOnEachSubscriber.onError(OnSubscribeDoOnEach.java:87) ~[rxjava-1.3.8.jar:1.3.8]
at rx.internal.operators.OnSubscribeDoOnEach$DoOnEachSubscriber.onError(OnSubscribeDoOnEach.java:87) ~[rxjava-1.3.8.jar:1.3.8]
at com.netflix.hystrix.AbstractCommand$DeprecatedOnFallbackHookApplication$1.onError(AbstractCommand.java:1472) ~[hystrix-core-1.5.12.jar:1.5.12]
at com.netflix.hystrix.AbstractCommand$FallbackHookApplication$1.onError(AbstractCommand.java:1397) ~[hystrix-core-1.5.12.jar:1.5.12]
at rx.internal.operators.OnSubscribeDoOnEach$DoOnEachSubscriber.onError(OnSubscribeDoOnEach.java:87) ~[rxjava-1.3.8.jar:1.3.8]
at rx.observers.Subscribers$5.onError(Subscribers.java:230) ~[rxjava-1.3.8.jar:1.3.8]
at rx.internal.operators.OnSubscribeThrow.call(OnSubscribeThrow.java:44) ~[rxjava-1.3.8.jar:1.3.8]
at rx.internal.operators.OnSubscribeThrow.call(OnSubscribeThrow.java:28) ~[rxjava-1.3.8.jar:1.3.8]
at rx.Observable.unsafeSubscribe(Observable.java:10327) ~[rxjava-1.3.8.jar:1.3.8]
at rx.internal.operators.OnSubscribeDefer.call(OnSubscribeDefer.java:51) ~[rxjava-1.3.8.jar:1.3.8]
at rx.internal.operators.OnSubscribeDefer.call(OnSubscribeDefer.java:35) ~[rxjava-1.3.8.jar:1.3.8]
at rx.Observable.unsafeSubscribe(Observable.java:10327) ~[rxjava-1.3.8.jar:1.3.8]
at rx.internal.operators.OnSubscribeDoOnEach.call(OnSubscribeDoOnEach.java:41) ~[rxjava-1.3.8.jar:1.3.8]
at rx.internal.operators.OnSubscribeDoOnEach.call(OnSubscribeDoOnEach.java:30) ~[rxjava-1.3.8.jar:1.3.8]
at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:48) ~[rxjava-1.3.8.jar:1.3.8]
at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:30) ~[rxjava-1.3.8.jar:1.3.8]
at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:48) ~[rxjava-1.3.8.jar:1.3.8]
at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:30) ~[rxjava-1.3.8.jar:1.3.8]
at rx.Observable.unsafeSubscribe(Observable.java:10327) ~[rxjava-1.3.8.jar:1.3.8]
at rx.internal.operators.OnSubscribeDoOnEach.call(OnSubscribeDoOnEach.java:41) ~[rxjava-1.3.8.jar:1.3.8]
at rx.internal.operators.OnSubscribeDoOnEach.call(OnSubscribeDoOnEach.java:30) ~[rxjava-1.3.8.jar:1.3.8]
at rx.Observable.unsafeSubscribe(Observable.java:10327) ~[rxjava-1.3.8.jar:1.3.8]
at rx.internal.operators.OnSubscribeDoOnEach.call(OnSubscribeDoOnEach.java:41) ~[rxjava-1.3.8.jar:1.3.8]
at rx.internal.operators.OnSubscribeDoOnEach.call(OnSubscribeDoOnEach.java:30) ~[rxjava-1.3.8.jar:1.3.8]
at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:48) ~[rxjava-1.3.8.jar:1.3.8]
at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:30) ~[rxjava-1.3.8.jar:1.3.8]
at rx.Observable.unsafeSubscribe(Observable.java:10327) ~[rxjava-1.3.8.jar:1.3.8]
at rx.internal.operators.OnSubscribeDoOnEach.call(OnSubscribeDoOnEach.java:41) ~[rxjava-1.3.8.jar:1.3.8]
at rx.internal.operators.OnSubscribeDoOnEach.call(OnSubscribeDoOnEach.java:30) ~[rxjava-1.3.8.jar:1.3.8]
at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:48) ~[rxjava-1.3.8.jar:1.3.8]
at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:30) ~[rxjava-1.3.8.jar:1.3.8]
at rx.Observable.unsafeSubscribe(Observable.java:10327) ~[rxjava-1.3.8.jar:1.3.8]
at rx.internal.operators.OperatorOnErrorResumeNextViaFunction$4.onError(OperatorOnErrorResumeNextViaFunction.java:142) ~[rxjava-1.3.8.jar:1.3.8]
at rx.internal.operators.OnSubscribeDoOnEach$DoOnEachSubscriber.onError(OnSubscribeDoOnEach.java:87) ~[rxjava-1.3.8.jar:1.3.8]
at rx.internal.operators.OnSubscribeDoOnEach$DoOnEachSubscriber.onError(OnSubscribeDoOnEach.java:87) ~[rxjava-1.3.8.jar:1.3.8]
at com.netflix.hystrix.AbstractCommand$HystrixObservableTimeoutOperator$1$1.run(AbstractCommand.java:1154) ~[hystrix-core-1.5.12.jar:1.5.12]
at com.netflix.hystrix.strategy.concurrency.HystrixContextRunnable$1.call(HystrixContextRunnable.java:45) ~[hystrix-core-1.5.12.jar:1.5.12]
at com.netflix.hystrix.strategy.concurrency.HystrixContextRunnable$1.call(HystrixContextRunnable.java:41) ~[hystrix-core-1.5.12.jar:1.5.12]
at com.netflix.hystrix.strategy.concurrency.HystrixContextRunnable.run(HystrixContextRunnable.java:61) ~[hystrix-core-1.5.12.jar:1.5.12]
at com.netflix.hystrix.AbstractCommand$HystrixObservableTimeoutOperator$1.tick(AbstractCommand.java:1159) ~[hystrix-core-1.5.12.jar:1.5.12]
at com.netflix.hystrix.util.HystrixTimer$1.run(HystrixTimer.java:99) ~[hystrix-core-1.5.12.jar:1.5.12]
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) ~[na:1.8.0_151]
at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:308) ~[na:1.8.0_151]
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301(ScheduledThreadPoolExecutor.java:180) ~[na:1.8.0_151]
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:294) ~[na:1.8.0_151]
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) [na:1.8.0_151]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) [na:1.8.0_151]
... 1 common frames omitted
Caused by: java.util.concurrent.TimeoutException: null
at com.netflix.hystrix.AbstractCommand.handleTimeoutViaFallback(AbstractCommand.java:997) ~[hystrix-core-1.5.12.jar:1.5.12]
at com.netflix.hystrix.AbstractCommand.access$500(AbstractCommand.java:60) ~[hystrix-core-1.5.12.jar:1.5.12]
at com.netflix.hystrix.AbstractCommand$12.call(AbstractCommand.java:610) ~[hystrix-core-1.5.12.jar:1.5.12]
at com.netflix.hystrix.AbstractCommand$12.call(AbstractCommand.java:601) ~[hystrix-core-1.5.12.jar:1.5.12]
at rx.internal.operators.OperatorOnErrorResumeNextViaFunction$4.onError(OperatorOnErrorResumeNextViaFunction.java:140) ~[rxjava-1.3.8.jar:1.3.8]
... 15 common frames omitted

gateway疑问

  gateway:
    discovery:
      locator:
      #开启服务发现路由匹配规则
        enabled: true
        filters:
        - name: Hystrix
          args:
            name: default
            fallbackUri: forward:/fallback

这么配置filters报错,为什么discovery 配置filters不生效.

3.5.1 Eureka Server 在线扩容--ch3-1/ch3-1-eureka-server启动报错

com.sun.jersey.api.client.ClientHandlerException: java.net.ConnectException: Connection refused: connect
at com.sun.jersey.client.apache4.ApacheHttpClient4Handler.handle(ApacheHttpClient4Handler.java:187) ~[jersey-apache-client4-1.19.1.jar:1.19.1]
at com.sun.jersey.api.client.filter.GZIPContentEncodingFilter.handle(GZIPContentEncodingFilter.java:123) ~[jersey-client-1.19.1.jar:1.19.1]
at com.netflix.discovery.EurekaIdentityHeaderFilter.handle(EurekaIdentityHeaderFilter.java:27) ~[eureka-client-1.9.2.jar:1.9.2]
at com.sun.jersey.api.client.Client.handle(Client.java:652) ~[jersey-client-1.19.1.jar:1.19.1]
at com.sun.jersey.api.client.WebResource.handle(WebResource.java:682) ~[jersey-client-1.19.1.jar:1.19.1]
at com.sun.jersey.api.client.WebResource.access$200(WebResource.java:74) ~[jersey-client-1.19.1.jar:1.19.1]
at com.sun.jersey.api.client.WebResource$Builder.post(WebResource.java:570) ~[jersey-client-1.19.1.jar:1.19.1]
at com.netflix.discovery.shared.transport.jersey.AbstractJerseyEurekaHttpClient.register(AbstractJerseyEurekaHttpClient.java:56) ~[eureka-client-1.9.2.jar:1.9.2]
at com.netflix.discovery.shared.transport.decorator.EurekaHttpClientDecorator$1.execute(EurekaHttpClientDecorator.java:59) [eureka-client-1.9.2.jar:1.9.2]
at com.netflix.discovery.shared.transport.decorator.MetricsCollectingEurekaHttpClient.execute(MetricsCollectingEurekaHttpClient.java:73) ~[eureka-client-1.9.2.jar:1.9.2]
at com.netflix.discovery.shared.transport.decorator.EurekaHttpClientDecorator.register(EurekaHttpClientDecorator.java:56) [eureka-client-1.9.2.jar:1.9.2]
at com.netflix.discovery.shared.transport.decorator.EurekaHttpClientDecorator$1.execute(EurekaHttpClientDecorator.java:59) [eureka-client-1.9.2.jar:1.9.2]
at com.netflix.discovery.shared.transport.decorator.RedirectingEurekaHttpClient.executeOnNewServer(RedirectingEurekaHttpClient.java:118) ~[eureka-client-1.9.2.jar:1.9.2]
at com.netflix.discovery.shared.transport.decorator.RedirectingEurekaHttpClient.execute(RedirectingEurekaHttpClient.java:79) ~[eureka-client-1.9.2.jar:1.9.2]
at com.netflix.discovery.shared.transport.decorator.EurekaHttpClientDecorator.register(EurekaHttpClientDecorator.java:56) [eureka-client-1.9.2.jar:1.9.2]
at com.netflix.discovery.shared.transport.decorator.EurekaHttpClientDecorator$1.execute(EurekaHttpClientDecorator.java:59) [eureka-client-1.9.2.jar:1.9.2]
at com.netflix.discovery.shared.transport.decorator.RetryableEurekaHttpClient.execute(RetryableEurekaHttpClient.java:120) [eureka-client-1.9.2.jar:1.9.2]
at com.netflix.discovery.shared.transport.decorator.EurekaHttpClientDecorator.register(EurekaHttpClientDecorator.java:56) [eureka-client-1.9.2.jar:1.9.2]
at com.netflix.discovery.shared.transport.decorator.EurekaHttpClientDecorator$1.execute(EurekaHttpClientDecorator.java:59) [eureka-client-1.9.2.jar:1.9.2]
at com.netflix.discovery.shared.transport.decorator.SessionedEurekaHttpClient.execute(SessionedEurekaHttpClient.java:77) [eureka-client-1.9.2.jar:1.9.2]
at com.netflix.discovery.shared.transport.decorator.EurekaHttpClientDecorator.register(EurekaHttpClientDecorator.java:56) [eureka-client-1.9.2.jar:1.9.2]
at com.netflix.discovery.DiscoveryClient.register(DiscoveryClient.java:829) [eureka-client-1.9.2.jar:1.9.2]
at com.netflix.discovery.InstanceInfoReplicator.run(InstanceInfoReplicator.java:121) [eureka-client-1.9.2.jar:1.9.2]
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) [na:1.8.0_181]
at java.util.concurrent.FutureTask.run(FutureTask.java:266) [na:1.8.0_181]
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:180) [na:1.8.0_181]
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293) [na:1.8.0_181]
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) [na:1.8.0_181]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) [na:1.8.0_181]
at java.lang.Thread.run(Thread.java:748) [na:1.8.0_181]
Caused by: java.net.ConnectException: Connection refused: connect
at java.net.DualStackPlainSocketImpl.waitForConnect(Native Method) ~[na:1.8.0_181]
at java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:85) ~[na:1.8.0_181]
at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350) ~[na:1.8.0_181]
at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206) ~[na:1.8.0_181]
at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188) ~[na:1.8.0_181]
at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:172) ~[na:1.8.0_181]
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392) ~[na:1.8.0_181]
at java.net.Socket.connect(Socket.java:589) ~[na:1.8.0_181]
at org.apache.http.conn.scheme.PlainSocketFactory.connectSocket(PlainSocketFactory.java:121) ~[httpclient-4.5.5.jar:4.5.5]
at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:180) ~[httpclient-4.5.5.jar:4.5.5]
at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:144) ~[httpclient-4.5.5.jar:4.5.5]
at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:134) ~[httpclient-4.5.5.jar:4.5.5]
at org.apache.http.impl.client.DefaultRequestDirector.tryConnect(DefaultRequestDirector.java:610) ~[httpclient-4.5.5.jar:4.5.5]
at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:445) ~[httpclient-4.5.5.jar:4.5.5]
at org.apache.http.impl.client.AbstractHttpClient.doExecute(AbstractHttpClient.java:835) ~[httpclient-4.5.5.jar:4.5.5]
at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:118) ~[httpclient-4.5.5.jar:4.5.5]
at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:56) ~[httpclient-4.5.5.jar:4.5.5]
at com.sun.jersey.client.apache4.ApacheHttpClient4Handler.handle(ApacheHttpClient4Handler.java:173) ~[jersey-apache-client4-1.19.1.jar:1.19.1]
... 29 common frames omitted

2018-10-25 10:20:01.151 WARN 14860 --- [nfoReplicator-0] c.n.d.s.t.d.RetryableEurekaHttpClient : Request execution failed with message: java.net.ConnectException: Connection refused: connect
2018-10-25 10:20:01.152 WARN 14860 --- [nfoReplicator-0] com.netflix.discovery.DiscoveryClient : DiscoveryClient_EUREKA-SERVER/CTOPC10081636.boe.com.cn:eureka-server - registration failed Cannot execute request on any known
server

com.netflix.discovery.shared.transport.TransportException: Cannot execute request on any known server
at com.netflix.discovery.shared.transport.decorator.RetryableEurekaHttpClient.execute(RetryableEurekaHttpClient.java:112) ~[eureka-client-1.9.2.jar:1.9.2]
at com.netflix.discovery.shared.transport.decorator.EurekaHttpClientDecorator.register(EurekaHttpClientDecorator.java:56) ~[eureka-client-1.9.2.jar:1.9.2]
at com.netflix.discovery.shared.transport.decorator.EurekaHttpClientDecorator$1.execute(EurekaHttpClientDecorator.java:59) ~[eureka-client-1.9.2.jar:1.9.2]
at com.netflix.discovery.shared.transport.decorator.SessionedEurekaHttpClient.execute(SessionedEurekaHttpClient.java:77) ~[eureka-client-1.9.2.jar:1.9.2]
at com.netflix.discovery.shared.transport.decorator.EurekaHttpClientDecorator.register(EurekaHttpClientDecorator.java:56) ~[eureka-client-1.9.2.jar:1.9.2]
at com.netflix.discovery.DiscoveryClient.register(DiscoveryClient.java:829) ~[eureka-client-1.9.2.jar:1.9.2]
at com.netflix.discovery.InstanceInfoReplicator.run(InstanceInfoReplicator.java:121) [eureka-client-1.9.2.jar:1.9.2]
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) [na:1.8.0_181]
at java.util.concurrent.FutureTask.run(FutureTask.java:266) [na:1.8.0_181]
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:180) [na:1.8.0_181]
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293) [na:1.8.0_181]
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) [na:1.8.0_181]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) [na:1.8.0_181]
at java.lang.Thread.run(Thread.java:748) [na:1.8.0_181]

gateway中HTTPS的使用技巧

启动报错

org.springframework.context.ApplicationContextException: Unable to start reactive web server; nested exception is java.lang.IllegalStateException: java.lang.IllegalStateException: org.springframework.boot.web.server.WebServerException: Could not load key store 'classpath:samples.jks'
	at org.springframework.boot.web.reactive.context.ReactiveWebServerApplicationContext.onRefresh(ReactiveWebServerApplicationContext.java:81) ~[spring-boot-2.1.15.RELEASE.jar:2.1.15.RELEASE]
	at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:544) ~[spring-context-5.1.16.RELEASE.jar:5.1.16.RELEASE]
	at org.springframework.boot.web.reactive.context.ReactiveWebServerApplicationContext.refresh(ReactiveWebServerApplicationContext.java:66) ~[spring-boot-2.1.15.RELEASE.jar:2.1.15.RELEASE]
	at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:744) [spring-boot-2.1.15.RELEASE.jar:2.1.15.RELEASE]
	at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:391) [spring-boot-2.1.15.RELEASE.jar:2.1.15.RELEASE]
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:312) [spring-boot-2.1.15.RELEASE.jar:2.1.15.RELEASE]
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:1215) [spring-boot-2.1.15.RELEASE.jar:2.1.15.RELEASE]
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:1204) [spring-boot-2.1.15.RELEASE.jar:2.1.15.RELEASE]
	at com.upcwangying.cloud.samples.gateway.SamplesGatewayApplication.main(SamplesGatewayApplication.java:44) [classes/:na]
Caused by: java.lang.IllegalStateException: java.lang.IllegalStateException: org.springframework.boot.web.server.WebServerException: Could not load key store 'classpath:samples.jks'
	at org.springframework.boot.web.embedded.netty.SslServerCustomizer.apply(SslServerCustomizer.java:85) ~[spring-boot-2.1.15.RELEASE.jar:2.1.15.RELEASE]
	at org.springframework.boot.web.embedded.netty.NettyReactiveWebServerFactory.createHttpServer(NettyReactiveWebServerFactory.java:137) ~[spring-boot-2.1.15.RELEASE.jar:2.1.15.RELEASE]
	at org.springframework.boot.web.embedded.netty.NettyReactiveWebServerFactory.getWebServer(NettyReactiveWebServerFactory.java:63) ~[spring-boot-2.1.15.RELEASE.jar:2.1.15.RELEASE]
	at org.springframework.boot.web.reactive.context.ReactiveWebServerApplicationContext$ServerManager.<init>(ReactiveWebServerApplicationContext.java:196) ~[spring-boot-2.1.15.RELEASE.jar:2.1.15.RELEASE]
	at org.springframework.boot.web.reactive.context.ReactiveWebServerApplicationContext$ServerManager.get(ReactiveWebServerApplicationContext.java:213) ~[spring-boot-2.1.15.RELEASE.jar:2.1.15.RELEASE]
	at org.springframework.boot.web.reactive.context.ReactiveWebServerApplicationContext.createWebServer(ReactiveWebServerApplicationContext.java:88) ~[spring-boot-2.1.15.RELEASE.jar:2.1.15.RELEASE]
	at org.springframework.boot.web.reactive.context.ReactiveWebServerApplicationContext.onRefresh(ReactiveWebServerApplicationContext.java:78) ~[spring-boot-2.1.15.RELEASE.jar:2.1.15.RELEASE]
	... 8 common frames omitted
Caused by: java.lang.IllegalStateException: org.springframework.boot.web.server.WebServerException: Could not load key store 'classpath:samples.jks'
	at org.springframework.boot.web.embedded.netty.SslServerCustomizer.getKeyManagerFactory(SslServerCustomizer.java:123) ~[spring-boot-2.1.15.RELEASE.jar:2.1.15.RELEASE]
	at org.springframework.boot.web.embedded.netty.SslServerCustomizer.getContextBuilder(SslServerCustomizer.java:90) ~[spring-boot-2.1.15.RELEASE.jar:2.1.15.RELEASE]
	at org.springframework.boot.web.embedded.netty.SslServerCustomizer.lambda$apply$0(SslServerCustomizer.java:78) ~[spring-boot-2.1.15.RELEASE.jar:2.1.15.RELEASE]
	at reactor.netty.http.server.HttpServerSecure.<init>(HttpServerSecure.java:37) ~[reactor-netty-0.8.19.RELEASE.jar:0.8.19.RELEASE]
	at reactor.netty.http.server.HttpServer.secure(HttpServer.java:447) ~[reactor-netty-0.8.19.RELEASE.jar:0.8.19.RELEASE]
	at org.springframework.boot.web.embedded.netty.SslServerCustomizer.apply(SslServerCustomizer.java:77) ~[spring-boot-2.1.15.RELEASE.jar:2.1.15.RELEASE]
	... 14 common frames omitted
Caused by: org.springframework.boot.web.server.WebServerException: Could not load key store 'classpath:samples.jks'
	at org.springframework.boot.web.embedded.netty.SslServerCustomizer.loadStore(SslServerCustomizer.java:177) ~[spring-boot-2.1.15.RELEASE.jar:2.1.15.RELEASE]
	at org.springframework.boot.web.embedded.netty.SslServerCustomizer.loadKeyStore(SslServerCustomizer.java:158) ~[spring-boot-2.1.15.RELEASE.jar:2.1.15.RELEASE]
	at org.springframework.boot.web.embedded.netty.SslServerCustomizer.getKeyStore(SslServerCustomizer.java:131) ~[spring-boot-2.1.15.RELEASE.jar:2.1.15.RELEASE]
	at org.springframework.boot.web.embedded.netty.SslServerCustomizer.getKeyManagerFactory(SslServerCustomizer.java:109) ~[spring-boot-2.1.15.RELEASE.jar:2.1.15.RELEASE]
	... 19 common frames omitted
Caused by: java.io.FileNotFoundException: class path resource [samples.jks] cannot be resolved to URL because it does not exist
	at org.springframework.util.ResourceUtils.getURL(ResourceUtils.java:137) ~[spring-core-5.1.16.RELEASE.jar:5.1.16.RELEASE]
	at org.springframework.boot.web.embedded.netty.SslServerCustomizer.loadStore(SslServerCustomizer.java:172) ~[spring-boot-2.1.15.RELEASE.jar:2.1.15.RELEASE]
	... 22 common frames omitted

eureka整合https

按照源码3.5.5整合https时发现,启动eureka-server 在启动一个eureka-client 发现eureka-server有报错 eureka-server自动调用https://localhost:8761/peerreplication/batch/ (个人猜测是在高可用的时候同步注册信息的接口) 报错 所以eureka-server是不是也要将内置的jersey支持https

第3章勘误

第3章 Spring Cloud Eureka 下篇 第37页 表3-6 : 行2和行4重复

关于Ribbon工程的两个疑问

工程CH5-2
1.感觉AvoidScan是多余的
如果想为Ribbon单个客户端进行配置 只需如下配置即可
1.@RibbonClient(name = "client-a", configuration = TestConfiguration.class)

2.编写TestConfiguration类代码如下
f

因为你添加了@configuration 然后又用AvoidScan将类排除在Spring容器扫描 个人感觉是多余的 并且Ribbon的配置貌似是区分大小写的 CLIENT-A的调用是不会引用到client-a的配置的

2.在CH5-2中 配置超时和重试都没有生效
服务调用方
k

i

关于超时:我在服务提供方打了断点让程序卡住 但是客户端却没有触发超时机制
关于重试:我先启动两个节点 后下线一个节点 但是客户端没有进行失败重试 即使在我添加了spring-retry依赖后,依然没触发重试机制 不知道是不是因为直接通过RestTemplate调用不会触发Ribbon的超时和重试机制。以上是个人见解 如有误解的地方 请多多包涵哈

Hystrix这章写的什么玩意儿?

前几章都挺好的,到了第六章Hystrix,例子跑不起来,报:找不着方法 org.HdrHistogram.Histogram.(I)V,而且写的一点都不细致,这本书最大的败笔就是这章!

第4章勘误汇总

第四章 Spring Cloud Feign
4.1.3 Feign的工作原理 小节(第78页)。两处地方,应该是@FeignClient 而不是 @FeignClients
4 1 3

关于Feign工程中的两个疑问

1.Token透传拦截器
postMan截图:
a

在项目中Header会被转成小写
b

2.Feign Response No converter found
在CH4-2中 我在服务提供方添加了响应Feign Response的方法
d

并且在项目中添加了一个消息转换器
e

但是调用的时候报错
Failed to write HTTP message: org.springframework.http.converter.HttpMessageNotWritableException: No converter found for return value of type: class feign.Response

不知道要添加什么类型的消息转换器

实战灰度发布时候报了个错

com.netflix.zuul.exception.ZuulException: Filter threw Exception
at com.netflix.zuul.FilterProcessor.processZuulFilter(FilterProcessor.java:227) ~[zuul-core-1.3.1.jar:1.3.1]
at com.netflix.zuul.FilterProcessor.runFilters(FilterProcessor.java:157) ~[zuul-core-1.3.1.jar:1.3.1]
at com.netflix.zuul.FilterProcessor.error(FilterProcessor.java:105) ~[zuul-core-1.3.1.jar:1.3.1]
at com.netflix.zuul.ZuulRunner.error(ZuulRunner.java:112) [zuul-core-1.3.1.jar:1.3.1]
at com.netflix.zuul.http.ZuulServlet.error(ZuulServlet.java:145) [zuul-core-1.3.1.jar:1.3.1]
at com.netflix.zuul.http.ZuulServlet.service(ZuulServlet.java:83) [zuul-core-1.3.1.jar:1.3.1]
at org.springframework.web.servlet.mvc.ServletWrappingController.handleRequestInternal(ServletWrappingController.java:165) [spring-webmvc-5.0.7.RELEASE.jar:5.0.7.RELEASE]
at org.springframework.cloud.netflix.zuul.web.ZuulController.handleRequest(ZuulController.java:44) [spring-cloud-netflix-zuul-2.0.0.RELEASE.jar:2.0.0.RELEASE]
at org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter.handle(SimpleControllerHandlerAdapter.java:52) [spring-webmvc-5.0.7.RELEASE.jar:5.0.7.RELEASE]
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:991) [spring-webmvc-5.0.7.RELEASE.jar:5.0.7.RELEASE]
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:925) [spring-webmvc-5.0.7.RELEASE.jar:5.0.7.RELEASE]
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:974) [spring-webmvc-5.0.7.RELEASE.jar:5.0.7.RELEASE]
at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:866) [spring-webmvc-5.0.7.RELEASE.jar:5.0.7.RELEASE]
at javax.servlet.http.HttpServlet.service(HttpServlet.java:635) [tomcat-embed-core-8.5.31.jar:8.5.31]
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:851) [spring-webmvc-5.0.7.RELEASE.jar:5.0.7.RELEASE]
at javax.servlet.http.HttpServlet.service(HttpServlet.java:742) [tomcat-embed-core-8.5.31.jar:8.5.31]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) [tomcat-embed-core-8.5.31.jar:8.5.31]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) [tomcat-embed-core-8.5.31.jar:8.5.31]
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) [tomcat-embed-websocket-8.5.31.jar:8.5.31]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) [tomcat-embed-core-8.5.31.jar:8.5.31]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) [tomcat-embed-core-8.5.31.jar:8.5.31]
at org.springframework.boot.actuate.metrics.web.servlet.WebMvcMetricsFilter.filterAndRecordMetrics(WebMvcMetricsFilter.java:158) [spring-boot-actuator-2.0.3.RELEASE.jar:2.0.3.RELEASE]
at org.springframework.boot.actuate.metrics.web.servlet.WebMvcMetricsFilter.filterAndRecordMetrics(WebMvcMetricsFilter.java:126) [spring-boot-actuator-2.0.3.RELEASE.jar:2.0.3.RELEASE]
at org.springframework.boot.actuate.metrics.web.servlet.WebMvcMetricsFilter.doFilterInternal(WebMvcMetricsFilter.java:111) [spring-boot-actuator-2.0.3.RELEASE.jar:2.0.3.RELEASE]
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) [spring-web-5.0.7.RELEASE.jar:5.0.7.RELEASE]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) [tomcat-embed-core-8.5.31.jar:8.5.31]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) [tomcat-embed-core-8.5.31.jar:8.5.31]
at org.springframework.boot.actuate.web.trace.servlet.HttpTraceFilter.doFilterInternal(HttpTraceFilter.java:90) [spring-boot-actuator-2.0.3.RELEASE.jar:2.0.3.RELEASE]
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) [spring-web-5.0.7.RELEASE.jar:5.0.7.RELEASE]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) [tomcat-embed-core-8.5.31.jar:8.5.31]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) [tomcat-embed-core-8.5.31.jar:8.5.31]
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:320) [spring-security-web-5.0.6.RELEASE.jar:5.0.6.RELEASE]
at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:127) [spring-security-web-5.0.6.RELEASE.jar:5.0.6.RELEASE]
at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:91) [spring-security-web-5.0.6.RELEASE.jar:5.0.6.RELEASE]
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) [spring-security-web-5.0.6.RELEASE.jar:5.0.6.RELEASE]
at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:119) [spring-security-web-5.0.6.RELEASE.jar:5.0.6.RELEASE]
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) [spring-security-web-5.0.6.RELEASE.jar:5.0.6.RELEASE]
at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:137) [spring-security-web-5.0.6.RELEASE.jar:5.0.6.RELEASE]
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) [spring-security-web-5.0.6.RELEASE.jar:5.0.6.RELEASE]
at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:111) [spring-security-web-5.0.6.RELEASE.jar:5.0.6.RELEASE]
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) [spring-security-web-5.0.6.RELEASE.jar:5.0.6.RELEASE]
at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:170) [spring-security-web-5.0.6.RELEASE.jar:5.0.6.RELEASE]
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) [spring-security-web-5.0.6.RELEASE.jar:5.0.6.RELEASE]
at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:63) [spring-security-web-5.0.6.RELEASE.jar:5.0.6.RELEASE]
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) [spring-security-web-5.0.6.RELEASE.jar:5.0.6.RELEASE]
at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:200) [spring-security-web-5.0.6.RELEASE.jar:5.0.6.RELEASE]
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) [spring-security-web-5.0.6.RELEASE.jar:5.0.6.RELEASE]
at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:116) [spring-security-web-5.0.6.RELEASE.jar:5.0.6.RELEASE]
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) [spring-security-web-5.0.6.RELEASE.jar:5.0.6.RELEASE]
at org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:66) [spring-security-web-5.0.6.RELEASE.jar:5.0.6.RELEASE]
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) [spring-web-5.0.7.RELEASE.jar:5.0.7.RELEASE]
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) [spring-security-web-5.0.6.RELEASE.jar:5.0.6.RELEASE]
at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:105) [spring-security-web-5.0.6.RELEASE.jar:5.0.6.RELEASE]
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) [spring-security-web-5.0.6.RELEASE.jar:5.0.6.RELEASE]
at org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:56) [spring-security-web-5.0.6.RELEASE.jar:5.0.6.RELEASE]
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) [spring-web-5.0.7.RELEASE.jar:5.0.7.RELEASE]
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) [spring-security-web-5.0.6.RELEASE.jar:5.0.6.RELEASE]
at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:215) [spring-security-web-5.0.6.RELEASE.jar:5.0.6.RELEASE]
at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:178) [spring-security-web-5.0.6.RELEASE.jar:5.0.6.RELEASE]
at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:357) [spring-web-5.0.7.RELEASE.jar:5.0.7.RELEASE]
at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:270) [spring-web-5.0.7.RELEASE.jar:5.0.7.RELEASE]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) [tomcat-embed-core-8.5.31.jar:8.5.31]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) [tomcat-embed-core-8.5.31.jar:8.5.31]
at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:99) [spring-web-5.0.7.RELEASE.jar:5.0.7.RELEASE]
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) [spring-web-5.0.7.RELEASE.jar:5.0.7.RELEASE]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) [tomcat-embed-core-8.5.31.jar:8.5.31]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) [tomcat-embed-core-8.5.31.jar:8.5.31]
at org.springframework.security.oauth2.client.filter.OAuth2ClientContextFilter.doFilter(OAuth2ClientContextFilter.java:60) [spring-security-oauth2-2.2.1.RELEASE.jar:na]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) [tomcat-embed-core-8.5.31.jar:8.5.31]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) [tomcat-embed-core-8.5.31.jar:8.5.31]
at org.springframework.web.filter.HttpPutFormContentFilter.doFilterInternal(HttpPutFormContentFilter.java:109) [spring-web-5.0.7.RELEASE.jar:5.0.7.RELEASE]
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) [spring-web-5.0.7.RELEASE.jar:5.0.7.RELEASE]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) [tomcat-embed-core-8.5.31.jar:8.5.31]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) [tomcat-embed-core-8.5.31.jar:8.5.31]
at org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:93) [spring-web-5.0.7.RELEASE.jar:5.0.7.RELEASE]
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) [spring-web-5.0.7.RELEASE.jar:5.0.7.RELEASE]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) [tomcat-embed-core-8.5.31.jar:8.5.31]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) [tomcat-embed-core-8.5.31.jar:8.5.31]
at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:200) [spring-web-5.0.7.RELEASE.jar:5.0.7.RELEASE]
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) [spring-web-5.0.7.RELEASE.jar:5.0.7.RELEASE]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) [tomcat-embed-core-8.5.31.jar:8.5.31]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) [tomcat-embed-core-8.5.31.jar:8.5.31]
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:198) [tomcat-embed-core-8.5.31.jar:8.5.31]
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96) [tomcat-embed-core-8.5.31.jar:8.5.31]
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:496) [tomcat-embed-core-8.5.31.jar:8.5.31]
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:140) [tomcat-embed-core-8.5.31.jar:8.5.31]
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:81) [tomcat-embed-core-8.5.31.jar:8.5.31]
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87) [tomcat-embed-core-8.5.31.jar:8.5.31]
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:342) [tomcat-embed-core-8.5.31.jar:8.5.31]
at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:803) [tomcat-embed-core-8.5.31.jar:8.5.31]
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66) [tomcat-embed-core-8.5.31.jar:8.5.31]
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:790) [tomcat-embed-core-8.5.31.jar:8.5.31]
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1468) [tomcat-embed-core-8.5.31.jar:8.5.31]
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) [tomcat-embed-core-8.5.31.jar:8.5.31]
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) [na:1.8.0_131]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) [na:1.8.0_131]
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) [tomcat-embed-core-8.5.31.jar:8.5.31]
at java.lang.Thread.run(Thread.java:748) [na:1.8.0_131]
Caused by: java.lang.ClassCastException: org.apache.http.conn.HttpHostConnectException cannot be cast to com.netflix.zuul.exception.ZuulException
at org.springframework.cloud.netflix.zuul.filters.post.SendErrorFilter.findZuulException(SendErrorFilter.java:104) ~[spring-cloud-netflix-zuul-2.0.0.RELEASE.jar:2.0.0.RELEASE]
at org.springframework.cloud.netflix.zuul.filters.post.SendErrorFilter.run(SendErrorFilter.java:73) ~[spring-cloud-netflix-zuul-2.0.0.RELEASE.jar:2.0.0.RELEASE]
at com.netflix.zuul.ZuulFilter.runFilter(ZuulFilter.java:117) ~[zuul-core-1.3.1.jar:1.3.1]
at com.netflix.zuul.FilterProcessor.processZuulFilter(FilterProcessor.java:193) ~[zuul-core-1.3.1.jar:1.3.1]
... 97 common frames omitted

4.3章,解决feign第一次调用失败的问题

我并没有看过书籍,我在这里说出我的疑问:

FeignAutoConfiguration的源代码中,明确指出

	// the following configuration is for alternate feign clients if
	// ribbon is not on the class path.
	// see corresponding configurations in FeignRibbonClientAutoConfiguration
	// for load balanced ribbon clients.
	@Configuration
	@ConditionalOnClass(ApacheHttpClient.class)
	@ConditionalOnMissingClass("com.netflix.loadbalancer.ILoadBalancer")
	@ConditionalOnProperty(value = "feign.httpclient.enabled", matchIfMissing = true)
	protected static class HttpClientFeignConfiguration {

		@Autowired(required = false)
		private HttpClient httpClient;

		@Bean
		@ConditionalOnMissingBean(Client.class)
		public Client feignClient() {
			if (this.httpClient != null) {
				return new ApacheHttpClient(this.httpClient);
			}
			return new ApacheHttpClient();
		}
	}	

    @Configuration
	@ConditionalOnClass(OkHttpClient.class)
	@ConditionalOnMissingClass("com.netflix.loadbalancer.ILoadBalancer")
	@ConditionalOnProperty(value = "feign.okhttp.enabled", matchIfMissing = true)
	protected static class OkHttpFeignConfiguration {

		@Autowired(required = false)
		private okhttp3.OkHttpClient okHttpClient;

		@Bean
		@ConditionalOnMissingBean(Client.class)
		public Client feignClient() {
			if (this.okHttpClient != null) {
				return new OkHttpClient(this.okHttpClient);
			}
			return new OkHttpClient();
		}
	}
  1. 首先,cloud代码中先是使用的是httpClient,但是在下面的代码有又有只要存在okhttp包,启用okhttp,仔细看咱们的源码,可以看出,咱们引用了okhttp的包,所以是生效的,只要feign.okhttp.enabled=true那么,okhttp就是生效的,咱们的配置文件就没有作用了。
  2. 我们考虑首次为何会失败的问题,查阅代码能找到,feign默认的超时参数是这样的
private final int connectTimeoutMillis;
private final int readTimeoutMillis;

public Options(int connectTimeoutMillis, int readTimeoutMillis) {
  this.connectTimeoutMillis = connectTimeoutMillis;
  this.readTimeoutMillis = readTimeoutMillis;
}

public Options() {
  this(10 * 1000, 60 * 1000);
}

啥意思呢

  1. connectTimeoutMillis连接超时的时间为:10*1000 就是10秒
  2. readTimeoutMillis 读取超时时间为:60*1000 也就是一分钟

那么@SoftwareKing 同学提交的代码是怎么样的呢:

 @Bean
 public okhttp3.OkHttpClient okHttpClient(){
     return new okhttp3.OkHttpClient.Builder()
              //设置连接超时
             .connectTimeout(60, TimeUnit.SECONDS)
             //设置读超时
             .readTimeout(60, TimeUnit.SECONDS)
             //设置写超时
             .writeTimeout(60,TimeUnit.SECONDS)
             //是否自动重连
             .retryOnConnectionFailure(true)
             .connectionPool(new ConnectionPool())
             //构建OkHttpClient对象
             .build();
 }

设置了,一分钟的超时时间,所以就解决了首次超时的问题。

为何10秒钟连接不到服务或者响应不会来呢,想必书籍里面应该已经提及到了,我就不就阐述了

swagger与gateway整合一章

书中的案例 通过定义一个filter 将X-Forwarded-Prefix添加到header中 但是实际发现greenwich版本中 这个header被gateway自动添加进去了 这种情况下发现swagger取api-docs的时候baseUrl有错误 这个是否是书中老版本的原因

第12章-勘误列表汇总

apollo配置zuul 配置下发问题更正

1、对于12章中的zuul 网关配置更新下发,图12-48 多了一个等号, 正确的配图如下:
wechatimg59

2、兼容apollo发布版, 案例配置文件中添加一个meta 的地址, 具体如下所示:

apollo:
  bootstrap:
    enabled: true
    namespaces: application
  meta: http://localhost:8080

推荐看案例源代码配置项;

oauth2-zull疑问

image
这个zuul和oauth2整合权限登陆后报了这个错误,我用的cloud版本是Greenwich.M3,这个怎么处理,有大佬遇到过吗,谢谢

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.