“家家泉”完成近亿元B轮融资,沣途资本领投
06-17
距离上一篇文章已经两个月了。毕竟辛苦的工人们太忙了,没有时间……这篇文章我们要聊的是微服务架构方面,最重要的一点就是服务发现及其对应的名称服务功能。
系列文章 腾讯 tRPC-Go 教学 - (1) 构建服务 腾讯 tRPC-Go 教学 - (2) trpc HTTP 能力 腾讯 tRPC-Go 教学 - (3) 微服务??间调用 腾讯 tRPC-Go 教学 - (4) tRPC 组件生态并使用腾讯tRPC-Go教程-(5)过滤器、上下文和日志组件腾讯tRPC-Go教程-(6)服务发现腾讯tRPC-Go教程-(7)服务配置和指标报告……会有更多,敬请期待... 概述 在上一篇文章中,我们提到微服务之间调用时,需要在客户端配置微服务的下游服务,以便 tRPC 知道如何寻址。在那篇文章的示例中,我们将目标字段的值配置为:这是一个IP,一个非常有方向性的IP地址。
但直接指定下游服务的IP地址存在几个问题: 在微服务集群中,一个服务可能有多个节点。仅配置一个IP无法满足主备业务需求,也无法实现一致性哈希等复杂查找。
随着地址能力随着业务节点的不断扩展,业务的IP列表频繁变化,固定的IP配置已经不能满足需求。 tRPC的名称服务是一个成熟的微服务框架,一般通过名称服务来解决这个问题。
换句话说,当一个微服务调用其他微服务时,它指定的不是IP地址,而是服务的名称。通过一系列中间件,将名称替换为真实且可达的IP地址。
tRPC 提供了定制名称服务的能力。如果要开发自己的名称服务,至少需要在tRPC框架中实现相应的选择器和注册中心能力(文档)。
作者尝试基于MySQL实现一个极其简单的名称服务。有兴趣的读者可以通过这个包了解更多信息。
本文不关注原理,而是关注应用。在腾讯内部,大多数 tRPC 微服务都使用 Polaris 名称服务。
在本文中,我们以 Polaris 名称服务为例来说明如何在 tRPC 上应用实用的名称服务。北极星简介 腾讯内部的北极星系统是一个以名称服务为主要业务的系统。
虽然外网开源版本看似功能更多,但作为服务管理的主要业务,内网和外网版本并没有太大区别。关于Polaris系统的搭建和安装,请参考Polaris文档。
出于教学目的,本文以作者使用Docker在本地安装的Polaris系统为例。当我们访问Polaris页面并登录后,可以看到初始页面:Polaris首页看到两个Polaris自带的服务,可以忽略。
接下来,按照正常流程,我们可以点击New按钮创建一个新的服务,名称为:New Service,不过Docker版本的Polaris也可以跳过这一步。因此,我们直接进入下一阶段:tRPC服务配置和tRPC服务启动配置。
我们仍然会遵循之前文章中描述的http-auth和用户服务。一个是主叫方,另一个是被叫方。
我们先来看看用户服务。代码中引用了 tRPC Polaris 支持。
要在服务中启用 Polaris 支持,tRPC 的标准用法是在主包中匿名导入 Polaris 包: 代码语言: go copy import (//......_ "trpc.group/ trpc-go/从逻辑上讲,该包会在init()阶段调用tRPC的相关RegisterXXXX函数,将Polaris的名称服务、负载均衡等功能注册到tRPC中。 trpc_go.yaml 文件配置前面的导入是为了支持二进制中的 Polaris。
为了启动Polaris,我们还需要配置tRPC服务。对于作为被调用方的用户服务,我们需要在其 trpc_go.yaml 文件中添加如下配置: 代码语言:yaml 复制plugins: ##plugins项下的其他值被忽略registry: Polarismesh: register_self: true heartbeat_interval: protocol: grpc address_list: host.docker.internal: service: - name: demo.account.User namespace: dev Weight: token: not_needed 其中address_list: host.docker.internal: 指的是Polaris服务的地址,因为我是使用Docker部署,Polaris的注册服务默认监听该端口。
使用此配置启动用户服务。然后我们回到Polaris首页,刷新一下:user服务自动注册了,可以看到多了一个demo.account.User服务。
进入该服务的详情页面,我们可以看到服务监听的配置:用户服务详情遵循上面的默认配置,Polaris会根据服务器配置来判断当前服务监听的是哪个地址和端口。名称和命名空间字段是必需的。
当前用户服务的配置为: Code language: yaml Copy server: filter: -tracelog service: - name: demo.account.User nic: eth0 port: network: tcp protocol: trpc timeout: 可以看到根据配置中,监控的是网卡eth0、端口。 Polaris 获取此信息并将其注册到名称服务。
解决好,现在我们作为调用者回到 http-auth 服务。调用者还需要在代码中导入相同的Polaris包。
但作为调用方,需要在 trpc_go.yaml 中添加以下配置: 代码语言:yaml 复制插件:## 忽略plugins项下的其他值 选择器:polarismesh:协议:grpc join_point:默认address_list:host。码头工人。
Internal: persistDir: ./polarismesh/backup log_dir: ./polarismesh/log 配置项选择器将 Polaris 功能指定为名称选择器。其中address_list项与之前的注册表配置含义相同。
然后,在调用用户服务时,我们放弃了之前 的写法,改为如下格式: 代码语言:yaml 复制客户端:filter: -tracelog service: -name:demo.account.User target :同样,我们通过这个trpc_go.yaml启动http-auth服务,然后参考上一篇文章请求http-auth方法:代码语言:shell copy curl '.17.0.7:/demo/auth/Login?username=amc' 得到错误响应: 代码语言:json copy {"err_code":1,"err_msg":"密码错误"} 根据这两个服务的逻辑,这时候我们可以清楚的知道,这个错误码表示http-auth -> user -> MySQL这个链接已经连接上了。从这两个服务的日志中我们也可以看到这一点。
其他说明 至此,使用Polaris 注册和发现名称服务的功能就已经介绍完毕。至此,读者就可以完全搭建一个微服务集群了。
集群中的每个微服务可以自行灵活扩展,无需相互耦合(包括配置);每个微服务还可以通过多点互备份的方式进行部署。实现灾难恢复。
但除此之外,还有一点需要注意。如果单纯使用 go build 命令进行编译,启动服务时可能会出现如下错误: 代码语言:shell copy panpanic: proto: file "auth.proto" is已经注册 看到gRPC中存在一些同名的proto文件通过重复注册。
如果这个问题不好解决,可以在编译时添加 -ldflags "-X google.golang.org/protobuf/reflect/protoregistry.conflictPolicy=warn" 参数来解决。具体的读者可以参考我的demo工程的Makefile规则。
这个系列文章的下一步其实是第六篇……对于tRPC的基本功能来说,还剩下一个配置和监控的地方要讲。在腾讯内部,口碑最好的配置系统叫做“七彩石”。
该系统对外提供商业私有化部署方案,不开源。口碑最好的监控系统成为了“伽利略”,而这个系统还没有向外界开源。
所以,接下来的两个话题就比较麻烦了。由于这两个流行的系统都不是开源的,所以基本上不可能在外网有和内网一样的体验。
在下一篇文章中,我打算简单介绍一下接入方法,并描述如何建立最粗暴、最简单的配置和监控(显示)解决方案。让我们快速跳过这一部分。
本文根据 Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License 获得许可。原作者:amc,原文发表于腾讯云开发者社区,也是我的博客。
欢迎转载,但请注明出处。原作者:amc,欢迎转载,但请注明出处。
版权声明:本文内容由互联网用户自发贡献,本站不拥有所有权,不承担相关法律责任。如果发现本站有涉嫌抄袭的内容,欢迎发送邮件 举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。
标签:
相关文章
06-17
06-17
06-18
06-18
06-17
06-17
06-18
06-18
最新文章
【玩转GPU】ControlNet初学者生存指南
【实战】获取小程序中用户的城市信息(附源码)
包雪雪简单介绍Vue.js:开学
Go进阶:使用Gin框架简单实现服务端渲染
线程池介绍及实际案例分享
JMeter 注释 18 - JMeter 常用配置组件介绍
基于Sentry的大数据权限解决方案
【云+社区年度征文集】GPE监控介绍及使用