/**
* 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:
* ystrix是一个用于处理分布式系统的延迟和容错的开源库,在分布式系统里,许多依赖不可避免的会调用失败,比如超时、异常等。
* 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的实例,使用过滤器,可以在请求被路由前或者后对请求进行修改。
*
* =================总结经验=======================
* Eureka 服务端作为服务注册中心,需要声明 @EnableEurekaServer
* 其他的服务作为单独的服务需要注册在Eureka的注册中心,需要声明 @EnableEurekaClient
* OrderFeign作为负载均衡器,不需要作为Eureka的客户端,只需要激活Feign @EnableFeignClients
只需要在接口上添加 @FeignClient(name="mcroservice-payment")//使用Feign,使用哪个微服务
* Hystrix作为断路器,不需要作为Eureka的客户端,只需要激活Hystrix @EnableHystrixDashboard
* 在控制类上添加 @DefaultProperties(defaultFallback = "paymentTimeOutFallbackMethod")
* 然后再接口上添加 @FeignClient(value = "CLOUD-PROVIDER-HYSTRIX-PAYMENT",fallback = PaymentFallbackService.class)
* GateWay作为网关,需要作为Eureka客户端
* 通过application配置文件配置,
* 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: http://localhost:7001/eureka #单机配置
defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka #集群配置
启动类上增加注解:@EnableEurekaClient
//===================================================
Eureka实现服务发现://注入服务发现的注解
@Autowired
private DiscoveryClient discoveryClient;
在启动类上加上注解@EnableDiscoveryClient
/* cloud-consumer-order */
服务消费者:
使用@Configuration创建一个配置类注入到IOC容器中,创建一个使用RestTemplate访问远程http服务的方法,配合@Bean加载到容器中,
方法上加@LoadBalanced表示开启负载均衡
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: http://localhost:7001/eureka #单机配置
defaultZone: http://eureka7001.com:7001/eureka
SpringCloud项目实战整理及详细代码
最新推荐文章于 2025-03-13 16:14:59 发布