To Top
首页 > 常用平台 > 正文

微服务

标签:微服务, microservices


目录

微服务是一种工程方法,聚焦在将应用拆解为具备良好接口设计单一功能的模块集上。模块集可以独立部署,由掌管整个生命周期小团队维护。

微服务最小化了人与人之间的沟通和协作,进而减小应用范围和变更的风险

抽几个来讲一下:

  • 单一功能:一个服务聚焦一个”类型的”功能上
  • 良好接口设计:服务间的通信依赖接口,简单清晰的接口是基础
  • 独立:服务具备独立运行工作的能力,包括流水线、监控、上线等
  • 整个生命周期:团队负责从开发-测试-staging-部署-维护的整个阶段
  • 语言无关:服务间通信使用语言无关的API,通常由RESTful的接口、RPC等实现
  • 有限上下文:松耦合,服务单元不需要了解其他服务单元如何运作

随着时间演进,大型、复杂的单体应用逐步演化出多层架构(MVC等),但按照业务功能的分层仍然笨拙、复杂、难以控制。

从单体服务迁移成微服务

核心就是面向业务拆分服务

设计时考虑失败

  • 熔断机制
    • 设计初衷是保证一个服务故障不会影响整个系统
    • 当某个服务调用失败比例提高,合理的使用其他方式提供服务
  • 隔离
    • 单个服务造成的负载问题不影响其他服务
    • 设计服务的资源用量

去中心化数据管理

单体应用的事务管理更容易。相较ACID,微服务架构更偏重BASE

  • BASE
    • BA:Basically Available, 基本可用
    • S:Soft state,无状态
    • E:Eventual consistency,最终一致性。中间可以失败重试,但最终结果要保持一致。
  • 尽可能的避免分布式事务,因为BASE还是会有各种坑
  • 理想情况下每个微服务单元管理自己的数据

服务发现

  • 微服务架构要求服务可靠和容错
  • 云计算和容器化的微服务,服务配置动态化。新服务单元创建后,需要网络中的其他服务快速找到并相互调用
  • 使用注册服务中心管理服务状态(例如使用zk,etcd等搞一个配置中心)
  • 使用服务内通信设置,更少的依赖外部环境:IP\域名\hostname...

服务通信

  • API调用
    • HTTP RESTful API
  • RPC
  • 消息机制:mq,劣势是实时性,优势是可以延迟处理

k8s+微服务

SaaS的12要素

https://12factor.net/zh_cn/

  • 基准代码:一分代码多处部署
  • 依赖:显示声明依赖关系
  • 配置:在环境中存储配置
  • 后端服务:把后端服务当做附加资源
  • 构建、发布、运行:严格分离构建和运行
  • 进程:一个或多个无状态进程运行应用
  • 端口绑定:通过端口绑定提供服务
  • 并发:通过进程模型进行扩展
  • 易处理:快速启动和优雅终止可最大化健壮性
  • 开发与线上环境等价:尽可能的保持开发,预发布,线上环境相同
  • 日志:把日志当作事件流
  • 管理进程:后台管理任务当作一次性进程运行

Kubernetes的设计适合微服务

  • 服务发现Service
  • 服务编排与弹性伸缩
  • 统一配置中心:对于配置中心,K8S 提供了 configMap,可以在容器启动的时候,将配置注入到环境变量或者 Volume 里面。但是唯一的缺点是,注入到环境变量中的配置不能动态改变了,好在 Volume 里面的可以,只要容器中的进程有 reload 机制,就可以实现配置的动态下发了。
  • 统一日志与监控:统一日志和监控往往需要在 Node 上部署 Agent,来对日志和指标进行收集,当然每个 Node 上都有,daemonset 的设计,使得更容易实现
    • Container Liveness
    • Readness Probe
    • Node-Problem-Detector
  • 滚动更新

设置账号密码

echo -n "root" > username
echo -n 'root123!' > password
kubectl create secret generic user-password --from-file=username --from-file=password

原创文章,转载请注明出处!
本文链接:http://daiwk.github.io/posts/platform-microservices.html
上篇: memcached
下篇: nginx

comment here..