文章目录
spring cloud 介绍
spring cloud 是一系列框架的集合,它利用spring boot的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册、配置中心、消息总线、负载均衡、断路器、数据监控等,都可以用spring boot的开发风格做到一键启动和部署。spring cloud 并没有重复制造轮子,他只是将目前各家公司开发的比较成熟、经得起实际考验的服务框架组合起来,通过spring boot 风格进行再封装屏蔽掉了复杂的配置和实现原理,最终给开发者留出了一套简单易懂、易部署和易维护的分布式系统开发工具包。
spring cloud技术组成
- eureka[juˈriːkə]
微服务治理,服务注册和发现 - ribbon [ˈrɪbən]
负载均衡、请求重试 - hystrix
断路器,服务降级、熔断 - feign
ribbon+hystrix集成,并提供声明试客户端 - hystix dashboard和turbine
hystrix数据监控 - zuul
API网关,提供微服务的统一入口,并提供统一的权限验证 - config
配置中心 - bus
消息总线,配置刷新 - sleuth+zipkin
链路跟踪
Spring Cloud与Dubbo的区别
Dubbo
- dubbo只是一个远程调用(RPC)框架
- 默认基于长连接,支持多种序列化格式
Spring Cloud
1.框架集
2.提供了一整套微服务解决方案
3.基于http调用,Rest API
eureka注册与发现
eureka注册中心作用:
*所有服务启动,都要向eureka进行注册
*服务之间调用,需要从eureka获取地址,来互相发现
1.依赖
Eureka Server
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
2.yml文件配置
eureka:
server:
enable-self-preservation: false
instance:
hostname: eureka1
lease-expiration-duration-in-seconds: 90
client:
register-with-eureka: false
fetch-registry: false
eureka.server.enable-self-preservation:
eureka的自我保护状态:心跳失败的比例,在15分钟内是否低于85%,如果出现了低于的情况,Eureka Server会将当前的实例注册中心信息保护起来,同时提示一个警告,一旦进入保护模式,Eureka Server将会尝试保护其服务注册表中的信息,不在删除服务注册表中的数据。也就是不会注销任何微服务
eureka.instance.hostname:
eureka是集群服务器,都是由若干eureka服务器组成,其中靠hostname来区分
eureka.client.register-with-eureka:
如果是一个eureka服务器,此处写false,表示不向自身注册
如果是多个服务器
则需要写true,且需要需要写明注册的另一个服务器名称
例如:
eureka:
instance:
hostname:
client:register-with-eureka: true
fetch-registry: true
service-url:
defaultZone: http://eureka2:2002/eureka
eureka.client.fitch-registry:
此处与register-with-eureka用法相似,如果是一个服务器写false,表示不从自身拉去注册信息,如果是多个服务器,则写true
lease-expiration-duration-in-seconds
表示eureka server至上一次收到client的心跳之后,等待下一次心跳的超时时间,在这个时间内若没收到下一次心跳,则将移除该instance。
defaultZone:
默认位置,可以修改为具体地理位置,比如:beijing,shanghai等,表示eureka服务器部署位置,需要云服务器提供
3.主程序添加注解
@EnableEurekaServer
4.提供者(服务端)
使用配置中心时,提供者需要添加Eureka Discovery Client依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
yml文件添加eureka注册配置
eureka:
client:
registry-fetch-interval-seconds: 30
service-url:
defaultZone: http://eureka1:2001/eureka
eureka.client.registry-fetch-interval-seconds: 30
拉取注册信息间隔时间,默认30秒
5.修改hosts文件,添加eureka域名映射
6.关于eureka的高可用
只要服务端有两个以上服务器
且eureka的yml文件中
eureka:
client:
register-with-eureka: true
fetch-registry: true
两个都为true,即可实现高可用,默认轮询
7.关于eureka集群的搭建
8.eureka执行参数总结
注册
1.服务启动时,就会连接eureka进行注册
2.如果注册失败,会一次次反复尝试,直到成功为止
拉取
1.每30秒,拉取更新一次注册地址表
2.一个新的服务注册后,其他服务不能立即感知新服务的地址,需要最长等30秒,才能更新新的地址表
心跳
1.每30秒发送一次心跳数据
2.连续丢失3次心跳数据,会删除这个服务的注册信息
自我保护模式(与zookeeper的主要区别)
3.15分钟内, 85%的服务器出现心跳异常,eureka会认为网络不稳定,会进入自我保护模式
4.自我保护模式下,会保护所有服务的注册信息,会不删除
5.直到恢复正常后,会自动退出保护模式,恢复正常
9.eureka和zookeeper的区别
eureka
1.AP - 强调可用性,和分区容错性
2.集群 - 对等结构
zookeeper
1.CP - 强调一致性,和分区容错性
2.集群 - 主从结构
ribbon
ribbon提供了负载均衡和重试功能,它底层是使用RestTemplate进行Rest api调用
RestTemplate
需要在主程序创建RestTemplate实例
RestTemplate是SpringBoot提供的一个Rest远程调用工具
它的常用方法:
1.getForObject() - 执行get请求
2.postForObject() - 执行post请求
负载均衡:
1.起步依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</dependency>
2.设置@LoadBalanced
@LoadBalanced负载均衡注解,会对RestTemplate实例进行封装,创建动态代理对象,并切入(AOP)负载均衡代码,把请求分发到集群中的服务器
例:
package cn.tedu.sp06;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;
@EnableDiscoveryClient
@SpringBootApplication
public class Sp06RibbonApplication {
@LoadBalanced //负载均衡注解
@Bean
public RestTemplate getRestTemplate() {
return new RestTemplate();
}
public static void main(String[] args) {
SpringApplication.run(Sp06RibbonApplication.class, args);
}
}
3.访问路径
访问路径设置为注册中心记录的服务id
@GetMapping("/item-service/{orderId}")
public JsonResult<List<Item>> getItems(@PathVariable String orderId) {
//这里服务器路径用 service-id 代替,ribbon 会向服务的多台集群服务器分发请求
return rt.getForObject("http://item-service/{1}", JsonResult.class, orderId);
}
访问即可,ribbon会把请求轮询发送到服务端口上
重试:
1.起步依赖
<dependency>
<groupId>org.springframework.retry</groupId>
<artifactId>spring-retry</artifactId>
</dependency>
2.yml文件配置
ribbon:
MaxAutoRetriesNextServer: 2
MaxAutoRetries: 1
OkToRetryOnAllOperations: true
3.主程序设置RestTemplate的请求工厂超时属性
package cn.tedu.sp06;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.http.client.SimpleClientHttpRequestFactory;
import org.springframework.web.client.RestTemplate;
@EnableDiscoveryClient
@SpringBootApplication
public class Sp06RibbonApplication {
@LoadBalanced
@Bean
public RestTemplate getRestTemplate() {
SimpleClientHttpRequestFactory f = new SimpleClientHttpRequestFactory();
f.setConnectTimeout(1000);
f.setReadTimeout(1000);
return new RestTemplate(f);
//RestTemplate 中默认的 Factory 实例中,两个超时属性默认是 -1,
//未启用超时,也不会触发重试
//return new RestTemplate();
}
public static void main(String[] args) {
SpringApplication.run(Sp06RibbonApplication.class, args)