您当前的位置: 首页 >  Java
  • 0浏览

    0关注

    284博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

【微服务 | Java】微服务与单体服务的拆分原则

区块链(Web3)开发工程师 发布时间:2020-03-20 21:49:35 ,浏览量:0

在这里插入图片描述

单体架构的优势:

1、便于开发 2、易于测试 3、易于部署

单体架构的不足:

1、复杂性高 2、交付效率低:构建和部署耗时长 3、伸缩性差:只能按整体横向扩展,无法分模块垂直扩展,IO密集型模块和CPU密集型模块无法独立升级和扩容 4、可靠性差:一个BUG可能引起整个项目的运行 5、阻碍技术创新

微服务架构的优势:

1、易于开发和维护 2、独立部署 3、伸缩性强 4、与组织结构相匹配 5、技术异构性

微服务面临的挑战:

1、服务拆分: (1)、微服务拆分原则:领域模型、组织结构、康威定律、单一职责 (2)、微服务拥有独立数据库 (3)、微服务之间确定服务边界

2、数据一致性 (1)、可靠性事件模式 (2)、补偿模式-sagas模式

3、服务通信 (1)、通信技术方案:RPC、REST、异步消息 (2)、服务注册和发现 (3)、负载均衡

4、服务网关: (1)、API Gateway (2)、为前端服务的后端 (3)、身份认证、路由服务、流量控制、日志统计

5、高可观察 (1)、健康检测、集中控制 (2)、日志聚合及检索 (3)、分布式追踪

6、可靠性(客户端实现): (1)、流量控制、超时控制 (2)、舱壁隔离(线程隔离),熔断机制 (3)、服务降级,幂等重试

微服务拆分原则: 1、单一职责、高内聚低耦合 2、微服务粒度适中 3、考虑团队结构 4、以业务模型切入 5、演进式拆分 6、避免环形依赖与双向依赖 7、DDD

微服务拆分步骤:

1、分析业务模型: (1)、弱耦合在一起 (2)、高内聚力

2、确定服务边界: (1)、服务应包含单一的界限上下文 3、微服务数据库拆分

微服务数据一致性:

1、分布式事务不适用微服务 (1)、2PC会有单点故障 (2)、由于锁的原因降低吞吐量 (3)、Nosql数据库并不支持

2、采用最终一致性来实现数据一致性 (1)、可靠性事件模式:消息队列(支付宝转余额宝) (2)、补偿模式-sagas模型:一些列的有序事务(每一个事物都有补偿子事务)

技术选型的三要素: 1、技术选型的广度和深度: 2、把握和分析技术选项的优缺点 3、紧密结合项目和团队的情况

Eureka简介: 1、支持跨机房的高可用 2、数据一致性是数据最终一致性 3、Eureka Client会对服务注册表进行缓存,降低Eureka的压力,进一步增强了它的高可用

借助logbook输出HTTP日志 1、pom添加logbook依赖 2、在服务提供者工程添加logbook filter以输出日志 3、在服务消费者工程httpclient添加logbook拦截器

JWT介绍: 1、基于token的进行身份验证的方案 2、jwt设计一个字符串由header、payload、signature组成 3、具备安全、自包含、紧凑等特点

JWT优点: 1、安全性高,防止token被伪造和篡改 2、自包含,减少存储开销 3、跨语言,支持多种语言的实现 4、支持过期,发布者等校验

JWT注意事项: 1、消息体是可以被base64解密成铭文 2、jwt不适合存放大量信息 3、无法作废未过期的jwt(可以借用Redis实现)

Redis的score机制: 可以做商品或房屋的热门商品,每点击一个商品的详情,就往Redis(zset)中添加一个,并只留排名前10的;

级联故障解决方案: 1、舱壁隔离(线程隔离) 2、超时控制 3、服务降级 4、熔断机制

Spring Cloud Sleuth原理:使用的是ThreadLocal,使用的是异步线程 1、疑问:(spring.factories) (1)、追踪数据是如何生成的 (2)、追踪数据是如何再进程内和进程间传递的 (3)、如何解决跨线程池问题的

进程内根据ThreadLocal进行数据的传递 Hystrix是跨线程池的,业务线程和调用线程是隔离的

用户请求—》TraceFilter—》Trace拦截器—》Controller—》HystrixCallable

—》TraceRestTemplate—》TraceAspect—(可以通过MQ,也可以通过Http请求上报)—》Zipkin Server(ES、Mysql做数据存储)

日志检索方案: 1、ELK介绍 (1)、Elasticsearch(日志存储) (2)、LogStash(负责日志收集) (3)、Kibana(进行日志图形化展示)

查看日志信息:less info.log

本地缓存:  

private final Cache registerCache =
CacheBuilder.newBuilder().maximumSize(100).expireAfterAccess(15, TimeUnit.MINUTES)
.removalListener(new RemovalListener() {

 @Override
        public void onRemoval(RemovalNotification notification) {
          String email = notification.getValue();
          User user = new User();
          user.setEmail(email);
          List targetUser = userMapper.selectUsersByQuery(user);
          if (!targetUser.isEmpty() && Objects.equal(targetUser.get(0).getEnable(), 0)) {
            userMapper.delete(email);// 代码优化: 在删除前首先判断用户是否已经被激活,对于未激活的用户进行移除操作
          }

        }
      }).build();


private final Cache resetCache = CacheBuilder.newBuilder().maximumSize(100).expireAfterAccess(15, TimeUnit.MINUTES).build();

微服务的消费模式: 1、服务直连模式(RestTemplate)特点:简洁明了、平台语言无关性、无法保证服务的可用性、生产环境比较少用 2、客户端发现模式: (1)、服务实例启动后,将自己的位置信息提交到服务注册表 (2)、客户端从服务注册表进行查询,来获取可用的服务实例 (3)、客户端自行使用负载均衡算法从多个服务实例中选择出一个 3、服务端发现模式

微服务的消费者: 1、HttpClient(RestTemplateBuilder) 2、Ribbon(基于客户端的负载均衡器(加权、随机、轮询算法))(RestTemplateBuilder+配置) 3、Feign:

使用API网关的意义: 1、API网关的意义: (1)、集合多个API (2)、统一API入口 2、常见API网关的实现方式:nginx、zuul、getaway

API网关带来的好处: 1、避免将内部信息泄露给外部 2、能给API添加额外的安全层 3、可以降低API调用的复杂度 4、微服务模拟与虚拟化

zuul简介: 1、功能:认证、压力测试、动态路由、负载削减、安全、静态响应处理、主动交换管理等

服务熔断: 1、断路器 2、断路器模式

熔断器的意义: 1、好处: (1)、系统稳定 (2)、减少性能损耗 (3)、及时响应 (4)、阀值可定制

熔断器的功能: 1、异常处理 2、日志记录 3、测试失败的操作 4、手动复位 5、加速断路 7、重试失败请求

微服务的高级主题----自动扩展 1、什么是自动扩展 (1)、垂直扩展:就是升级(双核变四核) (2)、水平扩展:就是数量变多(1台主机增加到4台主机) 2、自我注册和自我发现(服务注册表(Eureka)、客户端、微服务实例) 3、自动扩展的意义: (1)、提高了高可用性和容错能力 (2)、增加了可伸缩性 (3)、具有最佳使用率,并节约成本 (4)、优先考虑某些服务或服务组

自动扩展的常见模式: 1、自动扩展的不同级别:应用程序级别、基础架构级别

如何实现微服务的自动扩展: 1、要思考的问题: (1)、如何管理数千个容器 (2)、如何监控他们 (3)、在部署工作时如何应用规则和约束? (4)、如何利用容器来获得资源效率? (5)、如何确保至少有一定数量的最小实例正在运行? (6)、如何确保依赖服务正常运行? (7)、如何进行滚动的升级和优雅的迁移? (8)、如何回滚错误的部署? 2、所需功能:依赖两个关键功能 (1)、一个容器抽象层,在许多物理或虚拟机上提供统一的抽象 (2)、容器编排和初始化系统在集群抽象之上只能管理部署 3、容器编排: (1)、容器编排工具提供了一个抽象层来处理大规模的集装箱部署 (2)、具备发现、资源管理、监控和部署等功能 3、容器编排工作职能: (1)、集群管理 (2)、自动部署 (3)、可伸缩性 (4)、运行状况监控 (5)、基础架构抽象 (6)、资源优化 (7)、资源分配 (8)、服务可用性 (9)、敏捷性 (10)、隔离

资源分配常用算法: 1、常用算法: (1)、传播:将负载平均分配到各个主机上 (2)、装箱:负载先把第一台主机用完了,在用其它主机,按需付费 (3)、随机:负载随机选择主机

常见容器编排技术: (1)、Docker Swarm (2)、Kubernetes (3)、Apache Mesos

关注
打赏
1665194163
查看更多评论
立即登录/注册

微信扫码登录

0.0398s