Spring Cloud:提供了构建分布式系统所需的“全家桶”,比如服务发现、服务网关、服务路由、链路追踪等。
Eureka(优瑞噶)
- 服务治理:可以实现服务调用、负载均衡、容错等,实现服务发现与注册。
- 服务注册与发现:Eureka采用了CS的设计架构,Eureka Server服务端作为服务注册功能的服务器,它是服务注册中心。而系统中的其他微服务,使用Eureka Client客户端连接到Eureka Server服务端并维持心跳的连接。
Consul(康搜)
- Consul是一个服务网格(微服务间的 TCP/IP,负责服务之间的网络调用、限流、熔断和监控)解决方案,它是一个一个分布式的,高度可用的系统,而且开发使用都很简便。
- 它提供了一个功能齐全的控制平面,主要特点是:服务发现、健康检查、键值存储、安全服务通信、多数据中心。
Ribbon(瑞奔)
- 是一个基于HTTP和CP的客户端负载均衡工具,可以让我们轻松地将面向服务的REST模版请求自动转换成客户端负载均衡的服务调用。
Feign(份呢)=
- 是一个声明式WebService客户端,旨在使编写Java Http客户端变得更容易。
- 使用方法是定义一个服务接口然后在上面添加注解,以前是Dao接口上面标准Mapper注解,现在是一个微服务接口上面标注一个Feign注解即。
- FFeign集成了Ribbon,利用Ribbon维护了Payment的服务列表信息,并且通过轮询实现了客户端的负载均衡,而与Ribbon不同的是,通过Feign只需要定义服务绑定接口且一声明式的方法,优雅而简单的实现了服务调用。
Hystrix(嗨撕准课)
- Hystrix是一个用于处理分布式系统的延迟和容错的开源库,在分布式系统里,许多依赖不可避免的会调用失败,比如超时、异常等。
- Hystrix能保证在一个依赖出问题的情况下,不会导致整个服务失败,避免出现级联故障,以提高分布式系统的弹性。
- “断路器”本身是一种开发装置,当某个服务单元发生故障之后,通过断路器的故障监控(类似熔断保险丝),向调用方返回一个符合预期的、可处理的备选响应(FallBack),而不是长时间的等待或者抛出调用方无法处理的异常,这样就保证了服务调用方的线程不会被长时间、不必要地占用,从而避免了故障在分布式系统中的蔓延,乃至雪崩。
Hystrix三大作用:
①服务降级(Fallback):比如当服务器忙,请稍后再试,不让客户端等待并立刻返回一个友好提示,Fallback,会发生降级的几种情况:程序运行异常、超时、服务熔断触发服务降级。
②服务熔断(Break):类比保险丝达到最大服务访问后,直接拒绝访问,拉闸限电,然后调用服务降级的方法并返回友好提示。三个步骤先进行服务的降级、进而熔断、恢复调用链路。
③实时的监控:会持续地记录所有通过Hystrix发起的请求执行信息,并以统计报表和图形的形式展示给用户,包括没秒执行多少成功,多少失败等。
Gateway(给特为)
- 旨在为微服务架构提供一种简单而有效的统一的API路由管理方式。
- 目标是替代ZUUL,其不仅提供统一的路由方式,并且基于Filter链的方式提供了网关基本的功能,例如:安全,监控/埋点,和限流等。
- 作为一个 API 架构,用来保护、增强和控制对于 API 服务的访问。API 网关是一个处于应用程序或服务(提供 REST API 接口服务)之前的系统,用来管理授权、访问控制和流量限制等,这样 REST API 接口服务就被
- API 网关保护起来,对所有的调用者透明。因此,隐藏在 API 网关后面的业务系统就可以专注于创建和管理服务,而不用去处理这些策略性的基础设施。
最重要的几个概念:
Route(路由):这是网关的基本构建块,它由一个ID,一个URI,一组断言和一组过滤器定义。如果断言为真,则路由匹配。
Predicate(断言):输入类类是一个ServerWebExchange。我们可以使用它来匹配来自HTTP请求的任何内容,例如headers。如果请求与断言相匹配则进行路由。
Filter(过滤器):Spring框架中GatewayFilter的实例,使用过滤器,可以在请求被路由前或者后对请求进行修改。
总结经验
a. Eureka 服务端作为服务注册中心,需要声明 @EnableEurekaServer
b. 其他的服务作为单独的服务需要注册在Eureka的注册中心,需要声明 @EnableEurekaClient
c. OrderFeign 作为负载均衡器,不需要作为Eureka的客户端,只需要激活Feign @EnableFeignClients
–>只需要在接口上添加 @FeignClient(name=“mcroservice-payment”)//使用Feign,使用哪个微服务
c. Hystrix 作为断路器,不需要作为Eureka的客户端,只需要激活Hystrix @EnableHystrixDashboard
–>在控制类上添加 @DefaultProperties(defaultFallback = “paymentTimeOutFallbackMethod”)
–>然后再接口上添加 @FeignClient(value = “CLOUD-PROVIDER-HYSTRIX-PAYMENT”,fallback = PaymentFallbackService.class)
d. GateWay 作为网关,需要作为Eureka客户端
spring:
cloud:
gateway:
discovery:
locator:
enabled: true # 开启从注册中心动态创建路由的功能,利用微服务名称j进行路由
routes:
- id: payment_route # 路由的id,没有规定规则但要求唯一,建议配合服务名
#匹配后提供服务的路由地址
#uri: http://localhost:8001
uri: lb://MCROSERVICE-PAYMENT
predicates:
- Path=/payment/get/** # 断言,路径相匹配的进行路由
#- After=2020-11-20T14:17:43.912+08:00[Asia/Shanghai] #断言在当前时间之后才可以访问
- id: payment_route2
#uri: http://localhost:8001
uri: lb://MCROSERVICE-PAYMENT
predicates:
Path=/payment/lb/** #断言,路径相匹配的进行路由
或者通过代码实现
@Bean
public RouteLocator customRouteLocator(RouteLocatorBuilder routeLocatorBuilder){
RouteLocatorBuilder.Builder routes = routeLocatorBuilder.routes();
routes.route("patn_route_buba",r -> r.path("/guonei").uri("http://news.baidu.com/guonei")).build();
return routes.build();
}
Ribbon本地负载均衡与Nginx服务端负载均衡的区别?
- Nginx是服务器的负载均衡,客户端所有的请求都会交给Nginx,然后由Nginx实现转发请求,即负载均衡是由服务端实现的。
- Ribbon本地负载均衡,在调用服务接口的时候,会在注册中心上获取注册信息服务列表之后缓冲到JVM本地,从而在本地实现RPC远程服务调用技术。
LB负载均衡分为哪两种?
- 集中式LB,即在服务的消费方和提供方之间是有独立的LB设施(可以是硬件,如F5,也可以是软件,如Nginx),由该设施负责把访问请求通过某种策略转发至服务的提供方。
- 进程内LB,将LB逻辑集成于消费方,消费方从注册中心获知有哪些地址可用,然后自己再从这些地址中选择出一个 合适的服务器。Ribbon就属于进程内LB,它只是一个类库,集成于消费方进程。
mcroservice:(总项目名)
cloud-api-commons (子项目存放实体类型)
创建一个实体类和返回数据类型
cloud-provide-payment (服务生产者)
- POM文件:表示自己是eureka客户端
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
- application文件:
eureka:
client:
#表示是否将自己注册进eureka 默认为true
register-with-eureka: true
#是否从EurekaServer中抓取已有的注册信息,默认为true,单点无所谓,集群必须设置true才能和ribbon使用负载均衡
fetch-registry: true
service-url:
#defaultZone