springcloud ,springcloud alibaba ,springboot 工具组件应用

什么是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 Greenwich0.9.0.RELEASE2.1.X.RELEASE
Spring CLoud Finchley0.2.X.RELEASE2.0.X.RELEASE
Spring CLoud Edgware0.1.X.RELEASE1.5.X.RELEASE

nacos 

简单的说nacos 是一个服务发现组件,同时也是一个配置服务器,它解决了2个问题,服务a怎么找到服务b的问题。第二个就是管理服务的配置。

搭建nacos server

下载一个nacos

下载地址 https://github.com/alibaba/nacos/releases

搭建一个nacos server

参考文档 https://nacos.io/zh-cn/docs/quick-start.html

将应用注册到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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值