什么是服务注册发现?
对于搞微服务的同学来说,服务注册、服务发现的概念应该不会太生疏。
简略来说,当服务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
微信交换群
关注『微服务实际』公众号并点击 交换群 获取社区群二维码。