微服务框架Spring Cloud介绍 Part2: Spring Cloud与微服务

标签: 微服务 框架 spring | 发表时间:2016-08-03 22:09 | 作者:
出处:http://skaka.me/

之前介绍过 微服务的概念与Finagle框架, 这个系列介绍Spring Cloud.

Spring Cloud还是一个相对较新的框架, 今年(2016)才推出1.0的release版本. 虽然Spring Cloud时间最短, 但是相比我之前用过的Dubbo和Finagle, Spring Cloud提供的功能最齐全.

Spring Cloud完全依赖于Spring Boot, 我先简单介绍下Spring Boot. Spring Boot是Pivotal在Spring基础上推出的一个支持快速开发的框架. 如果是新项目, 建议基于Spring Boot而不是Spring. 以前使用Spring的项目, 需要自己指定一大堆项目依赖, 例如依赖Spring Core, Spring MVC, Mybatis等等, Spring Boot将这些依赖都模块化好了, 你不再需要自己手动去添加多个依赖项. 另外Spring Boot默认内嵌了一个Servlet容器, 你的页面可以直接通过main方法启动访问了, 不再需要部署到单独的应用服务器中, 这样应用的开发调试都会方便很多. Spring Boot的这些特点使得它比较适合用来做微服务的基础框架, 但是要开发一个完整的微服务系统可不仅仅是从命令行启动一个web系统这么简单. Pivotal看到了这点, 推出了Spring Cloud.

Spring Cloud基于Spring Boot, 由众多的子项目组成. 例如 Spring Cloud Config是一个中心化的配置管理服务, 用来解决微服务环境下配置文件分散管理的难题, Spring Cloud Stream是一个消息中间件抽象层, 目前支持Redis, Rabbit MQ和Kafka, Spring Cloud Netflix整合了 Netflix OSS, 可以直接在项目中使用Netflix OSS. 目前Spring Cloud的子项目有接近20个, 如果要使用Spring Cloud, 务必先将子项目都了解一遍, 得知道哪些功能Spring Cloud已经提供了, 避免团队花费大量时间重复造轮子.

Spring Cloud是伴随着微服务的概念诞生的. 毫无疑问, 微服务真正落地是一项艰巨的任务. 不但是技术的变革, 也是开发方式的转变. 仅仅依靠Dubbo或Spring Cloud开发几个互相调用的服务不能算做是微服务. 一个合格的微服务系统必然包括从设计(从业务层面划分服务, 独立数据库), 到开发(选用合适的架构和工具, 解决CAP问题), 到测试(持续集成, 自动化测试), 到运维(容器化, 服务监控, 服务容错)的一系列解决方案.

我这个系列的博客就是介绍如何借助Spring Cloud和Netflix OSS, 来解决上面提到的问题. 之后的博客主要会涉及下面这些技术:
使用eureka和Netflix Ribbon进行服务注册和服务发现
使用Spring Cloud Stream, zookeeper和kafka实现分布式事务
使用hystrix实现服务隔离, 并且用hystrix dashboard和turbine监控hystrix服务
使用Spring MVC和Swagger实现REST API
使用Spring Cloud Config实现配置集中管理
使用Spring Cloud Sleuth与Zipkin实现服务监控

内容比较多, 我会分成多篇博客. 我不想泛泛地谈概念, 这样有点无趣, 对实际工作也起不到什么帮助. 我为演示这些技术的使用, 搭建了一个项目: mysteam. 我选择了一个简单的问题域, 电商系统里最基础的下单功能. 围绕下单功能, 系统拆分成了五个服务:
用户服务(user service)
账户服务(account service)
产品服务(product service)
优惠券服务(coupon service)
订单服务(order service)
下面是mysteam的架构示意图: 我们的关注点主要在Backend Services和MQ, MySQL这一部分. 服务之间通过Rest API和事件进行通信. Rest API主要用来进行一些只读等不需要事务的操作, 涉及事务的操作一般使用事件来完成. 具体怎么做后面有专门的博客来介绍.

首先, 让我们来个Hello World, 先介绍如何将mysteam下载下来并启动. 一旦涉及微服务, 项目结构和环境都会比较复杂, 我已经尽量简化了, 请系好安全带: )

1. 环境准备

JDK 8+
MySQL
kafka 0.8.22
zookeeper (可以下载, 也可以直接使用kafka自带的zookeeper)
Intellij IDEA或Eclipse (这个项目结构比较复杂, IDE能起到很大帮助)

2. 从GitHub上下载项目

需要下载两个项目:
mysteam
mysteam-config-repo
mysteam是主项目, mysteam-config-repo是配置文件存放仓库, 后面讲Spring Cloud Config的时候会用到.

3. 修改配置文件

1. 修改配置文件读取路径

假设你的mysteam-config-repo项目存放路径是 D:/mysteam-config-repo, 打开 $YOUR_PATH/mysteam/config/src/main/resources/application.yml, 找到 uri: https://github.com/sunnykaka/mysteam-config-repo这一行, 替换为 uri: file:///D:/mysteam-config-repo.(如果你是linux系统, 并且mysteam-config-repo项目存放路径是 /home/my/mysteam-config-repo, 则改为 uri: file:///home/my/mysteam-config-repo).

2. 修改kafka和zookeeper地址

打开 $YOUR_PATH/mysteam/config/src/main/resources/application.yml, 将 brokers: 192.168.239.129:9092,192.168.239.129:9093,192.168.239.129:9094修改成你的 kafka地址, 将 zkNodes: 192.168.239.129:2181修改成你的zookeeper地址. 打开 $YOUR_PATH/mysteam-config-repo/application.yml, 同样, 将 brokers: 192.168.239.129:9092,192.168.239.129:9093,192.168.239.129:9094修改成你的 kafka地址, 将 zkNodes: 192.168.239.129:2181修改成你的zookeeper地址.

3. 修改MySQL数据库地址

进入 $YOUR_PATH/mysteam-config-repo目录, 打开 account.yml, coupon.yml, order.yml, product.yml, user.yml这几个文件, 找到 datasource的配置, 将数据库的ip地址和端口, 以及用户名和密码修改成你的配置.

4. 初始化数据库

数据库初始化文件是 $YOUR_PATH/mysteam/docs/init_database.sql. 执行方法(假设你的mysteam目录是 D:/mysteam, 数据库在本机3306, 用户名密码都是root):

1
2
      cd D:/mysteam
mysql -uroot -proot < docs/init_database.sql

执行完成之后, 进入数据库应该可以看见5个数据库已经初始化好了.

5. 启动Eureka服务, Config服务, 并运行测试.

主要介绍如何在IDE中启动服务. 因为Eureka和Config服务被其他服务使用, 所以要首先启动这两个服务. 其中Eureka服务要最先启动.

1. 启动Eureka服务, 运行在1111端口

打开 $YOUR_PATH/mysteam/eureka/src/main/java/com/akkafun/eureka/EurekaApplication.java, 直接运行main方法.

2. 启动Config服务, 运行在8888端口.

打开 $YOUR_PATH/mysteam/config/src/main/java/com/akkafun/config/ConfigApplication.java, 直接运行main方法.

3. 运行EventBusTest测试.

打开 $YOUR_PATH/mysteam/user/core/src/test/java/com/akkafun/common/event/service/EventBusTest.java, 运行junit测试.

这个测试的运行时间稍长, 在我机器上需要3分钟左右. 如果测试全部通过, 代表环境OK了. 如果运行报错, 则检查下前面的步骤看看问题出在哪儿. 特别关注下kafka和zookeeper的服务是不是启动了, 并且ip是否正确.

下一篇我会介绍mysteam的maven项目结构, 以及实现用户注册功能.

相关 [微服务 框架 spring] 推荐:

微服务框架Spring Cloud介绍 Part2: Spring Cloud与微服务

- - skaka的博客
之前介绍过 微服务的概念与Finagle框架, 这个系列介绍Spring Cloud.. Spring Cloud还是一个相对较新的框架, 今年(2016)才推出1.0的release版本. 虽然Spring Cloud时间最短, 但是相比我之前用过的Dubbo和Finagle, Spring Cloud提供的功能最齐全..

微服务架构的基础框架选择:Spring Cloud还是Dubbo?

- - 程序猿DD
最近一段时间不论互联网还是传统行业,凡是涉及信息技术范畴的圈子几乎都在讨论 微服务架构. 近期也看到各大技术社区开始组织一些沙龙和论坛来分享Spring Cloud的相关实施经验,这对于最近正在整理Spring Cloud相关套件内容与实例应用的我而言,还是有不少激励的. 目前,Spring Cloud在国内的知名度并不高,在前阵子的求职过程中,与一些互联网公司的架构师、技术VP或者CTO在交流时,有些甚至还不知道该项目的存在.

微服务框架-基础框架

- - 人月神话的BLOG
上面一篇文章对SpringBoot框架做了一下简单验证,在文中也写到SpringBoot重点还是在单个微服务模块的开发,已经对于微服务接口开放的便捷性上,而对于微服务基础架构和管控治理层面没有太多支持. 对于微服务基础框架可以看作是微服务治理架构的核心内容,包括了对微服务模块的全生命周期管理能力,这个能力包括了微服务网关APP,DevOps,Docker和云集成,安全,负载均衡,服务注册和发现等诸多能力.

微服务应用-基于Spring Cloud和Docker构建电影推荐微服务

- - CSDN博客推荐文章
使用Spring Cloud和Docker构建电影推荐微服务. 如果你对云应用很了解,可以直接移步下载运行项目(https://github.com/kbastani/spring-cloud-microservice-example),或跳转到部署步骤,. 本博客系列将向你介绍一些使用Spring Cloud和Docker构建微服务平台的基本概念.

微服务框架和工具大全

- - IT瘾-geek
引言:不去重新发明轮子总是更好的. 本文探讨了14个已经可用并能提供使微服务的开发和部署更容易的平台、框架和功能. 本文还补充了每个工具将如何有助于建立良好的微服务架构的简要概述.   在《Java微服务》一书中,我们使用 Spring Cloud,它提供使微服务非常容易地开发所需的所有工具和平台.

Spring Cloud Netflix构建微服务入门实践

- - 简单之美
在使用Spring Cloud Netflix构建微服务之前,我们先了解一下Spring Cloud集成的Netflix OSS的基础组件Eureka,对于Netflix的其他微服务组件,像Hystrix、Zuul、Ribbon等等本文暂不涉及,感兴趣可以参考官网文档. 这里,我们用最基础的Eureka来构建一个最基础的微服务应用,来演示如何构建微服务,了解微服务的基本特点.

使用Spring Cloud和Docker构建微服务架构

- - Oopsguy
原文: https://dzone.com/articles/microservice-architecture-with-spring-cloud-and-do. 作者:Alexander Lukyanchikov. 如何使用Spring Boot、Spring Cloud、Docker和Netflix的一些开源工具来构建一个微服务架构.

Spring Cloud 微服务的那点事 - CSDN博客

- -
微服务的概念源于2014年3月Martin Fowler所写的一篇文章“Microservices”. 微服务架构是一种架构模式,它提倡将单一应用程序划分成一组小的服务,服务之间互相协调、互相配合,为用户提供最终价值. 每个服务运行在其独立的进程中,服务与服务间采用轻量级的通信机制互相沟通(通常是基于HTTP的RESTful API).

在微服务领域Spring Boot自动伸缩如何实现

- - IT瘾-tuicool
自动伸缩是每个人都想要的,尤其是在微服务领域. 让我们看看如何在基于Spring Boot的应用程序中实现. 我们决定使用 Kubernetes、 Pivotal Cloud Foundry或 HashiCorp's Nomad等工具的一个更重要的原因是为了让系统可以自动伸缩. 当然,这些工具也提供了许多其他有用的功能,在这里,我们只是用它们来实现系统的自动伸缩.

实用技巧:Spring Cloud中,如何优雅下线微服务?

- - 周立的博客 - 关注Spring Cloud、Docker
在生产环境中,服务的上下线是不可避免的,我们希望能够优雅地下线微服务. 本文基于Spring Boot 2.x + Spring Cloud Finchley讲解实际项目中优雅下线服务的四种方式,并探讨各方式的优缺点. 注:Spring Boot 1.x + Spring Cloud Edgware及之前的方式相同,但配置有区别,本文不做讨论.