当前位置: 首页 > 编程日记 > 正文

Spring Cloud 微服务实战笔记

Spring Cloud 微服务实战笔记

微服务知识

传统开发所有业务逻辑都在一个应用中, 开发,测试,部署随着需求增加会不断为单个项目增加不同业务模块;前端展现也不局限于html视图模板的形式,后端向前端支持需要更多的接口模块。

随着需求增多,项目变大,单体系统部署在一个进程内部,往往修改很小的功能,为了部署上线也会影响其他功能。后期维护成本会变得越来越大,难以控制。

微服务架构中不同模块拆分成不同服务,都能独立部署和扩展,运行在自己的进程内,有稳定的边界,更新也不会影响其他服务运营。而且由于是独立部署的,可以更准确的为每个服务评估性能容量,也更容易发现系统瓶颈位置。

微服务带来的问题

微服务架构有如此多优点,单也因为服务的拆分引入了许多问题。

  • 运维人员需要维护的进程数量增多了, 所以需要自动化的工具
  • 服务拆分了,但业务逻辑的依赖不会消除,只是从单体应用的代码依赖变为了服务间的通信依赖, 所以要保证接口的正确调用,需要完善的接口和版本管理工具
  • 由于服务独立部署在各自进程内,所以它们间通信需要考虑网络延迟,分布式事务,异步消息,容错性等。

微服务实施

服务调用

微服务架构中通常通过两种方式互相通信:

  • 使用HTTPRESTFUL API或轻量级消息发送协议, 实现消息传递和服务调用的触发
  • 通过轻量级消息总线上传消息,类似RabbitMQ提供可靠异步交换.

去中心化管理

在实施微服务架构时,希望每一个服务都管理其自由的数据库,这就是数据管理的去中心化。

但随之而来数据一致性也成了需要解决的问题直以,分布式事务本身实现难度就非常大,所以在微服务架构中,强调在各个服务之间进行无事务的调用,对数据一致性,只要求数据在最后处理状态一致即刻;若在过程中发现错误, 通过补偿机制来进行处理,使得错误数据能够达到最终的 一 致性。

以下内容摘自我的领域驱动设计(DDD:Domain-Driven Design)笔记

传统架构,数据一般是强一致性的,我们通常会使用数据库事务保证一次操作的所有数据修改都在一个数据库事务里,从而保证了数据的强一致性。在分布式的场景,我们也同样希望数据的强一致性,就是使用分布式事务。但是众所周知,分布式事务的难度、成本是非常高的,而且采用分布式事务的系统的吞吐量都会比较低,系统的可用性也会比较低。所以,很多时候,我们也会放弃数据的强一致性,而采用最终一致性;

CQRS(Command Query Responsibility Segregation)架构 - 命令查询的责任分离, 则完全秉持最终一致性的理念。这种架构基于一个很重要的假设,就是用户看到的数据总是旧的。比如秒杀的场景,当你下单前,也许界面上你看到的商品数量是有的,但是当你下单的时候,系统提示商品卖完了。

容错设计

单体应用中, 一般不存在单个组件故障而其他部件还能运行的情况,通常是一挂全挂。

在微服务架构中,当部分服务存在故障,而导致没有返回,线程挂起等待,直到超时才能释放。正常服务频繁调用故障服务,导致大量线程被挂起,从而出现故障蔓延。

所以晶块检测出故障源并京可能自动恢复服务很关键。通常希望每个服务中实现监控和日志记录,比如服务状态,断路器状态,吞吐量,网络延迟等关键数据的仪表盘。

思想转变

设计服务时,需要学习领域驱动设计,细致的分出每个服务和相关边界。

实施微服务的团队,每个小组都应该以做产品的方式,对服务的整个生命周期负责。

Spring Cloud 介绍

Spring Cloud 是基于Spring Boot的微服务架构开发工具,它为微服务中涉及的配置管理,服务治理, 断路器, 智能路由, 微代理, 控制总线, 全局锁,决策竞选,分布式会话集群状态管理等操作提供了简单的开发方式。

常用子项目:

  • Spring Cloud Config 配置管理工具, 支持使用Git存储 配置内容, 可以使用它实现应用配置的外部化存储, 并支持客户端配置信息刷新、 加密/ 解密配置内容 等
  • Spring Cloud Netflix 核心组件,对多个Netflix OSS套件进行整合
    • Eureka 服务治理组件,包含服务注册中心、 服务注册与发现机制的实现。
    • Hystrix 容错管理组件,实现断路器模式,帮助服务依赖中出现的延迟和为故障提供强大的容错能力。
    • Ribbon 客户端负载均衡的服务调用组件。
    • Feign 基于RibbonHystrix的声明式服务调用组件。
    • Zuul 网关组件,提供智能路由,访问过滤等功能。
    • Archaius 外部化配置组件
  • Spring Cloud Bus 事件、消息总线。用于传播集群中的状态变化或事件, 以触发后续的处理, 比如用来动态刷新配置等。
  • Spring Cloud Cluster 针对ZooKeeper,Redis,Hazelcast,Consul的选举算法和通用状态模式的实现。
  • Spring Cloud Consul 服务发现与配置管理工具。
  • Spring Cloud Stream 通过Redis,RabbitKafka实现的消费微服务,通过简单的声明式模型来发送和接收消息。
  • Spring Cloud Security 安全工具包,提供在Zuul代理中对OAuth2客户端请求的中继器。
  • Spring Cloud Sleuth 分布式跟踪实现,可以完美整合Zipkin
  • Spring Cloud ZooKeeper 服务发现与配置管理工具
  • Spring Cloud Starters 基于Spring Boot风格项目的基础依赖模块。

转载于:https://www.cnblogs.com/xueyoucd/p/11272782.html

相关文章:

UE商城资源 Kitsune狐狸女孩

Unreal Engine虚幻游戏引擎素材资源 Unreal Engine Marketplace –Kitsune 4.26狐狸女孩 大小解压后:569M 可爱的Kitsune的3D模型。装配到史诗骷髅。完全模块化,包括无衣服的身体。包含不同的发型。通过材质实例轻松改变颜色。包含与Live Link Face应用程…

Java学习总结:18

认识异常 异常是程序中导致程序中断的一种指令流。 例:产生异常 package com.study.Demo;public class Test1 {public static void main(String args[]){System.out.println("1.除法计算开始");System.out.println("2.除法计算:"(…

java从字符串中提取数字

1、做一下操作时会一般会用到提取数字操纵: a、列表中有翻页,当新添加的数据不是放在第一条或者最后一条时,需要翻页并循环找到对应的那条数据 b、当新添加的数据放在第一条或者最后一条时,则不需要翻页,只需要直接进入…

2022-2028年中国联合办公行业深度调研及投资前景预测报告

【报告类型】产业研究 【报告价格】4500起 【出版时间】即时更新(交付时间约3个工作日) 【发布机构】智研瞻产业研究院 【报告格式】PDF版 本报告介绍了中国联合办公行行业市场行业相关概述、中国联合办公行行业市场行业运行环境、分析了中国联合办…

iBatis自动生成的主键 (Oracle,MS Sql Server,MySQL)【转】

iBatis的sqlMap配置文件的selectKey元素有个type属性&#xff0c;可以指定pre或者post表示前生成(pre)还是后生成(post)。 Oracle设置 Xml代码 <!-- Oracle SEQUENCE --> <insert id"insertProduct-ORACLE" parameterClass"com.domain.Product&quo…

微信小程序----调用用户信息

在对应的文件夹里面的js里面添加代码&#xff0c;例如&#xff1a;index.js 代码开始/// onLoad: function () {var that this// 查看是否授权wx.getSetting({success(res) {if (res.authSetting[scope.userInfo]) {// 已经授权&#xff0c;可以直接调用 getUserInfo 获取头像…

在Blender中创建真实的汽车CGI视觉动画效果

Blender VFX Tutorial Rig & Animate a Realistic Car in Real 大小&#xff1a;1.18G 时长1h 包含项目文件 1280X720 MP4 语言&#xff1a;英语中英文字幕&#xff08;根据原英文字幕机译更准确&#xff09; Blender VFX教程绑定&动画真实的汽车 云桥网络 平台获取教程…

Java学习总结:19

throws关键字 throws关键字主要在方法定义上使用&#xff0c;表示此方法中不进行异常的处理&#xff0c;而是交给被调用处处理。 例&#xff1a;使用throws package com.study.Demo;class MyMath{public static int div(int x,int y)throws Exception{ //此方法不处理异常re…

C语言访问网页

一、理论 http://www.zixue7.com/thread-3860-1-1.html转载于:https://www.cnblogs.com/274914765qq/p/4996433.html

禅道Docker安装包发布

禅道Docker安装包发布 大家好, 禅道Docker安装包发布。 一、下载地址 禅道开源版: /dl/zentao/docker/docker_zentao.zip 备用下载地址:https://download.csdn.net/download/u013490585/16271485 数据库用户名: root,默认密码: 123456。运行时,可以设置 MYSQL_ROO…

获取指定日期之间的各个周和月

2019独角兽企业重金招聘Python工程师标准>>> 日志格式化类 Date.class.php <?php class Datefmt{function __construct() {}/*** 根据指定日期获取所在周的起始时间和结束时间*/public function get_weekinfo_by_date($date) {$idx strftime("%u", s…

nested exception is org.apache.ibatis.type.TypeException: Could not set parameters for mapping

今天mybatis报了个错误 org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.type.TypeException: Could not set parameters for mapping: ParameterMapping{propertyInfoId, modeIN, javaTypeclass java.lang.Long, jdbcTypenull, numericSca…

Revit和Unreal Engine真实的建筑可视化视频教程

Revit和Unreal Engine真实的建筑可视化视频教程 Lynda – Revit and Unreal Engine: Real-Life Architectural Visualizations Lynda–Revit和Unreal Engine&#xff1a;真实的建筑可视化 时长 3小时 25分 | 1.15 GB |含项目练习文件|使用的软件&#xff1a;Revit&#xff0c…

Java学习总结:20

可变参数 语法形式&#xff1a; [public | protected | private][static][final][abstract] 返回值类型 方法名称(参数类型...变量){[return[返回值];] }例&#xff1a;使用可变参数定义方法 package com.study.Demo;public class Test6 {public static void main(String ar…

Axure 全局辅助线(转)

普通辅助线作用于当前页 全局作用于所有页面 , 包括新建页面 创建普通辅助线直接拉出来 创建全局辅助线 , 在拉出来的时候按住 Ctrl 默认情况下 , 颜色不同 辅助线可以多选 , 用拖选 或 按 ctrl 多选 多选后可以批量锁定等 转自&#xff1a;链接转载于:https://www.cnblogs.com…

2022-2028年中国帘子布行业市场研究及前瞻分析报告

【报告类型】产业研究 【报告价格】4500起 【出版时间】即时更新&#xff08;交付时间约3个工作日&#xff09; 【发布机构】智研瞻产业研究院 【报告格式】PDF版 本报告介绍了中国帘子布行业市场行业相关概述、中国帘子布行业市场行业运行环境、分析了中国帘子布行业市场…

查询在应用程序运行得很慢, 但在SSMS运行得很快的原因探究

原文:查询在应用程序运行得很慢&#xff0c; 但在SSMS运行得很快的原因探究查询在应用程序运行得很慢&#xff0c; 但在SSMS运行得很快的原因探究 -理解性能疑点 1 引言 内容来自http://www.sommarskog.se/query-plan-mysteries.html&#xff08;Slow in the Application,…

Spring Boot 2.X 实现文件上传(三)

使用 SpringBoot 项目完成单个、多个文件的上传处理&#xff0c;并将上传的文件保存到指定目录下。 代码演示案例 所有的 HTML 页面文件 index.html <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>选…

Blender灯光照明与渲染视频教程 Skillshare – Blender: Product rendering for beginners

Blender灯光照明与渲染视频教程 Skillshare – Blender: Product rendering for beginners Skillshare – Blender: Product rendering for beginners 教程大小&#xff1a;2.2G 共33小节课 1920X1080 mp4视频 语言&#xff1a;英语中文字幕 在这门课程中&#xff0c;你将了…

Java学习总结:21

泛型 泛型的引出 例&#xff1a;向下转型的错误示范 package Project.Study.Genericity;class Point{ //定义坐标类private Object x; //可以保存任意数据private Object y; //可以保存任意数据public Object getX() {return x;}public Object getY() {return y;}pu…

Lab模式的妙用--人像处理

其实就是&#xff1a; 1.复制明度图层到RGB模式&#xff0c;降低透明度。 2.仿制图章磨皮 3.液化 4.可选颜色润饰皮肤。 转载于:https://www.cnblogs.com/wensu/p/4997579.html

springboot整合swagger2之最佳实践

来源:https://blog.lqdev.cn/2018/07/21/springboot/chapter-ten/ Swagger是一款RESTful接口的文档在线自动生成、功能测试功能框架。 一个规范和完整的框架&#xff0c;用于生成、描述、调用和可视化RESTful风格的Web服务&#xff0c;加上swagger-ui&#xff0c;可以有很好的…

转:动态链接库的全局变量问题

动态链接库的全局变量问题 请问动态链接库被外部多次调用时&#xff0c;每次调用中动态库自身的全局变量都会重新初始化吗&#xff1f;如果会那怎么来使我每次调用动态库时都能从上次的状态开始执行呢&#xff1f; 你这个问题得分被调用的是同一个进程还是不同的进程。如果是不…

排名前 16 的 Java 工具类

转载来自微信公众号&#xff1a;Java 技术栈。如有侵权&#xff0c;请联系作者删除&#xff01;&#xff01; 在 Java 中&#xff0c;工具类定义了一组公共方法&#xff0c;这篇文章将介绍 Java 中使用最频繁及最通用的 Java 工具类。以下工具类、方法按使用流行度排名&#xf…

c4d教程-太空火车站场景创作视频教程Skillshare – Create A Space Train Scene With Cinema 4D Redshift Render

c4d教程-太空火车站场景创作视频教程Skillshare – Create A Space Train Scene With Cinema 4D & Redshift Render 教程大小 1.66G 共15小节 1280X720 mp4 视频 语言&#xff1a;英语中文字幕 百度一下 云桥网络 平台huo取 教程&#xff01; Skillshare – Create A Spa…

Java学习总结:23

前言&#xff1a;断更挺久了&#xff0c;今天把之前的补上 Annotation 3种最为常用的Annotation定义&#xff0c;Override、Deprecated和SuppressWarnings 1.准确的覆写&#xff1a;Override 当进行方法覆写时&#xff0c;为了保证子类所覆写的方法的确是父类中定义过的方法…

Windows Live Writer发布测试

通过Windows Live Writer发布文章测试&#xff01;&#xff01;&#xff01;&#xff01; 转载于:https://www.cnblogs.com/passerlee/p/5000567.html

2022-2028年中国锂电池用聚烯烃隔膜行业市场发展调研及投资方向分析报告

【报告类型】产业研究 【报告价格】4500起 【出版时间】即时更新&#xff08;交付时间约3个工作日&#xff09; 【发布机构】智研瞻产业研究院 【报告格式】PDF版 本报告介绍了中国锂电池用聚烯烃隔膜行业市场行业相关概述、中国锂电池用聚烯烃隔膜行业市场行业运行环境、…

【莫队算法】bzoj3781 小B的询问

莫队经典。 开个数组维护a[i]出现的次数。 1 #include<cstdio>2 #include<cmath>3 #include<algorithm>4 using namespace std;5 int Num,CH[12],f,c;6 inline void R(int &x){7 c0;f1;8 for(;c<0||c>9;cgetchar())if(c-)f-1;9 for(x0…

计算机为什么需要十六进制?

我们知道内存是按照字节粒度来寻址的,因此采用的数字系统必须很好的表达一个字节,也就是8比特,从这个角度上看256进制(2^8)是最好的,因为一个256进制就是表达一个字节,但还是基于可读性的原因,256进制对于人类来说记忆负担过重,而16进制则刚刚好,一个16进制数字表示一个字节的一半(4个比特),两个16进制数字正好表示一个字节。每个十六进制中的数字代表4个比特,你可以非常直观的从十六进制中知道对应的二进制是啥,比如给定一个十六进制数,假设其最后一位是9,那为什么十六进制是二进制的好朋友呢?