Go语言从单体服务到微服务设计方案详解

目录
  • 概述
  • 业务场景
  • 设计方案
    • Api网关
    • 数据
    • Go中的Grpc使用
  • 问题和反思

概述

微服务是一种思想,与编程语言无关,编程语言是思想下具体的一种实现方式,怎么设计架构方案和实现主要看主要面临的业务场景。

业务场景

主站核心业务使用的是yaf(php)开发的,要实现k8s + x编程语言 自主微服务实现,受到陈皓(左耳听风)的影响,我选用的编程语言是Go,Go语言有更强大的生态,有谷歌,k8s作为强大的后盾,摸着石头过河。

设计方案

Api网关

提到微服务我们就联想到Rpc,主流微服务价格设计,微服务之间的调用都使用Rpc,微服务也有直接用http实现的,Rpc限制了开发时候的灵活性和兼容性,主要3点原因:

1.Http协议是实际通信的标准,灵活性和兼容性得到了很好的市场验证,对Rpc我抱有怀疑态度,在Api层进行权限的统一认证( Token/Cookies ) , 后期微服务体系成熟,可以统一接入Api网关服务,Api网关服务是不可缺少的,全使用Nginx反向代理的方式,再数据统计的角度上局限性。

2.控制异常,如果发生异常,Rpc服务挂掉或者遭到网络攻击/刷请求,请求会直接打到Rpc上,如果有网关层,可以在Redis中加Redis锁,把无效的网络请求进行隔离。

数据

拆分微服务最大的两个问题是数据的一致性性能,系统性能的瓶颈主要是因为计算机Cpu,内存(memory/内存条、cache/Cpu的内存) 是非常快的,所有的性能问题大同小异,磁盘I/O往往才是性能的瓶颈。

1.数据的一致性的解决办法

模块化拆分和迁移微服务功能,把涉及到的整块进行迁移,可以按比重分流/整体功能进行,按比重分流要保留新旧数据的兼容,需要双写,现在的有声业务体量小,可以整块整块的迁移。

2.性能:有声的数据量非常小,暂时不使用redis缓存可能也不会造成什么性能问题,所以我把很小的公共部分进行了缓存,主要考虑C端用户的体验。

Go中的Grpc使用

Go-zero这个框架使用goctl工具开发速度非常高效,对调用外部的Grpc服务需要做更多的兼容,这里做一个解释说明,protoc-gen-goprotoc-gen-go-grpc这两个工具是protobuf的工具,是Go 1.5版本后新加的,这个地方饶了好大一圈。

GitHub Demo 地址 : github.com/grpc/grpc-g…

$ go install google.golang.org/protobuf/cmd/protoc-gen-go@v1.28
$ go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@v1.2
复制代码

在有声微服务中,是调用UserRpc的权限验证部分,Go-zero不支持,所以自己写了一些兼容包。

1.首先pb文件生成Pb和Grpc文件

$ ll
-rw-r--r--  1 stark  staff    69K  3 20 15:51 cp_user_internal.pb.go
-rw-r--r--  1 stark  staff    34K  3 20 15:51 cp_user_internal_grpc.pb.go
复制代码

2.调用UserRpc服务,需要实现的包是客户端部分代码,本地需要TLS加密,服务才能被调用的到,grpc.WithTransportCredentials(credentials.NewTLS(&tls.Config{})))是TLS灵魂。

package client

func Auth(Session string, Action string, Controller string, Param string) bool {
    // 1.建立链接
    flag.Parse()
	conn, err := grpc.Dial("testing.gongzicp.com:1443", grpc.WithTransportCredentials(credentials.NewTLS(&tls.Config{})))
	if err != nil {
		log.Fatalf("did not connect: %v", err)
	}
	defer conn.Close()
	client := pb.NewUserInternalClient(conn)

	//2.验证管理员权限
	resp, err := client.AdminMid(context.Background(), &pb.UserInternalParams_AdminMidReq{
		Session: Session,
	})

	//3.验证菜单权限

	auth, err := client.AdminAuth(context.Background(), &pb.UserInternalParams_AdminAuthReq{
			Action:     Action,
			Controller: Controller,
			Param:      Param,
			Session:    Session,
		})

	//....

}
复制代码

问题和反思

1.有声服务和主站的关联非常小,但是也有关联NovelId获取信息的部分,Novel属于核心服务,可能每一个地方的需要都不少。

2.Web端(Ukey) 、App安卓/Ios(Token) 本质上是一个维度的东西,类型上应该只用户/和系统管理员2种类型,最好是把服务类抽离出来做成单独的服务,可能会更好一些。

以上就是Go语言从单体服务到微服务设计方案详解的详细内容,更多关于Go单体服务微服务设计的资料请关注我们其它相关文章!

(0)

相关推荐

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

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

  • go micro微服务proto开发安装及使用规则

    目录 一 Protobuf介绍 二 安装Protobuf 三 Protobuf语法 1.1 基本规范 1.2 字段规则 1.3 service如何定义 1.4 Message如何定义 四 proto代码编写 五 生成.go文件 六 最后 一 Protobuf介绍 Google Protocol Buffer( 简称 Protobuf) 是 Google 公司内部的混合语言数据标准,目前已经正在使用的有超过 48,162 种报文格式定义和超过 12,183 个 .proto 文件. 他们用于 RP

  • go-micro微服务domain层开发示例详解

    目录 一 domain层介绍说明 二 model层开发 三 repository层开发 四 service层开发 最后 一 domain层介绍说明 domain层专注于数据库数据领域开发,我们把数据库相关操作全部写在domain层. model层:数据表字段定义与开发 repository层:数据库数据CURD操作 service层:数据库相关业务操作 对于复杂的业务操作,这样可以使业务逻辑更加清晰,有利于后期开发与维护. 二 model层开发 在model目录下新建 user.go 文件 pa

  • go zero微服务框架logx日志组件剖析

    目录 addTenant api 和 rpc 的实现 logx 日志组件剖析 Go-zero 中 logx 是如何使用的? Logx 基本的数据结构 Logx 的默认接口实现 Logx 自定义存储日志位置 和 实现自定义接口的方式 自定义存储日志位置 实现自定义接口 addTenant api 和 rpc 的实现 上一篇我们说到咱们还剩下 addTenant 功能还未实现,不知道有没有兄弟感兴趣去实验一波的,本篇文章进行简要补充 根据上一篇文章分析,其实我们只需要执行如下几步即可: 编写 ten

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

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

  • 详解go-micro微服务consul配置及注册中心

    目录 一 Consul介绍 1. 注册中心Consul基本介绍 2.注册中心Consul关键功能 3.注册中心Consul两个重要协议 二 Consul安装 1.使用docker拉取镜像 三 Config配置 四 Consul代码编写 1.设置consul配置中心 2.获取consul配置中心的数据 3.consul可视化界面数据编写 4. main.go代码编写 五 最后 一 Consul介绍 Consul是HashiCorp公司推出的开源工具,用于实现分布式系统的服务发现与配置. Consu

  • go micro微服务框架项目搭建方法

    目录 一 微服务项目介绍 二 go-micro安装 1.拉取micro镜像 2.生成项目目录 三 项目搭建 使用DDD模式开发项目: 四 最后 一 微服务项目介绍 账户功能是每一个系统都绕不开的一部分,所以本次搭建的微服务项目就是账户微服务项目,其中向外暴露的功能有: 登录 注册 查询用户信息 修改信息 发送注册邮件 发送重置密码邮件 重置密码 获取权限 修改权限 退出账号 删除账号 禁用账号 启用账号 提供的功能总共有13个,基本上包含了账户相关的所有功能! 在本次微服务项目中使用到的技术包括

  • Go语言从单体服务到微服务设计方案详解

    目录 概述 业务场景 设计方案 Api网关 数据 Go中的Grpc使用 问题和反思 概述 微服务是一种思想,与编程语言无关,编程语言是思想下具体的一种实现方式,怎么设计架构方案和实现主要看主要面临的业务场景. 业务场景 主站核心业务使用的是yaf(php)开发的,要实现k8s + x编程语言 自主微服务实现,受到陈皓(左耳听风)的影响,我选用的编程语言是Go,Go语言有更强大的生态,有谷歌,k8s作为强大的后盾,摸着石头过河. 设计方案 Api网关 提到微服务我们就联想到Rpc,主流微服务价格设

  • SpringCloud搭建netflix-eureka微服务集群的过程详解

    1.打开官网稍微学习一下,了解一下spring cloud是个什么东西,大概有哪些组件等 https://spring.io/projects/spring-cloud https://docs.spring.io/spring-cloud-netflix/docs/current/reference/html/ 2.新建项目 打开网址:https://start.spring.io/ 选择需要引入的组件,然后下载下来即可 3.更改项目结构 为了测试的方便,需将项目结构更改为多模块的项目. 步骤

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

    目录 微服务的注册与发现 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 总结对比 详解微服务架构及其演进史 微服务全景架构全面瓦解 微服务架构拆分策略详解 微服务的注册与发现 我们前面

  • Rainbond对微服务进行请求速率限制详解

    目录 前置条件 操作流程 常见问题 Rainbond 默认支持基于 envoy 的全局速率限制.在 Rainbond 默认提供的综合网络治理插件中呈现.本文我们将一个用例呈现 Rainbond 中全局速率限制的使用方式. 前置条件 Rainbond平台已部署完成. 在Rainbond中部署可访问的 Demo 业务. 为此组件开通综合网络治理插件. 参考视频 https://player.bilibili.com/player.html?aid=540728010 Rainbond 速率限制设置参

  • java开发分布式服务框架Dubbo原理机制详解

    目录 前言 Dubbo框架有以下部件 Consumer Provider Registry Monitor Container 架构 高可用性 框架设计 服务暴露过程 服务消费过程 前言 在介绍Dubbo之前先了解一下基本概念: Dubbo是一个RPC框架,RPC,即Remote Procedure Call(远程过程调用),相对的就是本地过程调用,在分布式架构之前的单体应用架构和垂直应用架构运用的都是本地过程调用.它允许程序调用另外一个地址空间(通常是网络共享的另外一台机器)的过程或函数,并且

  • SpringCloud Eureka服务注册中心应用入门详解

    目录 1.多节点无缝切换问题 2.服务注册与发现 Eureka 3.Springboot集成Eureka 3.1 父包pom依赖 3.2 eureka服务端 3.3 客户端 pom依赖 yml配置 3.4 控制台 1.多节点无缝切换问题 分布式节点中的服务宕机或者重启不影响客户端使用 分布式节点中的服务宕机重启不影响业务服务内部通信 如果在某个分布式系统中想要解决上述问题,那么这篇文章就是精华之处. 回顾一下以前的常用手段: 单节点运行,其他节点备用,无法无缝连接,内网通信无法保证 多节点运行,

  • Linux下重启oracle服务及监听器和实例详解

    一.在Linux下重启Oracle数据库及监听器: 方法1: 用root以ssh登录到linux,打开终端输入以下命令: cd $ORACLE_HOME #进入到oracle的安装目录 dbstart #重启服务器 lsnrctl start #重启监听器 cd $ORACLE_HOME #进入到oracle的安装目录 dbstart #重启服务器 lsnrctl start #重启监听器 ----------------------------------- 方法2: Sql代码 cd $OR

  • vue服务端渲染缓存应用详解

    服务端渲染简介 服务端渲染不是一个新的技术:在 Web 最初的时候,页面就是通过服务端渲染来返回的,用 PHP 来说,通常是使用 Smarty 等模板写模板文件,然后 PHP 服务端框架将数据和模板渲染为页面返回,这样的服务端渲染有个缺点就是一旦要查看新的页面,就需要请求服务端,刷新页面. 但如今的前端,为了追求一些体验上的优化,通常整个渲染在浏览器端使用 JS 来完成,配合 history.pushState 等方式来做单页应用(SPA: Single-Page Application),也收

  • 在 Angular6 中使用 HTTP 请求服务端数据的步骤详解

    第一步 准备好api接口地址, 例如 https://api.example.com/api/ 第二步 在根组件 app.components.ts 中引入 HttpClientModule 模块. // app.components.ts import {HttpClientModule} from "@angular/common/http"; //引入HttpClientModule 模块 imports: [ BrowserModule, AppRoutingModule, H

随机推荐