springCloud
1.它分布式服务的技术栈(全家桶),
即提供分布式服务的相关技术模块,比如配置中心、服务注册与发现、微服务间调用、负载均衡、熔断、路由网关、安全等
2.与Dubbo对比:Dubbo专注与RPC框架,其它的分布式技术需要依赖第三方技术,来组装出一个分布式架构。
而springCloud是一站式服务,提供了所有分布式架构需要的技术,不用依赖其它第三方技术,所以各组件间的兼容性很好。各微服务之间通过http等简单协议调用。
3.服务注册与发现(Eureka)
Eureka的自我保护机制:
在短时间内大量微服务没有心跳链接,会开启保护模式,不会立即删除注册表中没有心跳的微服务。当心跳回到阀值时,自动关闭保护模式。
服务注册中心:所有的微服务集群都可以是它的客户端,来注册和订阅。
启动一个springBoot应用,需要依赖spring-cloud-starter-eureka-server组件,无需编写其它代码。
并将主启动类标识@EnableEurekaServer。在yml配置文件中配置自己的访问地址等信息。
服务注册:
依赖spring-cloud-starter-config
启动一个springBoot应用,需要依赖spring-cloud-starter-eureka和spring-cloud-starter-config组件。
并将主启动类标识@EnableEurekaClient。在yml配置文件中指定注册中心的访问地址等信息。
这样本服务启动后会自动注册进eureka服务注册中心中。
服务发现:
@EnableDiscoveryClient 本应用的主启动类上添加此注解表示:服务发现。
进而可以在所有bean中使用DiscoveryClient接口来访问Eureka.
或结合RestTemplate来访问Restful风格的http服务。
Eureka集群:
各Eureka相互知晓。每个客户端要知晓所有Ereka,类似RocketMQ的NameServer。
与Zookeeper比较:
有自我保护机制。没有主从概念。
Zookeeper出现网络故障时会花30-120s来选举新master,而导致注册中心不可用,可用性不好。
4.负载均衡(Ribbon、Feign)
科普:将用户请求平摊的分配到多个服务。
负载均衡分两种:
1、集中式:在服务的消费方和提供方之间使用独立的LB设施(可以是硬件,如F5,也可以是软件,如Nginx、LVS),由该设施负责把请求通过某种策略转发至服务的提供方。
2、进程内:将LB逻辑集成到消费方(如dubbo、Ribbon),消费方从服务注册中心获知有哪些地址可用,然后自己从这些地址中选择出一个合适的服务器。
Ribbon:
构建过程:依赖Eureka
客户端首先引入Eureka客户端组件,再在RestTemplate的bean上加@LoadBalanced注解,就可以用微服务的名称来从Eureka集群中获取服务列表,进而选出一台服务器。
核心组件:IRule根据特定算法从服务列表中选取一个要访问的服务。自带7种均衡策略。默认轮询。
修改默认策略:向容器中注册一个IRule的bean,这样ribbon就会使用用户自己的策略来覆盖默认策略。
自定义策略:
在主启动类上加@RibbonClient(name="服务名", configuration=XxxRuler.class),从而在启动服务的时候就能去加载自定义的Ribbon配置类。
代码中向容器注入自己的XxxRuler的bean.
架构图:
Eureka集群
/ \
消费端(ribbon) ----- 服务提供集群
Feign:
Feign集成了Ribbon.同样默认使用轮询策略实现客户端负载均衡。Feign=Ribbon+RestTemplate.
在Eureka和ribbon的基础上,把restful风格的http接口包装成接口的形式便于客户端使用。
使用步骤:
1.主启动类添加@EnableFeignClients注解。并用@ComponentScan("包路径")来扫描到步骤2定义的接口。
2.新建一个跟服务端相似的接口类,再用@FeignClient注解标识,从而在启动时向容器中注入实现此接口的bean,后续就可以方便从容器中获取并使用。
5.短路器(Hystrix)
功能:服务降级、服务熔断、服务限流、接近实时的监控
服务端服务熔断步骤:
1.主启动类添加@EnableCircuitBreaker注解。
2.在@RequestMapping处增加@HystrixCommand(fallbackMethod="方法名"),新建一个出入参相同的类似方法,以便在原方法抛出异常时代替原方法。
3.默认每次原方法抛出异常都会触发熔断。
客户端服务降级步骤:
科普:整体资源快不够了,忍痛将某些服务先关掉,待度过难关,再开启回来。它依赖Feign。
步骤:
1.新建一个FallbackFactory接口的实现类,重写create方法。
2.在@FeignClient注解中加fallbackFactory属性值。例如:@FeignClient(value="", fallbackFactory=xxxFallbackFactory.class)
3.开启Feign对Hystrix的支持。在yml配置文件中配置feign.hystrix.enabled: true
6.路由网关(zuul)
科普:路由和过滤的作用。也是一个微服务集群,也需要注册到Eureka中。可以设置统一的访问入口。所有服务都可以通过它来间接访问。
使用步骤:
1.添加Eureka和Zuu的maven依赖。
2.主启动类上添加@EnableZuulProxy注解,无需@EnableDiscoveryClient注解。
3.配置Eureka的相关配置信息。
4.使用http://路由网关的ip+port/要请求的微服务名称/原微服务访问地址
5.还可以将“微服务名称”进行映射。
7.配置中心(Config)
科普:它是一个类似于Eureka的服务,有服务端和客户端。每个微服务作为客户端,spring-config作为服务端,它来监控远程配置中心的配置文件是否发生变化。
远程配置中心默认采用git来存储配置信息,这样有助于对环境配置进行版本管理,并可以通过git客户端工具来方便的管理和访问配置内容。
使用步骤:
1.在gitHub上建立一个仓库。
2.创建一个微服务,主启动类上添加@EnableConfigServer注解。