Go语言从单体服务到微服务设计方案详解
作者:stark张宇 发布时间:2023-09-02 02:45:57
概述
微服务是一种思想,与编程语言无关,编程语言是思想下具体的一种实现方式,怎么设计架构方案和实现主要看主要面临的业务场景。
业务场景
主站核心业务使用的是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-go
、protoc-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种类型,最好是把服务类抽离出来做成单独的服务,可能会更好一些。
来源:https://juejin.cn/post/7212918993349247031


猜你喜欢
- 概述Rollup, 和 Webpack, Parcel 都是模块打包工具(module bundler tool), 但是侧重点不同, 我们
- 前言有的时候上游传过来的字段是string类型的,但是我们却想用变成数字来使用。 本来用一个json:",string"
- 类型转换和类型断言类型转换语法:Type(expression)类型断言语法为:expression.(Type)1.类型转换示例代码pac
- 对所有数据进行整合与管理当你使用SQL Server 2008企业级的数据仓库平台时,你可以高效的操纵所有数据,并对其进行统一管理存储。◆合
- 红包:Lena椒盐噪声图片:# -*- coding: utf-8 -*-"""Created on Sat
- py 写东西快但是java 生态广比如大数据 py 虽然好 但是利用不到java的整个的生态的代码scala 虽然也好但是毕竟 有些库 需要
- 有时需要根据项目的实际需求向spider传递参数以控制spider的行为,比如说,根据用户提交的url来控制spider爬取的网站。在这种情
- 前言本文的内容主要是介绍了MYSQL每隔10分钟进行分组统计的实现方法,在画用户登录、操作情况在一天内的分布图时会非常有用,之前我只知道用「
- //测试函数 function test(str){ alert(str); } // 方法一 window["test"
- 对于Python开发用户来讲,PIP安装软件包是家常便饭。但国外的源下载速度实在太慢,浪费时间。而且经常出现下载后安装出错问题。所以把PIP
- 上边文章中提到win的性能监视器是监控数据库性能必备的工具,接下来我就给大家介绍一些常见的监控指标,其实无非就是磁盘,cpu,内存等硬件的运
- 0. 学习目标栈和队列是在程序设计中常见的数据类型,从数据结构的角度来讲,栈和队列也是线性表,是操作受限的线性表,它们的基本操作是线性表操作
- Toast简介Toast是Android中用来显示显示信息的一种机制,和Dialog不一样的是,Toast是没有焦点的,而且Toast显示的
- 背景最近在需求中有一个这样的场景:需要在页面关闭的时候,用户不需要操作,主动关闭当前订单当时考虑的方案:在页面关闭的时候,向后端发送一个请求
- 题目描述1260. 二维网格迁移 - 力扣(LeetCode)给你一个 m 行 n 列的二维网格 grid 和
- UI自动化测试过程中,可能会出现因测试环境不稳定、网络慢等情况,如果不做任何处理的话,会出现无法定位到特定元素而报错,导致自动化测试无法顺利
- 前言python中有一个非常有用的语法叫做生成器,所利用到的关键字就是yield。有效利用生成器这个工具可以有效地节约系统资源,避免不必要的
- 1.对数据库常用命令1.连接数据库mysql -u用户名 -p密码2.显示已有数据库show databases;3.创建数据库create
- 今天新能测试组的同事找我看一个奇怪的现象。一个tomcat应用,里面只有一个单纯的jsp页面,而且这个jsp页面没有任何java代码(想用这
- 爬蟲四步原理:1.发送请求:requests2.获取相应数据:对方及其直接返回3.解析并提取想要的数据:re4.保存提取后的数据:with