什么是Spring Cloud
spring cloud 是一个快速构建分布式系统的工具集<提供了一系列分布式开发的工具>
官方文档(https://spring.io/projects/spring-cloud#overview)
功能 | 翻译 | 选择 |
---|---|---|
Distributed/versioned configuration | 分布式/版本化配置管理 | Spring Cloud Config,Consul,Nacos,Zookeeper |
Service registration and discovery | 服务注册与发现 | Eureka,Consul,Nacos,Zookeeper |
Routing | 路由 | Zuul ,Spring Cloud Gateway |
Service-to-service calls | 服务调用 | RestTemplate,Feign |
Load balancing | 负载均衡 | Ribbon |
Circuit Breakers | 熔断(服务容错) | Hystrix,Sentinel,Resilience4l |
Global locks | 全局锁 | Spring Cloud Cluster (已经迁移到Spring integration) |
Leadership election and cluster state | 选举与集群的状态管理 | Spring Cloud Cluster (已经迁移到Spring integration) |
Distributed messaging | 分布式消息 | Spring Cloud Stream + kafka/RabbitMQ/RocketMQ |
spring boot 版本 : 语义化的版本控制
2-> 主版本,第几代.
1-> 次版本,一些功能的增加,但是架构没有太大的变化,是兼容的。
5-> 增量版本 , bug修复
RELEASE -> 里程碑 SNAPSHOT: 开发版 M*:里程碑 RELEASE: 正式版本.
<version>2.1.5.RELEASE</version>
spring cloud 有这八个版本版本 : angel brixton camden dalston edgware finchley greenwich hoxton
SR: Service Release : bug 修复版本.
Greenwich SR3: Greenwich版本的第7代第3个bug修复版本。
Greenwich RELEASE : Greenwich版本的第一个正式版本.
尽量用新一代
xxx.RELEASE版本需要缓一缓。
SR2之后一般可以大规模使用了
spring cloud alibab 基于spring cloud做的,spring cloud是基于spring boot做的,所以说三者之间存在着一些版本兼容关系。 https://github.com/alibaba/spring-cloud-alibaba/wiki/%E7%89%88%E6%9C%AC%E8%AF%B4%E6%98%8E
spring cloud 版本 | Spring cloud Alibaba 版本 | Spring boot 版本 |
---|---|---|
Spring Cloud Greenwich | 0.9.0.RELEASE | 2.1.X.RELEASE |
Spring CLoud Finchley | 0.2.X.RELEASE | 2.0.X.RELEASE |
Spring CLoud Edgware | 0.1.X.RELEASE | 1.5.X.RELEASE |
nacos
简单的说nacos 是一个服务发现组件,同时也是一个配置服务器,它解决了2个问题,服务a怎么找到服务b的问题。第二个就是管理服务的配置。
搭建nacos server
下载一个nacos
搭建一个nacos server
将应用注册到nacos上面。
cloud:
nacos:
discovery:
server-addr: 172.16.248.178,172.16.248.162,172.16.248.160
# server-addr: 127.0.0.1
register-enabled: true
namespace: 14209f0c-76ed-4a48-9ed4-4b5e4d03b46a
# ip: 47.111.9.173
config:
server-addr: 172.16.248.178:8848,172.16.248.162:8848,172.16.248.160:8848
# server-addr: 127.0.0.1:8848
file-extension: yaml
namespace: 14209f0c-76ed-4a48-9ed4-4b5e4d03b46a
nacos 服务发现的领域模型
namespace : 命名空间默认的namespace 是public 主要用来实现隔离,比如开发环境,测试环境,生产环境.
group: 服务分组,暂时还没有用到,默认的是 default_group ,可以吧不同的微服务划分到一个分组里面去,方便管理。
Service : 微服务 ,就是我们所说的微服务,比如用户微服务,订单微服务等等。
cluster: 集群,对微服务的指定虚拟划分,比如说公司为了容灾,有北京机房,杭州机房,就可以给北京机房,杭州机房的进行一个分组,可以实现让杭州机房的 用户中心调杭州机房的订单中心,这样在容灾的同时可以提升性能。
负载均衡的2种实现方式。
Ribbon与Nginx区别
1.服务器端负载均衡Nginx
nginx是客户端所有请求统一交给nginx,由nginx进行实现负载均衡请求转发,属于服务器端负载均衡。
既请求有nginx服务器端进行转发。
2.客户端负载均衡Ribbon
netfilx开源的客户端负载均衡器。
Ribbon是从nacos注册中心服务器端上获取服务注册信息列表,缓存到本地,让后在本地实现轮训负载均衡策略。
既在客户端实现负载均衡。
ribbon 内置了八款负载均衡规则,他让我们的ribbon更加的强大灵活,默认的负载均衡是 ZoneAvoidanceRule ,这个是一个比较复杂的rule,在没有zone 的情况下,就类似于轮询(RoundRobinRule)
服务消费者集成ribbon之后,rabbon 会自动从nacos server 上面获取想要调用的服务列表,他会用一个负载均衡的算法计算出一个实例,来交给restTemplate 去请求。
private final RestTemplate restTemplate;
public TestController(RestTemplate restTemplate) {
this.restTemplate = restTemplate;
}
public ResponseObject findIdByName(Long userId) {
return restTemplate.postForEntity("http://credit-user/foreign/user/findIdByName",
userId, ResponseObject.class).getBody();
}
Feign
feign 是netflix 开源的声明式http客户端。<只要声明一个接口 feign 就会自动给你构造一个http请求目标地址,并帮助你请求>
github: https://github.com/OpenFeign/feign
<!--pom 引入 Feign, 可以以声明的方式调用微服务 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<!-- 在启动类上面加上 @EnableFeignClients -->
feign 的负载均衡是整合ribbon实现的。
尽量使用Feign(因为用Feign 可以让代码写的更加的漂亮,非常的可读,可维护)
杜绝使用restTemplate(保持编码统一)。
@FeignClient(value = "credit-user", fallback = CreditSubjectListHystrix.class)
public interface CreditSubjectListClient {
/**
* 获取银行简称
*
* @param sysDataDicVO 业务标识、字段、名称
* @return 银行简称
*/
@PostMapping("/foreign/dataDicForeign/getDicValue")
ResponseObject<List<SysDataDicVO>> getDicValue(@RequestBody SysDataDicVO sysDataDicVO);
}
@FeignClient(value = "credit-user", fallback = CreditSubjectListHystrix.class)
熔断Hystrix:
<!-- 引入服务容错 Hystrix 的依赖 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
@Component
public class CreditSubjectListHystrix implements CreditSubjectListClient {
@Override
public ResponseObject getDicValue(SysDataDicVO sysDataDicVO) {
return ResponseObject.fail("[数据使用机构] 发生熔断");
}
}
服务网关 zuul
spring cloud zuul : 提供了认证,鉴权,限流,动态路由,监控,安全的负载均衡....
zuul 的特点:
1,路由 + 过滤器 = zuul
2,核心就是一系列的过滤器,过滤器是实现zuul最核心的东西.每一个http请求都会经过这一系列的过滤器,得到响应并返回给客户端,
zuul 的四种过滤器 api
1,前置过滤器 (pre)
2,后置过滤器(post)
3,错误过滤器 (error)
4,路由过滤器(route)
zuul:
sensitive-headers: Access-Control-Allow-Origin
ignored-headers: Access-Control-Allow-Origin,H-APP-Id,Token,APPToken
routes:
serve:
path: /credit-serve/**
serviceId: credit-serve
user:
path: /credit-user/**
serviceId: credit-user
服务网关做限流的例子:
@Configuration
@Slf4j
public class RateLimiterFilter extends ZuulFilter {
private static final RateLimiter RATE_LIMITER = RateLimiter.create(100);
/**
* 过滤器
*
* @return
*/
@Override
public String filterType() {
return PRE_TYPE;
}
/**
* 顺序
*
* @return
*/
@Override
public int filterOrder() {
return 0;
}
@Override
public boolean shouldFilter() {
return true;
}
/**
* 具体实现
*
* @return
* @throws
*/
@Override
public Object run() throws ZuulException {
if (!RATE_LIMITER.tryAcquire()) {
throw new RuntimeException("没有拿到令牌");
}
return null;
}
}
CAP理论作为分布式系统的基础理论,它描述的是一个分布式系统在以下三个特性中:
- 一致性(Consistency)
- 可用性(Availability)
- 分区容错性(Partition tolerance)
最多满足其中的两个特性。也就是下图所描述的。分布式系统要么满足CA,要么CP,要么AP。无法同时满足CAP