Spring Cloud 技术栈 一张图

Java
156
0
0
2024-07-26
标签   SpringCloud
spring cloud: 大话spring cloud

https://smile.blog.csdn.net/article/details/71077213

Spring Cloud是一个基于Spring Boot实现的云应用开发工具,它为基于JVM的云应用开发中的配置管理、服务发现、断路器、智能路由、 微代理、控制总线、全局锁、决策竞选、分布式会话和集群状态管理等操作提供了一种简单的开发方式 pring Cloud也不是没有缺点,小型独立的项目不适合使用,另外对分布式事物的支持暂时也没有。

小弟有:Spring Cloud Config、Spring Cloud Netflix(Eureka、Hystrix、Zuul、Archaius…)、Spring Cloud Bus、 Spring Cloud for Cloud Foundry、Spring Cloud Cluster、Spring Cloud Consul、Spring Cloud Security、Spring Cloud Sleuth、 Spring Cloud Data Flow、Spring Cloud Stream、Spring Cloud Task、Spring Cloud Zookeeper、Spring Cloud Connectors、 Spring Cloud Starters、Spring Cloud CLI

Spring Cloud Netflix(Eureka, Hystrix, Zuul, Archaiu)

spring cloud:dubbo

https://smile.blog.csdn.net/article/details/78578787

spring cloud: 三部曲

架构演进https://smile.blog.csdn.net/article/details/78431130 单体架构,垂直架构,服务化架构,微服务架构

其中Eureka负责服务的注册与发现,很好将各服务连接起来 Hystrix 负责监控服务之间的调用情况,连续多次失败进行熔断保护。 Hystrix dashboard,Turbine 负责监控 Hystrix的熔断情况,并给予图形化的展示 Spring Cloud Config 提供了统一的配置中心服务 当配置文件发生变化的时候,Spring Cloud Bus 负责通知各服务去获取最新的配置信息 所有对外的请求和服务,我们都通过Zuul来进行转发,起到API网关的作用 最后我们使用Sleuth+Zipkin将所有的请求数据记录下来,方便我们进行后续分析

中小公司是否适用 https://smile.blog.csdn.net/article/details/77940939 1、外部或者内部的非Spring Cloud项目都统一通过API网关(Zuul)来访问内部服务. 2、网关接收到请求后,从注册中心(Eureka)获取可用服务 3、由Ribbon进行均衡负载后,分发到后端的具体实例 4、微服务之间通过Feign进行通信处理业务 5、Hystrix负责处理服务超时熔断 6、Turbine监控服务间的调用和熔断相关指标

经验及教训https://smile.blog.csdn.net/article/details/78279922

Spring Cloud体系介绍 1、Spring Cloud Config 配置中心,利用git集中管理程序的配置。 2、Spring Cloud Netflix 集成众多Netflix的开源软件 3、Spring Cloud Bus 消息总线,利用分布式消息将服务和服务实例连接在一起,用于在一个集群中传播状态的变化 4、Spring Cloud for Cloud Foundry 利用Pivotal Cloudfoundry集成你的应用程序 5、Spring Cloud Cloud Foundry Service Broker 为建立管理云托管服务的服务代理提供了一个起点。 6、Spring Cloud Cluster 基于Zookeeper, Redis, Hazelcast, Consul实现的领导选举和平民状态模式的抽象和实现。 7、Spring Cloud Consul 基于Hashicorp Consul实现的服务发现和配置管理。 8、Spring Cloud Security 在Zuul代理中为OAuth2 rest客户端和认证头转发提供负载均衡 9、Spring Cloud Sleuth SpringCloud应用的分布式追踪系统,和Zipkin,HTrace,ELK兼容。 10、Spring Cloud Data Flow 一个云本地程序和操作模型,组成数据微服务在一个结构化的平台上。 11、Spring Cloud Stream 基于Redis,Rabbit,Kafka实现的消息微服务,简单声明模型用以在Spring Cloud应用中收发消息。 12、Spring Cloud Stream App Starters 基于Spring Boot为外部系统提供spring的集成 13、Spring Cloud Task 短生命周期的微服务,为SpringBooot应用简单声明添加功能和非功能特性。 14、Spring Cloud Task App Starters 15、Spring Cloud Zookeeper 服务发现和配置管理基于Apache Zookeeper。 16、Spring Cloud for Amazon Web Services 快速和亚马逊网络服务集成。 17、Spring Cloud Connectors 便于PaaS应用在各种平台上连接到后端像数据库和消息经纪服务。 18、Spring Cloud Starters (项目已经终止并且在Angel.SR2后的版本和其他项目合并) 19、Spring Cloud CLI 插件用Groovy快速的创建Spring Cloud组件应用。

架构演化的步骤 在确定使用Spring Boot/Cloud这套技术栈进行微服务改造之前,先梳理平台的服务,对不同的服务进行分类,以确认演化的节奏。 先让团队熟悉Spring Boot技术,并且优先在基础服务上进行技术改造,推动改动后的项目投产上线 当团队熟悉Spring Boot之后,再推进使用Spring Cloud对原有的项目进行改造。 在进行微服务改造过程中,优先应用于新业务系统,前期可以只是少量的项目进行了微服务化改造,随着大家对技术的熟悉度增加,可以加快加大微服务改造的范围 传统项目和微服务项目共存是一个很常见的情况,除非公司业务有大的变化,不建议直接迁移核心项目。

服务拆分原则 服务内部高内聚,服务之间低耦合 横向拆分:按照不同的业务域进行拆分 纵向拆分:把一个业务功能里的不同模块或者组件进行拆分

数据库的挑战 三种方案

spring cloud:eureka 注册中心

https://smile.blog.csdn.net/article/details/72085662

服务注册中心、服务提供者、服务消费者

//服务注册中心

           <groupId>org.springframework.cloud</groupId>
           <artifactId>spring-cloud-starter</artifactId>
       </dependency>
       <dependency>
           <groupId>org.springframework.cloud</groupId>
           <artifactId>spring-cloud-starter-eureka-server</artifactId>
       </dependency>

spring.application.name=spring-cloud-eureka

server.port=8000
eureka.client.register-with-eureka=false
eureka.client.fetch-registry=false

eureka.client.serviceUrl.defaultZone=http://localhost:${server.port}/eureka/

注册中心-集群:双节点注册中心,生产环境至少三节点 配置eureka.client.serviceUrl.defaultZone= “”

spring cloud:生产者/消费者

https://smile.blog.csdn.net/article/details/72235670

//生产者

           <groupId>org.springframework.cloud</groupId>
           <artifactId>spring-cloud-starter-eureka</artifactId>
       </dependency>

spring.application.name=spring-cloud-producer
server.port=9000
eureka.client.serviceUrl.defaultZone=http://localhost:8000/eureka/

@EnableDiscoveryClient

//消费者

<dependency>
           <groupId>org.springframework.cloud</groupId>
           <artifactId>spring-cloud-starter-eureka</artifactId>
       </dependency>

@EnableDiscoveryClient
@EnableFeignClients

@FeignClient(name= "spring-cloud-producer")
public interface HelloRemote {
    @RequestMapping(value = "/hello")
    public String hello(@RequestParam(value = "name") String name);
}
spring cloud:Hystrix 熔断器

https://smile.blog.csdn.net/article/details/72418097

熔断器就是保护服务高可用的最后一道防线 熔断器机制, fallback , 熔断只是作用在服务调用这一端

feign.hystrix.enabled=true  

//创建回调方法
@Component
public class HelloRemoteHystrix implements HelloRemote{

    @Override
    public String hello(@RequestParam(value = "name") String name) {
        return "hello" +name+", this messge send failed ";
    }
}

//指定回调类
@FeignClient(name= "spring-cloud-producer",fallback = HelloRemoteHystrix.class)
public interface HelloRemote {

    @RequestMapping(value = "/hello")
    public String hello(@RequestParam(value = "name") String name);

}
spring cloud: Hystrix Dashboard 和Turbine 熔断监控

https://smile.blog.csdn.net/article/details/72625646

用Hystrix Dashboard的话, 你只能看到单个应用内的服务信息, 这明显不够. 我们需要一个工具能让我们汇总系统内多个服务的数据并显示到Hystrix Dashboard上, 这个工具就是 Turbine

//Hystrix Dashboard

       <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>

@EnableHystrixDashboard
@EnableCircuitBreaker

//Turbine

       <dependency>
           <groupId>org.springframework.cloud</groupId>
           <artifactId>spring-cloud-starter-turbine</artifactId>
       </dependency>
       <dependency>
           <groupId>org.springframework.cloud</groupId>
           <artifactId>spring-cloud-netflix-turbine</artifactId>
       </dependency>
       <dependency>
           <groupId>org.springframework.boot</groupId>
           <artifactId>spring-boot-starter-actuator</artifactId>
       </dependency>
       <dependency>
           <groupId>org.springframework.cloud</groupId>
           <artifactId>spring-cloud-starter-hystrix-dashboard</artifactId>
       </dependency>
   </dependencies>

spring.application.name=hystrix-dashboard-turbine
server.port=8001
turbine.appConfig=node01,node02
turbine.aggregator.clusterConfig= default
turbine.clusterNameExpression= new String("default")

eureka.client.serviceUrl.defaultZone=http://localhost:8000/eureka/

@EnableHystrixDashboard
@EnableTurbine
spring cloud:config 配置中心

https://smile.blog.csdn.net/article/details/72636773

市面上的开源方案:360的QConf、淘宝的diamond、百度的discon, 本案例采用 spring cloud config spring cloud config: 只支持Client服务启动时拉去配置信息,不支持Client服务在已启动情况下更新配置文件 支持svn,git

核心能力 提供服务端和客户端支持 集中管理各环境的配置文件 配置文件修改之后,可以快速的生效 可以进行版本管理 支持大的并发查询 支持各种语言

//server

<dependencies>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-config-server</artifactId>
    </dependency>
</dependencies>

server:
  port: 8040
spring:
  application:
    name: spring-cloud-config-server
  cloud:
    config:
      server:
        git:
          uri: https://github.com/ityouknow/spring-cloud-starter/     # 配置git仓库的地址
          search-paths: config-repo                             # git仓库地址下的相对地址,可以配置多个,用,分割。
          username:                                             # git仓库的账号
          password:                                             # git仓库的密码

@EnableConfigServer

//client

<dependencies>
       <dependency>
           <groupId>org.springframework.cloud</groupId>
           <artifactId>spring-cloud-starter-config</artifactId>
       </dependency>
       <dependency>
           <groupId>org.springframework.boot</groupId>
           <artifactId>spring-boot-starter-web</artifactId>
       </dependency>
       <dependency>
           <groupId>org.springframework.boot</groupId>
           <artifactId>spring-boot-starter-test</artifactId>
           <scope>test</scope>
       </dependency>
   </dependencies>

//bootstrap.perperties
spring.cloud.config.name=neo-config
spring.cloud.config.profile=dev
spring.cloud.config.uri=http://localhost:8001/
spring.cloud.config.label=master
spring cloud:config refresh

https://smile.blog.csdn.net/article/details/72763310 //svn配置

<dependencies>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-config-server</artifactId>
    </dependency>
    <dependency>
        <groupId>org.tmatesoft.svnkit</groupId>
        <artifactId>svnkit</artifactId>
    </dependency>
</dependencies>

server:
  port: 8001

spring:
  cloud:
    config:
      server:
        svn:
          uri: http://192.168.0.6/svn/repo/config-repo
          username: username
          password: password
        default-label: trunk
  profiles:
    active: subversion
  application:
    name: spring-cloud-config-server

//client refresh

     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-actuator</artifactId>
   </dependency>

@RestController
@RefreshScope // 使用该注解的类,会在接到SpringCloud配置中心配置刷新的时候,自动将新的配置更新到该类对应的字段中。
class HelloController {

    @Value("${neo.hello}")
    private String hello;

    @RequestMapping("/hello")
    public String from() {
        return this.hello;
    }
}

//需要client主动刷新变量,调用 /refresh 

//webhook 监控github,执行刷新操作 需要配置事件类型,回调地址 webhook监控svn/git 的event 事件类型(push,create,delete), 然后出发调用/refresh 地址 缺点:不够优雅,每每新增服务,都需要配置webhook

spring cloud:config 配置中心服务化及高可用

https://smile.blog.csdn.net/article/details/72817791

//server

       <dependency>
           <groupId>org.springframework.cloud</groupId>
           <artifactId>spring-cloud-config-server</artifactId>
       </dependency>
       <dependency>
           <groupId>org.springframework.cloud</groupId>
           <artifactId>spring-cloud-starter-eureka</artifactId>
       </dependency>
   </dependencies>

server:
server:
  port: 8001
spring:
  application:
    name: spring-cloud-config-server
  cloud:
    config:
      server:
        git:
          uri: https://github.com/ityouknow/spring-cloud-starter/     # 配置git仓库的地址
          search-paths: config-repo                             # git仓库地址下的相对地址,可以配置多个,用,分割。
          username: username                                        # git仓库的账号
          password: password                                    # git仓库的密码
eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:8000/eureka/   ## 注册中心eurka地址

server:
server:
  port: 8001
spring:
  application:
    name: spring-cloud-config-server
  cloud:
    config:
      server:
        git:
          uri: https://github.com/ityouknow/spring-cloud-starter/     # 配置git仓库的地址
          search-paths: config-repo                             # git仓库地址下的相对地址,可以配置多个,用,分割。
          username: username                                        # git仓库的账号
          password: password                                    # git仓库的密码
eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:8000/eureka/   ## 注册中心eurka地址

@EnableDiscoveryClient
@EnableConfigServer

//client

       <dependency>
           <groupId>org.springframework.cloud</groupId>
           <artifactId>spring-cloud-starter-config</artifactId>
       </dependency>
       <dependency>
           <groupId>org.springframework.boot</groupId>
           <artifactId>spring-boot-starter-web</artifactId>
       </dependency>
       <dependency>
           <groupId>org.springframework.cloud</groupId>
           <artifactId>spring-cloud-starter-eureka</artifactId>
       </dependency>
       <dependency>
           <groupId>org.springframework.boot</groupId>
           <artifactId>spring-boot-starter-test</artifactId>
           <scope>test</scope>
       </dependency>
   </dependencies>

//bootstrap.properties 
spring.cloud.config.name=neo-config
spring.cloud.config.profile=dev
spring.cloud.config.label=master
spring.cloud.config.discovery.enabled=true
spring.cloud.config.discovery.serviceId=spring-cloud-config-server
eureka.client.serviceUrl.defaultZone=http://localhost:8000/eureka/

//config 高可用 config server 多节点部署,修改端口号,部署并测试通过

spring cloud:config 配置中心和bus 消息总线

https://smile.blog.csdn.net/article/details/72841460

Spring cloud bus通过轻量消息代理连接各个分布的节点。这会用在广播状态的变化(例如配置变化)或者其他的消息指令。 Spring bus的一个核心思想是通过分布式的启动器对spring boot应用进行扩展,也可以用来建立一个多个应用之间的通信频道。目前唯一实现的方式是用AMQP消息代理作为通道

Spring cloud bus被国内很多都翻译为消息总线,也挺形象的。大家可以将它理解为管理和传播所有分布式项目中的消息既可, 其实本质是利用了MQ的广播机制在分布式的系统中传播消息,目前常用的有Kafka和RabbitMQ。利用bus的机制可以做很多的事情,其中配置中心客户端刷新就是典型的应用场景之一

spring cloud bus 配置更新步骤 1、提交代码触发post给客户端A发送bus/refresh 2、客户端A接收到请求从Server端更新配置并且发送给Spring Cloud Bus 3、Spring Cloud bus接到消息并通知给其它客户端 4、其它客户端接收到通知,请求Server端获取最新配置 5、全部客户端均获取到最新的配置

       <groupId>org.springframework.cloud</groupId>
       <artifactId>spring-cloud-starter-bus-amqp</artifactId>
   </dependency>

## 刷新时,关闭安全验证
management.security.enabled=false
## 开启消息跟踪
spring.cloud.bus.trace.enabled=true

spring.rabbitmq.host=192.168.9.89
spring.rabbitmq.port=5672
spring.rabbitmq.username=admin
spring.rabbitmq.password=123456

//优化 Spring Cloud Bus做配置更新步骤如下:

1、提交代码触发post请求给bus/refresh 2、server端接收到请求并发送给Spring Cloud Bus 3、Spring Cloud bus接到消息并通知给其它客户端 4、其它客户端接收到通知,请求Server端获取最新配置 5、全部客户端均获取到最新的配置

//server

       <dependency>
           <groupId>org.springframework.cloud</groupId>
           <artifactId>spring-cloud-config-server</artifactId>
       </dependency>
       <dependency>
           <groupId>org.springframework.cloud</groupId>
           <artifactId>spring-cloud-starter-bus-amqp</artifactId>
       </dependency>
       <dependency>
           <groupId>org.springframework.cloud</groupId>
           <artifactId>spring-cloud-starter-eureka</artifactId>
       </dependency>
   </dependencies>

server:
  port: 8001
spring:
  application:
    name: spring-cloud-config-server
  cloud:
    config:
      server:
        git:
          uri: https://github.com/ityouknow/spring-cloud-starter/     # 配置git仓库的地址
          search-paths: config-repo                             # git仓库地址下的相对地址,可以配置多个,用,分割。
          username: username                                        # git仓库的账号
          password: password                                    # git仓库的密码
  rabbitmq:
    host: 192.168.0.6
    port: 5672
    username: admin
    password: 123456

eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:8000/eureka/   ## 注册中心eurka地址


management:
  security:
     enabled: false

其他 部分服务更新,跟踪总线事件

spring cloud:zuul 网关

https://smile.blog.csdn.net/article/details/72865480

在微服务架构中,后端服务往往不直接开放给调用端,而是通过一个API网关根据请求的url,路由到相应的服务。 当添加API网关后,在第三方调用端和服务提供方之间就创建了一面墙,这面墙直接与调用方通信进行权限控制,后将请求均衡分发给后台服务端。

Spring Cloud Zuul路由是微服务架构的不可或缺的一部分,提供动态路由,监控,弹性,安全等的边缘服务。Zuul是Netflix出品的一个基于JVM路由和服务端的负载均衡器

网关与注册中心的关系 网关最好也注册到注册中心,这样在进行访问服务路由的时候,可以直接通过服务名称 进行访问发现,不然还需指定服务域名或IP,可扩展性不好

启动顺序 1.注册中心 2.配置中心 3.业务服务 4.网关服务

网关作用 1.简化客户端调用复杂度, 执行相关的认证授权,简化服务之间的相互调用 2.简化客户端调用复杂度, 数据裁剪,逻辑聚合 3.多渠道支持

       <groupId>org.springframework.cloud</groupId>
       <artifactId>spring-cloud-starter-zuul</artifactId>
   </dependency>

spring.application.name=gateway-service-zuul
server.port=8888

#这里的配置表示,访问/it/** 直接重定向到http://www.ityouknow.com/**
zuul.routes.baidu.path=/it/**
zuul.routes.baidu.url=http://www.ityouknow.com/

@EnableZuulProxy

服务化 网关注册进eureka

//增加eureka 
<dependency>
       <groupId>org.springframework.cloud</groupId>
       <artifactId>spring-cloud-starter-eureka</artifactId>
   </dependency>

spring.application.name=gateway-service-zuul
server.port=8888

zuul.routes.api-a.path=/producer/**
zuul.routes.api-a.serviceId=spring-cloud-producer

eureka.client.serviceUrl.defaultZone=http://localhost:8000/eureka/

zuul默认的路由规则 Zuul的路由规则如下:http://ZUUL_HOST:ZUUL_PORT/微服务在Eureka上的serviceId/**会被转发到serviceId对应的微服务

//注销
#zuul.routes.api-a.path=/producer/**
#zuul.routes.api-a.serviceId=spring-cloud-producer
spring cloud:Sleuth和Zipkin 分布式链路跟踪

https://smile.blog.csdn.net/article/details/79235027

链路跟踪核心能力 数据收集、数据存储和数据展示 数据存储可分为实时数据和全量数据两部分,实时数据用于故障排查(troubleshooting),全量数据用于系统优化 数据收集除了支持平台无关和开发语言无关系统的数据收集,还包括异步数据收集(需要跟踪队列中的消息,保证调用的连贯性),以及确保更小的侵入性 数据展示又涉及到数据挖掘和分析

概念 trace: 一个请求记录的完整执行流程 span: 每个服务处理请求时,都对生成一个span

若干个span生成一个trace

Spring Cloud Sleuth为服务之间调用提供链路追踪。通过Sleuth可以很清楚的了解到一个服务请求经过了哪些服务,每个服务处理花费了多长

Sleuth能力 耗时分析: 通过Sleuth可以很方便的了解到每个采样请求的耗时,从而分析出哪些服务调用比较耗时; 可视化错误: 对于程序未捕捉的异常,可以通过集成Zipkin服务界面上看到; 链路优化: 对于调用比较频繁的服务,可以针对这些服务实施一些优化措施。

spring cloud sleuth可以结合zipkin,将信息发送到zipkin,利用zipkin的存储来存储信息,利用zipkin ui来展示数据

Zipkin 是一个开放源代码分布式的跟踪系统,它致力于收集服务的定时数据,以解决微服务架构中的延迟问题,包括数据的收集、存储、查找和展现 每个服务向zipkin报告计时数据,zipkin会根据调用关系通过Zipkin UI生成依赖关系图,显示了多少跟踪请求通过每个服务, 该系统让开发者可通过一个 Web 前端轻松的收集和分析数据,例如用户每次请求服务的处理时间等,可方便的监测系统中存在的瓶颈

Zipkin提供了可插拔数据存储方式:In-Memory、MySql、Cassandra以及Elasticsearch。 接下来的测试为方便直接采用In-Memory方式进行存储,生产推荐Elasticsearch。

zipkin-server

       <dependency>
           <groupId>org.springframework.cloud</groupId>
           <artifactId>spring-cloud-starter-eureka</artifactId>
       </dependency>
       <dependency>
           <groupId>io.zipkin.java</groupId>
           <artifactId>zipkin-server</artifactId>
       </dependency>
       <dependency>
           <groupId>io.zipkin.java</groupId>
           <artifactId>zipkin-autoconfigure-ui</artifactId>
       </dependency>
   </dependencies>

@EnableEurekaClient
@EnableZipkinServer

zipkin-client 包括zuul,业务服务

       <groupId>org.springframework.cloud</groupId>
       <artifactId>spring-cloud-starter-zipkin</artifactId>
   </dependency>

spring:
  zipkin:
    base-url: http://localhost:9000
  sleuth:
    sampler:
      percentage: 1.0
spring cloud:consul 注册中心

http://www.ityouknow.com/springcloud/2018/07/20/spring-cloud-consul.html

特性 服务发现,健康检查,Key/Value 存储,多数据中心

consul强一致性,选举期间consul不可用,选举算法为 raft eureka高可用性和最终一致性,服务注册相对较快,选举算法为paxos

//1.consul安装,类似nacos

//2.consul client producer

<dependency>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-actuator</artifactId>
	</dependency>
	<dependency>
		<groupId>org.springframework.cloud</groupId>
		<artifactId>spring-cloud-starter-consul-discovery</artifactId>
	</dependency>

spring.cloud.consul.host=localhost
spring.cloud.consul.port=8500
#注册到consul的服务名称
spring.cloud.consul.discovery.serviceName=service-producer

@EnableDiscoveryClient 

//3.consul client consumer 配置同producer 类似

//ServiceController  
@RestController
public class ServiceController {

    @Autowired
    private LoadBalancerClient loadBalancer;
    @Autowired
    private DiscoveryClient discoveryClient;

   /**
     * 获取所有服务
     */
    @RequestMapping("/services")
    public Object services() {
        return discoveryClient.getInstances("service-producer");
    }

    /**
     * 从所有服务中选择一个服务(轮询)
     */
    @RequestMapping("/discover")
    public Object discover() {
        return loadBalancer.choose("service-producer").getUri().toString();
    }
}

//CallHelloController 
@RestController
public class CallHelloController {

    @Autowired
    private LoadBalancerClient loadBalancer;

    @RequestMapping("/call")
    public String call() {
        ServiceInstance serviceInstance = loadBalancer.choose("service-producer");
        System.out.println("服务地址:" + serviceInstance.getUri());
        System.out.println("服务名称:" + serviceInstance.getServiceId());

        String callServiceResult = new RestTemplate().getForObject(serviceInstance.getUri().toString() + "/hello", String.class);
        System.out.println(callServiceResult);
        return callServiceResult;
    }

}
spring cloud:开源项目

http://www.ityouknow.com/springcloud/2018/08/06/spring-cloud-open-source.html

1.awesome-spring-cloud Spring Cloud 中文索引 http://springcloud.fun/ 2.PiggyMetrics 个人财务系统 包含认证授权,可以学习 ***** 3.spaascloud-master 商城+运营平台 基于RBAC、jwt和oauth2 ***** 4.Cloud-Admin 基于Spring Cloud微服务化开发平台 统一授权、认证后台管理系统,可以学习 ***** 5.spring-cloud-rest-tcc 柔性事务和EDA事件驱动示例 分布式事务学习 ***** 6.pig 基于Spring Cloud、oAuth2.0开发,基于Vue前后分离的开发平台,支持账号、短信、SSO等多种登录 ***** 7.xxpay-master 聚合支付 8.spring-boot-cloud 服务项目 9.FCat 企业级基础功能框架 10.spring-cloud-examples Spring Cloud 技术栈示例代码

spring cloud:gateway

http://www.ityouknow.com/springcloud/2018/12/12/spring-cloud-gateway-start.html

Zuul(1.x) 基于 Servlet,使用阻塞 API,它不支持任何长连接,如 WebSockets Spring Cloud Gateway 使用非阻塞 API,支持 WebSockets,支持限流等新特性

基于 Spring 5.0,Spring Boot 2.0 和 Project Reactor 等技术开发的网关,它旨在为微服务架构提供一种简单有效的统一的 API 路由管理方式

Spring Cloud Gateway 的特征 基于 Spring Framework 5,Project Reactor 和 Spring Boot 2.0 动态路由 Predicates 和 Filters 作用于特定路由 集成 Hystrix 断路器 集成 Spring Cloud DiscoveryClient 易于编写的 Predicates 和 Filters 限流 路径重写

   			<groupId>org.springframework.cloud</groupId>
   			<artifactId>spring-cloud-dependencies</artifactId>
   			<version>Finchley.SR2</version>
   			<type>pom</type>
   			<scope>import</scope>
   		</dependency>

<dependency>
	<groupId>org.springframework.cloud</groupId>
	<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>

server:
  port: 8080
spring:
  cloud:
    gateway:
      routes:
      - id: neo_route
        uri: http://www.ityouknow.com
        predicates:
        - Path=/spring-cloud
spring cloud:gateway 服务化及过滤器

http://www.ityouknow.com/springcloud/2019/01/19/spring-cloud-gateway-service.html

Spring Cloud Gateway 提供了一种默认转发的能力, 只要将 Spring Cloud Gateway 注册到服务中心,Spring Cloud Gateway 默认就会代理服务中心的所有服务

访问这些服务的语法为:http://网关地址:端口/服务中心注册 serviceId/具体的url

基于 Filter(过滤器) 实现的高级功能 Spring Cloud Gateway 的 Filter 的生命周期不像 Zuul 的那么丰富,它只有两个:“pre” 和 “post” Spring Cloud Gateway 的 Filter 分为两种:GatewayFilter 与 GlobalFilter。 GlobalFilter 会应用到所有的路由上,而 GatewayFilter 将应用到单个路由或者一个分组的路由上。

Spring Cloud Gateway 内置了9种 GlobalFilter,比如 Netty Routing Filter、LoadBalancerClient Filter、Websocket Routing Filter 等

spring cloud:gateway 熔断、限流、重试

http://www.ityouknow.com/springcloud/2019/01/26/spring-cloud-gateway-limit.html

StripPrefix Filter 是一个请求路径截取的功能,我们可以利用这个功能来做特殊业务的转发。 PrefixPath Filter 的作用和 StripPrefix 正相反,是在 URL 路径前面添加一部分的前缀

限速路由器 限速在高并发场景中比较常用的手段之一,可以有效的保障服务的整体稳定性,Spring Cloud Gateway 提供了基于 Redis 的限流方案。 所以我们首先需要添加对应的依赖包spring-boot-starter-data-redis-reactive

     <groupId>org.springframework.cloud</groupId>
     <artifactId>spring-boot-starter-data-redis-reactive</artifactId>
   </dependency>

spring:
  application:
    name: cloud-gateway-eureka
  redis:
    host: localhost
    password:
    port: 6379
  cloud:
    gateway:
     discovery:
        locator:
         enabled: true
     routes:
     - id: requestratelimiter_route
       uri: http://example.org
       filters:
       - name: RequestRateLimiter
         args:
           redis-rate-limiter.replenishRate: 10
           redis-rate-limiter.burstCapacity: 20
           key-resolver: "#{@userKeyResolver}"
       predicates:
         - Method=GET

//根据请求参数中的 user 字段来限流
public class Config {

    @Bean
    KeyResolver userKeyResolver() {
        return exchange -> Mono.just(exchange.getRequest().getQueryParams().getFirst("user"));
    }
}

//也可以设置根据请求 IP 地址来限流
@Bean
public KeyResolver ipKeyResolver() {
    return exchange -> Mono.just(exchange.getRequest().getRemoteAddress().getHostName());
}

熔断路由器

     <groupId>org.springframework.cloud</groupId>
     <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
   </dependency>

spring:
  cloud:
    gateway:
      routes:
      - id: hystrix_route
        uri: http://example.org
        filters:
        - Hystrix=myCommandName

重试路由器 RetryGatewayFilter 是 Spring Cloud Gateway 对请求重试提供的一个 GatewayFilter Factory

     cloud:
       gateway:
         routes:
         - id: retry_test
           uri: lb://spring-cloud-producer
           predicates:
           - Path=/retry
           filters:
           - name: Retry
             args:
               retries: 3
               statuses: BAD_GATEWAY