Go chassis云原生微服务开发框架应用编程实战

目录
  • 什么是Go chassis
  • 文章目标
  • 诞生背景
  • 如何快速开发一个微服务
  • 统一治理和协议模型
  • 可扩展的处理链条:handler chain as middleware
  • 不只是API,通过配置简化开发过程
    • 插件化

什么是Go chassis

go chassis是一个go语言微服务开发框架,专注于云原生应用的开发主要的使用场景是云服务开发。go chassis将云服务开发过程中沉淀的能力融入到了开发框架中,以帮助开发团队快速编写云原生应用。

文章目标

本文介绍我们的设计理念和目标,为何go chassis会诞生。后面的系列文章会着重介绍使用方法,项目实战。对于微服务架构模式,云原生要素,为什么选择go语言等将不再赘述。

诞生背景

公司开发云服务,要构建健壮,韧性,安全,高可靠的云服务,必然有大量基础能力需要编写,为了加速开发,我们将这些能力便沉淀在了该框架中。为什么呢?

我们希望加速每一个组件也就是微服务的开发速度。有的人看到的只是冰山一角,真的要达成微服务架构模式的愿景,其实需要繁重的工作量。就像冰山那样,我们要将通用能力沉淀下去,能够复用。如果让各个业务团队同时照顾冰山上下,各自开发各自的,那结果将是灾难性的,企业用人成本极高。

在业务交付的过程中,各个云团队有大量的管理服务需要对接,每个团队都在写重复的代码,通过框架能力,将交付职责分离,减少开发成本:

如何快速开发一个微服务

可以跟随这个文档体验。

github.com/go-chassis/…

统一治理和协议模型

我们使用Invocation概念来统一协议描述,当协议请求到来后,go chassis会把request转换为Invocation进行治理(如负载均衡,限流,熔断,重试,金丝雀发布等),这样就可以允许任意的协议接入到go chassis,并无缝使用go chassis提供的核心功能,当前默认提供原生grpc和http两种协议的接入。

为什么会有这样的设计呢?

  • 每个协议层的优化空间非常大,用户态到内核态的调用速度本来就相对内部代码来说是很慢的,优化这一层代码很重要,RPC怎么也比http来得好。
  • 不同部门可能有私有协议诉求,那么服务治理就交给核心框架完成。协议由业务部门决定自主研发或是集成现有协议。当你发现公司内部不同部门都在开发自己的协议做自己的服务治理时,再向将业务统一一个架构,一个工具链上,将非常困难。

可扩展的处理链条:handler chain as middleware

我们以Java为例,大家在写一个拦截器或者过滤器的时候可以对请求进行处理,处理完,这个拦截器的的执行过程就结束了,那么如何达成以下目标?

1.跟踪业务执行结果指标,比如http状态码,并导出他们让prometheus收集。

2.跟踪关键的业务执行结果,审计这些信息。比如请求返回的一些结果信息

3.分布式调用链追踪,end span必须等到请求返回才能拿到。

  • 客户端调用远程服务时,也需要进行中间处理,比如客户端负载均衡,请求重试,这些不能够耦合在业务代码中

Java的答案很简单,注解。那么go呢?

我们引入了handler chain编程模型,chain中每个handler都可以拿到后面的handler的执行结果,包括业务代码的执行结果。

看下接口定义

type Handler interface {
	Handle(*Chain, *invocation.Invocation, invocation.ResponseCallBack)
	Name() string
}
// ResponseCallBack process invocation response
type ResponseCallBack func(*Response)

ResponseCallBack用于接受后置handler返回的结果,所以每一个handler处理时都可以按需定义自己的ResponseCallBack来获取后面handler甚至是业务逻辑代码的执行结果。帮助通用逻辑(即中间件)和业务逻辑彻底解耦。可以看下现在已经支持的中间件,无论限流,熔断,负载均衡,认证鉴权,审计,我们都用此机制实现:

go-chassis.readthedocs.io/en/latest/m…

将公司全部的工具链,服务治理手段,安全合规等都落入到处理链中,可快速加快研发速度,并统一规范,减少管理负担。

不只是API,通过配置简化开发过程

只举2个例子

监控

减少让开发者自己调用API的过程,将他们简化为配置项

例如可观察:

引入一行代码

import _ github.com/go-chassis/go-chassis/v2/middleware/monitoring

加上配置

handler:
  chain:
    Provider:
      default: monitoring

就可以在服务端进行监控,导出请求数,延迟等指标,大大加速开发人员效率

# HELP request_count
# TYPE request_count counter
request_count{app="default",env="",instance="",service="servicecomb-kie",version="0.1.0"} 14
# HELP request_process_duration
# TYPE request_process_duration summary
request_process_duration{app="default",env="",instance="",service="servicecomb-kie",version="0.1.0",quantile="0.5"} 3
request_process_duration{app="default",env="",instance="",service="servicecomb-kie",version="0.1.0",quantile="0.9"} 80
request_process_duration{app="default",env="",instance="",service="servicecomb-kie",version="0.1.0",quantile="0.99"} 80
request_process_duration_sum{app="default",env="",instance="",service="servicecomb-kie",version="0.1.0"} 315
request_process_duration_count{app="default",env="",instance="",service="servicecomb-kie",version="0.1.0"} 14

需要自定义指标:

err := metrics.CreateCounter(metrics.CounterOpts{
		Name:   “user_login”,
		Labels: labelsSlice,
	})
metrics.CounterAdd(“user_login”, 1, labelMap)

可信软件

公司对软件质量的高要求,需要我们编写大量的基础代码。我们也将通用的部分都落地到了框架中,通过简单的配置文件启用,不再需要不同团队重复编写代码

servicecomb:
  transport:
    failure:
      rest: http_500,http_502 #统计错误率时,例如只把500和502作为错误
    maxIdleCon:
      rest: 1024
    maxBodyBytes:
      rest: 20 #只需要指定我的服务能接受的body体大小,访问的超时时间即可不再需要各个团队维护代码。
    maxHeaderBytes:
      rest: 1 #限制http header大小
    timeout: #限制客户端超时
      rest: 30s

插件化

为了应对不同业务诉求,我们总是要考虑“可替换性”。而这个的优先级总是大于“可复用性”。这就是go chassis的插件理念。基本所有的重要组件都是插件化的,框架已经定义好标准接口,只需要开发者实现好,注册到框架中,就可以在配置文件中配置并生效了,业务开发者是完全不感知的。可以参考我们对quota组件的扩展过程,他负责资源的配额管理

go-chassis.readthedocs.io/en/latest/d…

后续将详细剖析go chassis的内部设计和特性使用。

在下一篇文章中,我将讲述go chassis如何快速开发出一个微服务。由于是系列文章,随着文章不断更新,如果有期望了解的话题,内容可以留言反馈,我会加入到后续文章中。

项目地址:

github.com/go-chassis/…

目前的用户:

  • 华为
  • 趣头条
  • Shopee
  • KubeEdge
  • ServiceComb

以上就是Go chassis云原生微服务开发框架应用编程实战的详细内容,更多关于Go chassis云原生微服务框架的资料请关注我们其它相关文章!

(0)

相关推荐

  • 详解Go语言微服务开发框架之Go chassis

    引言 https://github.com/go-chassis/go-chassis是一个微服务开发框架,而微服务开发框架带来的其中一个课题就是:当单体应用向微服务转型后,有大量的配置需要管理,而你并不希望登录到远端机器去更改配置,并重启应用,尤其是现在已经是容器的时代了,也不希望因为一个配置的变更,而发布一个新的软件包.那么分布式系统中每个进程的动态配置管理及运行时热加载就成为了一个亟待解决的问题.https://github.com/go-chassis/go-archaius为gocha

  • 微服务效率工具 goctl 深度解析

    目录 前言 goctl 的由来 1. goctl 的诞生 2. 为什么需要 goctl? 3. 怎么理解开发规范? 4. 怎么理解工程效率? 二 .goctl 的安装及功能介绍 1. 介绍 2. 安装 go get/install docker 3. 功能介绍 goctl completion 1.3.5 1.3.6 goctl migrate goctl env 1. 环境查看 2. 修改参数 3. 依赖检测/安装 goctl rpc 4. 编辑器插件 三.goctl 使用中遇到的问题 1.

  • golang微服务框架基础Gin基本路由使用详解

    目录 概述 1. 基本路由 2. 路由参数 获取URL路径全部参数 获取URL路径单个参数 获取URL中指定的参数 获取指定默认值的参数的 概述 路由是自定义url地址执行指定的函数,良好的路由定义可以对seo起到很好的效果. 1. 基本路由 gin框架封装了http库,提供了 GET.POST.PUT.DELETE.PATCH.HEAD.OPTIONS 这些http请求方式. 使用 router.method() 来绑定路由 func (group *RouterGroup) METHOD(r

  • 基于微服务框架go-micro开发gRPC应用程序

    go-micro是golang的一个微服务框架.这篇文章将介绍使用go-micro最新版本v4开发gRPC服务的方式. 1.安装protoc 这个工具也称为proto编译器,可以用来生成各种开发语言使用proto协议的代码. 下载地址:https://github.com/protocolbuffers/protobuf/releases 一般下载最新版本就行,注意要符合自己当前的操作系统. 解压后里边有个 protoc.exe ,拷贝到 GOPATH 的 bin 目录下,我这里就是 C:/Us

  • go zero微服务实战性能优化极致秒杀

    目录 引言 批量数据聚合 降低消息的消费延迟 怎么保证不会超卖 结束语 引言 上一篇文章中引入了消息队列对秒杀流量做削峰的处理,我们使用的是Kafka,看起来似乎工作的不错,但其实还是有很多隐患存在,如果这些隐患不优化处理掉,那么秒杀抢购活动开始后可能会出现消息堆积.消费延迟.数据不一致.甚至服务崩溃等问题,那么后果可想而知.本篇文章我们就一起来把这些隐患解决掉. 批量数据聚合 在SeckillOrder这个方法中,每来一次秒杀抢购请求都往往Kafka中发送一条消息.假如这个时候有一千万的用户同

  • Go chassis云原生微服务开发框架应用编程实战

    目录 什么是Go chassis 文章目标 诞生背景 如何快速开发一个微服务 统一治理和协议模型 可扩展的处理链条:handler chain as middleware 不只是API,通过配置简化开发过程 插件化 什么是Go chassis go chassis是一个go语言微服务开发框架,专注于云原生应用的开发主要的使用场景是云服务开发.go chassis将云服务开发过程中沉淀的能力融入到了开发框架中,以帮助开发团队快速编写云原生应用. 文章目标 本文介绍我们的设计理念和目标,为何go c

  • NodeJS 基于 Dapr 构建云原生微服务应用快速入门教程

    目录 安装 Dapr CLI 本地环境中初始化 Dapr 运行初始化 CLI 命令 验证容器是否正在运行 验证组件目录是否已初始化 使用 Dapr API 运行 Dapr sidecar 保存状态 获取状态 删除状态 上手实战指南 1. 服务调用 示例仓库 运行 order-processor 服务 运行 checkout 服务 查看服务调用输出 2. 状态管理 操纵服务状态 查看 order-processor 输出 3. 发布和订阅 订阅 topic 发布 topic 查看发布/订阅输出 4

  • Go 微服务开发框架DMicro设计思路详解

    目录 背景 概述 架构 设计理念 面向接口设计 会话 Session 消息 Message 协议 Proto 编码 Codec 连接 Socket 有机的组合 插件 Plugin 组件 未来展望 背景 DMicro 诞生的背景,是因为我写了 10 来年的 PHP,想在公司内部推广 Go, 公司内部的组件及 rpc 协议都是基于 swoole 定制化开发的.调研了市面上的各种框架,包括 beego,goframe,gin,go-micro,go-zero,erpc 等等,可能是我当时技术能力有限,

  • 详解多云架构下的JAVA微服务技术解析

    微服务生态 微服务生态本质上是一种微服务架构模式的实现,包括微服务开发SDK,以及微服务基础设施. 目前比较成熟的 JAVA 微服务生态包括 servicecomb(华为), spring-cloud (Pivotal), dubbo(阿里), tsf(腾讯)等.gRPC.Thrift 等也用于内部服务之间的通信,但是微服务基础设施比较欠缺. 核心的微服务基础设施包括:注册中心.配置中心.应用网关.此外,分布式事物管理.计划任务.调用链跟踪系统等也是微服务基础设施的组成部分.完整的微服务基础实施

  • SpringCloud微服务架构升级汇总

    一.背景 1.1 应用系统的架构历史 1.2 什么是微服务? 起源:微服务的概念源于 2014 年 3 月 Martin Fowler 所写的一篇文章"Microservices".文中内容提到:微服务架构是一种架构模式,它提倡将单一应用程序划分成一组小的服务,服务之间互相协调.互相配合,为用户提供最终价值. 通信方式:每个服务运行在其独立的进程中,服务与服务间采用轻量级的通信机制互相沟通(通常是基于 HTTP 的 RESTful API). 微服务的常规定义:微服务是一种架构风格,一

  • 前端云原生之微信小程序云服务配置指南

    目录 前言 创建使用云开发项目 搭建云环境 测试云服务 1. 获取openid(上传本地login云函数) 2. 自定义sum函数并创建部署 3. 上传图片 4. 前端操作数据库 5. 即时通信demo 总结 前言 如今云原生已经非常火热,很多伙伴说我们前端领域涉及到云原生么?当然了!今天就来为大家介绍我们最直白的涉及到的云原生,就是我们微信小程序开发中的云函数云存储 创建使用云开发项目 将AppID填入 选择小程序云开发 创建即可 成功后会为我们呈现一个实例 刚刚创建的云服务项目中 测试器中有

  • 详解微服务架构及其演进史

    目录 1 传统单体系统介绍 1.1 单体系统的问题 1.2 单体系统的优点 1.3 单体服务到微服务的发展过程 2 关于微服务 2.1 单一职责 2.2 轻量级通信 2.3 独立性 2.4 进程隔离 2.5 混合技术栈和混合部署方式 2.6 简化治理 2.7 安全可靠,可维护. 3 微服务演进史 3.1 第一阶:简单服务通信模块 3.2 第二阶:原始通信时代 3.3 第三阶:TCP时代 3.4 第四阶:第一代微服务(Spring Cloud/RPC) 3.5 第五阶:第二代微服务 3.6 第六阶

  • Rainbond云原生部署SpringCloud应用架构实践

    目录 示例项目详情 模块说明: 部署环境说明: 模块构建 部署 Mysql 部署 Redis 部署 pig-ui 依赖与端口梳理 最终成果 示例项目详情 本文档以Pig 快速开发框架为例,演示如何在Rainbond上部署一套完整的Spring Cloud项目. Pig Microservice Architecture V2.1.0: 基于 Spring Cloud Finchley .Spring Security OAuth2 的RBAC权限管理系统 基于数据驱动视图的理念封装 Elemen

  • 微服务架构之服务注册与发现功能详解

    目录 微服务的注册与发现 1.服务注册 2.服务发现 3.注册中心 4.现下的主流注册中心 4.1 Eureka 4.1.1 介绍 4.1.2 整体架构 4.1.3 接入Spring Cloud 4.2 ZooKeeper 4.2.1 介绍 4.2.2 整体架构 4.2.3 接入Dubbo生态 4.3 Consul 4.3.1 介绍 4.3.2 整体架构 4.3.3 生态对接 4.4 总结对比 详解微服务架构及其演进史 微服务全景架构全面瓦解 微服务架构拆分策略详解 微服务的注册与发现 我们前面

随机推荐