原标题:SpringCloud微服务架构升级总结

1.1 应用系统的架构历史

1.2 什么是微服务?

起源:微服务的概念源于 2014 年 3 月 Martin Fowler 所写的一篇文章“Microservices”。文中内容提到:微服务架构是一种架构模式,它提倡将单一应用程序划分成一组小的服务,服务之间互相协调、互相配合,为用户提供最终价值。

通信方式:每个服务运行在其独立的进程中,服务与服务间采用轻量级的通信机制互相沟通(通常是基于 HTTP 的 RESTful API)。

微服务的常规定义:微服务是一种架构风格,一个大型复杂软件应用由一个或多个微服务组成。系统中的各个微服务可被独立部署,各个微服务之间是松耦合的。每个微服务仅关注于完成一件任务。

把原来的一个完整的进程服务,拆分成两个或两个以上的进程服务,且互相之间存在调用关系,与原先单一的进程服务相比,就是“微服务”。(微服务是一个比较级的概念,而不是单一的概念)

1.3 微服务架构的优势

可扩展性:在增加业务功能时,单一应用架构需要在原先架构的代码基础上做比较大的调整,而微服务架构只需要增加新的微服务节点,并调整与之有关联的微服务节点即可。在增加业务响应能力时,单一架构需要进行整体扩容,而微服务架构仅需要扩容响应能力不足的微服务节点。

容错性:在系统发生故障时,单一应用架构需要进行整个系统的修复,涉及到代码的变更和应用的启停,而微服务架构仅仅需要针对有问题的服务进行代码的变更和服务的启停。其他服务可通过重试、熔断等机制实现应用层面的容错。

技术选型灵活:微服务架构下,每个微服务节点可以根据完成需求功能的不同,自由选择最适合的技术栈,即使对单一的微服务节点进行重构,成本也非常低。

开发运维效率更高:每个微服务节点都是一个单一进程,都专注于单一功能,并通过定义良好的接口清晰表述服务边界。由于体积小、复杂度低,每个微服务可由一个小规模团队或者个人完全掌控,易于保持高可维护性和开发效率。

Spring Cloud作为目前最流行的微服务开发框架,不是采用了Spring Cloud框架就实现了微服务架构,具备了微服务架构的优势。正确的理解是使用Spring Cloud框架开发微服务架构的系统,使系统具备微服务架构的优势(Spring Cloud就像工具,还需要“做”的过程)。

1.4 什么是Spring Boot?什么是Spring Cloud?

Spring Boot框架是由Pivotal团队提供的全新框架,其设计目的是用来简化基于Spring应用的初始搭建以及开发过程。SpringBoot框架使用了特定的方式来进行应用系统的配置,从而使开发人员不再需要耗费大量精力去定义模板化的配置文件。

Spring Cloud是一个基于Spring Boot实现的云应用开发工具,它为基于JVM的云应用开发中的配置管理、服务注册,服务发现、断路器、智能路由、微代理、控制总线、全局锁、决策竞选、分布式会话和集群状态管理等操作提供了一种简单的开发方式。

1.5 微服务、Spring Boot、Spring Cloud三者之间的关系

思想:微服务是一种架构的理念,提出了微服务的设计原则,从理论为具体的技术落地提供了指导思想。

脚手架:Spring Boot是一套快速配置脚手架,可以基于Spring Boot快速开发单个微服务。

多个组件的集合:Spring Cloud是一个基于Spring Boot实现的服务治理工具包;Spring Boot专注于快速、方便集成的单个微服务个体;Spring Cloud关注全局的服务治理框架。二、技术解析 2.1 Everything is jar, Everything is http

Spring Boot通过@SpringBootApplication注解标识为Spring Boot应用程序。所有的应用都通过jar包方式编译,部署和运行。

@SpringBootApplication

public class Application {

private static final Logger LOGGER = LoggerFactory.getLogger(Application.class);

public static void main(String[] args) {

SpringApplication.run(Application.class, args);

LOGGER.info(”启动成功!");

}

}

每个Spring Boot的应用都可以通过内嵌web容器的方式提供http服务,仅仅需要在pom文件中依赖spring-boot-start-web即可,原则上微服务架构希望每个独立节点都提供http服务。

org.springframework.boot

spring-boot-starter-web

2.2 Spring boot Task 任务启动和定时任务

在Spring Boot需要启动任务时,只要继承CommandLineRunner接口实现其run方法即可。

@SpringBootApplication

public class ClientDataListener implements CommandLineRunner

public void run(String... strings) throws Exception {

clientInfoListenerHandler;

}

}

在Spring Boot需要执行定时任务时,只需要在定时任务方法上增加@Scheduled(cron = “0 15 0?”)注解(支持标准cron表达式),并且在服务启动类上增加@EnableScheduling的注解即可。

@SpringBootApplication

@EnableScheduling

public class Application {

private static final Logger LOGGER = LoggerFactory.getLogger(Application.class);

public static void main(String[] args) {

SpringApplication.run(Application.class, args);

LOGGER.info(”启动成功!");

}

} // some class

@Scheduled(cron = "0 15 0 * * ?")

public void someTimeTask {

***

} 2.3 Spring boot Actuator 监控

Actuator是spring boot提供的对应用系统自身进行监控的组件,在引入spring-boot-start-web基础上引入spring-boot-starter-actuator即可。

org.springframework.boot

spring-boot-starter-actuator

2.4 Spring cloud Config 配置中心

在我们实现微服务架构时,每个微服务节点都需要自身的相关配置数据项,当节点众多,维护就变得非常困难,因此需要建立一个中心配置服务。

Spring Cloud Config分为两部分。Spring Cloud Config server作为一个服务进程,Spring Cloud Config File为配置文件存放位置。

2.5 Spring cloud Eureka 服务注册中心

服务注册的概念早在微服务架构之前就出现了,微服务架构更是把原先的单一应用节点拆分成非常多的微服务节点。互相之间的调用关系会非常复杂,Spring Cloud Eureka作为注册中心,所有的微服务都可以将自身注册到Spring Cloud Eureka进行统一的管理和访问(Eureka和Zookeeper不同,在AOP原则中选择了OP,更强调服务的有效性)

2.6 Spring cloud Zuul 服务端智能路由

当我们把所有的服务都注册到Eureka(服务注册中心)以后,就涉及到如何调用的问题。Spring Cloud Zuul是Spring Cloud提供的服务端代理组件,可以看做是网关,Zuul通过Eureka获取到可用的服务,通过映射配置,客户端通过访问Zuul来访问实际需要需要访问的服务。所有的服务通过spring.application.name做标识,

不同IP地址,相同spring.application.name就是一个服务集群。当我们增加一个相同spring.application.name的节点,Zuul通过和Eureka通信获取新增节点的信息实现智能路由,增加该类型服务的响应能力。

2.7 Spring cloud Ribbon 客户端智能路由

与Spring Cloud Zuul的服务端代理相对应,Spring Cloud Ribbon提供了客户端代理。在服务端代理中,客户端并不需要知道最终是哪个微服务节点为之提供服务,而客户端代理获取实质提供服务的节点,并选择一个进行服务调用。Ribbon和Zuul相似,也是通过和Eureka(服务注册中心)进行通信来实现客户端智能路由。

2.8 Spring cloud Sleuth 分布式追踪

2.9 Spring cloud Zipkin 调用链

2.10 Spring cloud Feign http客户端

Spring Cloud Feign是一种声明式、模板化的http客户端。 使用Spring Cloud Feign请求远程服务时能够像调用本地方法一样,让开发者感觉不到这是远程方法(Feign集成了Ribbon做负载均衡)。

把远程服务和本地服务做映射

@FeignClient(name = "rabbitmq-http", url = "${SKYTRAIN_RABBITMQ_HTTP}")

public interface TaskService {

@RequestMapping(value = "/api/queues", method = RequestMethod.GET)

public String query(@RequestHeader("Authorization") String token);

} @Autowired

private TaskService taskService;

private String queryRabbitmqStringInfo {

byte credentials = Base64 .encodeBase64((rabbitmqHttpUserName + ":" + rabbitmqHttpPassword).getBytes(StandardCharsets.UTF_8));

String token = "Basic " + new String(credentials, StandardCharsets.UTF_8);

return taskService.query(token);

} 2.11 Spring cloud Hystrix 断路器

三、微服务实践 3.1 我们开发的几个微服务组件—应用管理中心

应用管理中心可以对每个已经注册的微服务节点进行停止,编译,打包,部署,启动的完整的上线操作。

3.2 我们开发的几个微服务组件—zookeeper数据查询中心

zookeeper数据查询中心根据zookeeper地址,端口,命令获取zookeeper数据信息。

3.3 我们开发的几个微服务组件—微服务健康检测中心

健康检测中心周期性检查每个微服务的状态,当发现有微服务状态处于DOWN或连接超时时,触发报警。

3.4 我们开发的几个微服务组件—定时任务查询中心 // 在BeanPostProcessor子类中拦截

@Component

public class SkytrainBeanPostProcessor implements BeanPostProcessor, Ordered {

***

/**

* Bean 实例化之后进行的处理

*/

public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {

beanPostProcessor.postProcessAfter(bean, beanName);

return bean;

}

***

}

// 拦截后获取定时任务注解

***

public Object postProcessAfter(Object bean, String beanName) {

Class targetClass = AopUtils.getTargetClass(bean);

Map annotatedMethods = MethodIntrospector.selectMethods(targetClass,

new MethodIntrospector.MetadataLookup {

public Set inspect(Method method) {

Set scheduledMethods = AnnotatedElementUtils.getMergedRepeatableAnnotations(method,

Scheduled.class, Schedules.class);

return (!scheduledMethods.isEmpty ? scheduledMethods : );

}

});

if (!annotatedMethods.isEmpty) {

String className = targetClass.getName;

for (Map.Entry entry : annotatedMethods.entrySet) {

Method method = entry.getKey;

for (Scheduled scheduled : entry.getValue) {

String key = className + ":" + method.getName;

String value = scheduled.toString;

taskInfos.put(key, value);

}

}

}

return ;

}

***

***

public void taskRegister {

String nodeInfo = ipAddress + ":" + serverPort + ":";

try {

/**

* 定时任务

*/

Map infos = taskInfos;

for (Entry item : infos.entrySet) {

String taskId = nodeInfo + item.getKey;

String taskParameter = item.getValue;

JSONObject info = new JSONObject;

info.put("taskId", taskId);

info.put("taskParameter", taskParameter);

info.put("applicationName", applicationName);

info.put("taskType", "schedule");

LOGGER.info(info.toString);

zooKeeperExecutor.createZKNode(SKYTRAIN_TASK_ZKNODE_PREFIX + taskId, info.toString);

}

}

catch (Exception ex) {

LOGGER.error("", ex);

}

}

*** 3.5 微服务的分类

基础服务组件/业务服务组件3.6 整体微服务架构图

作者:梁鑫

来源:宜信技术学院返回搜狐,查看更多

责任编辑:

微服务升级优点_SpringCloud微服务架构升级总结相关推荐

  1. 微服务升级优点_微服务–——定义, 原则 和 优点

    微服务是业界最新的流行语,似乎每个人都在以这样或那样的方式谈论它.让我们理解一下什么是微服务?通过这篇教程我们将理解微服务的定义,概念以及微服务的原理. 微服务的定义 如今,微服务是SOA(面向服务的 ...

  2. 微应用是什么_SpringCloud微服务架构篇1:微服务架构开发

    大型分布式系统具有复杂性.隐匿性.配合性和易变性四大难题,不会存在任何单一软件工程上的突破,能让开发生产力得到一个数量级上的提升. 1.单体架构应用的困境 一个典型的单体架构应用就是将一个应用中所有的 ...

  3. java服务限流_SpringCloud微服务:Sentinel哨兵组件,管理服务限流和降级

    一.基本简介 1.概念描述 sentinel 以流量为切入点,从流量控制.熔断降级.系统负载保护等多个维度保护服务的稳定性.包括核心的独立类库,监控台,丰富的使用场景验证.(这似乎是阿里开源组件的一贯 ...

  4. springcloud 微服务鉴权_springcloud 微服务权限校验JWT模式获取 token 实战(十二)...

    springcloud 微服务权限校验JWT模式获取 token 实战(十二) springcloud 微服务权限校验JWT模式获取 token 实战(十二) JWT:json web token 是 ...

  5. 分布式与微服务——Iaas,Paas和Saas、单体应用和缺点、微服务概念、传统 分布式 SOA 架构与微服务架构的区别、微服务实战、什么是RPC、CAP定理和BASE理论、唯一ID生成、实现分布式

    文章目录 1-什么是Iaas,Paas和Saas 一 IaaS基础设施服务 二 paas平台即服务 三saas软件即服务 四 总结 2-单体应用和缺点 一 单体应用 二 单体应用的缺陷 3-微服务概念 ...

  6. 【架构】需求决定架构 —— 萌Mark的架构升级之路

    前言 2014年到2015年,是IP爆发的一年,在这一年中,出现很多因为IP火起来的产品.其中有一款产品,凭借着新奇的玩法和萌萌的IP形象,取得了不俗的成绩,也使我司得到数量客观的融资. 萌Mark, ...

  7. 系统架构升级要不要上微服务?历“久”弥新微服务——你真的需要升级微服务架构吗

    在 <微服务架构设计模式> 一书中,作者总结了关于微服务的一些"重点",原文如下: 中国企业和开发者对微服务架构的热情让我印象深刻.但如同我给所有客户的忠告一样,我想对 ...

  8. 马蜂窝如何利用 APISIX 网关实现微服务架构升级

    作者:董红帅,马蜂窝微服务体系建设以及基础服务能力建设专家. 马蜂窝作为旅行社交平台,是数据驱动的新型旅行电商.基于十余年的内容积累,马蜂窝通过 AI 技术与大数据算法,将个性化旅行信息与来自全球各地 ...

  9. 微服务_SpringCloud微服务架构实战:高并发微服务架构设计

    高并发微服务架构设计 作为一个 IT 从业人员,我们经常会碰到类似于下面的一些问题: 单个项目巨大而沉重,难以维护. 系统稳定性得不到更有效的保证. 怎样才能持续地提升系统的性能. 怎样才能快速地响应 ...

最新文章

  1. 皮一皮:怎么才能让员工有干劲...
  2. C语言用char数组存储一串整数时的一个陷阱
  3. 中国银屑病患者中银屑病关节炎的患病率和特征
  4. 用户体验改善案例_用户体验案例研究:建立更好的体验(重新设计“和平航空”网站)...
  5. 201771010137 赵栋 《第十二周学习总结》
  6. t3-财务通计算机名称,用友T3用友通财务软件操作方法
  7. sigmoid画图_博弈画图软件(Window版和MAC版)
  8. 你知道PMU与PMU的区别吗?
  9. Python 学习笔记 -- pickle模块,如何腌制泡菜(入门级)
  10. ACP相比AWS哪个更具有优势
  11. Blender插件天空地形山水自然环境生成器 TerrainScapes V2.0
  12. 玩转树莓派 一、为你的树莓派烧录系统镜像
  13. postgresql 索引之 gin、btree_gin
  14. 隐藏通知内容什么意思_隐藏通知内容
  15. shell字符串切割 去除文件名后缀
  16. 微信小程序个人订单,微信头像用户名信息获取页面
  17. css之-各种基本图形画法总结(css3.0)
  18. 如何解决Mac上网速度很慢的问题(多种可能分析)
  19. windows LSP 实现及多个lsp兼容安装的几个坑
  20. 半波电压的研究-马赫曾德尔型

热门文章

  1. spark学习-SparkSQL-SparkSession与SparkContext
  2. express给html设置缓存,webpack+express实现文件精确缓存的示例代码
  3. redis学习-redis入门概述及简介
  4. 聊聊区块链,虽然我不挖矿!
  5. MNIST机器学习入门(二)
  6. 微信公众号开发--.Net Core实现微信消息加解密
  7. Trains 归纳法
  8. mongodb 权限设置--用户名、密码、端口
  9. 自己定义AlertDialog对话框布局
  10. 实现删除商品信息功能