一个自己实践的微服务全家桶,希望能提供帮助

前奏

创业半年多,中间做过一个app。各种各样的原因,最后虽然上线了,但是没有推广,每天百十来个用户,也不打算迭代了。我们后台使用的是基于spring-boot、spring-cloud的微服务框架。框架包含了spring-cloud全家桶的大部分组件,我自己花时间,重新把这些框架类的内容整理了一遍,构建了一个简单的场景,开源出来,希望对那些想学习 或者 快速搭建自己的微服务框架的同学能提供帮助。

代码地址(附上原文地址):https://github.com/chxfantasy/spring-cloud-demo
截图:

代码目录

如果对微服务本身不太太了解的话,或者不知道为什么需要微服务的话,请参考原来的一篇文章:我也想写篇微服务的文章,以及微服务的优缺点

如果对微服务里面的各个组件不太熟悉的话,可以参考这一篇文章:spring cloud从看不懂到放弃

项目介绍

  1. 这仅仅是spring-cloud微服务框架的一个demo,可以完整运行。可能你初看到这里,会觉得这个项目目录太tm复杂了,确实,微服务要做的就是解耦、轻量化。这里面包含的组件和内容有:
    • spring cloud eureka,服务注册和服务发现
    • spring cloud config,动态配置项
    • ribbon,客户端负载均衡
    • feign,
    • hystrix,熔断
    • turbine
    • Spring Cloud Starters
    • 同一个服务中的多数据库支持(AOP)
    • 全链路traceId追踪
    • velocity 前端模板
    • mybatis, pageHelper (分页), druid (连接池)
    • redis(序列化采用的是jdk默认序列化方案)
    • slf4j & logback(及其配置)
    • 国际化配置
    • 全局错误信息catch
    • 线程池
    • 服务健康检查, 服务全链路健康检查
  2. 代码的业务是:首先有一个登录页面,用户登录以后,能看到一个微博(moment)列表,同时也可以添加微博。在每个微博的最右边,可以看到每个微博的评论列表,也能添加评论。前端代码写的非常粗糙。。。 如果你真的运行了,求不吐槽。
  3. 这里不谈根据业务的需求去选择是否微服务化,也不争辩什么时候该用什么样的框架,我这里只是把我们app后端的代码,抽象成一个代码库,希望能为你提供帮助。我们产品上线2个多月,后端基本没有出过问题(也跟量小有关系)。

运行

  1. 首先,你在本地需要有一个redis和mysql,redis默认启动就可以。数据库表的创建语句见下:
create database test;

CREATE TABLE `account` (
  `user_id` varchar(127) NOT NULL DEFAULT '',
  `user_name` varchar(127) NOT NULL DEFAULT '',
  `password` varchar(127) NOT NULL DEFAULT '',
  `gmt_created` datetime NOT NULL,
  `gmt_modified` datetime DEFAULT NULL,
  `is_deleted` tinyint(1) NOT NULL DEFAULT '0',
  PRIMARY KEY (`user_id`),
  KEY `index_user_id` (`user_id`) KEY_BLOCK_SIZE=10
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

CREATE TABLE `moment` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `user_id` varchar(127) COLLATE utf8mb4_unicode_ci NOT NULL,
  `content` text COLLATE utf8mb4_unicode_ci,
  `gmt_created` datetime NOT NULL,
  `gmt_modified` datetime DEFAULT NULL,
  `is_deleted` tinyint(1) DEFAULT '0',
  PRIMARY KEY (`id`),
  KEY `index_user_id` (`user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

create database test2;

CREATE TABLE `comment` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `moment_id` bigint(20) unsigned NOT NULL,
  `content` text COLLATE utf8mb4_unicode_ci,
  `gmt_created` datetime NOT NULL,
  `gmt_modified` datetime DEFAULT NULL,
  `is_deleted` tinyint(1) DEFAULT '0',
  PRIMARY KEY (`id`),
  KEY `index_moment_id` (`moment_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
  1. 系统环境需要Java 8 和 maven 3及以上
  2. 运行命令如下 (需要按顺序运行每个模块):
    cd spring-cloud-parent
    mvn clean install -DskipTests
    cd ../spring-cloud-client
    mvn clean install -DskipTests
    cd ../spring-cloud-starter
    mvn clean install -DskipTests
    
    cd spring-cloud-eureka
    mvn clean spring-boot:run
    
    cd spring-cloud-account
    mvn clean spring-boot:run
    
    cd spring-cloud-biz
    mvn clean spring-boot:run   
    
    cd spring-cloud-gateway
    mvn clean spring-boot:run
  1. 浏览器中打开 http://127.0.0.1:7001/index

代码解释

  1. 代码中的依赖关系见下图:


    代码依赖关系
  2. spring-cloud-parent
    • 是一个空的mvn project, 包含了一些被其他项目所需要的公共的依赖。我这里创建parent,仅仅是因为我不想把很多相同的依赖在spring-cloud-eureka、spring-cloud-biz、spring-cloud-account和spring-cloud-gateway这几个项目中重复写一遍,所以,一般微服务project都集成spring-cloud-parent。嗯,懒惰是人类的第一生产力。
  3. spring-cloud-starter
    • 是一个我创建的spring starter, 里面包含的是一些公共的bean,和一些公共的bean配置,比如国际化locle配置、缓存CacheService配置,messageConvertor配置等,spring-cloud-biz、spring-cloud-account和spring-cloud-gateway等微服务都需要依赖和共用这些基础配置。
  4. spring-cloud-client
    • 是一个公共依赖,这里包含的是一个util类,以及多个模块需要共同使用的、和数据库表对应的Java model.
  5. spring-cloud-eureka
    • 是一个服务注册和服务发现中心,需要集群化。代码里,我把spring-cloud-config动态配置项也集成在这里面了。服务发现的心跳检测时间,也从15s改到了5s,这对于快速发现节点故障很有作用。
  6. spring-cloud-account
    • 是整个工程的账号服务模块。对于一个大型的系统来讲,单独的账号服务系统是很有必要解耦出来的。
  7. spring-cloud-biz
    • 是实际的业务模块,包括发微博模块和评论模块。整个代码中动态使用了两个数据库,我这里对数据库的切分只是简单从业务上切分,既:微博在一个库中,评论在另外一个库中,同时写了一个@TargetDataSource注解,方便动态切换数据库。其实对于分库、分表、读写分离,代码都是类似的。
  8. spring-cloud-gateway
    • 是整个系统的网关服务,所有来自端上的请求,包括app或者web页面,都需要先到网关,由网关做过处理之后再转发给其他服务。比如,网关需要处理登录状态问题,需要处理上传文件问题,需要做一些过滤,以及其他多种切面上的事情。
  9. 如果需要停止某个微服务,如spring-cloud-account、spring-cloud-biz或者spring-cloud-gateway, 运行命令: curl -H 'Accept:application/json' -X POST 'http://127.0.0.1:${management.port}/shutdown', 这条命令会先让这个微服务在注册中心下掉自己,然后再停掉自己。

部署

  1. 服务的部署如下图:


    部署
  2. 需要注意的就是,整个系统只有gateway是可以被端访问到的,其他服务的所有接口,都应该只能在内网访问,这也可以让其他服务不做很强的权限验证。
  3. 代码里面细节很多,比如cache如何使用, GlobalCacheHelper,hystrix的自定义设置,全链路traceId的设置,信息的国际化、健康检查(去检查了cache、db等其他项,还检查了每一项的返回时间),这里没办法展开一一讲解。有问题请直接github上开issue,或者公众号联系我:不如假如。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,033评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,725评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,473评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,846评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,848评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,691评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,053评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,700评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,856评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,676评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,787评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,430评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,034评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,990评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,218评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,174评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,526评论 2 343

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,598评论 18 139
  • 软件是有生命的,你做出来的架构决定了这个软件它这一生是坎坷还是幸福。 本文不是讲解如何使用Spring Cloud...
    Bobby0322阅读 22,607评论 3 166
  • 转自:https://my.oschina.net/CraneHe/blog/703181 最近一直在关注关于微服...
    艾尔温阅读 2,677评论 0 52
  • 有一个人 脸上常挂着微笑 无论痛苦或是悲伤 笑容从未消失 别人都很羡慕他 甚至有人嫉妒他过得那么幸福 就算是伤心难...
    杪夏蕶阅读 307评论 0 0
  • (一) 有些人你以为此生都再无交集了,却会在平平常常的一个日子里,展开某种奇异的联系。 如果这是宇宙的力量,那简直...
    张成薇阅读 312评论 0 1