本文以笔者个人经历讲述关于微服务方面的技术选型和相关知识点. 微服务模式的项目从初建到上线部署应用, 每一个环节都会涉及到相当多的技术细节(上线后的性能调优更需要). 本文着重介绍一套微服务搭建流程中面临的一些技术选型, 战略性的技术方案及相关技术的简要介绍, 不做每一项技术的深入说明.
微服务简介
微服务是指开发一个单个小型的但有业务功能的服务, 每个服务都有自己的处理和轻量通讯机制, 可以部署在单个或多个服务器上. 微服务也指一种种松耦合的, 有一定的有界上下文的面向服务架构.
微服务是系统架构上的一种设计风格, 主旨是将一个原本独立的系统拆分成多个小型服务, 这些小型服务都在各自独立的进程中运行, 服务之间通过基于 HTTP/HTTPS 协议的 RESTful API 进行通信协作, 也可以通过 RPC 协议进行通信协作. 被拆分成的每一个小型服务都围绕着系统中一些耦合度较高的业务功能进行构建, 并且每个服务都维护着自身的数据存储, 业务开发, 自动化测试案例以及独立部署机制. 由于有了轻量级的通信协作基础, 所以这些微服务可以使用不同的语言来编写.
微服务的优点
每个微服务都很小, 这样能够聚焦一个指定的业务功能或业务需求.
微服务能够被小团队单独开发, 这个小团队是 2 到 5 人的开发人员组成.
微服务是松耦合的, 是有功能意义的服务, 无论是在开发阶段或部署阶段都是独立的.
微服务能使用不同的语言开发, 如 Java,Python,PHP,C# 等.
微服务允许容易且灵活的方式集成自动部署, 通过持续集成工具, 如 Jenkins, Travis CI 等工具.
一个团队的新成员能够更快投入生产.
微服务易于被一个开发人员理解, 修改和维护, 这样小团队能够更关注自己的工作成果. 无需通过合作才能体现价值.
微服务方便融合最新技术.
微服务只是业务逻辑的代码, 不会和 html,CSS 或其他界面组件混合.
微服务能够即时被要求扩展.
微服务能部署中低端配置的服务器上.
易于和第三方应用系统集成.
每个微服务都有自己的存储能力, 可以有自己的数据库, 也可以有统一数据库.
微服务技术选型
前几年较为火的微服务技术有阿里的 Dubbo 方案. 后面又出现了 Spring 体系下的微服务方案. 本文主要介绍 Spring 体系下的微服务技术选型方案.
构建一套微服务最基本的是需要搭建网关, 注册中心, 开发具体实现业务功能的服务. 对于各个微服务之间的通信, 可通过 Feign 方案处理. 具体搭建一套微服务技术选型可参考如下方案:
不同的技术选择应用的场景不同:
网关: 若整个公司业务都基于 java 开发, 可以直接使用 Spring Gateway 做网关. 若还存在其他的开发语言, 也可选择 kong 网关模式.
注册中心: 基于 java 开发, Spring 体系下可直接用 Spring Eureka. 若还存在其他语言编写的服务, 可使用 Consul.
微服务搭建: 各自语言都可以搭建. 若采用 java 开发, 可参考 Spring boot 方案搭建微服务.
持续集成的方案, 三种都可以. 若基于 java 开发, 第一种最为传统, 运维人员或开发人员工作更多, 需编写启动脚本, 使用 jdk 命令启动 java 程序. 建议使用第二种方案. 第三种方案操作更为简便, 但需用阿里云的产品.
Spring Boot 项目构建: 采用 Spring Boot 模式搭建微服务项目时, 对于 Maven 项目 pom.xml 配置文件的使用需注意 pom 文件配置单项目模式和项目聚合模式的区别. 对于网关, 注册中心可采用单项目模式. 但在搭建真正业务的服务时, 建议采用父子级项目聚合的方式. 笔者最初做微服务开发时, 采用了单项目的模式, 当开发了多个业务的微服务后, 单项目模式在引用依赖项目版本, 管理项目时极为不便.
微服务相关知识点
本文针对 Spring 体系下微服务常用的几个知识点做简要说明, 具体细节, 原理, 如何应用可通过关键词搜索详细了解.
Spring Boot
Spring Boot 是由 Pivotal 团队提供的全新框架, 其设计目的是用来简化新 Spring 应用的初始搭建以及开发过程. 该框架使用了特定的方式来进行配置, 从而使开发人员不再需要定义样板化的配置.
Spring Boot 的核心思想就是约定大于配置, 一切自动完成. 采用 Spring Boot 可以大大的简化开发模式, 通过组件的模式集成常用的框架.
Spring Cloud
Spring Cloud 是一系列框架的有序集合. 它利用 Spring Boot 的开发便利性巧妙地简化了分布式系统基础设施的开发, 如服务发现注册, 配置中心, 消息总线线, 负载均衠, 断路器, 数据监控等, 都可以用 Spring Boot 的开发风格做到一键启动和部署. Spring 并没有重复制造轮子, 它只是将目前各家公司开发的比较成熟, 经得起实际考验的服务框架组台起来, 通过 Spring Boot 风格进行再封装屏蔽掉了复杂的配置和实现原理, 最终给开发者留出了一套简单易懂, 易部署和易维护的分布式系統开发工具包.
微服务是可以独立部署, 水平扩展, 独立访问 (或者有独立的数据库) 的服务单元, Spring Cloud 就是这些微服务的大管家, 采用了微服务这种架构之后, 项目的数量会非常多, Spring Cloud 做为大管家就需要提供各种方案来维护整个生态.
Spring Cloud 就是一套分布式服务治理的框架, 既然它是一套服务治理的框架, 那么它本身不会提供具体功能性的操作, 更专注于服务之间的通讯, 熔断, 监控等. 因此就需要很多的组件来支持一套功能.
Spring Cloud 的子项目, 大致可分成两类, 一类是对现有成熟框架 "Spring Boot 化" 的封装和抽象, 也是数量最多的项目; 第二类是开发了一部分分布式系统的基础设施的实现, 如 Spring Cloud Stream 扮演的就是 kafka, ActiveMQ 这样的角色.
Spring Cloud Eureka
Spring Cloud Eureka 是 Spring Cloud Netflix 项目下的服务治理模块. 而 Spring Cloud Netflix 项目是 Spring Cloud 的子项目之一, 主要内容是对 Netflix 公司一系列开源产品的包装, 它为 Spring Boot 应用提供了自配置的 Netflix OSS 整合. 通过一些简单的注解, 开发者就可以快速的在应用中配置一下常用模块并构建庞大的分布式系统. 它主要提供的模块包括: 服务发现 (Eureka), 断路器(Hystrix), 智能路由(Zuul), 客户端负载均衡(Ribbon) 等.
Spring Cloud Gateway
Spring Cloud Gateway 是 Spring 官方基于 Spring 5.0,Spring Boot 2.0 和 Project Reactor 等技术开发的网关, Spring Cloud Gateway 旨在为微服务架构提供一种简单而有效的统一的 API 路由管理方式. Spring Cloud Gateway 作为 Spring Cloud 生态系中的网关, 目标是替代 Netflix ZUUL, 其不仅提供统一的路由方式, 并且基于 Filter 链的方式提供了网关基本的功能, 例如: 安全, 监控 / 埋点, 和限流等.
Spring Cloud Feign
Feign 是一个伪客户端, 即它不做任何的请求处理. Feign 通过处理注解生成 request, 从而实现简化 HTTP API 开发的目的, 即开发人员可以使用注解的方式定制 request API 模板, 在发送 http request 请求之前, feign 通过处理注解的方式替换掉 request 模板中的参数, 这种实现方式显得更为直接, 可理解.
Feign 封装了 Http 调用流程, 更适合面向接口化的编程习惯. 在服务调用的场景中, 我们经常调用基于 Http 协议的服务, 而我们经常使用到的框架可能有 HttpURLConnection,Apache HttpComponnets,OkHttp3 ,Netty 等等, 这些框架在基于自身的专注点提供了自身特性. 而从角色划分上来看, 他们的职能是一致的提供 Http 调用服务.
本文的重点是你有没有收获与成长, 其余的都不重要, 希望读者们能谨记这一点. 同时我经过多年的收藏目前也算收集到了一套完整的学习资料, 包括但不限于: 分布式架构, 高可扩展, 高性能, 高并发, Jvm 性能调优, Spring,MyBatis,Nginx 源码分析, Redis,ActiveMQ,,Mycat,Netty,Kafka,MySQL,Zookeeper,Tomcat,Docker,Dubbo,Nginx 等多个知识点高级进阶干货, 希望对想成为架构师的朋友有一定的参考和帮助
喜欢这篇文章的朋友可以点个喜欢, 也可以关注一下我的个人专题: Java 成长之路
需要更详细思维导图和以下资料的可以加一下技术交流分享群:"708 701 457" 免费获取
来源: http://www.jianshu.com/p/e897df3f2887