什么是服务注册发现?

对于搞微服务的同学来说,服务注册、服务发现的概念应该不会太生疏。

简略来说,当服务A须要依赖服务B时,咱们就须要通知服务A,哪里能够调用到服务B,这就是服务注册发现要解决的问题。

Service BService RegistryService AService RegistryService B

服务注册

服务注册是针对服务端的,服务启动后须要注册,分为几个局部:

  • 启动注册
  • 定时续期
  • 退出撤销

启动注册

Service Registry

定时续期

keep aliveService Registry

退出撤销

当过程退出时,咱们应该被动去撤销注册信息,便于调用方及时将申请散发到别的节点。同时,go-zero 通过自适应的负载平衡来保障即便节点退出没有被动登记,也能及时摘除该节点。

服务发现

服务发现是针对调用端的,个别分为两类问题:

  • 存量获取
  • 增量侦听

还有一个常见的工程问题是

  • 应答服务发现故障

当服务发现服务(比方 etcd, consul, nacos等)呈现问题的时候,咱们不要去批改曾经获取到的 endpoints 列表,从而能够更好的确保 etcd 等宕机后所依赖的服务仍然能够失常交互。

存量获取

Service AService RegistryService BService B1Service B2Service B3

增量侦听

Service B1Service B2Service B3Service B4Service A

应答服务发现故障

etcdconsulnacosetcdetcdService BService Bgo-zero
go-zero

go-zero 之内置服务发现

go-zero
  • 直连
  • 基于 etcd 的服务发现
  • 基于 kubernetes endpoints 的服务发现

直连

直连是最简略的形式,当咱们的服务足够简略时,比方单机即可承载咱们的业务,咱们能够间接只用这种形式。

rpcendpoints
Rpc:
  Endpoints:
  - 192.168.0.111:3456
  - 192.168.0.112:3456
zrpczrpc

这个办法的毛病是不能动静减少节点,每次新增节点都须要批改调用方配置并重启。

基于 etcd 的服务发现

当咱们的服务有肯定规模之后,因为一个服务可能会被很多个服务依赖,咱们就须要可能动静增减节点,而无需批改很多的调用方配置并重启。

etcdconsulnacos
etcd
Rpc:
  Etcd:
     Hosts:
     - 192.168.0.111:2379
     - 192.168.0.112:2379
     - 192.168.0.113:2379
     Key: user.rpc
HostsetcdKeykey

基于 Kubernetes Endpoints 的服务发现

KubernetesKubernetesetcdEndpointsdeploymentEndpoints
Service BPodEndpointsService APodEndpointsService BService BService AwatchEndpoints
namespacepodEndpoints
namespacenamespaceservice accountClusterRolenamespaceServiceAccount
Kubernetesnamespace
Endpoints
zrpcKubernetes Endpoints
Rpc:
  Target: k8s://mynamespace/myservice:3456

其中:

mynamespacerpcnamespacemyservicerpc3456rpc
deploymentserviceAccountNameServiceAccount
apiVersion: apps/v1
kind: Deployment
metadata:
  name: alpine-deployment
  labels:
    app: alpine
spec:
  replicas: 1
  selector:
    matchLabels:
      app: alpine
  template:
    metadata:
      labels:
        app: alpine
    spec:
      serviceAccountName: endpoints-reader
      containers:
      - name: alpine
        image: alpine
        command:
        - sleep
        - infinity
serviceAccountNamedeploymentpodServiceAccount
serverclientKubernetesserver
kubectl rollout restart deploy -n adhoc server-deployment
client
kubectl -n adhoc logs -f deploy/client-deployment --all-containers=true
server

残缺代码示例见 https://github.com/zeromicro/zero-examples/tree/main/discovery/k8s

go-zeroconsulnacos

我的项目地址

https://github.com/tal-tech/go-zero

go-zero

微信交换群

关注『微服务实际』公众号并点击 交换群 获取社区群二维码。