近段时间离职,跟同事们讲解我之前所做的微服务相关产品,对于同事们提出的问题,做了如下整理出来,加上自己的理解,分享出来跟大家一起探讨下:

问题预览

  1. 我为什么要换微服务?能给我带来什么好处?
  2. 从交互上来看,单体应用在处理业务实体之间的关系,直接由框架搞定,如java的hibernate等,而使用微服务,还要去花时间去重新整理甚至重构业务结构.
  3. 微服务测试起来比较麻烦:首先微服务根据不同的业务实体划分资源服务,那么也许有些业务的操作,会涉及多个微服务,那么测试微服务的话,就需要将所有的相关服务都启动完成,才可以进行测试。
  4. 微服务一般对外是restful服务,为了保证安全性,开销也是比较大的:一方面服务内部可能每次访问都需要安全检查,会降低效率;另一方面内部访问开启https,在证书部署维护方面也会增加压力
  5. 一般情况下,很多服务都存在类似session等数据存储在内存中,而这些session只在同一WebServer中存在,一般无法进行多实例共享(当然也有共享的方案,但是需要相对复杂的集群设计),该如何解决这些数据的问题呢?
  6. 接着上个问题,微服务的使用场景中,基本都需要实现单个服务多个实例的场景,以实现高可用,那么问题来了,我对单个服务运行了10个实例,那么该如何知道服务该向哪个服务发起访问呢?
  7. 接着上个问题,当我运行10个WebServer的时候,在主机上需要使用10个端口进行对应,而服务多了以后,对于端口的消耗和管理也是个比较大的麻烦
  8. 接着上个问题,一般的应用,我们可以使用haproxy来做代理,那么就需要每增加或者修改一次实例,就需要修改haproxy的配置,管理上的消耗也会成为比较大的麻烦,并且还有可能出错
  9. 对于众多的微服务实例,服务较多的至少可以达到数百个甚至数千个,监控和管理上,也将比较大的挑战
  10. 上面提到的很多软件,都是比较零散的软件堆叠出来的服务,有没有比较好的成套的解决方案?

问题及自己的理解

1. 我为什么要换微服务?能给我带来什么好处?

  1. 可以解决复杂性的问题,在功能不变的情况下,分解为多个相互协作的微服务,通过rest API定义边界,这样极大易于开发、理解和维护。

  2. 微服务架构是的每个服务可以由专门的开发团队或者个人开发者进行开发,开发者可以自由选择技术,不必受制于规定的技术和框架,只要API服务协议好交互方式即可(如restful)。这样即使重新技术过时的微服务模块儿或者重写以前的代码,也不是很困难。

  3. 微服务架构模式使得每个微服务独立部署,且每个服务独立扩展,开发者不再需要协调其它服务部署对本服务的影响。微服务架构模式使得持续化部署成为可能。

2. 从交互上来看,单体应用在处理业务实体之间的关系,直接由框架搞定,如java的hibernate等,而使用微服务,还要去花时间去重新整理甚至重构业务结构.

首先,在使用框架的同时,也已经受制于框架,甚至是开发语言的选择,单体应用下,看似方便,可是业务实体之间的关系太过于固化,当有一个业务实体需要改变,则整个应用相当于发布了一个新的版本。这种情况对于不care更新停止程序的客户来说是无所谓,可是对于服务更新停止程序敏感性比较强甚至不允许停止程序的公司来说,无疑是个灾难。所以使用微服务不是必须的,而是在适当的实际,架构适应应用场景的一种改变。

3. 微服务测试起来比较麻烦:首先微服务根据不同的业务实体划分资源服务,那么也许有些业务的操作,会涉及多个微服务,那么测试微服务的话,就需要将所有的相关服务都启动完成,才可以进行测试。

微服务测试起来麻烦是没有任何疑问的,不过微服务大多采用restful服务,这为微服务的测试提供了相对的便利性(测试restful接口的工具还是挺多的)。对于微服务带来的便利性,增加这点压力还是可以容忍的。

4. 微服务一般对外是restful服务,为了保证安全性,开销也是比较大的:一方面服务内部可能每次访问都需要安全检查,会降低效率;另一方面内部访问开启https,在证书部署维护方面也会增加压力

首先,一般微服务外部都是需要有API GateWay的,由API GateWay来保证外部访问的安全性,而内部访问,可以省去https和安全检查,仅保留必要的用户信息即可。

5. 一般情况下,很多服务都存在类似session等数据存储在内存中,而这些session只在同一WebServer中存在,一般无法进行多实例共享(当然也有共享的方案,但是需要相对复杂的集群设计),该如何解决这些数据的问题呢?

一般情况下,对于绝大部分有状态服务,在设计之初,就会考虑有状态服务的状态转移等工作,假设我们有服务存在session,那么这些session信息,可以转嫁存储在一套redis集群中,这样子就可以多个实例都访问redis,相当于状态由redis进行处理了。

6. 接着上个问题,微服务的使用场景中,基本都需要实现单个服务多个实例的场景,以实现高可用,那么问题来了,我对单个服务运行了10个实例,那么该如何知道服务该向哪个服务发起访问呢?

一般情况下,我们可以使用haproxy之类的服务,将当期服务的所有实例进行代理,可以先对单个服务单点访问,其他服务做备份,又可以使用haproxy的负载均衡,使请求平均分发到各个服务中

7. 接着上个问题,当我运行10个WebServer的时候,在主机上需要使用10个端口进行对应,而服务多了以后,对于端口的消耗和管理也是个比较大的麻烦

可以使用docker来解决,在docker的使用中,一个服务对应一个镜像,而基于一个镜像可以启动多个容器,而每个容器都可以使用统一的内部端口,不同的容器名称,我们使用的haproxy也在docker中运行,通过docker内部网络访问各个服务,这样就解决了端口问题。

8. 接着上个问题,一般的应用,我们可以使用haproxy来做代理,那么就需要每增加或者修改一次实例,就需要修改haproxy的配置,管理上的消耗也会成为比较大的麻烦,并且还有可能出错

对于这个问题,也有解决方案:首先我们可以去尝试使用如下一套解决方案“docker-swarm-consul-haproxy”,Swarm是一个用于创建Docker主机(运行Docker守护进程的服务器)集群的工具,consul用来服务发现及配置中心,haproxy则用来进行代理服务

9. 对于众多的微服务实例,服务较多的至少可以达到数百个甚至数千个,监控和管理上,也将比较大的挑战

无论是做以往的单体应用、SOA还是微服务,服务监控和管理都是必不可少的,对于监控,目前有比较好的容器监控开源程序,如:Prometheus、 cAdvisor等;管理方案可以使用简单的shipyard,复杂的可以使用kubernetes的

10. 上面提到的很多软件,都是比较零散的软件堆叠出来的服务,有没有比较好的成套的解决方案?

整体的解决方案是有的,就是个人感觉略重(我个人搭建的一些服务,没有用kubernetes,而是使用了非常简单compose+swarm)。这个方案就是使用kubernetes(基于Docker),下面可以简单描述下我这边是怎么使用kubernetes来实现微服务的:
1. 首选我的微服务程序都是无状态的或者经过状态转移过的
2. 对于服务发现,以往我们用consul,这里我没有去做服务发现和服务注册,而是使用kubernetes的ReplicationController来保证我的微服务实例数量(系统会自动维护)
3. 对外的代理以前用haproxy,而现在使用kubernetes的service来替代,kubernetes自动处理各个微服务实例的负载及请求的分发,我们只需要保证业务稳定即可。

相关文章链接:

  • 微服务指南走北(一):微服务是什么
  • 微服务指南走北(二):微服务架构的进程间通信(IPC)
  • 微服务指南走北(三):Restful API 设计简述
  • 微服务指南走北(四):你不愿意做微服务架构的十个理由
  • 微服务指南走北(五):什么样的服务才可以说是微服务?

by 刘迎光@萤火虫工作室
OpenBI交流群:495266201
MicroService 微服务交流群:217722918
mail: liuyg#liuyingguang.cn
博主首页(==防止爬虫==):http://blog.csdn.net/gsying1474

微服务指南走北(四):你不愿意做微服务架构的十个理由相关推荐

  1. 微服务指南走北(五):什么样的服务才可以说是微服务?

    最近有朋友提出了问题:"是不是拥有了服务发现就是微服务了?",对于这个问题,很难回答,毕竟微服务的定义在每个人心里都是不一样的,就像"互联网思维"一样,我们说得 ...

  2. 华为帐号服务学习笔记(四):Authorization Code模式服务端开发

    笔者在<华为帐号服务学习笔记(二):OAuth2.0协议详解>中已经给大家介绍了Authorization Code模式是需要有后台服务器才能使用的,并且在<华为帐号服务学习笔记(三 ...

  3. 微服务指南和实施要素

    一.什么是微服务化和组件化?为什么要做微服务? 1. 什么是微服务 顾名思义,微服务得从两个方面去理解,什么是"微".什么是"服务",所谓服务,就是IT系统提供 ...

  4. 微服务详解(四):领域驱动设计

    微服务详解(一):概述 微服务详解(二):解决方案 微服务详解(三):设置开发环境 微服务详解(四):领域驱动设计 微服务详解(五):实现微服务 微服务详解(六):部署与测试 微服务详解(七):微服务 ...

  5. springboot 搭建分布式_爱了!阿里巴巴内部出品“SpringBoot+微服务指南”,理论与实战...

    爱了爱了,Alibaba出品"Springboot+微服务架构指南",理论与实战结合,双管齐下! 有幸从一位朋友那里得到Alibaba内部出品强推的"SpringBoot ...

  6. 通过Dapr实现一个简单的基于.net的微服务电商系统(四)——一步一步教你如何撸Dapr之订阅发布...

    之前的章节我们介绍了如何通过dapr发起一个服务调用,相信看过前几章的小伙伴已经对dapr有一个基本的了解了,今天我们来聊一聊dapr的另外一个功能--订阅发布 目录: 一.通过Dapr实现一个简单的 ...

  7. 开发指南专题十四:JEECG微云快速开发平台MiniDao 介绍

    开发指南专题十四:JEECG微云快速开发平台MiniDao 介绍 13.MiniDao 介绍 13.1.  MiniDao简介及特征 MiniDao是Jeecg自己的持久化解决方案,具备了Hibern ...

  8. 《深入理解 Spring Cloud 与微服务构建》第四章 Dubbo

    <深入理解 Spring Cloud 与微服务构建>第四章 Dubbo 文章目录 <深入理解 Spring Cloud 与微服务构建>第四章 Dubbo 一.Dubbo 简介 ...

  9. Spring Cloud之(四)基于RestTemplate的微服务调用

    四.基于RestTemplate的微服务调用 前面我们已经成功的把第一个小案例跑起来了,其中消费者使用了RestTemplate来调用提供者提供的微服务,下面就来详细的说明一下RestTemplate ...

最新文章

  1. 中端存储趋势:x86、SSD缓存和虚拟化
  2. 做个游戏:设计代码生成特定的调用堆栈
  3. 【自动驾驶/opencv】32.交通灯颜色提取的难点
  4. Linux内存管理Linux Memory Management Notes
  5. BLE安全机制从入门到放弃
  6. 用JavaScript语言判断一个三位数是否为水仙花数
  7. 消息中间件核心实体(1)
  8. R语言第十一讲 决策树与随机森林
  9. java 8和jdk区别_java-8 – JDK 6和JDK8之间的Java Collection差异
  10. MySQL教程(十一)—— 操作数据表中的记录
  11. 开源无疆!CSDN 董事长蒋涛、GitHub 副总裁 Thomas Dohmke 即将重磅对话
  12. colorpicker插件和使用(直接能用真美好)
  13. 是否忘记了向源中添加 stdafx.h
  14. 电脑知识:DOS命令使用
  15. 电脑桌面便签软件怎么新建内容?
  16. 终极卸载PC奇安信天擎
  17. 自定义iTerm2主题配置(iTerm2-Color-Schemes)
  18. 中国异丁酸酐(CAS+97-72-3)行业市场供需与战略研究报告
  19. 全转录组关联分析(TWAS)简介
  20. 列车车次查询系统php源码,火车票务系统源代码(含数据库)

热门文章

  1. 如何调动员工情绪提高员工的积极性
  2. C++实现软件版本号比较
  3. “星链”计划给国际通信运营商带来的挑战和机遇
  4. Review代码审核建议
  5. 解决VUE自定义拖拽指令时 onmouseup 与 click事件冲突
  6. 乌合之众 -- 群体心理
  7. 查看服务器出口ip,公网ip
  8. rk3128网络机顶盒一些测试结果
  9. 华为否认鸿蒙为噱,华为否认鸿蒙为噱头 鸿蒙系统手机会上市吗
  10. 基于UML网络教学管理平台模型的搭建